Перейти к контенту
  • 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 я уже вставляю что мне надо

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

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

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

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

Гость
Ответить на вопрос...

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

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

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

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

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

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

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

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