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

Блог. Yii. Подсказки по yii. Глава четвёртая.

Поиск

Ещё небольшая подборка рецептов при разработке на фреймворке Yii.

  1. Своя функция - валидатор на примере капчи.

    В модели пишем:

     

    1. public function rules() {  
    2.     return array(  
    3.         ...  
    4.         array('verifyCode''required''on' => 'registration'),  
    5.         array('verifyCode''captchaValidate''on' => 'registration'),  
    6.     )  
    7. }     
    8.   
    9. public function captchaValidate() {  
    10.     $code = Yii::app()->controller->createAction('captcha')->getVerifyCode();  
    11.     if ($code != $this->verifyCode)  
    12.         $this->addError('verifyCode''Неверный код с капчи');  
    13. }  

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

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

  2. Расширяем своё приложение на примере многоразового использования одного расширения для однотипных действий, на примере удаления записи.

    В protected/extensions/ создайте новую папку test, в ней файл testActionDelele.php с таким содержанием:

     

    1. <?php  
    2. class testActionDelele extends CAction {  
    3.     public $modelName;  
    4.     public $redirectAfter = array('index');  
    5.   
    6.     public function run($id = null) {  
    7.         if (id) {  
    8.             CActiveRecord::model($this->modelName)->deleteByPk($id);  
    9.         }  
    10.           
    11.         if(Yii::app()->getRequest()->getIsAjaxRequest()) {  
    12.             Yii::app()->end(200, true);  
    13.         }  
    14.         else {  
    15.             $this->getController()->redirect($this->redirectAfter);  
    16.         }  
    17.     }  
    18. }  

    Затем создадим контроллер protected/controllers/testController.php:

     

    1. <?php  
    2. class testController extends CController {  
    3.     public function actions() {  
    4.         return array(  
    5.             'deleteUser' => array(  
    6.                 'class' => 'ext.test.testActionDelele',  
    7.                 'modelName' => 'User',  
    8.                 'redirectAfter' => array('indexUsers'),  
    9.             ),  
    10.             'deletePost' => array(  
    11.                 'class' => 'ext.test.testActionDelele',  
    12.                 'modelName' => 'Post',  
    13.                 'redirectAfter' => array('indexPosts'),  
    14.             ),  
    15.         );  
    16.     }  
    17.     ...  
    18. }  

    Теперь при обращении /test/deleteUser/{$id}/ или /test/deletePost/{$id}/ будет удалён пользователь или запись соответственно, а после удаления - редирект на указанную в ключе 'redirectAfter' страницу.

  3. Jquery не работает после renderPartial.

    Например, при клике на ссылку у вас открывается новое окно в FancyBox, а на этой странице есть какой-будь datePicker.

    Чтобы datePicker заработал необходимо в контроллере написать примерно так:

     

    1. if($isFancyBox){  
    2.     Yii::app()->clientscript->scriptMap['jquery.js'] = false;  
    3.     Yii::app()->clientscript->scriptMap['jquery.min.js'] = false;  
    4.     Yii::app()->clientscript->scriptMap['jquery-ui.min.js'] = false;  
    5.       
    6.     $this->renderPartial('form', array(  
    7.         'model' => $model,  
    8.     ), falsetrue);  
    9.       
    10. else{  
    11.     $this->render('form', array(  
    12.         'model' => $model,  
    13.     ));  
    14. }  

    scriptMap - массив, служащий для подмены зарегистрированных *.css или .js файлов при рендеринге страницы.

    Для понимания ещё пример:

     

    1. Yii::app()->clientScript->scriptMap=array(  
    2.     'jquery.js'=>'https://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js',  
    3.     'jquery.min.js'=>'https://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js',  
    4.     'style.css'=>'/css/all.css'  
    5. );  
  4. Фильтры. На примере сжатия страницы.

    В protected/extensions/ создайте новую папку compress, в ней файл compressPage.php с таким содержимым:

     

    1. <?php  
    2. class compressPage extends CFilter {  
    3.     protected function preFilter($filterChain) {  
    4.         ob_start();  
    5.         return parent::preFilter($filterChain);  
    6.     }  
    7.       
    8.     protected function postFilter($filterChain) {  
    9.         $html = ob_get_clean();  
    10.         echo preg_replace("~>(\s+|\t+|\n+)<~""><", $html);  
    11.         parent::postFilter($filterChain);  
    12.     }  
    13. }  

    в контроллер, например: SiteController.php, допишите:

     

    1. ...   
    2. public function filters() {  
    3.     return array(  
    4.         array(  
    5.             'ext.compress.compressPage + view, index'  
    6.         ),  
    7.     );  
    8. }  
    9. ...  

    Теперь поглядите на исходный код страницы :-)

    "+ view, index" означают, что фильтр будет применён к действиям view и index.

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