Микрошаблоны

С.

Продвинутый новичок
Ок, не все спокойно в MVCешном королевстве, но это песня не о нем, а о микрошаблонах. Никуда нам, не деться от кусочков HTML текста в коде. Это и хелперы и просто разросшиеся динамические текстовые сообщения. Уже откровенно стала нервировать ситуация с ними. Ну не в отдельные же их файлы выносить. И в кавычках они уже стали натурально бесить.

Есть конечно старый добрый буферизатор вывода. Но максимум удобств, которые из него можно получить типа такого:
PHP:
<?
   /* тут всякое разное */
   mTpl::start();
?>
тута формируется <em>мой текст</em> с каким-то там <a href="<?=foo('динамическим')?>">контекстом</a>
<?
   $msg= mTpl::contents();
   /* тут "всякое-разное" пошло дальше */
?>
Получше, чем то же самое в кавычках, но как-то неаккуратненько. Вот это $msg=, расположенное после самого содержимого расстраивает. Было бы лучше что-то типа HEREDOC, но не просто с {$переменными}, а с <?=выражениями?>.

Какие есть мысли о проблеме.
 

Фанат

oncle terrible
Команда форума
Если это реально код размером больше одной строчки, и прям вот требуются шаблонизаторные изыски - таки да, выносить в отдельные файлы.
Ну, или в том же шаблоне делается ветвление.
PHP:
<? if ($foo): ?>
тута формируется <em>мой текст</em> с каким-то там <a href="<?=$foo?>">контекстом</a>
<? endif ?>
Вообще, в абстрактном виде такие вопросы задавать, имхо, бесполезно. Каждый конкретный случай надо рассматривать отдельно. Повторяющиеся блоки вынести в свой модуль со своим шаблоном. "разросшиеся текстовые" фигачить либо прямо в шаблоне, либо, если используется в разных шаблонах - в отдельный файл.
 

С.

Продвинутый новичок
Хорошо, не одна строка, а три? Уже в отдельный файл? А это просто напросто текст об одной конкретной ошибке.

Или вот например хелпер, просто рисует маленькую плашку:
PHP:
	function Plate($url,$icon1,$icon2,$title)
	{
		$html= "\n";
		$html.= '<a class="plate" href="'.$url.'">';
		$html.= '<div>';
		if ($icon2)
		{
			$html.= '<span><img src="icons/'.$icon1.'"></span>';
			$html.= '<span><img src="icons/arrow.jpg" alt="&gt;&gt;"></span>';
			$html.= '<span><img src="icons/'.$icon2.'"></span>';
		}
		else
		{
			$html.= '<span style="width:240px;"><img src="icons/'.$icon1.'" alt="'.$title.'"></span>';
		}
		$html.= '</div>';
		$html.= $title;
		$html.= '</a>';
		return $html;
	}
В отдельный файл? Не уверен. Я специально не конкретизирую, поскольку вижу, что единый подход может мыть использован в очень разных случаях.
 

Фанат

oncle terrible
Команда форума
ну а я - уверен. это я бы точно выносил в отдельный файл.
смешно, но как раз на этой неделе буду писать микроадминку для таких вот кнопок :)
вопрос, выносить ли шаблон в файл, даже не стоит
 

С.

Продвинутый новичок
Вот и я про это... Сначала вынесли кнопку в отдельный файл, а потом оказалось, что надо админку для их управления. А не жирно?
 

Фанат

oncle terrible
Команда форума
админка пишется не для файлов, а для кнопок, чтобы менеджеры могли их сами ставить, не привлекая программиста.
 
  • Like
Реакции: craz

SiZE

Новичок
Не в тему немного. Почему не так?

PHP:
$html = "\n"
  .'<a class="plate" href="'.$url.'">'
  .'<div>';

// или так
$html = "\n"
  .'<a class="plate" href="'.$url.'">
    <div>';
 

Фанат

oncle terrible
Команда форума
кстати да, о динамических выражовываниях
PHP:
$foo = 'foo';
echo <<<HERE
blahblah $foo() barbar
HERE;
если мне не изменяет ни с кем
 

С.

Продвинутый новичок
админка пишется не для файлов, а для кнопок, чтобы менеджеры могли их сами ставить, не привлекая программиста.
Тем более. Я показал вариант, когда шаблон всего один, но формируется динамически.

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

С.

Продвинутый новичок
Не в тему немного. Почему не так?
PHP:
$html = "\n"
  .'<a class="plate" href="'.$url.'">'
  .'<div>';

// или так
$html = "\n"
  .'<a class="plate" href="'.$url.'">
    <div>';
Это как раз в тему. И тема состоит в том, как именно этой самой порнографии, приведенной в твоем (и моем) примере, избежать
 

craz

Нестандартное звание
А если по правильному то разве не должно быть стека хелперов? И минишаблоны это те которые у яндекса?
<?=$this->miniTplAddress($address);?> - как то так. Или мои 15 секунд меня подвели?
 

