Собственные ссылки в yii2. Как?
Re: Собственные ссылки в yii2. Как?
Я так понял никто не в курсе почему не исполняется init?
Re: Собственные ссылки в yii2. Как?
то, что вы говорите, что init не выполняется, это еще "бабка на двое сказала".Matthew писал(а):Я так понял никто не в курсе почему не исполняется init?
init() выполняется в любом инициализирующемся классе, унаследованном от object. Если не выполняется, значит, класс не инициализируется.
- mihail_dev
- Сообщения: 243
- Зарегистрирован: 2013.07.17, 00:51
- Откуда: Молдова
- Контактная информация:
Re: Собственные ссылки в yii2. Как?
можно увидеть ваш класс и то как вы его подключаете в конфиг фаиле
Re: Собственные ссылки в yii2. Как?
Вот часть конфига:
Вот класс:
Я пробовал по всякому, и через точку остановки и echo, просто ничего не происходит. Init не выполняется и то что в нем соответственно.
Код: Выделить всё
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'controllerNamespace' => 'frontend\controllers',
'components' => [
'user' => [
'identityClass' => 'common\models\User',
'enableAutoLogin' => true,
],
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules'=> [
// 'register' => 'user/index',
['class' => 'frontend\components\Pages\PagesUrlRule'],
],
],
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
'errorHandler' => [
'errorAction' => 'site/error',
],
Код: Выделить всё
namespace frontend\components\Pages;
use frontend\models\Pages\Pages;
use yii\helpers\ArrayHelper;
use yii\web\UrlRule;
class PagesUrlRule extends UrlRule
{
private $_db_rules;
public function init()
{
if ($this->name === null) {
$this->name = __CLASS__;
}
$this->prepareData();
}
private function prepareData()
{
$pages = Pages::find()->asArray(true)->all();
$this->_db_rules = ArrayHelper::map($pages, 'route', 'alias');
}
public function createUrl($manager, $route, $params)
{
/*$model = Pages::find()->select('alias')->where(['route' => $route])->one()->alias;
if ($model) {
return $model;
}*/
return false; // это правило не подходит
}
public function parseRequest($manager, $request)
{
/*$pathInfo = $request->getPathInfo();
if (preg_match('%^(\w+)(/(\w+))?$%', $pathInfo, $matches)) {
$route = Pages::find()->select('route')->where(['alias' => $pathInfo])->one()->route;
$params= array();
if($route) {
return [$route, $params];
}
}*/
return false; // это правило не подходит
}
}
- mihail_dev
- Сообщения: 243
- Зарегистрирован: 2013.07.17, 00:51
- Откуда: Молдова
- Контактная информация:
Re: Собственные ссылки в yii2. Как?
ясно ты неверно делаешь данный класс обрабатывает только одно правило!
тебе надо как то так сделать
тебе надо как то так сделать
Код: Выделить всё
<?php
namespace frontend\components\Pages;
use frontend\models\Pages\Pages;
use yii\caching\DbDependency;
use yii\web\CompositeUrlRule;
use yii\web\UrlRuleInterface;
use yii\base\InvalidConfigException;
/**
* Class PagesUrlRule
*
* @package frontend\components\Pages
*/
class PagesUrlRule extends CompositeUrlRule{
public $cacheComponent = 'cache';
public $cacheID = 'PagesUrlRules';
public $ruleConfig = ['class' => 'yii\web\UrlRule'];
/**
* Creates the URL rules that should be contained within this composite rule.
*
* @return \yii\web\UrlRuleInterface[] the URL rules
* @throws \yii\base\InvalidConfigException
*/
protected function createRules()
{
$cache = \Yii::$app->get($this->cacheComponent)->get($this->cacheID);
if(!empty($cache))
return $cache;
$pages = Pages::find()->asArray(true)->all();
$rules = [];
foreach ($pages as $page) {
$rule = [
'pattern' => ltrim($page->alias, '/'),
'route' => ltrim($page->route, '/'),
];
$rule = \Yii::createObject(array_merge($this->ruleConfig, $rule));
if (!$rule instanceof UrlRuleInterface) {
throw new InvalidConfigException('URL rule class must implement UrlRuleInterface.');
}
$rules[] = $rule;
}
$cd= new DbDependency();
$cd->sql='SELECT MAX(id) FROM '.Pages::tableName();
\Yii::$app->get($this->cacheComponent)->set($this->cacheID, $rules, 0, $cd);
return $rules;
}
}
Re: Собственные ссылки в yii2. Как?
Такой реализации еще не видел, мало опыта мало(
А ты бы не мог пояснить мне немного что здесь происходит?
Немного не понимаю вот этот кусок кода:
А дальше что делать? Как этим воспользоваться? Сори если тупые вопросы, самому трудно учиться(
А ты бы не мог пояснить мне немного что здесь происходит?
Немного не понимаю вот этот кусок кода:
Код: Выделить всё
$rules = [];
foreach ($pages as $page) {
$rule = [
'pattern' => ltrim($page->alias, '/'),
'route' => ltrim($page->route, '/'),
];
$rule = \Yii::createObject(array_merge($this->ruleConfig, $rule));
if (!$rule instanceof UrlRuleInterface) {
throw new InvalidConfigException('URL rule class must implement UrlRuleInterface.');
}
$rules[] = $rule;
}
$cd= new DbDependency();
$cd->sql='SELECT MAX(id) FROM '.Pages::tableName();
\Yii::$app->get($this->cacheComponent)->set($this->cacheID, $rules, 0, $cd);
Re: Собственные ссылки в yii2. Как?
1) В PagesUrlRule ты забыл parent::init()
2) Компонент урлманагер кеширует массив rules так что тут смотри может быть ступорок когда ты что то меняешь в правилах а нифига не меняется.
3) С "внутреннего" адреса на "внешний" я бы просто делал редирект
2) Компонент урлманагер кеширует массив rules так что тут смотри может быть ступорок когда ты что то меняешь в правилах а нифига не меняется.
3) С "внутреннего" адреса на "внешний" я бы просто делал редирект
Re: Собственные ссылки в yii2. Как?
Я в конец запутался. Зачем parent::init(), я думал он уже не нужен.maleks писал(а):1) В PagesUrlRule ты забыл parent::init()
2) Компонент урлманагер кеширует массив rules так что тут смотри может быть ступорок когда ты что то меняешь в правилах а нифига не меняется.
3) С "внутреннего" адреса на "внешний" я бы просто делал редирект
Кэш нужно будет просто чистить как-то при добавлении нового адреса.
Re: Собственные ссылки в yii2. Как?
точно, тут parent::init() не нужен
- mihail_dev
- Сообщения: 243
- Зарегистрирован: 2013.07.17, 00:51
- Откуда: Молдова
- Контактная информация:
Re: Собственные ссылки в yii2. Как?
CompositeUrlRule это абстрактный класс для обработки группы правил
дабы он заработал надо реализовать функцию protected function createRules()
которая должна возвращать массив UrlRuleInterface[]
я и сделал на основе имеющийся информации об Pages я сформировал массив объектов ( $rule = \Yii::createObject(array_merge($this->ruleConfig, $rule));)
также добавил кэширование
ну и всё!
дабы он заработал надо реализовать функцию protected function createRules()
которая должна возвращать массив UrlRuleInterface[]
я и сделал на основе имеющийся информации об Pages я сформировал массив объектов ( $rule = \Yii::createObject(array_merge($this->ruleConfig, $rule));)
также добавил кэширование
ну и всё!
- mihail_dev
- Сообщения: 243
- Зарегистрирован: 2013.07.17, 00:51
- Откуда: Молдова
- Контактная информация:
Re: Собственные ссылки в yii2. Как?
по поводу как пользоваться
у тебя в конфиге уже прописано
тебе просто нужно добавлять правила в базу данных Pages
у тебя в конфиге уже прописано
Код: Выделить всё
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules'=> [
// 'register' => 'user/index',
['class' => 'frontend\components\Pages\PagesUrlRule'],
],
],
- mihail_dev
- Сообщения: 243
- Зарегистрирован: 2013.07.17, 00:51
- Откуда: Молдова
- Контактная информация:
Re: Собственные ссылки в yii2. Как?
кстате делал по аналогии
yii\web\GroupUrlRule
yii\web\GroupUrlRule
Re: Собственные ссылки в yii2. Как?
Не работает. Я попытался сразу же проверить( А не должно быть функций "createUrl" и "parseRequest"? Как ссылки создавать тогда, если не нужна функция "createUrl"?mihail_dev писал(а):по поводу как пользоваться
у тебя в конфиге уже прописанотебе просто нужно добавлять правила в базу данных PagesКод: Выделить всё
'urlManager' => [ 'enablePrettyUrl' => true, 'showScriptName' => false, 'rules'=> [ // 'register' => 'user/index', ['class' => 'frontend\components\Pages\PagesUrlRule'], ], ],
Re: Собственные ссылки в yii2. Как?
php знаем?Matthew писал(а):Не работает. Я попытался сразу же проверить( А не должно быть функций "createUrl" и "parseRequest"? Как ссылки создавать тогда, если не нужна функция "createUrl"?mihail_dev писал(а):по поводу как пользоваться
у тебя в конфиге уже прописанотебе просто нужно добавлять правила в базу данных PagesКод: Выделить всё
'urlManager' => [ 'enablePrettyUrl' => true, 'showScriptName' => false, 'rules'=> [ // 'register' => 'user/index', ['class' => 'frontend\components\Pages\PagesUrlRule'], ], ],
- mihail_dev
- Сообщения: 243
- Зарегистрирован: 2013.07.17, 00:51
- Откуда: Молдова
- Контактная информация:
Re: Собственные ссылки в yii2. Как?
скажи что ты добавил за правило ?
- mihail_dev
- Сообщения: 243
- Зарегистрирован: 2013.07.17, 00:51
- Откуда: Молдова
- Контактная информация:
Re: Собственные ссылки в yii2. Как?
сорри в коде допустил ошибку в классе
заменить на это (в коде $page является массивом)
Код: Выделить всё
$rule = [
'pattern' => ltrim($page->alias, '/'),
'route' => ltrim($page->route, '/'),
];
Код: Выделить всё
$rule = [
'pattern' => ltrim($page['alias'], '/'),
'route' => ltrim($page['route'], '/'),
];
Код: Выделить всё
<?php
namespace frontend\components\Pages;
use frontend\models\Pages\Pages;
use yii\caching\DbDependency;
use yii\web\CompositeUrlRule;
use yii\web\UrlRuleInterface;
use yii\base\InvalidConfigException;
/**
* Class PagesUrlRule
*
* @package frontend\components\Pages
*/
class PagesUrlRule extends CompositeUrlRule{
public $cacheComponent = 'cache';
public $cacheID = 'PagesUrlRules';
public $ruleConfig = ['class' => 'yii\web\UrlRule'];
/**
* Creates the URL rules that should be contained within this composite rule.
*
* @return \yii\web\UrlRuleInterface[] the URL rules
* @throws \yii\base\InvalidConfigException
*/
protected function createRules()
{
$cache = \Yii::$app->get($this->cacheComponent)->get($this->cacheID);
if(!empty($cache))
return $cache;
$pages = Pages::find()->asArray(true)->all();
$rules = [];
foreach ($pages as $page) {
$rule = [
'pattern' => ltrim($page['alias'], '/'),
'route' => ltrim($page['route'], '/'),
];
$rule = \Yii::createObject(array_merge($this->ruleConfig, $rule));
if (!$rule instanceof UrlRuleInterface) {
throw new InvalidConfigException('URL rule class must implement UrlRuleInterface.');
}
$rules[] = $rule;
}
$cd= new DbDependency();
$cd->sql='SELECT MAX(id) FROM '.Pages::tableName();
\Yii::$app->get($this->cacheComponent)->set($this->cacheID, $rules, 0, $cd);
return $rules;
}
}
Re: Собственные ссылки в yii2. Как?
Все исправил. Но вот все равно не пойму почему не работает:( Трудная тема. Может я туплю?mihail_dev писал(а):сорри в коде допустил ошибку в классезаменить на это (в коде $page является массивом)Код: Выделить всё
$rule = [ 'pattern' => ltrim($page->alias, '/'), 'route' => ltrim($page->route, '/'), ];
Код: Выделить всё
$rule = [ 'pattern' => ltrim($page['alias'], '/'), 'route' => ltrim($page['route'], '/'), ];
Вот кусок \frontend\config\main.php
Код: Выделить всё
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules'=> [
// 'register' => 'user/index',
['class' => 'frontend\components\Pages\PagesUrlRule'],
],
],
Переход по ссылке /registration дает 404
Когда вообще должна отработать функция createRules в классе PagesUrlRule? Точка остановки никогда не срабатывает в ней, стало быть функция не срабатывает вообще...
-
- Сообщения: 977
- Зарегистрирован: 2014.08.27, 21:54
Re: Собственные ссылки в yii2. Как?
в конфиге - register
вы переходите на /registration
как правильно?
вы переходите на /registration
как правильно?
Re: Собственные ссылки в yii2. Как?
В конфиге вообще-то строка с "register" за комментирована. Все правила в базе хранятся, поэтому правильно "registration"Loveorigami писал(а):в конфиге - register
вы переходите на /registration
как правильно?