Новые компоненты фреймворка Yii: CDetailView

Владимир | | PHP, Web разработка, Yii.

yii php cdetailview

Знаете, чем больше я работаю с фрейворком Yii, тем больше он мне нравится. Конечно, он далеко не идеальный, но активно развивается. Правда это развитие идёт не совсем плавно, а скорее рывками, и при этом остаются пробелы. Самый большой из них – документация. Я имею в виду «Полное руководство», информация в API полная.

Не поймите неправильно, то, что я написал в предыдущем абзаце – это даже не замечание разработчикам. Просто фреймворк позволяет решить одни и те же задачи разными способами, и новые классы появляются довольно часто. И для обновления документации, думаю, нужна специальная команда редакторов.

Но это всё общие рассуждения, а я собираюсь рассказать о вполне конкретной вещи – виджете CDetailView.

Он входит в набор компонентов под названием zii. Эти компоненты появились довольно давно, но, начиная с версии 1.1, они входят в дистрибутив фреймворка. Кроме того, консольная утилита yiic генерирует код с этими компонентами.

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

Возвращаемся к виджету CDetailView.

Его назначение – вывод подробной информации о модели. Проще говоря, он выводит данные, содержащиеся в одной записи таблицы БД. Эти данные могут быть представлены как в виде экземпляра CModel, так и в виде ассоциативного массива.

Виджет создаёт таблицу с данными примерно такого вида.

cdetailview

Оформление можно изменять. На скриншоте показан вариант, который создаётся по-умолчанию. Виджет автоматически подключает CSS файл со стилями.

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

$this->widget('zii.widgets.CDetailView', array(
    'data'=>$model,
    'attributes'=>array(
		array(
			'label'=>'Capital',
			'type'=>'raw',
			'value'=>$capitalLink,
		),
		array(
			'label'=>'Continent',
			'type'=>'raw',
			'value'=>CHtml::link($model->Continent,
				array('country/continent', 'name'=>$model->Continent)),
		),
		'Region',
		'SurfaceArea:number:Area',
		'Population:number',
		'GovernmentForm:text:Government Form',
		'LocalName:text:Local Name',
		'Code2:text:Country Code',
	),
	'nullDisplay'=>'Unknown',
));

Наибольший интерес здесь представляют настройки виджета. Они передаются в виде ассоциативного массива.

Элемент data должен содержать все данные модели. В данном случае, они находятся в переменной $model.

В элементе attributes мы перечисляем все поля, которые вывести в таблице. При этом существует несколько форматов записи этих атрибутов.

Самый простой – просто указать его имя (например, Region). В этом случае в правой колонке таблице будет выведено название атрибута, а в левой – его значение. Тут следует учесть, что значение атрибута будет отформатировано с помощью класса CFormatter. По-умолчанию используется форматирование типа text, т.е. все HTML сущности будут заменены на их эскейп последовательности. Это означает, что, например, вы не сможете вывести ссылку.

Более сложный вариант – указать параметры в виде массива. При этом элемент label должен содержать текст, который будет отображаться в левой колонке, type – тип форматирования (например, raw означает отсутствие форматирования вообще) и value – значение. Этот вариант удобен, когда вам нужно предварительно каким-то образом обработать значение из базы. В данном примере эта обработка заключалась в создании ссылок.

Третий вариант – указать параметры в формате
«атрибут:тип_форматирования:надпись_в_левой_колонке»
Т.е. это просто сокращённая запись второго варианта.

Элемент nullDisplay содержит текст, который будет выводиться вместо значений, которые равны NULL.

Есть ещё ряд параметров, которые используются для оформления таблицы. Например, с помощью cssFile можно указать имя своего файла со стилями, itemTemplate содержит шаблон, с помощью которого формируется строка таблицы и т.д.

Я подробно их не рассматриваю. Вы можете открыть файл с исходниками компонента и посмотреть все public атрибуты. Значение любого из них можно изменить с помощью настроек. Вы просто создаёте в массиве элемент, ключ которого совпадает с именем нужного public атрибута и фреймворк сам его изменит. Это касается всех компонентов Yii.

Как видите, разобраться с компонентами zii не сложно. Комментариев, которые находятся в исходниках, вполне достаточно для работы.

В заключение хочу спросить. Насколько интересна тема компонентов zii? И о каких из них вы хотели бы почитать?

Интересное в Сети

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

