Jump to content

Recommended Posts

Я правильно понимаю, что штатными возможностями движка невозможно полностью заменить шаблон или внести изменения в код, который не закрыт в какой-то контейнер? Типа ссылку в примере ниже поменять невозможно в принципе?

<div class="zzz"><h1 class="www">Title</h1></div>
<a href="...">Ссылка</a>
<div class='xxx'>{$table}</div>

 

Share this post


Link to post
Share on other sites

Заменить что угодно в выводе ничто не мешает и штатными средствами PHP. Например хуком для класса \IPS\Output:

	public function sendOutput( $output='', $httpStatusCode=200, $contentType='text/html', $httpHeaders=array(), $cacheThisPage=TRUE, $pageIsCached=FALSE, $parseFileObjects=TRUE, $parseEmoji=TRUE )
	{
		if( preg_match( '#<div\sclass="zzz"><h1\sclass="www">Title</h1></div>\n?\r?(<a[^<>]*</a>)#s', $output, $match ) )
		{
			$replace = '<!--my_replece_code-->';
			$output = str_replace( $match[1], $replace, $output );
		}
		
		parent::sendOutput( $output, $httpStatusCode, $contentType, $httpHeaders, $cacheThisPage, $pageIsCached, $parseFileObjects, $parseEmoji )
	}

 

Share this post


Link to post
Share on other sites

В регулярке лишняя треугольная закрывающая скобка, на коленке писал... Правильно - '#<div\sclass="zzz"><h1\sclass="www">Title</h1></div>\n?\r?(<a[^<]*</a>)#s'. С ней в общем-то варианты возможны.

Share this post


Link to post
Share on other sites
7 часов назад, Respected сказал:

Заменить шаблон полностью можно, а вот часть кода без контейнера - вряд ли получится.

Как, если у шаблона нет контейнера? В штатных средствах хуков 4.х нет такой фичи.

Dmitriy427 preg_match на весь вывод, шаблон в коде..  А если там на пару-тройку строк фрагмент в неуникальных селекторах? Не, не наш метод. Но за идею спасибо.

Share this post


Link to post
Share on other sites
4 минуты назад, Respected сказал:

и перегружаешь полностью шаблон.

Или я что-то не понял, или.. Я не выбираю шаблон в theme plugin, я выбираю группу шаблонов, а в самом хуке все действия с шаблонами только по селекторам css,

Или поясните.

Share this post


Link to post
Share on other sites

А что собственно мешает выбрать нужный элемент селекторами? Где сказано что элемент должен быть в каком-то контейнере?  Ссылку можно выбрать по аттрибуту href, можно в порядке следования.

Share this post


Link to post
Share on other sites
Только что, siv1987 сказал:

А что собственно мешает выбрать нужный элемент селекторами?

Отсутствие оных.  Например, такое.. 

{{if count( $featured )}}
	{template="featuredEntries" group="browse" params="$featured"}
{{endif}}

 

Share this post


Link to post
Share on other sites

Ну так хукать нужно там где он находится, очевидно это шаблон featuredEntries

Можно в крайнем случае перегрузить нужный шаблон и выполнить замену по регулярному выражению.

Share this post


Link to post
Share on other sites
28 минут назад, siv1987 сказал:

Ну так хукать нужно там где он находится, очевидно это шаблон featuredEntries

А мне не надо хукать featuredEntries. Вот простой пример, надо перенести indexButtons внутрь div-а и поставить его после h1.  

<div class="ipsPageHeader ipsClearfix ipsSpacer_bottom  ipsPageHeader--blogs">
	<h1 class="ipsType_pageTitle">{lang="blogs"}</h1>
</div>
{template="indexButtons" group="browse" params="$blogs, $viewMode"}

Я не спрашиваю, как это можно еще сделать, я выясняю встроенные возможности. 

Share this post


Link to post
Share on other sites
2 часа назад, Desti сказал:

preg_match на весь вывод, шаблон в коде..  А если там на пару-тройку строк фрагмент в неуникальных селекторах? Не, не наш метод.

Очевидно, это не Ваш метод, поскольку регулярные выражения Вам изучать влом. Но это метод использующийся IPS, в том же sendOutput весь вывод прогняетяся через регулярки методами parseOutputForDisplay, parseFileObjectUrls, replaceEmojiWithImages. К тому же это только пример, делайте замены с нужным шаблоном - \IPS\Theme\Template, никто против не будет.

