Скрыть папку в URL / Активный пункт меню / Обработчик ошибок

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
pioneer
Сообщения: 136
Зарегистрирован: 2013.03.10, 23:27

Скрыть папку в URL / Активный пункт меню / Обработчик ошибок

Сообщение pioneer »

Доброго времени суток, форумчане!

Хотел спросить у Вас помощи по вот каким вопросам:
1) В своем проекте юзаю CMS Yupe и их стандартную структуру каталогов (index.php находится в папке 'public', а не в корне проекта). В связи с этим вопрос: как убрать из строки адреса папку "public" http://mysite.ru/public/site/news
Т.е. какие действия необходимо предпринять, чтобы в пути никогда не отображалась папка /public/ ?
2) Так вышло, что во фронтенд-части разрабатываемого мною проекта используется обычное меню от верстальщика, активные пункты которого необходимо подсвечивать. Сначала выбор пал на jQuery, однако решение оказалось очень неудачным, из-за того, что class="active" для тега <a> выставляется только текущему (совпадающему по URL) адресу страницы (например, http://mysite.ru/news), но если же у этого же (активного) пункта есть параметры (http://mysite.ru/news/some-news), то подсветка теряется, да и анимация там отрабатывает с промедлением. Как выход - JS-щики посоветовали решать такие дела на сервере. Хотел спросить у вас: КАК?))
3) Как и где лучше обрабатывать ошибку такого типа: Если у ссылки атрибут href="#" (или любой другой, означающий, что материалы на данный момент не готовы к отображению), то при переходе в любом месте сайта по такому URL выводить CHttpError (какой код, кстати, посоветуете для вот такого сообщения?): "Материалы готовятся к публикации..."

Спасибо Вам огромное заранее за помощь :)
pioneer
Сообщения: 136
Зарегистрирован: 2013.03.10, 23:27

Re: Скрыть папку в URL / Активный пункт меню / Обработчик ош

Сообщение pioneer »

неужели никто не в силах помочь? :(
Аватара пользователя
sluchainiyznak
Сообщения: 617
Зарегистрирован: 2013.05.19, 17:51
Откуда: ХМАО-Югра, г. Сургут
Контактная информация:

Re: Скрыть папку в URL / Активный пункт меню / Обработчик ош

Сообщение sluchainiyznak »

1. Настроить виртуальный хост
kawabanga
Сообщения: 806
Зарегистрирован: 2013.10.12, 23:35
Откуда: Новосибирск

Re: Скрыть папку в URL / Активный пункт меню / Обработчик ош

Сообщение kawabanga »

1) это вопрос к их техподдержке.
2) если не получается решить виджетом Cmenu, то попробуйте к классу добавить нечто подобное:

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

<?= ($this->action->id='имя контроллера в этом меню?') ? ' active' : '' ?>
3) можно jquerry, поставить событие, только осторожнее, многие ссылки на сайтах имеют # ссылку.
А вообще, выводите туда ссылку статьи, а в статье, если статус в доработке, то выводите сообщение что страница в доработке.
pioneer
Сообщения: 136
Зарегистрирован: 2013.03.10, 23:27

Re: Скрыть папку в URL / Активный пункт меню / Обработчик ош

Сообщение pioneer »

kawabanga писал(а):1) это вопрос к их техподдержке.
2) если не получается решить виджетом Cmenu, то попробуйте к классу добавить нечто подобное:

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

<?= ($this->action->id='имя контроллера в этом меню?') ? ' active' : '' ?>
3) можно jquerry, поставить событие, только осторожнее, многие ссылки на сайтах имеют # ссылку.
А вообще, выводите туда ссылку статьи, а в статье, если статус в доработке, то выводите сообщение что страница в доработке.
Спасибо за ответ. С 1ым и 3ьим вопросом вроде более-менее разобрался. Хочу уточнить по 2му. Вот фрагмент с меню моего шаблона main.php:

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

<nav id="navigation-main">
          <?php
            echo CHtml::link('Главная', array('/index'), array('class' => $this->action->id='site' ? ' active' : ''));
            echo CHtml::link('Каталог', array('/catalogue'));
            echo CHtml::link('Акции', array('/shares'));
            echo CHtml::link('Сотрудничество', array('/cooperation'));
            echo CHtml::link('Новости', array('/news'));
            echo CHtml::link('Карьера', array('/career'));
            echo CHtml::link('Магазины', array('/stores'));
          ?>
      </nav>

Стандартный виджет CMenu не помог, да и вывелся не так, как нужно. А вот этот фрагмент кода выдает CException "Свойство "CInlineAction.id" доступно только для чтения. "
Вот.
Просто, если честно, до сих пор ума не приложу как на сервере (без использования JS) проворачивать такие штуки - чтобы class="active" умно отрабатывал на всех URL'ах текущего активного пункта.
kawabanga
Сообщения: 806
Зарегистрирован: 2013.10.12, 23:35
Откуда: Новосибирск

Re: Скрыть папку в URL / Активный пункт меню / Обработчик ош

Сообщение kawabanga »

опечатка у меня и у вас)))))


= - присваивание
== - сравнение.

$this->action->id=='site
pioneer
Сообщения: 136
Зарегистрирован: 2013.03.10, 23:27

Re: Скрыть папку в URL / Активный пункт меню / Обработчик ош

Сообщение pioneer »

kawabanga писал(а):опечатка у меня и у вас)))))


= - присваивание
== - сравнение.

$this->action->id=='site
точно)) не доглядел. спасибо, но остались небольшие нюансы...Вот если я пишу в меню вот так, как Вы сказали:

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

