Хитрое решение - xtemplate. Или простое?

Poster

Новичок
Хитрое решение - xtemplate. Или простое?

Господа, вопрос.

Нужно выводить публикации списком. Если группа публикаций меняется - вывести ее название и затем публикации этой группы.
Группа изменилась - снова название группы и ее публикации.

Есть такая схема.
Определяю массив для вывода в шаблон:
PHP:
$publicationz = $db -> select("SELECT p.id, p.name AS name, p.shorttext, p.pc, pcats.name AS pcname FROM publications p
			LEFT JOIN publicationscats pcats ON (p.pc = pcats.id)
			WHERE p.section = '".$endid."' AND p.active = 'y' ORDER BY pc DESC, date DESC, id DESC LIMIT $first, $per_page");
массив:
[0] => Array
(
[id] => 31
[name] => Как выбрать элитное французское вино?
[shorttext] =>
[pc] => 18
[pcname] => Напитки
)

[1] => Array
(
[id] => 30
[name] => Правило четырех "К"
[shorttext] =>
[pc] => 18
[pcname] => Напитки
)

[2] => Array
(
[id] => 29
[name] => Проба пера
[shorttext] =>
[pc] => 3
[pcname] => Аксессуары
)

Теперь обработка для шаблона:
PHP:
$group_ch = 1;
			foreach ($publicationz as $key => $val) {
				
				$current_group = $publicationz[$key-1]['pc'];
				$next_group = $publicationz[$key]['pc'];
				
				if (($current_group <> $next_group) || $key == 0) $group_ch = 1;
					
				
				if ($group_ch == 1)
					$t -> parse('main.publications.row.group_changed');
					
					
				$t -> insert_loop('main.publications.row', 'ROW', $val);
				
				
				$group_ch = 0;	
			}
			
			$t -> parse('main.publications');
$group_ch - флажок изменения группы, при 1 нужно вывести название группы;

Вот так обрабатываю в шаблоне:
<!-- BEGIN: publications -->
<!-- BEGIN: row -->
<!-- BEGIN: group_changed -->
<div class="newsdate"><img src="/img/icon_time.gif" width="9" height="9" class="tc" />группа {ROW.pcname}</div>
<!-- END: group_changed -->

<div class="news1"><a href="/{PUBLICATIONS_ALIAS}/{ROW.id}.html" class="newstitlewithling">{ROW.name}</a></div>
<div class="news2">&nbsp;</div>
<!-- END: row -->
<!-- END: publications -->

Теперь собственно сам вопрос:

Как обработать блочок group_changed в шаблоне?
то есть когда происходит parse('main.publications') - блок group_changed еще не отпарсился... или отпарсился, но в него не попадает {ROW.pcname} - название группы.

Подскажите пожалуйста как делается такая вещь. Как вы делаете подобную схему в шаблонах?

Спасибо!
 

bgm

&nbsp;
Ничего не могу сказать про шаблоны, но то, что у тебя неправильная конструкция проверки смены группы - это точно. Посмотри внимательно и попытайся понять - почему она неправильная.
 

Poster

Новичок
bgm, конечно, спасибо, это я проглядел и запостил этап экспериментов - сдвигал изменение группы вперед-назад.

вот так должно быть:

PHP:
foreach ($publicationz as $key => $val) { 
                 
                $current_group = $publicationz[$key]['pc']; 
                $next_group = $publicationz[$key + 1]['pc']; 
                 
                if (($current_group <> $next_group) || $key == 0) $group_ch = 1; 
                     
                 
                if ($group_ch == 1) 
                    $t -> parse('main.publications.row.group_changed'); 
                     
                     
                $t -> insert_loop('main.publications.row', 'ROW', $val); 
                 
                 
                $group_ch = 0;     
            }
 

bgm

&nbsp;
Нихт зо гут. Опять неправильно.
Смотри: выбран последний элемент из массива. Значит попытка взять имя группы для элемента $key+1 вызовет ошибку.

P.S. Подсказка - тебе вообще не надо брать имя группы для следующего элемента.
 

Poster

Новичок
Автор оригинала: bgm
Подсказка - тебе вообще не надо брать имя группы для следующего элемента.
bgm, ок, оставим в стороне шаблоны :)

а почему мне не нужно знать к какой группе относится следующая публикация?

ведь название группы мне нужно вывести _перед_ публикацией у которой изменится группа.
 

bgm

&nbsp;
Тебе нужно знать имя группы текущего элемента и имя группы предыдущего. Думаю, пример поможет:

PHP:
$prev_group = ""; // Считаем, что имя группы у элемента всегда не пустое
foreach ($publucationz as $val)
{
    if ($prev_group!=$val['pc']) {

    // Выводим имя группы

    $prev_group = $val['pc'];
   }

   // выводим текущий элемент
}
Теперь понятно? :)
 

Poster

Новичок
понятно конечно, спасибо, но уточню немного - ты недосмотрел массив:
[0] => Array
(
[pc] => 18
)

так что немного подправить )

и попытаться передать это в шаблон... :-(((
 

bgm

&nbsp;
"Недосмотр" массива значения не имеет. С определением когда надо выводить имя группы разобрались? Разобрались. Всё остальное - элементарно.
 
Сверху