Перейти к контенту
  • 0

передать переменную во все шаблоны


demvlg

Вопрос

доброго времени суток

 

подскажите, в шаблоне globalTemplate я пишу код:

<php>

$abc = '123456789';

</php>

 

как вывести эту переменную в другом шаблоне? например в userInfoPane

вывод {$abc} дает пустоту

 

заранее спасибо

Ссылка на комментарий
Поделиться на других сайтах

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

  • 0

у шаблона есть такая штука - входящие переменные, это как бы функция (один шаблон - одна функция)

так что скорее придется писать хук, и смотря для чего все это нужно

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Можно объявить нужную переменную в шаблоне includeVars:

ipb.vars['my_var'] = 'my_data';

Или в globalTemplate есть объявление переменных JS:

 
<script type='text/javascript'>
//<![CDATA[
jsDebug = {parse expression="intval($this->settings['_jsDebug'])"}; /* Must come before JS includes */
DISABLE_AJAX = parseInt({$this->settings['disable_text_ajax']}); /* Disables ajax requests where text is sent to the DB; helpful for charset issues */
inACP = false;
var isRTL = false;
var rtlIe = '';
var rtlFull = '';
//]]>
</script>

Можно присоединиться к ним.

Ссылка на комментарий
Поделиться на других сайтах

  • 0

но это именно js переменные?

мне именно их пхп файла надо вывести...

 

можно конечно в главном шаблоне весь выход их пхп засунуть в js переменную, и дальше она уже получается доступна везде

но это некрасиво, там будет большой хтмл...

Ссылка на комментарий
Поделиться на других сайтах

  • 0

У нас же ООП. Даже если бы и по-процедурному, то все равно надо было бы вылезать в $GLOBALS['MyEvilVar'] . 

 

Если по жесткому, то можно пририсовать её в кеш.  ipsRegistry::updateCacheWithoutSaving( 'MySuperVar','abc' );  А потом ipsRegistry::getCache('MySuperVar', FALSE ); . 

 

Но лучше слепить хук https://www.invisionpower.com/support/guides/_/advanced-and-developers/hooks/skin-overloaders-r61 , в котором передать шаблону свою переменную в одном из входящих массивов.

 

А вообще, все зависит от того что за переменная и в скольки местах нужна и переменная ли она вообще. Может ее проще в conf_global.php вписать или глобальную константу в initdata завести. 

Ссылка на комментарий
Поделиться на других сайтах

  • 0

не совсем понял по ссылке мануал для создания хука перезагрузки стиля

как мне вывести чтото (это чтото родится внутри файла хука) над аватарой?


нашел, наверно мне подходит этот пример:
https://www.invisionpower.com/support/guides/_/advanced-and-developers/hooks/template-hooks-r105
 
только в нем
$profile = ipsRegistry::instance()->output->getTemplate('profile')->functionData['profileModern'][0]['member'];
не работает, ничего не выдает...

 

как мне получить данные автора каждого поста?

 

и еще, код внутри

public function getOutput()
сколько раз будет вызываться? сколько постов на странице?
Ссылка на комментарий
Поделиться на других сайтах

  • 0

и еще, код внутри public function getOutput() сколько раз будет вызываться? сколько постов на странице?

смотря к какому шаблону привязка. если к topicview то один, если к post то для каждого поста 

 

Над аватаркой работает userinfopane из глобальных. А profilemodern есть только на странице профиля. если у вас этот шаблон на данной конкретной странице не используется, то и в массиве functionData его не будет.

 

 

как мне получить данные автора каждого поста?

смотря куда их надо получить. в topicviewtemplate можно получить из functionData['userinfoPane'][НОМЕР ПОСТА НА СТРАНИЦЕ]['author'] 

 

Но это и не надо. У вас есть userinfoPane, в который вы хотите, как я понял, что-то вывести, у него есть данные об авторе. Над аватаром находится хукпоинт if.avatar . Вам нужен туда хук шаблона, который в getOutput() возьмет что-то из базы или из массива author, отформатирует и выдаст. 

