Как все это работает ???

Впервые имею дело с famework для построения сайтов.

Раньше вручную делал для собственного пользования простенькие сайты.

Знаю с++, ООП, php на базовом уровне…

Однако, хоть убей, не могу врубиться в идеологию Yii.

Изучаю исходные тексты Yii, вижу как создаются объекты разных классов, как запускаются на

исполнение методы созданных объектов, но конечная цель всей этой работы представляется очень смутно.

Может кто-нибудь расскажет "своими словами" что тут и почем - на глобальном, так сказать, уровне…

Разумеется, документация выполнена исключительно добросовестно и кропотливо,

но для таких начинающих, как я, не хватает общего описания принципов применения framework.

Такое ощущение, что необходимо все же убить два-три месяца на изучение всех исходников Yii,

а хочется начать проектирование сайтов.

С уважением - Новичек.

Это всё хорошо, но вы упустили паттерн MVC.

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

Зачем изучать тонны кода? Посмотрите демо блог, скачайте расширения, почитайте кукбук… Картина станет ясней гораздо быстрее.

Это лишь мои скромные рекомендации. Описывать глобальные принципы работы в целом, думаю, здесь не место. Ну а если вы все-таки хотите подискутировать на эту тему, то задавайте конкретные вопросы, например, почему я должен использовать какие-то контроллеры и виджеты вместо того, чтобы поместить всю логику в файл с html-разметкой :)

В MVC-концепцию я, конечно, вникну поглубже.

Однако, коль скоро, как мне сдается, я, "дикий" человек, исключительно самоучка,

стоящий у самых истоков современных И.Т., попал в среду профессионалов,

хочется оценить вообще на каком уровне я нахожусь.

Прикрепляю php-скрипт из Yii - файл index.php из каталога …YiiRoot\requirements\

Хотя я и разобрался в работе этого скрипта, пришлось довольно-таки сильно напрягаться

и потратить полдня.

Если у Вас есть время, гляньте и оцените возможности

"среднего" программиста писать скрипты в таком же вот духе.

С уважением - Новичок.

Зачем вы создаете себе такие сложности? :) index.php в Yii Requirements к фреймворку отношения вообще не имеет (за исключением того, что проверяет требования).

Как я уже сказал, начните с создания блога: http://www.yiiframework.com/doc/blog/ru/start.overview

Тут дается и краткое описание последовательности работы приложения, и основные шаги при создании нового приложения.

Более детальное изложение приведено в Definitive Guide.

Если еще вам не надоел, такой вот конкретный вопрос.

Рассматриваю пример создания блога - действие контроллера

//*********************

public function actionContact()

{


	$model=new ContactForm;


	 ...


             ...


             ...


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


}

//********************

class ContactForm extends CFormModel

{

public $name;


public $email;


public $subject;


public $body;


public $verifyCode;

}

//********************

Понятно, что создается объект класса ContactForm, который является потомком класса CFormModel.

При создание этого объекта выполняется конструктор, находящийся в классе CFormModel(а возможно где-то еще глубже).

Этот конструктор выводит HTML-форму с нашими полями и далее, методы CFormModel-класса контролируют заполнение формы, используя в том числе и методы, переопределенные нами в ContactForm-потомке.

Вопрос такой - откуда методы CFormModel-класса берут типы и другие характеристики выводимых в HTML-форме полей ?

Возможно, есть какие-то default-соглашения на имена свойств потомков класса CFormModel ?


Хотя увидел через полчаса, что конструктор тут не причем. За вывод HTML-формы отвечает представление Contact.php, которое "рендится" и выводится на браузер…


Вопрос снимается.


Посмотрел, однако, на представление Contact.php, дошел до строки

<?php $form=$this->beginWidget(‘CActiveForm’); ?>

и понял, что до понимания очень и очень далеко. Создается объект класса CActiveForm - потомок класса СWidget, который и сам является потомком » CBaseController » CComponent…

И в этом всем можно разобраться ???


С уважением - Новичек

Модель и представление между собой ничего общего не имеют, поэтому в конструкторе модели никакого вывода выполняться не может. Единственное, что можно в него передать, это имя сценария. Поэтому:

Ни от куда :) Всё задается в файле представления (protected/views/site/contact.php). Единственное, что стоит отметить - это правила валидации полей формы. Они задаются в самой модели с помощью метода rules().

Надеюсь, сейчас картина MVC станет для вас еще немного яснее. Контроллер создает объект модели, передает её в представление с помощью метода render(), где уже и начинается вывод HTML.