Share this post


Link to post
Share on other sites

Хук для класса \IPS\Theme:

	public function getTemplate( $group, $app=NULL, $location=NULL )
	{
		if( $group == 'my_group' and $app == 'my_app' and $location == 'my_location' )
		{
			$template = parent::getTemplate( $group, $app, $location );
			$search = preg_match( 'my_pattern', $template, $match ) ? $match[1] : false;
			
			if( $search )
			{
				$replace = '<!--my_replece_code-->';
				$template = str_replace( $search, $replace, $template );
			}
			
			return $template;
		}
		
		return parent::getTemplate( $group, $app, $location );
	}

 

Share this post


Link to post
Share on other sites

Dmitriy427 Что бы я без вас делал.. Вот только я снова уточняю, меня интересует вполне конкретный инструмент, Theme Hook и его возможности, а не ваш бесценный опыт в написании банальных регулярок. Убедительная просьба на влезать в мои темы со своими ответами, если у вас возникают сомнения, что вы правильно прочитали и смогли понять вопрос.

 

Share this post


Link to post
Share on other sites
2 минуты назад, Dmitriy427 сказал:

и обещал

Надеюсь, мы больше не пересечемся, вы сможете-таки сдержать обещание.

Share this post


Link to post
Share on other sites
12 часов назад, Desti сказал:

А мне не надо хукать featuredEntries. Вот простой пример, надо перенести indexButtons внутрь div-а и поставить его после h1.  

<div class="ipsPageHeader ipsClearfix ipsSpacer_bottom  ipsPageHeader--blogs">
	<h1 class="ipsType_pageTitle">{lang="blogs"}</h1>
</div>
{template="indexButtons" group="browse" params="$blogs, $viewMode"}

Я не спрашиваю, как это можно еще сделать, я выясняю встроенные возможности. 

В последних версиях шаблон выглядит несколько иначе:

<div class="ipsPageHeader ipsClearfix ipsSpacer_bottom ipsHeaderButtons">
	{{if \count( $blogs ) || \IPS\blog\Blog::canCreate() || \IPS\Settings::i()->blog_allow_grid}}
		<ul class='ipsToolList ipsToolList_horizontal ipsClearfix ipsPos_right'>
			{template="indexButtons" group="browse" params="$blogs, $viewMode"}
		</ul>
	{{endif}}
	<h1 class="ipsType_pageTitle">{lang="blogs"}</h1>
</div>

Здесь как раз можно выбрать родительский элемент - ipsPageHeader

Share this post


Link to post
Share on other sites
12 часов назад, Desti сказал:

Я не спрашиваю, как это можно еще сделать, я выясняю встроенные возможности. 

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

Share this post


Link to post
Share on other sites

Respected Я пока не переехал на свежую версию, да и код я привел только в качестве примера.  Там, где есть контейнер с классами, вопросов не возникает. 

3 часа назад, siv1987 сказал:

Есть возможность перегрузить шаблон

Третий раз это слышу.. Как?? 

 

Share this post


Link to post
Share on other sites
3 часа назад, Desti сказал:

Третий раз это слышу.. Как?? 

Шаблоны в IPS это функции, соответственно в хуке для шаблона перегружаете шаблон переопределением нужной функции.

class hook149 extends _HOOK_CLASS_
{

/* !Hook Data - DO NOT REMOVE */
public static function hookData() {
	return array_merge_recursive( array(), parent::hookData() );
}
/* End Hook Data */

public function indexButtons($showViewButtons=TRUE, $showFilterButton=FALSE)
{
	$html = parent::indexButtons($showViewButtons, $showFilterButton);
	
	return $html;
}

}

 

Share this post


Link to post
Share on other sites

siv1987 Теперь понял, про что вы, спасибо. Я думал, что это как-то возможно стандартными средствами управления Theme plugin, а не правкой кода плагина.

Share this post


Link to post
Share on other sites

Центр разработки это лишь гуи для управления и правки "кодом плагина", и то и то являются стандартными средствами форума. 

Share this post


Link to post
Share on other sites

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

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.

×