нужна помощь по Модели

привет всем!

народ… подскажите как правильно использовать Модели?

может разберем конкретный пример?

Давайте пример, разберем :) Разве в гайде и примере по созданию блога мало информации?

хотелось бы разжевать поподробнее :rolleyes:

связь между контроллером и представлением - прозрачна и понятна

а вот механизм использования модели - нет

могу ли я создать модель для конкретной страницы, чтобы она получала данные из базы на основании GET-параметров? и будет ли это правильным применением модели?

честно говоря не укладывается в голове конкретное применение без примера…

Модель предоставляет интерфейс для работы с некоторыми данными, которые где-то хранятся (в идеале даже не важно где и как). Модель ничего не знает о представлении и контроллере, она умеет только работать со своим источником данных, поэтому ни о каких GET/POST параметрах говорить не приходится. Нужно найти запись в таблице по названию товара? Делаем следующее в контроллере:




$model = Product::model()->findByName($_GET['name']);



Как видите, здесь даже не используются стандартные методы CActiveRecord (findByAttributes(), например), потому что привязывать контроллер к полям таблицы в базе данных не очень хорошо. Если мы решим поменять название одного поля, то менять придется и контроллеры, и представления, и виджеты, которые это поле используют напрямую. Конечно, в реальных условиях не всегда удастся обойтись без использования того же CDbCriteria вне модели, но нужно стремиться к лучшему :) Главное не делать из контроллера ТТУК.

Всё это относится не только в моделям, работающими с базами данных. Взять, например, форму обратной связи на сайте. Модель FeedbackForm extends CFormModel должна предоставить контроллеру метод send() отправки письма, чтобы код контроллера сводился к 3 основным операциям: присвоение атрибутов, отправка письма, рендер/редирект. Еще бывает и четвертая - проверка прав доступа :)

нарыл на просторах интернета вот такое вот описание принципа MVC

где мне более-менее понятна роль модели =


 1. Пользователь вводит адрес, и браузер обращается к контроллеру.


 2. Контроллер обращается к модели.


 3. Модель обращается к базе данных 

    (к примеру, для получения необходимой для вывода информации)


 4. Информация из базы попадает обратно в модель.


 5. Из модели информация передается в контроллер.


 6. Контроллер передает эту информацию в вид.


 7. Вид выводится в браузер с помощью контроллера.

если вышеизложенное точно описывает работу модели, то давайте попробуем продолжить на простом примере

Описано все верно, но я бы подкорректировал пункт 3.

Теоретически, модель имеет право не только к БД обращаться, а к любым данным вообще.

Простых примеров хватает в документации, вот хоть тут:

http://www.yiiframework.com/tour/

Ну и как бы must read: http://www.yiiframework.com/doc/guide/

все-таки без реального примера = не обойтись :blink:

нужно взять из БД статью с id=1

в модели нужно формировать SQL-запрос? что-то типа =


class Test extends CModel

{

  public $qwe;

	

  public function rules()

    {

      $qwe = Yii::app()->db->createCommand()

      ->select('*')

      ->from('post')

      ->where('id=:id', array(':id'=>1))

      ->queryRow();

      return $qwe;

    }

}

а в контроллере экшн =


  public function actionTest()

  {

    $model=new Test;

    $this->render('test',array('model'=>$model));

  }

Ужас! Читайте уже гайд! :)

Научный тык driven development же :)

Я также новичок в Yii. Думаю нужно создать вот такую модель:




class Article extends CActiveRecord

{


	static public function model($className = __CLASS__)

	{

		return parent::model($className);

	}


	public function tableName()

	{

		return "{{article}}";

	}

}



А в файле контроллера написать:




  public function actionTest()

  {

    $article = Article::model()->findByPk(1);

    $this->render('test',array('article'=>$article));

  }



Тут неплохо изложено по модели, я лично с удовольствием прочитал… http://finger.reduct.ru/?p=124

Подскажите кто-нибудь, как вывести label не используя форму? :)

Т.е. аналог “echo $form->labelEx($model,‘field’)”

См. класс CHtml, методы activeLabel() и label():




echo CHtml::activeLabel($model, 'field');