Jump to content
View in the app

A better way to browse. Learn more.

IPBMafia.ru - поддержка 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.

Featured Replies

Posted

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

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

 

Заменить что угодно в выводе ничто не мешает и штатными средствами 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 )
	}

 

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

  • Author
7 часов назад, Respected сказал:

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

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

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

  • Author
4 минуты назад, Respected сказал:

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

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

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

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

  • Author
Только что, siv1987 сказал:

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

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

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

 

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

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

  • Author
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"}

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

2 часа назад, Desti сказал:

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

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

Хук для класса \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 );
	}

 

  • Author

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

 

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

12 часов назад, Desti сказал:

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

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

  • Author

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

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

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

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

 

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;
}

}

 

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Ответить в этой теме...

Последние посетители 0

  • No registered users viewing this page.

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.