DbHelp.ru
Маленький Yii блог
Комментарии
Гость: Намереваетесь оттрахать три киски сразу, обратите взо...
Гость: «Халва» - Карта Рассрочки взять кредит частный займ ...
Гость: Регистрируешься - огромный бонусы. Играешь - огромный ...
Гость: Быстро и качественно придам вашему фото идеальный вид....
Гость: Информативно,продолжай в том же духе [url=http://forum.oncolo...



Сервер Ultima Online - Forest Wars (от создателя данного блога)

Шаг 5: Контроллер Д/З

Рубрика: Первые шаги

Оцените эту статью:

Рейтинг: 0.00 (0)
6 Сен. 2010
Опубликовать в Twitter Написать в Facebook Опубликовать в своем блоге livejournal.com


Yii Framework Blog img http://dbhelp.ru3 Рассмотрим правильный вариант решения задачи поставленной в статье "Шаг 5: Контроллер".

---

Тем кто читает все статьи за один раз и не старается выполнять упражнения самостоятельно я искрение сочувствую. Прошу вас еще раз пересмотреть свое отношение к познанию материала и все таки попробовать посидеть N-ое кол-во времени и самостоятельно пораскинуть мозгами, учитывая что все материалы для решения вы уже получили.

Тем кто выполнил упражнение своими силами и теперь хочет сверится с моим вариантом - прошу читать дальше.

Первым делом я открыл phpMyAdmin (обычно этот скрипт для удобной работы с базой уже установлен у вас на хостинге) и создал таблицу для новостей следующим SQL:

 CREATE TABLE `news` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`url` VARCHAR( 100 ) NULL ,
`title` VARCHAR( 255 ) NOT NULL ,
`body` TEXT NOT NULL
) ENGINE = MYISAM

ALTER TABLE `news` ADD UNIQUE(`url`)


Я делал только основные поля что бы вы поняли как это работает. После этого я заполняю базу двумя новостями:

INSERT  INTO `news` (`id`, `url`, `title`, `body`) VALUES (NULL,  'my-super-news1', 'Тестовая новость 1', 'текст новости 1 текст новости 1  текст новости 1 текст новости 1 текст новости 1 текст новости 1 '),  (NULL, 'super-puper-news2', 'Тестовая новость 2', 'текст новости 2 текст  новости 2 ');


Идея в следующем: пользователь который заходит по ссылке www.mysite.ru/news/my-super-news/ - получает на экране текст первой новости, а если зайдет на www.mysite.ru/news/super-puper-news2 тогда получает текст второй.

Создаем модель (models/News.php) для работы с нашей таблицей новостей:

<?php
class News extends CActiveRecord
{
   public static function model($className=__CLASS__)
   {
       return parent::model($className);
   }
   public function tableName()
   {
       return 'news';
   }
}

Модернизируем наш контроллер под работу с базой (controllers/HelloController.php)

<?php
class HelloController extends CController
{
  public function actionWorld()
  {
      echo 'Привет от HelloController->actionWorld()';
  }
  public function actionStepan()
  {
      echo 'Привет Степан!';
  }
  public function actionDima()
  {
      echo 'Привет Дима!';
  }
  public function actionIvan()
  {
      echo 'Привет Иван!';
  }  
  public function actionNews()
  {
        // если хотите, то $_GET['news_name'] можете обработать
        // предварительно всякими функциями для безопасноти
     $url = $_GET['news_name'];
     // проверяем есть ли новость с таким url
     if ($news = News::model()->findByAttributes(array('url' => $url))) {
         // получается мы нашли в базе запись
         // в которой значение url равняется переменной news_name
         echo $news->title ,  '<br>' , $news->body;
     } else {
         // нет такой новости, об этом и сообщаем:
       echo 'новость не существует!';
     }
  }
}

Вот и все. Заходите по тестовым ссылкам выше и наслаждайтесь работой.
Если даже после примера остались вопросы - рекомендую перечитать урок по работе с моделью.



Если хотите опубликовать этот материал у себя - пожалуйста, разместите ссылку на страницу откуда вы его взяли.
Другие yii статьи:

  1. Рамки MVC весьма размыты, поэтому моё понимание может не совпадать с полученными вами ранее знаниями. Хотел бы напомнить что ... "Шаг 3 : Что такое MVC?"

  2. Помню когда я показал свой тестовый набросок блога своему другу - ему сразу понравилась его скорость работы. Через пару ... "Свой текст для обновления капчи"

  3. Для начала вам потребуется скачать последний релиз FCKeditor. Разархивируйте скачанный файл и поместите его в папку fckeditor (которую предварительно ... "Как подключить FCKeditor"

[adm] zolter

Было сказано: Понедельник, 06 Сентябрь 2010

Рендер отображений в статье не используется специально. :)

[guest] Maxx

Было сказано: Понедельник, 06 Сентябрь 2010

Спасибо, давно сам сделал :)

[guest] zolter

Было сказано: Вторник, 07 Сентябрь 2010

