1 Отредактировано Николай (15.08.2015 04:44:34)

Тема: Вывод название категории статей

При добавлении на сайте нескольких категорий статей (Новости, статьи, акции), при выводе списка всех статей в заголовке выводится "Новости" даже для статей и акций.

Прописано это в файле preview_list.tpl

<div class="newsPage">

    <h1 class="newsTitle">Новости</h1>

    <ul class="news">
        {foreach $list as $item}

Какой переменной выводить в заголовки название именно той категории, которая подгружается?

И на данный момент в адресной строке страница вывода статей выглядит так сайт.ру/text-article/ и сайт.ру/text-news. Можно ли привести аддрес к виду сайт.ру/article сайт.ру/news

Повысить оценку Понизить оценку

2 Отредактировано Александр (17.08.2015 11:16:23)

Re: Вывод название категории статей

За вывод статей на странице с постраничной навигацией отвечает front контроллер \Article\Front\PreviewList, который соответственно находится в /modules/article/controller/front/previewlist.inc.php. В самом низу данного файла, если его открыть идёт передача переменных в шаблон. Начиная с $this->view->assign
И там как раз видно, что за текущую категорию отвечает переменная $dir, которая и означает текущую категорию.

А дальше просто посмотрим, что в ней в шаблоне:

<pre>
{var_dump($dir)}
</pre>

И на данный момент в адресной строке страница вывода статей выглядит так сайт.ру/text-article/ и сайт.ру/text-news. Можно ли привести аддрес к виду сайт.ру/article сайт.ру/news

Нет. Дело в том, что в система строится на маршрутах (масках адреса url), которые конкретно говорят ей, что нужно обрабатывать соответствующий фронт контроллер. Ваш адрес красивый, но не однозначный, что касается сео, то изменений с нашим или Вашим адресом вы не почувствуйте. Поисковики нормально кушают их. Маршруты в системе задаются в папках конфига каждого модуля, в файле handlers.inc.php, метод getRoute.
Маршрут можно конечно и перегрузить своим именно для Вашего случая, но всё станет намного хуже в плане обработки и дальнейшей поддержки.
Подробнее о маршрутах у нас в документации.

Re: Вывод название категории статей

В переменной такой массив

OBJECT(ARTICLE\MODEL\ORM\CATEGORY)#313 (3) {
  ["_VALUES":PROTECTED]=>
  ARRAY(11) {
    ["ID"]=>
    STRING(1) "3"
    ["SITE_ID"]=>
    STRING(1) "1"
    ["TITLE"]=>
    STRING(12) "СТАТЬИ"
    ["ALIAS"]=>
    STRING(7) "ARTICLE"
    ["PARENT"]=>
    STRING(1) "0"
    ["PUBLIC"]=>
    STRING(1) "1"
    ["SORTN"]=>
    STRING(1) "3"
    ["USE_IN_SITEMAP"]=>
    STRING(1) "0"
    ["META_TITLE"]=>
    STRING(0) ""
    ["META_KEYWORDS"]=>
    STRING(0) ""
    ["META_DESCRIPTION"]=>
    STRING(0) ""
  }
  ["_SELF_CLASS":PROTECTED]=>
  STRING(26) "ARTICLE\MODEL\ORM\CATEGORY"
  ["_LOCAL_ID":PROTECTED]=>
  INT(35)
}

Вот не могу доехать, как с него вытащить ключ "TITLE"

Повысить оценку Понизить оценку

Re: Вывод название категории статей

БИНГО!

<h1 class="newsTitle">{$dir.title}</h1>

Спасибо за подсказки)

Повысить оценку Понизить оценку

Re: Вывод название категории статей

Всё просто:) Обращение к полям, как к массиву.

{$dir.title}

Re: Вывод название категории статей

Вот блин на 16 секунд быстрее)

7

Re: Вывод название категории статей

Александр пишет:

Всё просто:) Обращение к полям, как к массиву.

{$dir.title}

Подскажите как получить значение "Заголовка категории" в блоке, который не имеет соответствующей переменной?

Повысить оценку Понизить оценку

Re: Вывод название категории статей

Андрей пишет:
Александр пишет:

Всё просто:) Обращение к полям, как к массиву.

{$dir.title}

Подскажите как получить значение "Заголовка категории" в блоке, который не имеет соответствующей переменной?

Что это за блок и на какой странице?

9

Re: Вывод название категории статей

Закусило Александр пишет:
Андрей пишет:
Александр пишет:

Всё просто:) Обращение к полям, как к массиву.

{$dir.title}

Подскажите как получить значение "Заголовка категории" в блоке, который не имеет соответствующей переменной?

