Ещё небольшая подборка рецептов при разработке на фреймворке Yii.
-
Своя функция - валидатор на примере капчи.
В модели пишем:
- public function rules() {
- return array(
- ...
- array('verifyCode', 'required', 'on' => 'registration'),
- array('verifyCode', 'captchaValidate', 'on' => 'registration'),
- )
- }
-
- public function captchaValidate() {
- $code = Yii::app()->controller->createAction('captcha')->getVerifyCode();
- if ($code != $this->verifyCode)
- $this->addError('verifyCode', 'Неверный код с капчи');
- }
При валидации капчи будет вызван метод captchaValidate, в котором мы можем "задавать свои пути развития событий".
Например, получили версию браузера пользователя. Не понравился - всегда выводим сообщение "Неверный код с капчи".
-
Расширяем своё приложение на примере многоразового использования одного расширения для однотипных действий, на примере удаления записи.
В protected/extensions/ создайте новую папку test, в ней файл testActionDelele.php с таким содержанием:
- <?php
- class testActionDelele extends CAction {
- public $modelName;
- public $redirectAfter = array('index');
-
- public function run($id = null) {
- if (id) {
- CActiveRecord::model($this->modelName)->deleteByPk($id);
- }
-
- if(Yii::app()->getRequest()->getIsAjaxRequest()) {
- Yii::app()->end(200, true);
- }
- else {
- $this->getController()->redirect($this->redirectAfter);
- }
- }
- }
Затем создадим контроллер protected/controllers/testController.php:
- <?php
- class testController extends CController {
- public function actions() {
- return array(
- 'deleteUser' => array(
- 'class' => 'ext.test.testActionDelele',
- 'modelName' => 'User',
- 'redirectAfter' => array('indexUsers'),
- ),
- 'deletePost' => array(
- 'class' => 'ext.test.testActionDelele',
- 'modelName' => 'Post',
- 'redirectAfter' => array('indexPosts'),
- ),
- );
- }
- ...
- }
Теперь при обращении /test/deleteUser/{$id}/ или /test/deletePost/{$id}/ будет удалён пользователь или запись соответственно, а после удаления - редирект на указанную в ключе 'redirectAfter' страницу.
-
Jquery не работает после renderPartial.
Например, при клике на ссылку у вас открывается новое окно в FancyBox, а на этой странице есть какой-будь datePicker.
Чтобы datePicker заработал необходимо в контроллере написать примерно так:
- if($isFancyBox){
- Yii::app()->clientscript->scriptMap['jquery.js'] = false;
- Yii::app()->clientscript->scriptMap['jquery.min.js'] = false;
- Yii::app()->clientscript->scriptMap['jquery-ui.min.js'] = false;
-
- $this->renderPartial('form', array(
- 'model' => $model,
- ), false, true);
-
- } else{
- $this->render('form', array(
- 'model' => $model,
- ));
- }
scriptMap - массив, служащий для подмены зарегистрированных *.css или .js файлов при рендеринге страницы.
Для понимания ещё пример:
- Yii::app()->clientScript->scriptMap=array(
- 'jquery.js'=>'https://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js',
- 'jquery.min.js'=>'https://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js',
- 'style.css'=>'/css/all.css'
- );
-
Фильтры. На примере сжатия страницы.
В protected/extensions/ создайте новую папку compress, в ней файл compressPage.php с таким содержимым:
- <?php
- class compressPage extends CFilter {
- protected function preFilter($filterChain) {
- ob_start();
- return parent::preFilter($filterChain);
- }
-
- protected function postFilter($filterChain) {
- $html = ob_get_clean();
- echo preg_replace("~>(\s+|\t+|\n+)<~", "><", $html);
- parent::postFilter($filterChain);
- }
- }
в контроллер, например: SiteController.php, допишите:
- ...
- public function filters() {
- return array(
- array(
- 'ext.compress.compressPage + view, index'
- ),
- );
- }
- ...
Теперь поглядите на исходный код страницы :-)
"+ view, index" означают, что фильтр будет применён к действиям view и index.
Обсудить статью на форуме