Фанат

oncle terrible
Команда форума
Тем более. Я показал вариант, когда шаблон всего один, но формируется динамически.
А что - бывает по-другому?
Ты задаешь вопрос, но не читаешь ответов. Смысл тогда затевать обсуждение?
админка - повторяю второй раз - не для шаблонов. Не для файлов. Для кнопок.
Шаблон - один. Ему админка не нужна.
Файл - один. Админка обратно не нужна.
Админка - прикладная задача.
Технология же, о которой ты спрашивал - записать в файл.
Всякая отдельная от других сущность может быть записана в файл. Ничего страшного в этом нету.

Для приведённого тобой примера решение очевидно - записать в файл.
Для других случаев могут быть другие решения.
 

damner2

Новичок
Можно ещё делать так:
PHP:
$html = tag('a', array('class' => 'plate', 'href' => $url)).tag('div').escape($text).tag('/div').tag('/a');
Так не удастся забыть сделать htmlspecialchars атрибутам тегов, как во всех примерах выше...
 

Фанат

oncle terrible
Команда форума
Можно ещё делать так:
гениальное решение, я щетаю.
Так не удастся забыть сделать htmlspecialchars атрибутам тегов, как во всех примерах выше...
а вот тут ты малость соврал
непонятно, с чего вдруг здесь нельзя забыть искейпинг
 

С.

Продвинутый новичок
Привожу еще пример. Кусок массива, в котором хранятся настроечные данные. Данных много и они на столько разные, что полнотью формализовать их невозможно.
PHP:
	...
	'PROV1'=> array('zone'=>'CELL', 'sys'=>'CELL', 'topup'=>'DIRECT', 'currency'=>'RUB',
		'values'=>array(20,30,40,50),
		'suspend'=>	
			ert(
				'Direct PROV-1 service under technical maintanence. Please use ',
				'Извините сервис прямого пополнения PROV-1 закрыт на техобслуживание. Поспользуйтесь '
			)
			.'<a href="'.url_add('org','PROV2').'">PROV-2</a>',
		'info'=>
			'<div style="text-align:center;"><a href="'.url_add('org','PROV2').'">'
			.ert('For larger top up<br>amounts please use','Для более крупных<br>сумм пополнения используйте')
			.'<br><img src="icons/PROV2.jpg" alt="PROV-2" style="vertical-align:middle;"></a></div>',
	),
	...
От такого кровоточят глаза. Как сделать лучше?
 

craz

Нестандартное звание
Привожу еще пример. Кусок массива, в котором хранятся настроечные данные. Данных много и они на столько разные, что полнотью формализовать их невозможно.
PHP:
	...
	'PROV1'=> array('zone'=>'CELL', 'sys'=>'CELL', 'topup'=>'DIRECT', 'currency'=>'RUB',
		'values'=>array(20,30,40,50),
		'suspend'=>	
			ert(
				'Direct PROV-1 service under technical maintanence. Please use ',
				'Извините сервис прямого пополнения PROV-1 закрыт на техобслуживание. Поспользуйтесь '
			)
			.'<a href="'.url_add('org','PROV2').'">PROV-2</a>',
		'info'=>
			'<div style="text-align:center;"><a href="'.url_add('org','PROV2').'">'
			.ert('For larger top up<br>amounts please use','Для более крупных<br>сумм пополнения используйте')
			.'<br><img src="icons/PROV2.jpg" alt="PROV-2" style="vertical-align:middle;"></a></div>',
	),
	...
От такого кровоточят глаза. Как сделать лучше?
Прям отвечаю хелпер вида тут сам напрашивается.

ert(
'Direct PROV-1 service under technical maintanence. Please use ',
'Извините сервис прямого пополнения PROV-1 закрыт на техобслуживание. Поспользуйтесь '
)
Причем это тоже хелпер.
$this->__t('Direct PROV-1 service under technical maintanence. Please use');
 

Фанат

oncle terrible
Команда форума
Без объяснения, почему нельзя весь этот хтмл вынести в шаблон, постить такие куски кода, имхо, бессмысленно.
 

С.

Продвинутый новичок
Ты задаешь вопрос, но не читаешь ответов. Смысл тогда затевать обсуждение?
Может смысл поменяться с тобой ролями?

Вот ведь как не хотел, так и получилось, что уперлись в частности. Я снова обобщаю вопрос. Есть куски HTML текстов, формируемные так или иначе и передаваемые по программе в виде строк. Есть такое! Кто скажет, что нет, я перекушу ему кадык. Вопрос состоит в том, как представлять красиво такие "литералы". Проблема в том, что формально с т.з. синтаксиса это не литералы, но в рамках приложения (на более высоком уровне понимания) это некий фиксированный кусок. Как его красиво представлять?
 
Сверху