<nav id="navigation-main">
          <?php
            echo CHtml::link('Главная', array('/index'), array('class' => $this->action->id == 'index' ? ' active' : ''));
            echo CHtml::link('Каталог', array('/catalogue'));
            echo CHtml::link('Акции', array('/shares'));
            echo CHtml::link('Сотрудничество', array('/cooperation'));
            echo CHtml::link('Новости', array('/news'));
            echo CHtml::link('Карьера', array('/career'));
            echo CHtml::link('Магазины', array('/stores'));
          ?>
      </nav>
И в строке адреса вбиваю: mysite.com/index?id=1&name=name (передаю вымышленные GET-параметры), то подсветка на вкладке "Главная" остается, и, в принципе, ничего не происходит.
Но вот если пытаюсь так: mysite.com/index/1 (такие ведь случаи бывают, когда маршрутизатор GET-параметры обрабатывает через слэш), то появляется ошибка 404 (само собой, все норм), НО подсветка с вкладки "Главная" теряется (хотя, по сути ведь продолжает работать тот же контроллер 'site' и действие 'index' в частности - кстати, $this->action->id выводит имя текущего экшена, а не контроллера).

Вот такие дела. Уже без JS - это хорошо, но все же хотелось бы такую штуку, как в менюшках bootstrap'a - в какие категории/подкатегории/пункты и всевозможные действия от текущей вкладки не зайди - подсветка не теряется.

Но все равно спасибо!)
kawabanga
Сообщения: 806
Зарегистрирован: 2013.10.12, 23:35
Откуда: Новосибирск

Re: Скрыть папку в URL / Активный пункт меню / Обработчик ош

Сообщение kawabanga »

так вывести можно не только название действия, но и название контроллера.
pioneer
Сообщения: 136
Зарегистрирован: 2013.03.10, 23:27

Re: Скрыть папку в URL / Активный пункт меню / Обработчик ош

Сообщение pioneer »

kawabanga писал(а):так вывести можно не только название действия, но и название контроллера.
Да, вот, погуглил и сделал вот так:

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

<nav id="navigation-main">
          <?php
            echo CHtml::link('Главная', array('/index'), array('class' => $this->UniqueId == 'site' ? 'active' : ''));
            echo CHtml::link('Каталог', array('/catalogue'));
            echo CHtml::link('Акции', array('/shares'));
            echo CHtml::link('Сотрудничество', array('/cooperation'));
            echo CHtml::link('Новости', array('/news'));
            echo CHtml::link('Карьера', array('/career'));
            echo CHtml::link('Магазины', array('/stores'));
          ?>
      </nav>
Но теперь получается, что class="active" ставится тогда, если в текущий момент отрабатывает SiteController, а он обрабатывает каждую из этих ссылок меню - выходит, что теперь все вкладки подсвечиваются одновременно, !ОДНАКО! при переходе по mysite.com/aaabbb подсветка с вкладки "Главная" теперь не теряется - это уже круто, то, что надо! Как поправить, чтобы они все вместе одновременно не выделялись?
kawabanga
Сообщения: 806
Зарегистрирован: 2013.10.12, 23:35
Откуда: Новосибирск

Re: Скрыть папку в URL / Активный пункт меню / Обработчик ош

Сообщение kawabanga »

у вас есть одновременно и название контроллера и название действия ;) ;) ;)
pioneer
Сообщения: 136
Зарегистрирован: 2013.03.10, 23:27

Re: Скрыть папку в URL / Активный пункт меню / Обработчик ош

Сообщение pioneer »

kawabanga писал(а):у вас есть одновременно и название контроллера и название действия ;) ;) ;)
Точно, спасибо!) Решил эту проблему вот каким способом:

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

<nav id="navigation-main">
          <?php
            echo CHtml::link('Главная', array('/index'), array('class' => ($this->UniqueId == 'site' && $this->action->id == 'index') ? 'active' : ''));
            echo CHtml::link('Каталог', array('/catalogue'), array('class' => $this->UniqueId == 'category/category' ? 'active' : ''));
            echo CHtml::link('Акции', array('/shares'), array('class' => ($this->UniqueId == 'site' && $this->action->id == 'shares') ? 'active' : ''));
            echo CHtml::link('Сотрудничество', array('/cooperation'), array('class' => ($this->UniqueId == 'site' && $this->action->id == 'cooperation') ? 'active' : ''));
            echo CHtml::link('Новости', array('/news'), array('class' => ($this->UniqueId == 'site' && $this->action->id == 'news') ? 'active' : ''));
            echo CHtml::link('Карьера', array('/career'), array('class' => ($this->UniqueId == 'site' && $this->action->id == 'career') ? 'active' : ''));
            echo CHtml::link('Магазины', array('/stores'), array('class' => ($this->UniqueId == 'site' && $this->action->id == 'stores') ? 'active' : ''));
          ?>
      </nav>
Т.е. для статичных страниц менюшки (контроллер Site) отслеживаю и текущий контроллер, и экшн, дабы все сразу не выделялись, а вот вкладка "Каталог" должна подсвечиваться, допустим, и при actionIndex, и при actionView - поэтому оставил в условие только отслеживание контроллера.
Спасибо Вам за совет, подход интересный и как по мне лучше, быстрее и эффективнее решения на JS))
Кстати, понял для себя почему при переходе на mysite.com/index/1 подсветка с пункта "Главная" уходит - там ведь стоит условие на SiteController и actionIndex, а т.к. выдает 404 "страница не найдена", то отрабатывает уже actionError() - все верно, вообщем :)
Ответить