Показать страницуИстория страницыСсылки сюдаCopy this pageExport to MarkdownODT преобразованиеНаверх Вы загрузили старую версию документа! Сохранив её, вы создадите новую текущую версию с этим содержимым. Медиафайлы{{tag>Yii2 jquery ajax csrfToken url html view urlmanager activerecord docs}} ====== Документация по Yii 2 Framework ====== ===== Configuration ===== ===== URL Management ===== <code php> echo \Yii::$app->urlManager->createUrl(['site/page', 'id' => 'about']); // /index.php/site/page/id/about/ echo \Yii::$app->urlManager->createUrl(['date-time/fast-forward', 'id' => 105]) // /index.php?r=date-time/fast-forward&id=105 echo \Yii::$app->urlManager->createAbsoluteUrl('blog/post/index'); // http://www.example.com/index.php/blog/post/index/ </code> ==== Конфигурация ==== <code php> <?php return [ // ... 'components' => [ 'urlManager' => [ 'enablePrettyUrl' => true, 'showScriptName' => false, 'enableStrictParsing' => true, 'suffix' => '.html', 'rules' => [ '<action:(login|logout|about)>' => 'site/<action>', // ... ['class' => 'app\components\CarUrlRule', 'connectionID' => 'db', ...], ], ], ], ]; </code> ==== Url ==== === yii\helpers\Url::toRoute === <code php> echo Url::toRoute([''], $schema = false); // currently active route echo Url::toRoute(['view', 'id' => 'contact'], $schema = false); // same controller, different action echo Url::toRoute(['post/index'], $schema = false); // same module, different controller and action echo Url::toRoute(['/site/index'], $schema = false); // absolute route no matter what controller is making this call echo Url::toRoute(['post/read', 'id' => 100, '#' => 'title'], $schema = false) </code> <code php> echo Url::toRoute('', $schema = false); // currently active route echo Url::toRoute('post/index', $schema = false); // same module, different controller and action echo Url::toRoute('/site/index', $schema = false); // absolute route no matter what controller is making this call </code> === yii\helpers\Url::to === <code php> echo Url::to('', $schema = false); // currently active route echo Url::to('post/index', $schema = false); // same module, different controller and action echo Url::to('/site/index', $schema = false); // absolute route no matter what controller is making this call </code> <code php> echo Url::to('@web', $schema = false); echo Url::canonical(); // get canonical URL for the curent page echo Url::home(); // get home URL echo Url::remember(); // save URL to be used later echo Url::previous(); // get previously saved URL </code> * **$schema = true** - Абсолютный адрес * **$schema = 'https'** - Указание на испоользование шифрованного протокола Синоним для yii\helpers\Url::toRoute <code php> echo Url::to([''], $schema = false); // currently active route echo Url::to(['view', 'id' => 'contact'], $schema = false); // same controller, different action echo Url::to(['post/index'], $schema = false); // same module, different controller and action echo Url::to(['/site/index'], $schema = false); // absolute route no matter what controller is making this call echo Url::to(['post/read', 'id' => 100, '#' => 'title'], $schema = false) </code> Примеры использоватия можно глянуть в тестах https://github.com/yiisoft/yii2/blob/master/tests/unit/framework/helpers/UrlTest.php === yii\helpers\Html::url (old) === <code php> echo Html::url(['']); // currently active route echo Html::url(['view', 'id' => 'contact']); // same controller, different action echo Html::url(['post/index']); // same module, different controller and action echo Html::url(['/site/index']); // absolute route no matter what controller is making this call echo Html::url(['post/read', 'id' => 100, '#' => 'title']) </code> <code php> echo Html::url(''); // currently active route echo Html::url('post/index'); // same module, different controller and action echo Html::url('/site/index'); // absolute route no matter what controller is making this call </code> вместо старых методов нада использовать **yii\helpers\Url::to** Примеры использоватия можно глянуть в тестах https://github.com/yiisoft/yii2/blob/master/tests/unit/framework/helpers/UrlTest.php ==== createUrl ==== <code php> echo $this->createUrl([''], $schema = null); // currently active route echo $this->createUrl(['view', 'id' => 'contact'], $schema = null); // same controller, different action echo $this->createUrl(['post/index'], $schema = null); // same module, different controller and action echo $this->createUrl(['/site/index'], $schema = null); // absolute route no matter what controller is making this call echo $this->createUrl(['post/read', 'id' => 100, '#' => 'title'], $schema = null) </code> <code php> echo $this->createUrl('', $schema = null); // currently active route echo $this->createUrl('post/index', $schema = null); // same module, different controller and action echo $this->createUrl('/site/index', $schema = null); // absolute route no matter what controller is making this call </code> === createAbsoluteUrl (old) === Усли $this - это yii\web\Controller <code php> echo $this->createAbsoluteUrl([''], $schema = null); // currently active route echo $this->createAbsoluteUrl(['view', 'id' => 'contact'], $schema = null); // same controller, different action echo $this->createAbsoluteUrl(['post/index'], $schema = null); // same module, different controller and action echo $this->createAbsoluteUrl(['/site/index'], $schema = null); // absolute route no matter what controller is making this call echo $this->createAbsoluteUrl(['post/read', 'id' => 100, '#' => 'title'], $schema = null) </code> вместо старых методов надо использовать **yii\helpers::toRoute** Усли $this - это yii\web\Controller <code php> echo $this->createAbsoluteUrl('', $schema = null); // currently active route echo $this->createAbsoluteUrl('post/index', $schema = null); // same module, different controller and action echo $this->createAbsoluteUrl('/site/index', $schema = null); // absolute route no matter what controller is making this call </code> вместо старых методов надо использовать **yii\helpers::toRoute** ==== Request ==== === GET === <code php> Yii::$app->request->get(); Yii::$app->request->getQueryParams(); Yii::$app->request->getQueryParam('File'); Yii::$app->request->get('File'); </code> === POST === <code php> Yii::$app->request->post(); Yii::$app->request->getBodyParams(); Yii::$app->request->getBodyParam('File'); Yii::$app->request->post('File'); </code> ===== View ===== ==== CSS ==== <code php> $this->registerCssFile(); </code> ==== JS ==== <code php> $this->registerJsFile(); </code> === Вставка кода внутри представления === В примере производится вставка JS кода из assets c применением переменной в скрипте JS_FABRIC_CAR_URL <code php> $this = Yii::$app->view; </code> <code php> <?php $this->registerJs('var JS_FABRIC_CAR_URL = "' . Html::url(['/core/ajax/fabric-car']) . '";', View::POS_HEAD, 'js-fabric-car-url'); $publish = Yii::$app->assetManager->publish(Yii::getAlias('@app/modules/core/assets/js')); $this->registerJsFile($publish[1] . '/block-select-car.js', [yii\web\JqueryAsset::className()], ['position'=>View::POS_END]); ?> </code> ==== assetManager ==== <code php> 'components' => [ 'assetManager' => [ 'class' => 'yii\web\AssetManager', 'forceCopy' => true, ], ], </code> * forceCopy - Включает постоянное обновление асетов === через ajaxSetup === Добавление csrfToken в Ajax запрос (Yii2) <code php> $js_global_variables = ' $.ajaxSetup({ data: ' . \yii\helpers\Json::encode([ \yii::$app->request->csrfParam => \yii::$app->request->csrfToken, ]) . ' });' . PHP_EOL; $this->registerJs($js_global_variables, yii\web\View::POS_HEAD, 'js_global_variables'); </code> или через header <code php> $js_global_variables = ' $.ajaxPrefilter(function( options ) { if ( !options.beforeSend) { options.beforeSend = function (xhr) { xhr.setRequestHeader("HTTP_X_CSRF_TOKEN", ' . \yii::$app->request->csrfToken .'); } } });' . PHP_EOL; $this->registerJs($js_global_variables, yii\web\View::POS_HEAD, 'js_global_variables'); </code> или через JQuery <code js> $.ajax({ url: 'http://site?controller/action', type: 'post', data: {payload: payload, _csrf: yii.getCsrfToken()}, dataType: 'json', }).success(function(response) { }); </code> ===== Controller ===== ==== Как программно вызвать контроллер? ==== <code php> $className = 'backend\controllers\SiteController'; $controller = Yii::createObject($className, [$id, $this]); </code> ==== yii\helpers\Html (old) ==== <code php> // ['label' => 'Добавление', 'url' => ['/admin/user/create']] Html::a("Log in here", ["user/reset", "hash" => $hash, "sid" => $sid]); Html::url(["user/reset", "hash" => $hash, "sid" => $sid]); </code> **Подробно** https://github.com/yiisoft/yii2/blob/master/docs/guide/url.md ===== Session ===== <code php> Yii::$app->session->get('key'); Yii::$app->session->set('key', 'value'); </code> ==== setFlash ==== В контролере <code php> Yii::$app->session->setFlash('info', $shell->output); return $this->redirect('/site'); </code> return делать обязательно. инчаче после редиректа сообщение не выведется Вывод стандартным способом <code php> <?php foreach (Yii::$app->session->getAllFlashes() as $key => $message) { echo '<div class="alert alert-' . $key . '">' . $message . '</div>'; } ?> </code> Вывод с помощью виджета [[https://github.com/loveorigami/yii2-notification-wrapper|loveorigami/yii2-notification-wrapper]] <code php> <?= Wrapper::widget([ 'layerClass' => 'lo\modules\noty\layers\Noty', ]);?> </code> Данный виджет поддерживает большое кол-во виджетов обображения таких как: | Library (Layer) | Bower | Project homepage | Docs | | Bootstrap Alert | - | http://getbootstrap.com/components/#alerts | docs/Alert.md | | Bootstrap Notify | remarkable-bootstrap-notify | https://github.com/mouse0270/bootstrap-notify | docs/BootstrapNotify.md | | Growl | jquery-growl | https://github.com/ksylvest/jquery-growl | docs/Growl.md | | iGrowl | igrowl | https://github.com/catc/iGrowl | docs/Igrowl.md | | jQuery Notify | jquery.notify | https://github.com/CreativeDream/jquery.notify | docs/JqueryNotify.md | | jQuery Notify Bar | jqnotifybar | https://github.com/dknight/jQuery-Notify-bar | docs/JqueryNotifyBar.md | | jQuery Toaster | jquery.toaster | https://github.com/scottoffen/jquery.toaster | docs/JqueryToaster.md | | jQuery Toast Plugin | jquery-toast-plugin | https://github.com/kamranahmedse/jquery-toast-plugin | docs/JqueryToastPlugin.md | | Lobibox | lobibox | https://github.com/arboshiki/lobibox | docs/Lobibox.md | | Notie | notie | https://github.com/jaredreich/notie | docs/Notie.md | | Notific8 | notific8 | https://github.com/ralivue/notific8 | docs/Notific8.md | | NotifIt | notifit | https://github.com/naoxink/notifIt | docs/NotifIt.md | | Notify.js | notifyjs | https://github.com/notifyjs/notifyjs | docs/Notifyjs.md | | Noty | noty | https://github.com/needim/noty | docs/Noty.md | | PNotify | pnotify | https://github.com/sciactive/pnotify | docs/PNotify.md | | Sweetalert | sweetalert | https://github.com/t4t5/sweetalert | docs/Sweetalert.md | | Toastr | toastr | https://github.com/CodeSeven/toastr | docs/Toastr.md | ===== Console ===== ==== IsConsole ==== <code php> if(Yii::$app->request->isConsoleRequest){ // } </code> ===== Cache ===== <code php> // Создать зависимость от времени модификации файла example.txt. $dependency = new \yii\caching\FileDependency(['fileName' => 'example.txt']); // Данные устаревают через 30 секунд. // Данные могут устареть и раньше, если example.txt будет изменён. $cache->set($key, $data, 30, $dependency); // Кэш будет проверен, если данные устарели. // Он также будет проверен, если указанная зависимость была изменена. // Вернется false, если какое-либо из этих условий выполнено. $data = $cache->get($key); </code> ==== Зависимости ==== * [[yii\caching\ChainedDependency]]: зависимость меняется, если любая зависимость в цепочке изменяется; * [[yii\caching\DbDependency]]: зависимость меняется, если результат некоторого определенного SQL запроса изменён; * [[yii\caching\ExpressionDependency]]: зависимость меняется, если результат определенного PHP выражения изменён; * [[yii\caching\FileDependency]]: зависимость меняется, если изменилось время последней модификации файла; * [[yii\caching\TagDependency]]: Связывает кэшированные данные элемента с одним или несколькими тегами. Вы можете аннулировать кэширование данных элементов с заданным тегом(тегами) по вызову. [[yii\caching\TagDependency::invalidate()]]; ==== Кэширование запросов ==== <code php> $result = $db->cache(function ($db) { // Результат SQL запроса будет возвращен из кэша если // кэширование запросов включено и результат запроса присутствует в кэше return $db->createCommand('SELECT * FROM customer WHERE id=1')->queryOne(); }); $result = Customer::getDb()->cache(function ($db) { return Customer::find()->where(['id' => 1])->one(); }); </code> <code php> $duration = 60; // кэширование результата на 60 секунд $dependency = ...; // параметры зависимости $result = $db->cache(function ($db) { // ... выполнять SQL запросы здесь ... return $result; }, $duration, $dependency); </code> <code php> $result = $db->cache(function ($db) { // SQL запросы, которые используют кэширование $db->noCache(function ($db) { // SQL запросы, которые не используют кэширование }); // ... return $result; }); </code> <code php> // использовать кэширование запросов и установить срок действия кэша на 60 секунд $customer = $db->createCommand('SELECT * FROM customer WHERE id=1')->cache(60)->queryOne(); </code> <code php> $result = $db->cache(function ($db) { // Используется кэширование SQL запросов // не использовать кэширование запросов для этой команды $customer = $db->createCommand('SELECT * FROM customer WHERE id=1')->noCache()->queryOne(); // ... return $result; }); </code> ===== Локализация - i18N/intl ===== apt=get install php5-intl ===== Статьи ===== * https://github.com/yiisoft/yii2/blob/master/docs/guide-ru/caching-data.md * https://gist.github.com/jkovacs618/ab225ecadf55cb1feca9 * http://habrahabr.ru/post/208328/ ===== Описание ===== * https://github.com/yiisoft/yii2/blob/master/docs/guide/i18n.md#advanced-placeholder-formatting * http://userguide.icu-project.org/formatparse/messages * http://icu-project.org/apiref/icu4c/classMessageFormat.html СохранитьПросмотрРазличияОтменить Сводка изменений Примечание: редактируя эту страницу, вы соглашаетесь на использование своего вклада на условиях следующей лицензии: CC0 1.0 Universal