Перейти к публикации
View in the app

A better way to browse. Learn more.

Дизайн и модификация Invision Community

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Опубликовано:

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

Рекомендованные сообщения

Опубликовано:

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

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

Опубликовано:
  • Автор

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

 

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

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

Опубликовано:
В каких именно?

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

Опубликовано:

Косяк вашей задачи в том, что 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.

Опубликовано:
  • Автор

Спасибо.

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

 

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

Изменено пользователем hacenator

Опубликовано:

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

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

 

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

Опубликовано:
  • Автор

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

Изменено пользователем hacenator

Опубликовано:
  • Автор

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

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

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х уровнях вложенности.

Изменено пользователем hacenator

Создайте аккаунт или войдите в него для комментирования

Сейчас на странице 0

  • Нет пользователей, просматривающих эту страницу.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.