Надеюсь, сейчас картина MVC станет для вас еще немного яснее. Контроллер создает объект модели, передает её в представление с помощью метода render(), где уже и начинается вывод HTML.


Ладно, хорошо, опустим "второстепенное".

Вот rend()-метод вывел форму. Пользователь заполнил форму, нажал submit и управление

опять попадает на действие :

//*********************

public function actionContact()

{


	&#036;model=new ContactForm;


	if(isset(&#036;_POST['ContactForm']))


	{


		&#036;model-&gt;attributes=&#036;_POST['ContactForm'];


		if(&#036;model-&gt;validate())


		{


			&#036;headers=&quot;From: {&#036;model-&gt;email}&#092;r&#092;nReply-To: {&#036;model-&gt;email}&quot;;


			mail(Yii::app()-&gt;params['adminEmail'],&#036;model-&gt;subject,&#036;model-&gt;body,&#036;headers);


			Yii::app()-&gt;user-&gt;setFlash('contact','Thank you for contacting us. We will respond to you as soon as possible.');


			&#036;this-&gt;refresh();


		}


	}


	&#036;this-&gt;render('contact',array('model'=&gt;&#036;model));


}

//*****************************

если форма заполнена - isset($_POST[‘ContactForm’]) = true, и метод $model->validate(), обратившись

к нашим правилам public function rules() {…}, нашел ее заполнение верным, нам посылается email-сообщение, а

$this->refresh() чистит, по видимому, свойства модели, а $this->render(‘contact’,array(‘model’=>$model))

посылает чистую форму снова на браузер. Примерно так ???

С уважением - Новичек.

Метод CController.refresh() просто обновляет страницу, что и приводит к очистке заполнененных полей. В противном случае, даже если бы мы очистили значения полей вручную, если пользователь нажмет в браузере кнопку "обновить" (F5), то ему будет предложено отправить форму еще раз с теми же значениями полей, а это нам совсем не нужно.

не могу найти место, где производится формирование(скорее, тоже - "рендирование")

и вывод представления с информацией о полях не прошедших "валидизацию".

Ведь при нажатие submit управление, вроде как, опять передается на то же самое

действие контроллера…

???

Если есть время, дайте, пожалуйста, намек…

С уважением - Новичек.

Если говорить о контактной форме, то в том же представлении contact.php:




<?php echo $form->errorSummary($model); ?>



Если при валидации возникли ошибки, то модель сохраняет информацию о них, а метод CActiveForm.errorSummary() выводит соответствующие сообщения. Если вам не нравится его вид, то CSS стили можно поправить в файле css/form.css. Такие методы CActiveForm как textField() и textArea() не зря принимают в качестве первого аргумента объект модели. Это позволяет им менять стиль отображения поля в зависимости от того, есть ошибка или нет.

То есть, если валидизация не прошла, то метод $model->validate(), по видимому,

делает какие-то пометки в свойствах данного экземпляра модели и управление опять передается сюда-

$this->render(‘contact’,array(‘model’=>$model));

Причем $model - экземпляр, содержащий неправильные поля и соответствующие пометки об этом.

При рендирование этого неправильного экземпляра метод $form->errorSummary($model) обнаруживает пометки об ошибках, сделанные методом $model->validate() и, таким образом, формируется представление contact.php с диагностикой ошибок заполнения, которое и попадает на браузер.

В принципе картина прояснилась.


Только два вопроса:

  1. где вы все это узнали ?

  2. чтобы работать с Yii мне нужно выходить на такой же уровень понимания ?


Разумеется, очень вам признателен за внимание к моей скромной персоне.


А что это за конструкция в представление contact.php:

<?php if(Yii::app()->user->hasFlash(‘contact’)): ?>

<div class="flash-success">

&lt;?php echo Yii::app()-&gt;user-&gt;getFlash('contact'); ?&gt;

</div>

<?php else: ?>

<?php endif; ?>

<?php endif; ?>

то есть получается вот такая штука:

if(…): … else: … endif; … endif;

Похоже на директивы препроцессора…или какие-то директивы для метода render(…)…

Работаю с фреймворком уже год. Этого времени для понимания основных принципов работы более чем достаточно. Сколько потребуется вам - не знаю. Но, учитывая ваш вопрос про альтернативный синтаксис if-else, вам придется узнать много нового и про PHP :)

Чтобы писать серьезные приложения - на гораздо больший :)