Какие шаблонизаторы наиболее востребованы?

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Собственно вопрос в названии топика, хотелось бы узнать для себя, кто и что использует. Холиварчики приветствуются.

Пока что остановил свой взор на php-native/smarty(quicky)/twig/blitz
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Так большинсво за native шаблонизацию) А как же многими любимые смартя-твиги?
 

atv

Новичок
Сначала нужно определиться с требованиями к шаблонизатору.
 

shark_255

Новичок
smarty, 3-я версия вышла - наверное все в курсе) От нативного пхп в глазах рябит, хотя каждому свое
 

AmdY

Пью пиво
Команда форума
ещё phphalm http://phphaml.sourceforge.net/

я постепенно убегаю от php native, слишком уж много кода и уродские шаблоны получаются. да и от коллег получаешь такие говнокодистые шаблоны, вот пример пэйджинга
есть ещё вариант с использованием с захватом части в буффер и использования через sprintf .... такие шаблоны править чёрт знает какая потеря времени
PHP:
<?php

if ($list):

	// сооружается постраничник

	// сколько будет страниц
	$pages = $list->getPager()->getPages();
	if ( $pages > 1 ) { // если больше одной -- показываем
		$pager_html = '<div class="pager"><strong>'.__('Страница:').'</strong>';
		for ( $i=1; $i<=$pages; $i++ ) {
			$pager_html .=
				'<a '.
					( $list->getPager()->getOffset() != $i ?
						// ссылка для перехода на страницу номер ...
						'href='.
						$list->getBaseUrl()->tempVar(
							( $i>1 ? array('p'=> $i) : array() ),
							$this->getRequest()->getAction() ) :
						// или выделение текущей страницы
						'class="current_page"'
					)
				.">$i</a> ";
		}
		$pager_html .= '</div>';
		echo $pager_html;
	}

	echo '<div id="forecasts">';

	// проход по всем извлеченным прогнозам
	foreach($list->getData() AS $row) {
?>

// вместо
<? if ($this->PAGER->getPages() > 1) { ?>
<ul class="pager">
    <? for ($i=1;$i<=$this->PAGER->getPages();$i++) { ?>
    <li>
        <?php if ($this->PAGER->getOffset()!=$i) { ?>
        <a href="<?=$this->baseUrl?><?if ($i>1): ?>p:<?=$i?>/<? endif;?>"><?=$i?></a>
        <?php } else { ?>
        <span class="current"><?=$i?></span>
        <?php } ?>
    </li>
    <? }?>
</ul>
<? } ?>
//
// а вот очень интересный момент
//
<?php /* @var $this Templater */ ?>
<?php
/* @var $Form Form */
$Form = $this->FORM;
$Form->beginForm();

?>
<div class="headline graf_ico" style="background-image:none; padding-left:10px !important;"></div>
<div class="headline career_acc_ico"><h2><?= __('Карьера') ?></h2></div>
<table width="608">
    <tr>
        <td colspan="2"><h3><?= __('Место работы') ?></h3></td>
    </tr>
    <tr>
        <td colspan="2"><?= __('Работаете ли вы сейчас в каком-нибудь клубе или академии (спортивной школе)') ?>:<br><br>
            <div class="f_list">
                <?= $Form->get('club_play')->render('form_input') ?>
            </div><br><br>
        </td>
    </tr>
    <tr>
        <td colspan="2"><b><?= __('Если да, то в каком?') ?></b><br><br>
        </td>
    </tr>
    <tr>
        <td width="146"><label for="<?=$Form->get('club_name')->getId()?>"><?= __('Название клуба (академии)') ?>:</label></td>
        <td width="450">
            <?= $Form->get('club_name')->render('form_input') ?>
        </td>
    </tr>
    <tr>
        <td><label for="<?=$Form->get('club_position')->getId()?>"><?= __('Позиция') ?>:</label></td>
        <td><?= $Form->get('club_position')->render('form_input') ?></td>
    </tr>
    <tr>
        <td><label for="<?=$Form->get('club_country')->getId()?>"><?= __('Страна') ?>:</label><br>
        </td>
        <td><?= $Form->get('club_country')->render('form_input') ?></td>
    </tr>
    <tr>
        <td width="146"><label for="<?=$Form->get('club_city')->getId()?>"><?= __('Город') ?>:</label></td>
        <td width="450"><?= $Form->get('club_city')->render('form_input') ?></td>
    </tr>
    <tr>
        <td colspan="2"><h3><?= __('Контракт (если имеется, то укажите дату окончания контракта)') ?></h3></td>
    </tr>
    <tr>
        <td><label for="<?=$Form->get('contract_expired')->getId()?>"><?= __('День, месяц, год') ?>:</label></td>
        <td><?= $Form->get('contract_expired')->render('form_input') ?></td>
    </tr>
    <tr>
        <td colspan="2"><h3><label for="<?=$Form->get('additional')->getId()?>"><?= __('Информация о вашей карьере') ?>:</label></h3></td>
    </tr>
    <tr>
        <td><label for="<?=$Form->get('additional')->getId()?>"><i>* <?= __('Постарайтесь написать здесь как можно больше о&nbsp;вашей карьере') ?></i></label></td>
        <td><?= $Form->get('additional')->render('form_input') ?></td>
    </tr>
    <tr>
        <td>&nbsp;</td>
        <td><br><br><div style="float:right; margin-right:25px;"><a class="html_button" href="javascript:$('#<?= $Form->getFormId() ?>').submit()">Сохранить</a></div></td>
    </tr>
</table>
<?php $Form->endForm(); ?>

<table width="608">
    <tr>
        <td colspan="2"><h3 id="places"><?= __('Карьера') ?>:</h3></td>
    </tr>
</table>

<div id="career_forms">
<?php

// таблица-список мест работы
if ( count( $this->careerForms ) > 1 ) {
	$briefTable = '
		<table id="careersTable"><thead><tr>
			<th>'.__('Клуб').'</th><th>'.__('Должность').'</th><th>'.__('Страна').'</th>
			<th>'.__('Город').'</th><th>'.__('Период').'</th>
		</tr></thead><tbody>';

}

// выпихиваем на вывод что уже есть в буфере, чтоб в него собрать дальнейшие формы
ob_flush();

foreach ( $this->careerForms AS $idPlace => $careerForm ) {
    $careerForm->beginForm();

    if ( isset( $briefTable ) && $idPlace ) {
	    // формируем таблицу-список мест работы
		$briefTable .= '<tr id="staff_'.$careerForm->getId().'">'
			.'<th>'.$careerForm->get('club_name')->getValue().'</th>'
			.'<th>'.$careerForm->get('club_position')->getHumaneValue().'</th>'
			.'<th>'.$careerForm->get('club_country')->getHumaneValue().'</th>'
			.'<th>'.$careerForm->get('club_city')->getHumaneValue().'</th>'
			.'<td>'.$careerForm->get('club_from')->getHumaneValue()
			.' &mdash; '.$careerForm->get('club_to')->getHumaneValue().'</td>'
			.'</tr>'; ;
    }
    ?>


    <table width="608">
        <tr>
        	<td colspan="2"><h3><label for="<?=$careerForm->get('club_name')->getId()?>">
			<?= ( ! $idPlace ? 
				__('Новый клуб') :
				$careerForm->get('club_name')->getValue() ) ?>:
        	</label></h3></td>
        </tr>
        <tr>
            <td width="146"><label for="<?=$careerForm->get('club_name')->getId()?>"><?= __('Название клуба (академии)') ?>:</label></td>
            <td width="450"><?= $careerForm->get('club_name')->render('form_input') ?></td>
        </tr>
        <tr>
            <td><label for="<?=$careerForm->get('club_position')->getId()?>"><?= __('Позиция') ?>:</label></td>
            <td><?= $careerForm->get('club_position')->render('form_input') ?></td>
        </tr>
        <tr>
            <td><label for="<?=$careerForm->get('club_country')->getId()?>"><?= __('Страна') ?>:</label></td>
            <td><?= $careerForm->get('club_country')->render('form_input') ?></td>
        </tr>
        <tr>
            <td><label for="<?=$careerForm->get('club_city')->getId()?>"><?= __('Город') ?>:</label></td>
            <td><?= $careerForm->get('club_city')->render('form_input') ?></td>
        </tr>
        <tr>
	    	<td class="right_align"><?= __('с') ?></td>
	        <td>
				<?= $careerForm->get('club_from')->render('form_input') ?>
				<?= '&nbsp;' . __('по') ?> <?= $careerForm->get('club_to')->render('form_input') ?>
			</td>
        </tr>
		<tr>
			<td>&nbsp;</td>
            <td><br><br>
            	<?php /* 
                <div style="float:right; margin-right:25px;">
                    <a class="html_button delete_place_button" href="<?=$this->getFullHost()?>/staff/deletePlace/id:<?=$idPlace?>/"><?=__('Удалить')?></a>
                </div>
                */ ?>
                <div style="float:right; margin-right:25px;">
                    <a class="html_button" href="javascript:$('#<?= $careerForm->getFormId() ?>').submit()"><?=__('Сохранить')?></a>
                </div>
            </td>
        </tr>
    </table>

    <?php
    $careerForm->endForm();
}

if ( isset( $briefTable ) ) {
	// закрываем таблицу-список мест работы
	$briefTable .= '</tbody></table><a id="deleteCareerRow" href="#x" title="'.__('Удалить место работы').'">&times;</a>'; // кнопочка "Удалить"
} else {
	$briefTable = '<div id="careersTableDummy">Не указано ни одного места работы</div>';
}
// публикуем таблицу-список мест работы выше форм и всего остального
$out = ob_get_clean();
// выводим таблицу-список, ссылку "Добавить новое место", формы
echo
	$briefTable,
	'<div id="add_carrier_place_block"><a class="ajax" id="add_carrier_place" href="#'.
		__('Добавить').'">'.__('Добавить место работы').'</a></div>',
	$out;

?>

<input type="hidden" id="areYouSureQuestion" value="<?=__('Подтвердите удаление места работы')?>" />    
</div>
 

AmdY

Пью пиво
Команда форума
fixxxer
синтаксис провоцирует. я добавил кусок с буферизацией, с пяти попыток так и не понял, зачем было использовать буферизацию, когда всё прекрасно работает и без неё, просто кусок кода нужно опустить ниже
 

fixxxer

К.О.
Партнер клуба
Вот потому я за твиг. =)

