Неправильное формирование url в CMenu

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
codrilla
Сообщения: 173
Зарегистрирован: 2013.03.06, 12:24
Откуда: Молдова, Тирасполь

Неправильное формирование url в CMenu

Сообщение codrilla »

В таком случае

Код: Выделить всё

<?php $this->widget(
        'zii.widgets.CMenu',
        array(
            'items' => array(
                array(
                    'label' => '...',
                    'url' => array('pages/default/view', 'id'=>10), 
Ссылка будет вида "/pages/pages/default/view/id/10"
А если я пишу таким образом

Код: Выделить всё

<?php $this->widget(
        'zii.widgets.CMenu',
        array(
            'items' => array(
                array(
                    'label' => '...',
                    'url' => Yii::app->createUrl('pages/default/view', array( 'id'=>10)), 
То получаю нужную мне ссылку /kommercheskaya-nedvijimost'. Однако в данном случае пункту в меню не присваевается класс active. Формирование ссылок делал по этой статье http://habrahabr.ru/post/155927/
Помогите сделать так, чтобы и ссылка была нужного вида и пункт был активным. Спасибо заранее.
codrilla
Сообщения: 173
Зарегистрирован: 2013.03.06, 12:24
Откуда: Молдова, Тирасполь

Re: Неправильное формирование url в CMenu

Сообщение codrilla »

Во втором случае проблема понятна после просмотра этой функции

Код: Выделить всё

/**
     * Checks whether a menu item is active.
     * This is done by checking if the currently requested URL is generated by the 'url' option
     * of the menu item. Note that the GET parameters not specified in the 'url' option will be ignored.
     * @param array $item the menu item to be checked
     * @param string $route the route of the current request
     * @return boolean whether the menu item is active
     */
    protected function isItemActive($item,$route)
    {
        if(isset($item['url']) && is_array($item['url']) && !strcasecmp(trim($item['url'][0],'/'),$route))
        {
            unset($item['url']['#']);
            if(count($item['url'])>1)
            {
                foreach(array_splice($item['url'],1) as $name=>$value)
                {
                    if(!isset($_GET[$name]) || $_GET[$name]!=$value)
                        return false;
                }
            }
            return true;
        }
        return false;
    } 
Ведь втором случае передаётся не массив, а строка.
codrilla
Сообщения: 173
Зарегистрирован: 2013.03.06, 12:24
Откуда: Молдова, Тирасполь

Re: Неправильное формирование url в CMenu

Сообщение codrilla »

В CMenu мы в итоге придём к этой функции

Код: Выделить всё

/**
     * Normalizes the input parameter to be a valid URL.
     *
     * If the input parameter is an empty string, the currently requested URL will be returned.
     *
     * If the input parameter is a non-empty string, it is treated as a valid URL and will
     * be returned without any change.
     *
     * If the input parameter is an array, it is treated as a controller route and a list of
     * GET parameters, and the {@link CController::createUrl} method will be invoked to
     * create a URL. In this case, the first array element refers to the controller route,
     * and the rest key-value pairs refer to the additional GET parameters for the URL.
     * For example, <code>array('post/list', 'page'=>3)</code> may be used to generate the URL
     * <code>/index.php?r=post/list&page=3</code>.
     *
     * @param mixed $url the parameter to be used to generate a valid URL
     * @return string the normalized URL
     */
    public static function normalizeUrl($url)
    {
        if(is_array($url))
        {
            if(isset($url[0]))
            {
                if(($c=Yii::app()->getController())!==null)
                    $url=$c->createUrl($url[0],array_splice($url,1));
                else
                    $url=Yii::app()->createUrl($url[0],array_splice($url,1));
            }
            else
                $url='';
        }
        return $url==='' ? Yii::app()->getRequest()->getUrl() : $url;
    } 
Быть может обработчик входит в это условие и вызывает непонятно что

Код: Выделить всё

if(($c=Yii::app()->getController())!==null) 
codrilla
Сообщения: 173
Зарегистрирован: 2013.03.06, 12:24
Откуда: Молдова, Тирасполь

Re: Неправильное формирование url в CMenu

Сообщение codrilla »

Если я вставляю

Код: Выделить всё

public function createUrl($manager, $route, $params, $ampersand)
    {
        $pathsMap = Yii::app()->getModule('pages')->getPathsMap();

        if ($route === 'pages/default/view' && isset($params['id'], $pathsMap[$params['id']]))
            return $pathsMap[$params['id']] . $manager->urlSuffix;
        else
            return false;
    } 
В DefaultController модуля pages получаю следующую ошибку
Missing argument 3 for DefaultController::createUrl(), called in C:\work\syte1\vendor\yiisoft\yii\framework\web\helpers\CHtml.php on line 1417 and defined
codrilla
Сообщения: 173
Зарегистрирован: 2013.03.06, 12:24
Откуда: Молдова, Тирасполь

Re: Неправильное формирование url в CMenu

Сообщение codrilla »

Значит он всё-таки заходит в то условие. Осталось разобраться с этой ошибкой. Кто-нибудь может подсказать, я двигаюсь в правильном направлении?
codrilla
Сообщения: 173
Зарегистрирован: 2013.03.06, 12:24
Откуда: Молдова, Тирасполь

Re: Неправильное формирование url в CMenu

Сообщение codrilla »

Хотя помещять туда правило создания урл нелогично, как по мне.
kawabanga
Сообщения: 806
Зарегистрирован: 2013.10.12, 23:35
Откуда: Новосибирск

Re: Неправильное формирование url в CMenu

Сообщение kawabanga »

Код: Выделить всё

array('label'=>'Посты', 'active' => Yii::app()->controller->getId() == 'post', 'url'=>array('/post/index')),   
у меня в меню вот так стоит, т.е. вы можете обозначить active при вызове конкретного контроллера.
codrilla
Сообщения: 173
Зарегистрирован: 2013.03.06, 12:24
Откуда: Молдова, Тирасполь

Re: Неправильное формирование url в CMenu

Сообщение codrilla »

У меня контроллер везде будет default
Во всех пунктах. Меняться будет только id
kawabanga
Сообщения: 806
Зарегистрирован: 2013.10.12, 23:35
Откуда: Новосибирск

Re: Неправильное формирование url в CMenu

Сообщение kawabanga »

А, ну тогда условие Active сделайте свое.

Код: Выделить всё

 'label' => '...',
 'url' => Yii::app->createUrl('pages/default/view', array( 'id'=>10)), 
'active' => id == 10
теперь вам только нужно получить это значение 10 в обработчике.
codrilla
Сообщения: 173
Зарегистрирован: 2013.03.06, 12:24
Откуда: Молдова, Тирасполь

Re: Неправильное формирование url в CMenu

Сообщение codrilla »

В этом случае меня ждёт другая проблема. Если дочерний пункт будет активным, то родитель об этом ничего не узнает. 'activateParents'=>true, не помогает.
Аватара пользователя
Barssoft
Сообщения: 726
Зарегистрирован: 2013.01.21, 16:03

Re: Неправильное формирование url в CMenu

Сообщение Barssoft »

Код: Выделить всё

<?php $this->widget(
        'zii.widgets.CMenu',
        array(
            'items' => array(
                array(
                    'label' => '...',
                    'url' => array('/pages/default/view', 'id'=>10),  
Нужно так написать, Слеш перед pages будет говорить от том что путь будет начинаться именно с модуля, а в вашем случаи путь начинается от активного модуля, если урл используется только в рамках модуля pages то можно написать

Код: Выделить всё

<?php $this->widget(
        'zii.widgets.CMenu',
        array(
            'items' => array(
                array(
                    'label' => '...',
                    'url' => array('default/view', 'id'=>10),  
В таком случаи адрес тоже будет корректный... Если я правильно понял вопрос то должно все работать верно
codrilla
Сообщения: 173
Зарегистрирован: 2013.03.06, 12:24
Откуда: Молдова, Тирасполь

Re: Неправильное формирование url в CMenu

Сообщение codrilla »

Удивительно, но вариант со слешем сработал.
m00n_lite
Сообщения: 10
Зарегистрирован: 2014.04.11, 20:50

Re: Неправильное формирование url в CMenu

Сообщение m00n_lite »

Код: Выделить всё

Yii::app->createUrl('pages/default/view', array( 'id'=>10)) 

если не работает и нужно массив так дайте ей массив

Код: Выделить всё

array(Yii::app->createUrl('pages/default/view', array( 'id'=>10))) 
и все работает и подсвечивается
Ответить