Ссылка на комментарий
Поделиться на других сайтах

  • 0

а где мне взять этот НОМЕР ПОСТА НА СТРАНИЦЕ,
который используется в functionData['userinfoPane'][НОМЕР ПОСТА НА СТРАНИЦЕ]['author'] ?
 
допустим я хочу вывести над аватаром [author_id]
код хука:

<?php

class aionAchieves
{
	public function getOutput()
	{

        $authorData = ipsRegistry::instance()->output->getTemplate('global')->functionData['userInfoPane'];
        return '<li class="aion_achieves">'.$authorData[0]['author']['author_name'].'</li>';

	}
}

вот как мне вместо 0 задать нужный ИД поста?

иначе выводится над каждым аватаром author_name из первого поста

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Вот тут и начинается веселье, никак.
Есть 2 варианта:
1. Сделать хук для вышестоящего шаблона - topicViewTemplate, а в нем использовать функцию replaceOputput() и заменять в выводе по ключу хука в цикле. Вот так добавляют кнопки в посты:
 

public function getOutput()
				{
				}

				public function replaceOutput( $output, $key )
				{
					$key = 'if.skin_topic.post.canEdit.pre.startif';
					$tag	= '<!--hook.' . $key . '-->';
					$lastFound = 0;
					if (count($this->registry->output->getTemplate('topic')->functionData['topicViewTemplate'][0]['post_data'])){
						foreach($this->registry->output->getTemplate('topic')->functionData['topicViewTemplate'][0]['post_data'] as $post)
						{
							if (!$post['post']['_isDeleted'])
							{
								$pos = strpos($output, $tag, $lastFound);
								$strToInsert = 'Я кнопка!!!';

								if ($pos)
								{
									$output = substr_replace($output, $strToInsert.$tag, $pos, strlen($tag));
									$lastFound = $pos + strlen($tag.$strToInsert);
								}
							}
						}
					}
					return $output;
				}

Жутко глючная конструкция. Надо угадать все условия, при которых пост будет пропущен, иначе счетчик пойдет в разнос и мы вставим данные не от того поста.
 

2. В теории можно замутить глобальный счетчик или флажок. 

<?php

class aionAchieves
{
	public function getOutput()
	{
 
          $authorData = ipsRegistry::instance()->output->getTemplate('global')->functionData['userInfoPane'];
          foreach ($authorData as $num => $data) {
            if (!isset($data['achive_added'])){
              ipsRegistry::instance()->output->getTemplate('global')->functionData['userInfoPane'][$num]['achive_added']=true;
              return '<li class="aion_achieves">'.$data['author']['author_name'].'</li>';
            }
          }
	}
}

Решение чисто теоретическое. Я так еще не пробовал, только что придумал.

Ссылка на комментарий
Поделиться на других сайтах

  • 0

похоже что нет, выводит author_name первого поста над всеми аватарами


а как добавить в массив $author в userinfoPane свои данные?

а потом их просто в шаблоне вывести


нашел выход:

<?php
class aionAchieves
{
	protected $registry;
	protected $settings;
	public function __construct()
	{
		$this->registry =  ipsRegistry::instance();
		$this->settings =& $this->registry->fetchSettings();
	}

	public function getOutput()
	{
		return;
	}

	public function replaceOutput($output, $key )
	{
		if(is_array($this->registry->output->getTemplate('global')->functionData['userInfoPane']) && count($this->registry->output->getTemplate('global')->functionData['userInfoPane']))
		{
			$tag  = '<!--hook.'.$key.'-->';
			$last = 0;

			foreach($this->registry->output->getTemplate('global')->functionData['userInfoPane'] as $k => $v)
			{
				$pos = strpos($output, $tag, $last );
				if($pos !== FALSE )
				{
					$string = $v[1]; // my output
					$output = substr_replace($output, $string.$tag, $pos, strlen($tag ) );
					$last = $pos + strlen($tag . $string );
				}
			}
		}
		return $output;
	}

и вот в $string = $v[1]; // my output я уже вставляю что мне надо

и в шаблон топика не лезу

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить на вопрос...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.