php_templates 1.7

confguru

ExAdmin
Команда форума
Гут! А то тут раздовалось неровное гудение
в народе - что ты все забросил ,)

Думаю надо найти еще спецов по написамнию модулей - чтоб дело спорилось

В клубе теперь есть цвс - для таких дел -
обращатся к tony2001
 

su1d

Старожил PHPClubа
слухи о моей отставке сильно преувеличены! (с) =)

Думаю надо найти еще спецов по написамнию модулей - чтоб дело спорилось
...ещё спецов для написания php_templates? negative. этот проект веду я один. я всегда включу в CVS чей-то bugfix (при условии, что он хорош, ессно), но реализацию новых фич оставляю за собой. это -- лишь необходимая мера для поддержания порядка в проекте.
 

forre

Новичок
Требуется такая структура:

Каталог 1
-- Статья 1 (каталога 1)
-- Статья 2 (каталога 1)
Каталог 2
-- Статья 1 (каталога 2)
-- Статья 2 (каталога 2)

Вот код обработчика шаблона:
PHP:
//-- БД: "parts" -> каталоги, "articles" -> статьи. Привязка по полям `cat_id` каждой из таблиц.
//--
	if (tmpl_type_of ($template,'subcat')) {
		$query = "SELECT `cat_id`, `name`, `description`FROM `parts`";
		$result = mysql_query($query);
                //-- Получили строки каталогов --
		while($row = mysql_fetch_assoc($result)) {
			tmpl_iterate($template, 'subcat');
			tmpl_set($template, 'subcat', $row);

			//-- Получаем статьи, привязанные к текущему в цикле каталогу --
			if (tmpl_type_of ($template,'art_lim')) {
				$query = "SELECT `name`, `description`FROM `articles`WHERE `cat_id` = ".$row['cat_id'];
				$result1 = mysql_query($query);
				while($row1 = mysql_fetch_assoc($result1)) {
					tmpl_iterate($template, 'art_lim');
					tmpl_set($template, 'art_lim', $row1);
				}
			}

		}
	}
Вот шаблон:
PHP:
<tmpl:subcat>
<table>
 	<tr>
		<td>
		{name}
		</td>
	</tr>
	<tr>
		<td>
		{description}
		</td>
	</tr>
</table>
</tmpl:subcat>
<tmpl:art_lim>
<table>
 	<tr>
		<td>
		{name}
		</td>
	</tr>
	<tr>
		<td>
		{description}
		</td>
	</tr>
</table>
</tmpl:art_lim>
Получается следущее:

Каталог 1
Каталог 2
-- Статья 1 (каталога 1)
-- Статья 2 (каталога 1)
-- Статья 1 (каталога 2)
-- Статья 2 (каталога 2)

Подскажите как подправить.

Прошу помощи - очень надо разобраться.
 

su1d

Старожил PHPClubа
тебе нужно разобраться, что такое контекст в шаблоне, и как с ним работать с помощью итераций.

шаблон:
PHP:
<table class="menu">
<tmpl:cat>
  <tr><th>{part_name}</th></tr>
  <tmpl:subcat>
    <tr><td>-- {article_name}</td></tr>
  </tmpl:subcat>
</tmpl:cat>
</table>
код:
PHP:
$sql = "SELECT parts.*, articles.*, parts.name AS part_name, articles.name AS article_name FROM parts INNER JOIN articles USING(cat_id) GROUP BY articles.id ORDER BY parts.name, parts.id, articles.name";
$q = mysql_query($sql) or die("SQL error: ".mysql_error());
$cat = 0;
while($D = mysql_fetch_assoc($q))
{
  extract($D);
  if($cat != $cat_id)
  {
    tmpl_iterate($tmpl, "cat");
    tmpl_set($tmpl, "cat", $D);
    $cat = $cat_id;
  }

  tmpl_iterate($tmpl, "cat/subcat");
  tmpl_set($tmpl, "cat/subcat", $D);
}
 

forre

Новичок
Огромное спасибо.

-~{}~ 21.09.06 15:59:

Пытаюсь разобраться дальше и наткнулся на такую проблему:
Требуемая стуктура левого меню:
Блок 1
-- Раздел 1 (блока 1)
-- Раздел 2 (блока 1)
-- Раздел 3 (блока 1)
-- Раздел 4 (блока 1)
Блок 2
-- Раздел 1 (блока 2)
-- Раздел 2 (блока 2)
-- Раздел 3 (блока 2)
-- Раздел 4 (блока 2)
Использую шаблон и обработчик (см. ниже).
Все работает без проблем. Теперь требуется подкрасить троки меню (Раздел 1, Раздел 2 и т.д.) разными цвета
(получить "полосатое" меню). Я ввожу в шаблон 2 варианта меню и в обработчике устанавливаю чередование.
Это срабатывает, но в итоге получается следующее:
Блок 1
-- Раздел 1 (блока 1) - ord
-- Раздел 3 (блока 1) - ord
-- Раздел 2 (блока 1) - even
-- Раздел 4 (блока 1) - even
Блок 2
-- Раздел 1 (блока 2) - ord
-- Раздел 3 (блока 2) - ord
-- Раздел 2 (блока 2) - even
-- Раздел 4 (блока 2) - even
То есть он сгруппировал структуру меню по кускам шаблона.
Скорее всего я некорректно понямаю принцип обработки шаблона и прошу Вашей помощи.
Вот листинги:
(блоки и разделы хранятся в одной таблице)
PHP:
<?php
//-- Загрузка левого меню --
$template = tmpl_open('./blocks/left_menu.html');

$query = "SELECT t1.`cat_id`,t1.`cat_level`,t2.`name`,t3.`mod_id`, t3.`file`
FROM `parts` AS t1
LEFT JOIN `part_names` AS t2 ON t1.`cat_id` = t2.`cat_id`
LEFT JOIN `modules` AS t3 ON t2.`mod_id` = t3.`mod_id`
WHERE t1.`cat_level` IN (1,2)
ORDER BY t1.`cat_left`";
$result = $db->Execute($query);
$i=1;
while($row = $result->FetchRow()) {
	if ($row['cat_level'] == 1) {
		tmpl_iterate($template, 'topic');
		tmpl_set($template, 'topic', $row);
	}
	if ($row['cat_level'] == 2) {
		if ($i == 1) {
			tmpl_iterate($template, 'topic/menu_ord');
			tmpl_set($template, 'topic/menu_ord', $row);
			$i = 0;
		} else {
			tmpl_iterate($template, 'topic/menu_even');
			tmpl_set($template, 'topic/menu_even', $row);
			$i = 1;
		}
	}
}
echo tmpl_parse($template);
?>
Шаблон:
PHP:
<table>
<tmpl:topic>
	<tr>
		<td>Topic - {name}</td>
	</tr>

<tmpl:menu_ord>
	<tr>
		<td>ord - {name}</td>
	</tr>
</tmpl:menu_ord>

<tmpl:menu_even>
	<tr>
		<td>even - {name}</td>
	</tr>
</tmpl:menu_even>

</tmpl:topic>	
</table>
 

su1d

Старожил PHPClubа
оберни menu_ord и menu_even в ещё один контекст menu_item, и в tmpl_iterate() указывай только его.

PHP:
<tmpl:menu_item>
  <tmpl:menu_odd>
  </tmpl:menu_odd>

  <tmpl:menu_even>
  </tmpl:menu_even>
</tmpl:menu_item>

PHP:
tmpl_iterate($tmpl, "menu_item");
tmpl_set($tmpl, "menu_item/".($i % 2 ? "menu_odd" : "menu_even"), $D);
 

forre

Новичок
Помогло. Спасибо большое.

А есть расширенный мануал с примерами?
 

su1d

Старожил PHPClubа
неа, мануал есть только тот, что уже есть.

глянь ещё -- http://raa.livejournal.com/85358.html -- здесь Fisher понятно объяснил принципы работы контекстов, и может быть ещё тебе понравится его новый шаблонизатор.
 

confguru

ExAdmin
Команда форума
su1d

Offtop - скинь мне свою новую аську, если есть :)
Или приватом - есть разговор..
 

fisher

накатила суть
Автор оригинала: su1d
неа, мануал есть только тот, что уже есть.

глянь ещё -- http://raa.livejournal.com/85358.html -- здесь Fisher понятно объяснил принципы работы контекстов, и может быть ещё тебе понравится его новый шаблонизатор.
да-да, приглашаю всех тестировать и высказывать свои пожелания :) !
http://raa.livejournal.com/86623.html#cutid1
 

confguru

ExAdmin
Команда форума
PHP-templates - fix под php 5.4.4 - спасибо fixxxer

PHP:
diff -r e25edcf39d28 templates.c
--- a/templates.c       Tue Aug 21 05:01:45 2012 +0000
+++ b/templates.c       Tue Aug 21 05:02:46 2012 +0000
@@ -48,7 +48,7 @@
 int            le_templates;

 /* {{{ templates_functions[] */
-function_entry templates_functions[] = {
+static const zend_function_entry templates_functions[] = {
        PHP_FE(tmpl_open,               NULL)
        PHP_FE(tmpl_load,               NULL)
        PHP_FE(tmpl_close,              NULL)
 
Сверху