HAML хорош для случая "верстку делает программист", верстальщику обычный html привычнее :)
 

Raziel[SD]

untitled00
да и от коллег получаешь такие говнокодистые шаблоны, вот пример пэйджинга
есть ещё вариант с использованием с захватом части в буффер и использования через sprintf .... такие шаблоны править чёрт знает какая потеря времени
бить по рукам ... топором, чтобы точно не повторялось.
 

Фанат

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

AmdY
"не виноватая я, он сам пришёл", ага.
говнокод можно не только в шаблоне писать. давайте тогда уж и логику не на пыхе писать. он, кагбе, провоцирует.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
phphalm идет лесом, не буду интегрировать к себе, больно некрасив в плане шаблонов, все таки html должен им и оставаться
 

AmdY

Пью пиво
Команда форума
c0dex
у тебя какое-то логическое противоречие.
halm - еслинственный из приведённых подходов, который СОВСЕМ не трогает html, все остальные вставляют свою разметку в html.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
AmdY
Нет никакого противоречия, мне нужны были мнения кто и что использует.
А то, что halm похож на дикообраза - факт.

Мне не нужен шаблонизатор, который бы саму идею шаблонизации увеличил в два раза, добавив туда еще и шаблонизацию самого html. Это бред.

Оставлю пока как есть, не буду добавлять нового.
 
Сверху