Очередное столкновение логики представления с логикой приложения.

Фанат

oncle terrible
Команда форума
Очередное столкновение логики представления с логикой приложения.

Количество колонок при выводе в несколько колонок - это чьё?
Это задаёт дизигнер в тз? Это задаёт вестала в шаблоне? Это задаёт программер в хз?..

Дано:
шаблон системы "plain php".
Выводим массив в несколько колонок. Как определять конец уолонки?
Концептуально чисто будет использовать стандартный пхп код
<? if (!(++$count % $cols)): ?></tr><tr><? endif ?>

Однако, следуя принципу неумножения сущностей (который является основным при создании шаблонного движка (и которым пренебрегли создатели смарти)), добавлять непонятный оператор в код шаблона не хочется.
что делать?
Пока придумал что-то вроде
function new_col($counter,$cols)
с одной стороны, совсем неизвестная функция, самописная.
С другой - название можно сделать совсем говорящим.
Опять же, верстальщик может управлть количеством колонок сам.
Других вариантов, признаться не вижу...

Традиционный вопрос - как это делается в других движках?

Да, попутно вопрос.
<? if (!(++$count % $cols)): ?></tr><tr><? endif ?>
- это грубый хак. получается невалидный хтмл. Оставляет незакрытый tr.
в лучшем случае - пустую строчку tr без td.

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

пример:
PHP:
<div align="center"> 
<a href="?<?=$prev_num?>">&lt;&lt;&lt; предыдущая</a> | <a href="?<?=$next_num?>">следующая &gt;&gt;&gt;</a><br> 
<img src="<?=$bigpic?>" <?=$bigsize?>><br> 
<table width=0 border=0 bgcolor=#eeeeee cellpadding=7 cellspacing=3> 
<tr> 
<? foreach($thumbnails as $i => $thumb): ?> 
  <td width=170 bgcolor=#cccccc valign="middle" align="center"> 
   <a href="?<?=$i?>"><img src="<?=$thumb ?>" border="0"></a> 
  </td> 
<? if (!(++$count % $cols)):?></tr><tr><? endif ?> 
<? endforeach ?> 
</tr> 
</table> 
</div>
часть флейма вынесена в http://phpclub.ru/talk/showthread.php?s=&threadid=66555
 

Screjet

Новичок
может так:

{foreach item=cols from=$rows}
<tr>
{foreach item=col from=$cols}
<td>...</td>
{/foreach}
</tr>
{/foreach}

где $rows - массив колонок, $cols - массив ячеек.

?
 

Фанат

oncle terrible
Команда форума
Wsc
Все же Smarty позволяет в какой-то мере отделить код от оформления
во-первых, не код от оформления, а код приложения от кода оформления.
во-вторых, пхп позволяет сделать то же самое.
Не вижу никакой разницы. Вообще

-~{}~ 04.05.05 14:53:

Screjet, чёрт возьми, хорошая мысль!
похоже, именно так и надо делать!
Вот что значит - стереотип.
Это же самое простое решение.
а глаз замылен работой с потоком прямо из базы.
 

fixxxer

К.О.
Партнер клуба
Screjet

В этом случае количество столбцов определяется в коде приложения.
Соответственно, верстальщик изменить его не может никак.

Такое решение хорошо (и абсолютно правильно) для вывода табличек с заранее известным набором столбцов. А здесь, я так понимаю, речь идет о выводе однотипных данных в несколько столбцов.

-~{}~ 04.05.05 15:31:

Wsc
...вместо того, чтобы в коде шаблона написать 1 строчку
<? if ($category.count % $cols == 0) ?>
:)
 

syfisher

TDD infected!!
Re: Очередное столкновение логики представления с логикой приложения.

Автор оригинала: Фанат
Традиционный вопрос - как это делается в других движках?
Если я в тему - то для примера, как это делается в WACT:

Код:
<list:LIST id="child_folders">
  <list:ITEM>
  <list:SEPARATOR count='3'>
  </tr><tr>
  </list:SEPARATOR>
  ... что касается каждой колоки
  </list:ITEM>
</list:LIST>
Хотя это те же яйца, только сбоку. Верстальщику все равно нужно знать назначение и аттрибуты тега <list:SEPARATOR>
 

Фанат

oncle terrible
Команда форума
syfisher, да, спасибо.
Но очевидное решение, подсказанное Screjet, позволяет избежать проблемы вовсе.
 

syfisher

TDD infected!!
Автор оригинала: Фанат
syfisher, да, спасибо.
Но очевидное решение, подсказанное Screjet, позволяет избежать проблемы вовсе.
Да, в WACT можно сделать и так:

Код:
<list:LIST id="rows">
  <list:ITEM>
  <tr>
    <list:LIST from='cols'>
     <list:ITEM>
     <td>
     ... что касается каждой ячейки                                            
     </td>
     </list:ITEM>
    <list:LIST>
  </tr>
  </LIST:ITEM>
</list:LIST>
Правда способ менее компактный, чем в Smarty.

Недостаток только в том, что нужно особым образом формировать массив данных (уже говорили, кажется).
 

Фанат

oncle terrible
Команда форума
Дело в том, что я не считаю это недостатком.
Более того, я считаю, что подготовить данные должным образом - это главная задача приложения.
то есть, я полагаю, что в шаблоне логики должно быть как можно меньше, а в коде - соответственно - больше, если это потребуется.
по наивности я полагал, что это аксиома.
Оказалось, что так думают не все, что и выдзвало некоторые споры в этом топике.
 

Screjet

Новичок
fixxxer
Да, верно. Незнаю, есть ли в сматри возможность конструкции вида:
{while proc=fetch_cols item=cols args=4}
<tr>
{foreach item=col from=$cols}
<td>...</td>
{/foreach}
</tr>
{/while}

где 4 - аргумент ф-ции fetch_cols, - число столбцов

Правда, с одной стороны - нарушение принципа шаблонов (практически, подготовка данных ведется в шаблоне), а с другой стороны - имхо, единственный вариант для обратной связи.
 

yugene

Отошел от дел
Автор оригинала: Фанат
Традиционный вопрос - как это делается в других движках?
Использую самописный шаблонизатор. Он не умеет ничего, кроме разделения HTML-кода на блоки и замещения шаблонов_значений на реальные_значения. Таким образом в шаблоне кроме HTML встречаются только конструкции вида <!-- BLOCK BEGIN item --> и {ITEM_ID}. Пока не встречал задачи, где этого было бы недостаточно, но все-таки немного не хватает гибкости. Кроме того, у меня каждой странице соответствует секция в INI-файле с описанием настроек страницы, например, используемые шаблоны (шапки, тела, окончания), title страницы, etc... Можно хранить количество колонок или строк в таблице, количество фотографий на странице и т.п. там же. Хотелось бы услышать недостатки такого подхода.
 

Фанат

oncle terrible
Команда форума
yugene, тебе приходится с верстальщиком договариваться на словах - что какой блок означает, условный переход, цикл, или инклюд.
Это не очень удобно.
То есть, важная часть программы просто НИГДЕ не фиксируется - существует только в виде устных договорённостей.
Надо ли пояснять, в чём недостатки такого подхода?
 

yugene

Отошел от дел
Автор оригинала: Фанат
yugene, тебе приходится с верстальщиком договариваться на словах - что какой блок означает, условный переход, цикл, или инклюд.
Это не очень удобно.
Что уж там, это совсем не удобно. По крайней мере, для проектов с отдельным верстальщиком (отдельным от кодера).

Автор оригинала: Фанат
Надо ли пояснять, в чём недостатки такого подхода?
Спасибо, дальше я сам буду думать :)
 

Фанат

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

-~{}~ 04.05.05 20:58:

Что получилось в итоге:
PHP:
<?
$i=0;
$handle = opendir($systemdir.$thumb);
while (false !== ($file = readdir($handle))) { 
  if ($file != "." and $file != "..") {
    $thumbnails[floor($i++ / $cols)][$i]=$dir.$thumb."/".$file;
    $files[$i]=$file;
  }
}
?>
<table width=0 border=0 bgcolor=#eeeeee cellpadding=7 cellspacing=3>
<? foreach($thumbnails as $row): ?>
 <tr>
<? foreach($row as $i => $thumb): ?>
  <td width=170 bgcolor=#cccccc valign="middle" align="center">
   <a href="?<?=$i?>"><img src="<?=$thumb ?>" border="0"></a>
  </td>
<? endforeach ?>
 </tr>
<? endforeach ?>
</table>
</div>
По-моему-просто прекрасно!
Screjet-у - огромное спасибо.
 

yugene

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

Demiurg

Guest
обычная договоренность об api, по идее об этом надо договариваться перед началом реализации. Ну в процессе, конечто возможности шаги в лево и в право.
 

HEm

Сетевой бобер
Интересно, сколько процентов народу в этом форуме работают с отдельным верстальщиком? А сколько верстают сами.
 

Фанат

oncle terrible
Команда форума
а при чём здесь голосование вообще?
данный вопрос к теме отношения вообще не имеет
 

HEm

Сетевой бобер
ну извините, не написал перед своими словами "оффтопик:"
да, оффтопик
но голосование было бы интересно провести
 
Сверху