Jump to content
Дизайн и модификация IPS Community IPBSkinsBETA
Search In
  • More options...
Find results that contain...
Find results in...
Sign in to follow this  
hacenator

Передать переменные между шаблонами IPB 3

Recommended Posts

В глобальном шаблоне передается массив $items, в частности он используется для формирования "breadcrumbs". Мне же надо формировать их непосредственно в шаблоне "topicViewTemplate". Как я могу добавить или передать эту переменную в данный шаблон? Или это надо делать как-то иначе?

Share this post


Link to post
Share on other sites

В редакторе шаблонов сверху справа есть кнопка "Variables"

Там прописываются входящие переменные при необходимости. Но чаще всего надо и в файлах что-то менять.

Share this post


Link to post
Share on other sites

Спасибо. Там я прописывал, и она конечно же приходит пустой.

 

Но чаще всего надо и в файлах что-то менять.

В каких именно?

Share this post


Link to post
Share on other sites
В каких именно?

Не факт что там где вызывается topicViewTemplate будет эта переменная, может breadcrumbs вообще в другом методе класса формируется, или часть кода выполнятся после topicViewTemplate. А вообще так и ищите getTemplate('группа_шаблона')->имя_шаблона

  • Upvote 1

Share this post


Link to post
Share on other sites

Косяк вашей задачи в том, что globalTemplate всегда вызывается в самую последнюю очередь, когда контент страницы сгенерирован и topicViewTemplate уже отработал.

 

Вот если бы вам нужно было бы передать что-то из topicViewTemplate в globalTemplate, например, переменную $forum, это было бы легко сделать так:

 

1. Добавить в topicViewTemplate в начало:

<php>$GLOBALS['any_unique_name'] = $forum;</php>

или

<php>global $any_unique_name; $any_unique_name = $forum;</php>

 

2. Добавить в globalTemplate в начало:

<php>$forum = $GLOBALS['any_unique_name'];</php>

или

<php>global $any_unique_name; $forum = $any_unique_name;</php>

 

3. Использовать в любом нужном вам месте globalTemplate переменную {$forum}. Оно будет содержать значение $forum из topicViewTemplate.

 

Работает это просто - шабоны IPB при парсинге приводятся к обычным функциям в php-классах, а значит там работает global variable scope.

 

Однако, как уже говорилось вначале, не получится передать что-то из шаблона более высокого уровня в более низкий, т.к. они выполняются последовательно вверх по уровням. Посмотрите, где и как получаетс этот нужный вам $items. Попробуйте построить его самостоятельно прямо в шаблоне topicViewTemplate.

  • Upvote 2

Share this post


Link to post
Share on other sites

Спасибо.

Ну в приципе я думаю что всё не столь страшно. И скорей всего просто надо найти как он формирует этот массив $items и возможно прям впихнуть куском кода в 'topicViewTemplate'.

 

Только для этого еще бы не помешала API документация для IPB. Но я пока так и не нашел нормальной. Она конечно есть на офф. сайте, но полноценной документацией её назвать можно лишь с натяжкой.

Edited by hacenator

Share this post


Link to post
Share on other sites

Она конечно есть на офф. сайте, но полноценной документацией её назвать можно лишь с натяжкой.

А более полной и нет.

 

Только просмотр кода форума.

Share this post


Link to post
Share on other sites

Порылся. Похоже что навигация становится доступна уже после рендеринга шаблона 'topicViewTemplates'

Edited by hacenator

Share this post


Link to post
Share on other sites

Вообщем если кому-то еще пригодится:

Лезем в файлик

admin/applications/forums/modules_public/forums/topics.php и ищем строки

if ( is_array( $this->nav ) AND count( $this->nav ) )
{
 foreach( $this->nav as $_nav )
 {
   $this->registry->output->addNavigation( $_nav[0], $_nav[1], $_nav[2], $_nav[3] );
 }
}

 

Вырезаем их и вставляем немного выше, над строкой:

$template = $this->registry->output->getTemplate('topic')->topicViewTemplate( $this->forum, $this->topic, $post_data, $displayData );

 

В итоге это должно будет выглядеть примерно так:

if ( is_array( $this->nav ) AND count( $this->nav ) )
{
 foreach( $this->nav as $_nav )
 {
   $this->registry->output->addNavigation( $_nav[0], $_nav[1], $_nav[2], $_nav[3] );
 }
}

$template = $this->registry->output->getTemplate('topic')->topicViewTemplate( $this->forum, $this->topic, $post_data, $displayData );

 

Теперь идем в наш шаблон 'topicViewTemplate'.

Добавляем в переменные $items.

 

И в том месте где нам необходимо вставить "хлебные крошки" пишем:

<php>
$items = $this->registry->output->_navigation;
</php>

<ul id='breadcrumb' class='left'>
<foreach loop="$items as $idx => $data">
 <li>
   <span class='nav_sep'>{parse replacement="f_nav_sep"}</span>
   <a href='{parse url="{$data[1]}" base="$data[4]" seotitle="$data[2]" template="$data[3]"}' title='{$this->lang->words['nav_return_to']}{$data[0]}'>{$data[0]}</a>
 </li>
</foreach>
 <li>>{$topic['title']}</li>
</ul>

 

Возможно придеться еще немного подправить стили.

Если например надо будет продублировать "хлебные крошки" внизу страницы то нужно добавить код без верхних трех строк (он конечно не навредит но всё же).

Я проверял и это замечательно работает на 3х уровнях вложенности.

Edited by hacenator
  • Upvote 1

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...