Создание и сопровождение сайтов

Блог. Yii. Подсказки по Yii. Глава девятнадцатая

Поиск

Подсказки по Yii. Глава девятнадцатая.

  1. Использование CHtml::listData.

    Имеется запрос:

    1. $ids = array(18, 19, 20, 21);  
    2. $sql = 'SELECT id_object, COUNT(id) as count FROM {{images}} WHERE id_object IN ('.implode(','$ids).') GROUP BY id_object';  
    3. $res = Yii::app()->db->createCommand($sql)->queryAll();  

    Результатом выполнения запроса будет следующий массив:

    1. Array  
    2. (  
    3.     [0] => Array  
    4.         (  
    5.             [id_object] => 18  
    6.             [count] => 3  
    7.         )  
    8.   
    9.     [1] => Array  
    10.         (  
    11.             [id_object] => 19  
    12.             [count] => 3  
    13.         )  
    14.   
    15.     [2] => Array  
    16.         (  
    17.             [id_object] => 20  
    18.             [count] => 4  
    19.         )  
    20.   
    21.     [3] => Array  
    22.         (  
    23.             [id_object] => 21  
    24.             [count] => 2  
    25.         )  
    26. )  

    Задача: вернуть массив, в котором ключами будут id_object, а значениями ключей будет count.

    Конечно, можно использовать циклы foreach / for / while ...

    Однако, фреймворк Yii тем и хорош, что в нём много "магических" методов.

    Всё, что потребуется - это вставить строку кода:

    1. return CHtml::listData($res'id_object''count');  

    В результате получится массив, который нам нужен:

    1. Array  
    2. (  
    3.     [18] => 3  
    4.     [19] => 3  
    5.     [20] => 4  
    6.     [21] => 2  
    7. )  

     

  2. Вывод ошибок валидации в блоке, который можно закрыть.

    Практическое применение: мобильная версия сайта/адаптивный дизайн, где видимая область экрана ограничена. Поэтому пользователь, прочитав описание ошибок, может скрыть их. Тем самым опять вернуть обзор "полезной" части сайта.

    Если в проекте используется Yii BootStrap, то вместо:

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

    пропишем:

    1. <?php  
    2. if (CHtml::errorSummary($model)) {  
    3.     Yii::app()->user->setFlash('error', CHtml::errorSummary($model));  
    4.     $this->widget('bootstrap.widgets.TbAlert');  
    5. }  
    6. ?>  

    Это позволит по "крестику" закрывать список ошибок.

    Если в проекте Yii BootStrap не используется - ничего страшного, сами добавим нужный функционал:

    Вместо:

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

    пропишем:

    1. <?php if (CHtml::errorSummary($model)) :?>  
    2.     <div class="error-block">  
    3.         <a class="close" href="javascript:void(0);">×</a>  
    4.   
    5.         <?php echo CHtml::errorSummary($model);?>  
    6.     </div>  
    7.   
    8.     <?php  
    9.     $css=<<<EOT  
    10.     .error-block, .error-block .errorSummary { background-color: #DE6D6B !important; color: #FFFFFF; }  
    11.     .error-block .close { float: right; font-size: 22px;  position: relative;  right: 9px;  text-decoration: none; top: 1px;}  
    12. EOT;  
    13.     Yii::app()->clientScript->registerCss('inline.css'$css);  
    14.   
    15.     Yii::app()->clientScript->registerScript('close-action'" 
    16.         $('.error-block .close').click( function(){ $(this).parent().fadeOut(500); }); 
    17.     ", CClientScript::POS_END);  
    18.     ?>  
    19. <?php endif;?>  

     

  3. CListView. Передача дополнительных параметров в представление.

    В коде есть вызов CListView:

    1. $this->widget('zii.widgets.CListView'array(  
    2.     'dataProvider' => $dataProvider,  
    3.     'itemView' => '_view',  
    4.     'itemsTagName' => 'ol',  
    5.     'itemsCssClass' => 'advertising-blocks',  
    6.     'sortableAttributes' => array(  
    7.         'position',  
    8.         'type',  
    9.         'active',  
    10.     ),  
    11. ));  

    Необходимо в представлении _view.php, кроме объекта $data, знать значение текста в переменной $text.

    Для этого добавим viewData:

    1. 'viewData' => array('text' => 'Здесь некий текст'),  

    Вызов примет вид:

    1. $this->widget('zii.widgets.CListView'array(  
    2.     'dataProvider' => $dataProvider,  
    3.     'viewData' => array('text' => 'Здесь некий текст'),  
    4.     'itemView' => '_view',  
    5.     'itemsTagName' => 'ol',  
    6.     'itemsCssClass' => 'advertising-blocks',  
    7.     'sortableAttributes' => array(  
    8.         'position',  
    9.         'type',  
    10.         'active',  
    11.     ),  
    12. ));  

    Теперь, в представлении можно отобразить значение переменной $text.

    Также, можно воспользоваться "клипом". Для этого в контроллере пропишем:

    1. $this->beginClip('testClip');  
    2. echo 'Здесь некий текст';  
    3. $this->endClip();  

    А в представлении _view.php добавим код:

    1. <?php  
    2. if (isset($this->clips['testClip']) && !empty($this->clips['testClip'])) {  
    3.     echo $this->clips['testClip'];  
    4. }  
    5. ?>  

     

  4. CViewAction. Статические страницы в Yii.

    Для примера возьмём скрипт для сайта-визитки Open Business Card.

    Создадим в директории protected/views папку staticpages.

    В эту папку добавим два файла: staticpage1.php и staticpage2.php.

    Содержимое файла staticpage1.php:

    1. <p>Это пример статической страницы #1.</p>  
    2. <p>Такая страница редактируется в текстовом редакторе.</p>  

    Содержимое файла staticpage2.php:

    1. <p>Это пример статической страницы #2.</p>  

    В файле protected/controllers/SiteController.php заменим код:

    1. public function actions() {  
    2.     return array(  
    3.         // captcha action renders the CAPTCHA image displayed on the contact page  
    4.         'captcha' => array(  
    5.             'class' => 'MathCCaptchaAction',  
    6.             'backColor' => 0xFFFFFF,  
    7.         ),  
    8.         // page action renders "static" pages stored under 'protected/views/site/pages'  
    9.         // They can be accessed via: index.php?r=site/page&view=FileName  
    10.         'page' => array(  
    11.             'class' => 'CViewAction',  
    12.         ),  
    13.     );  
    14. }  

    на:

    1. public function actions() {  
    2.     return array(  
    3.         // captcha action renders the CAPTCHA image displayed on the contact page  
    4.         'captcha' => array(  
    5.             'class' => 'MathCCaptchaAction',  
    6.             'backColor' => 0xFFFFFF,  
    7.         ),  
    8.         // page action renders "static" pages stored under 'protected/views/site/pages'  
    9.         // They can be accessed via: index.php?r=site/page&view=FileName  
    10.         'staticpage' => array(  
    11.             'class' => 'CViewAction',  
    12.             'basePath' => 'application.views.staticpages', # директория, в которой находятся статические страницы.  
    13.             'renderAsText' => true, # в противном случае будет обрабатываться PHP-код, если он есть на странице.  
    14.             'defaultView' => 'staticpage1', # страница по-умолчанию  
    15.             'layout' => '//layouts/user', # макет для статических страниц. Если указано null, то страница будет без макета  
    16.         ),  
    17.     );  
    18. }  

    Теперь можно вызывать статические страницы таким образом:

    http://site_domain/site/staticpage/view/staticpage1 и http://site_domain/site/staticpage/view/staticpage2

    Ссылки не совсем красивые. Исправим это.

    В файл protected/config/main.php добавим правило (секция urlManager):

    1. 'statpage/<view:(staticpage1|staticpage2)>' => array('site/staticpage'),  

    Теперь статические страницы вызываются так:

    http://site_domain/statpage/staticpage1 и http://site_domain/statpage/staticpage2

     

Обсудить статью на форуме