Наши специалисты помогут вам выбрать и купить профессиональные пылесосы.

  • Александр

    вау, давно ваш сайт не посещал, зашёл посмотреть что новенькое появилось, не успел прочитать по Yii за 20 февраля, так тут же появилось новая 🙂
    Спасибо большое, что уделяете внимание фреймворку Yii, я сам его потихоньку изучаю, и хотелось по больше таких статей. Вот только сейчас у меня переломный момент с появлением новой версии 1.1 т.к. не сильно ещё разбираюсь, как тут же появилась новая версия, но уже со значительными изменениями. Но подхватываю я не сильно быстро.

  • Александр

    вау, давно ваш сайт не посещал, зашёл посмотреть что новенькое появилось, не успел прочитать по Yii за 20 февраля, так тут же появилось новая 🙂
    Спасибо большое, что уделяете внимание фреймворку Yii, я сам его потихоньку изучаю, и хотелось по больше таких статей. Вот только сейчас у меня переломный момент с появлением новой версии 1.1 т.к. не сильно ещё разбираюсь, как тут же появилась новая версия, но уже со значительными изменениями. Но подхватываю я не сильно быстро.

  • Александр

    кстати, хотел попросить если конечно будет время свободное уделить новой статьи как подключить шаблоннотизатор Smarty 3.0

    где-то на офф сайте в разделе расширения было выложено, но там на сколько помню старая версия, да и не так подробно расписано для новичка. Хотелось бы по подробное, и ещё как подключать виджеты ввиде плагина для смарти.

    • Я со Smarty практически не работал, поэтому вряд ли у меня получится хорошая статья на эту тему.

  • Александр

    кстати, хотел попросить если конечно будет время свободное уделить новой статьи как подключить шаблоннотизатор Smarty 3.0

    где-то на офф сайте в разделе расширения было выложено, но там на сколько помню старая версия, да и не так подробно расписано для новичка. Хотелось бы по подробное, и ещё как подключать виджеты ввиде плагина для смарти.

    • Я со Smarty практически не работал, поэтому вряд ли у меня получится хорошая статья на эту тему.

  • Sam

    zii — тема довольно интересная. Особенно для испытывающих трудности с API.

    Александр
    Рендерер для Smarty 2 моего авторства. Третья версия пока ещё бета и у неё много проблем, поэтому использовать её рановато.

    Расширение для второй версии можно взять тут.

    • Александр

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

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

      или она таже самая остаётся в случаи со смарти и без смарти?

      Вижу в классе смарти есть описание Yii::t(), как в шаблоне но может быть выглядеть?
      Да и последний вопросик, где должны располагаться .tpl шаблоны в какой директории?

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

      • Sam

        Остаётся та же.

        Весь функционал фреймфорка придётся оборачивать в плагины Smarty. Готового нет.

        Вообще лучше задать на форуме вопросы.

  • Sam

    zii — тема довольно интересная. Особенно для испытывающих трудности с API.

    Александр
    Рендерер для Smarty 2 моего авторства. Третья версия пока ещё бета и у неё много проблем, поэтому использовать её рановато.

    Расширение для второй версии можно взять тут.

    • Александр

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

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

      или она таже самая остаётся в случаи со смарти и без смарти?

      Вижу в классе смарти есть описание Yii::t(), как в шаблоне но может быть выглядеть?
      Да и последний вопросик, где должны располагаться .tpl шаблоны в какой директории?

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

      • Sam

        Остаётся та же.

        Весь функционал фреймфорка придётся оборачивать в плагины Smarty. Готового нет.

        Вообще лучше задать на форуме вопросы.

  • hyzhak

    Хотел получать на e-mail комментарии к єтой статье.
    Пришлось оставить ненужный комментарий.

  • hyzhak

    Хотел получать на e-mail комментарии к єтой статье.
    Пришлось оставить ненужный комментарий.

  • Работа с фремворками явно не для «простых смертных». Лучше сначала попробовать поискать готовое решение.

  • Работа с фремворками явно не для «простых смертных». Лучше сначала попробовать поискать готовое решение.

  • Angrycat

    Интересно и про zii и про всё остальное связанное с Yii. Потому как не так много практической информации, тем более на русском.

  • Angrycat

    Интересно и про zii и про всё остальное связанное с Yii. Потому как не так много практической информации, тем более на русском.

  • Спасибо, за краткую информацию на русском и за примеры.
    Пойду поковыряюсь в Yii

  • Спасибо, за краткую информацию на русском и за примеры.
    Пойду поковыряюсь в Yii

  • Stalingrad

    На русском вообще информации мало! Очень сложно что либо изучать без знания английского! Я сейчас долбаю CI и издали посматриваю на Yii. От Yii меня отталкивает код (не красивый) 8)

    • Angrycat

      Я согласен, что без английского трудно. В принципе по-английски читаю, но всегда приятнее видеть толковые материалы на родном.

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

  • Stalingrad

    На русском вообще информации мало! Очень сложно что либо изучать без знания английского! Я сейчас долбаю CI и издали посматриваю на Yii. От Yii меня отталкивает код (не красивый) 8)

    • Angrycat

      Я согласен, что без английского трудно. В принципе по-английски читаю, но всегда приятнее видеть толковые материалы на родном.

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

  • Скажите, как лучше всего поменять формат даты в пределах одного виджета, если оно выводится через datetime.

    • Упс, невнимательно ваш код посмотрел.
      array('value' => date('Y-m-d H:i:s',$model->datetime)),

      • Наверно более правильно будет вместо 'value' => date использовать
        'value'=>Yii::app()->dateFormatter->format

        • Да, вы правы.
          Для этого примера разницы нет, но если нужна поддержка форматов даты для разных стран, то CDateFormatter удобнее.

  • Скажите, как лучше всего поменять формат даты в пределах одного виджета, если оно выводится через datetime.

    • Упс, невнимательно ваш код посмотрел.
      array('value' => date('Y-m-d H:i:s',$model->datetime)),

  • Целиком и полностью присоединяюсь. Ибо очень хороший пост. Даже добавил в закладочник. 🙂 Рекомендую для этих целей моеместо.ру

  • Целиком и полностью присоединяюсь. Ибо очень хороший пост. Даже добавил в закладочник. 🙂 Рекомендую для этих целей моеместо.ру

  • Lamname

    сайт просто чума)) сделал себе сайт , здесь все что нужно, все ясно и понятно!
    Автору огромное спасибо