Что это за блок и на какой странице?

Предположим хочу вывести в блоке
/moduleview/main/blocks/logo/logo.tpl (Тема: Молодёжная)
Имя текущей категории товаров (для страниц каталога) или название товара (для страницы товара)
Сейчас реализовали то, что должно получиться, но как говорится КОСТЫЛЁМ (см. исходник страницы)
http://55opt.org/catalog/suvenirnaya-produkciya/
http://55opt.org/product/arlayn-golovka … aya-48125/
А хотелось бы по нормальному вывести.

Повысить оценку Понизить оценку

Re: Вывод название категории статей

Ну в шаблоне доступен объект роутера, и у каждого типа страницы, есть свой  идентификатор маршрута. Вы можете посмотреть маршруты в
/modules/catalog/config/handlers.inc.php в методе getRoute

У категории это catalog-front-listproducts
У товара это catalog-front-product

Соответственно в шаблоне мы можем проверить:

{$route_id=$router->getCurrentRoute()->getId()}
{if $route_id=="catalog-front-product"}
    //Мы на странице товара
{/if}

Аналогично с каталогом.
Теперь... Объект товара содержится в самом роутере

{$product=$router->getCurrentRoute()->product}

А категорию можно получить так:

{$category}

11

Re: Вывод название категории статей

Теперь... Объект товара содержится в самом роутере

{$product=$router->getCurrentRoute()->product}

СПАСИБО! Вот этих строчек мне не хватало, не нашёл в документации

Повысить оценку Понизить оценку

12

Re: Вывод название категории статей

А категорию можно получить так:

{$category}

Можно подробнее
Откуда возьмутся данные в переменной $category

Пробовал так:

{$category=$router->getCurrentRoute()->category}
{$category=$router->getCurrentRoute()->listproducts}
{$category=$router->getCurrentRoute()->catalog}

Каждый раз

{$category|print_r}

Выводит

1

Повысить оценку Понизить оценку

Re: Вывод название категории статей

Андрей пишет:

Теперь... Объект товара содержится в самом роутере

{$product=$router->getCurrentRoute()->product}

СПАСИБО! Вот этих строчек мне не хватало, не нашёл в документации

Этого в документации нет и не будет, т.к. это результат отработки фронт контроллера /modules/catalog/controller/front/product.inc.php (страница товара). Там в объект текущего маршрута заносится сам объект товара. Вот через эту строчку:

$this->router->getCurrentRoute()->product = $item; //Прикрепляем к маршруту загруженный объект товара

А $this->router доступен уже во всех шаблонах в качестве переменной $router

Re: Вывод название категории статей

{$category=$router->getCurrentRoute()->category}
{$category=$router->getCurrentRoute()->listproducts}
{$category=$router->getCurrentRoute()->catalog}

Так у Вас ничего не получится, т.к. во фронт контроллере категории товара этот объект не записывается в объект текущего маршрута, я поэтому ничего и не писал по этому поводу.
Надобности в записи объекта этого не было поэтому, мы его и не добавляли.

{$category} должен быть доступен т.к. поскольку первым отрабатывае фронт контроллер который рендерит результат, а уже потом к "Середине" оборачивается внешняя оболочка. И в шаблоны внешние также уходят переменные из фронт конроллера и там же доступны. У Вас не получилось видимо потому, что в каком-то блок контроллере видимо $category переназначается. Тогда можно сделать так:

{$category_alias=$this_controller->request('category','string')} {* Получает alias категории из запроса *}
{static_call var=category callback=['\Catalog\Model\Orm\Dir', 'loadByWhere'] params=[['alias'=>$category_alias]]} {* Подгрузим категории *}
{var_dump($category)}

Я думаю должно получиться.

15

Re: Вывод название категории статей

Конечный вариант:

Может кому-то будет нужно:

{$route_id=$router->getCurrentRoute()->getId()}
{if $route_id=="catalog-front-product"}
[b]
{* Здесь то, что нужно вывести на странице товара *}[/b]
{$product=$router->getCurrentRoute()->product}
{var_dump($product)}

{elseif $route_id=="catalog-front-listproducts"}

[b]{* Здесь то, что нужно вывести на странице категории *}[/b]
{$category_alias=$this_controller->request('category','string')} 
{static_call var=category callback=['\Catalog\Model\Orm\Dir', 'loadByWhere'] params=[['alias'=>$category_alias]]} 
{var_dump($category)}

{else}
[b]
{* Здесь то, что нужно вывести на других страницах *}[/b]
<p>Это не страница товара или каталога</p>

{/if}

Повысить оценку Понизить оценку