Ваши голоса за статью - стимулируют написание новых!

[guest] Гость

Было сказано: Вторник, 29 Март 2011

голосую! :)

[guest] Султан

Было сказано: Вторник, 14 Июнь 2011

Шаг 6 будет?

Кстати, вчера у Вас сайт полег! Логин и пароль был на показ, надеюсь, что yii не выдает пароль и логин по умолчанию, при ошибке к подключению к базе?

[guest] sidan_root

Было сказано: Вторник, 14 Июнь 2011

Султан, где вы пароль увидели? Zolter@localhost?
Пароль не выдается ни при каких обстоятельствах.

[guest] Гость

Было сказано: Пятница, 20 Январь 2012

Спасибо Большое! Будет следующий шаг или все?

[guest] zolter

Было сказано: Пятница, 20 Январь 2012

Ближайшее время начнется новый цикл статей посвещенный моему текущему проекту - модульной CMS системе. По поводу данного материала для новичков - планирую так же постепенно идти дальше.

[guest] Гость

Было сказано: Суббота, 21 Январь 2012

C нетерпение ждем.

[guest] Гость

Было сказано: Суббота, 28 Январь 2012

Пишет "Table "news" does not have a column named "0"."
И не пойму в чем дело(

[guest] Гость

Было сказано: Суббота, 28 Январь 2012

Все разобрался, была синтаксическая ошибка в findByAttributes.
Ждем продолжение статей! как реализуется view?

[guest] Павел

Было сказано: Суббота, 21 Апрель 2012

Немного по другому сделал. Создал в моделе Test ф-цию:


public function getNew($url)
{
$r=$this->find("url_name = :url_name", array(":url_name" => "$url"));
if ($r != NULL)
{
echo $r->text;
}
else
echo "Не найдено в базе";
}

Потом из контроллера обратился к этой ф-ции следующим образом:

public function actionNews()
{
if (!empty($_GET['news_name']))
{
$name=new Test();
$name->getNew($_GET['news_name']);
echo $name->text;
}
else
{
echo "Не выбрана статья";
}
}


Согласен, что Ваш вариант проще, но можно ли было сделать как это сделал я?

P.S. Ваш сайт - просто кладезь для новичка в yii. Огромное Вам спасибо за Ваш труд! Ждем новых статей)

[guest] zolter

Было сказано: Суббота, 21 Апрель 2012

Можно и так, только зачем? Вы таким образом раздуете в будущем вашу модель и вам не слишком будет просто поддерживать её. Если цель такой функции была допустим обработка безопасности переменной, что бы в каждом контроллере не заниматся этими действиями - тогда стоило написать общий какой то метод в модели для возврата переменной + обработка. По типу геттеров_сеттеров.

Плюс в вашем подходе вместо:
echo $r->text;
мне кажется надо
return $r->text;

И вместо
$name->getNew($_GET['news_name']);
echo $name->text;

Тогда уже:
echo $name->getNew($_GET['news_name']);

[guest] Павел

Было сказано: Суббота, 21 Апрель 2012

Спасибо за замечания. Наверное, Ваш способ все же лучше.

[guest] zolter

Было сказано: Суббота, 21 Апрель 2012

Просто зависит от цели, почему вы так хотите использовать модель. Если как свою обворотку для функции "вытягивания" новости, тогда лучше в функции getNew сделать вроде вот такого:

static public function getNews($id = false, $url = false)
{
if ($id) {
if ($news = News::model()->findByPk(intval($id))) {
return $news;
} else {
return false;
}
} else {
if ($news = News::model()->find("url_name = :url_name", array(":url_name" => "$url"))) {
return $news;
} else {
return false;
}
}
}

Таким образом мы получаем статическую функцию не привязанную к модели, готовую нам возвращать полностью объект новости с базы данных с которым мы можем работать со всеми проверками на существование и тп.

И тогда уже в контроллере проверка получится:

public function actionNews()
{
if (!empty($_GET['news_name'])) {
if ($news = News::getNews(obrabotka($_GET['news_name']))) {
echo $news->text;
} else {
echo "Нет такой новости";
}

} else {
echo "Не выбрана новость";
}
}

Вот в таком случае мне кажется подоход предложенный вами будет красив и будет себя достаточно оправдывать. Т.к. вы в имеете собственную функцию для вытаскивания новости по id и url, без привязки к findByPk/find и тп.

[guest] Павел

Было сказано: Воскресенье, 22 Апрель 2012

Такой вариант действительно довольно красив)

P.S. Zolter, а почему при выделении текста в комментариях, он выделяеться по ширине всей страницы?

P.P.S. Что порекомедуете почитать на Вашем сайте после рубрики "Первые шаги" ?

[guest] Mike

Было сказано: Понедельник, 04 Февраль 2013

Zolter забросили вы бложик) А где же в вашем примере защита от SQLInjection?

[guest] Гость

Было сказано: Среда, 11 Март 2015

ваш сайт даже лучше чем оф.документация

Оставить комментарий


Код:
Имя: