2013-04-08 4 views
1

Прежде, чем я доберусь до сути, позвольте мне представить контекст :) Я работал над слоем представления фреймворка MVC, который я пытаюсь разработать. Я создал несколько многоразовых такие представлений, как гармошка, выпадающее меню, текстовый редактор, выбор цвета и т.д. Используя это, я могу сделать, например:Как правильно использовать функции шаблонов PHP?

<?php 
$template = newView('Template'); 
$template->panel()->add(newView('Accordion') 
    ->add('Accordion entry 1') 
    ->add('Accordion entry 2') 
    ->add('Accordion entry 3')); 
$template->content()->add(newView('Block') 
    ->add('Bla bla bla') 
    ->add('Bla bla bla') 
    ->add('Bla bla bla')); 
echo $template; 
?> 

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

public function __toString() { 
    $output = 
     '<nav'.$this->_getHeader().'>'. 
      $this->_label. 
      '<ul>'; 
    for($i = 0, $l = count($this->_entries), $last = $l - 1; $i < $l; ++$i) { 
     if($i === 0) { 
      $this->_entries[$i]->addClass('First'); 
     } 
     elseif($i === $last) { 
      $this->_entries[$i]->addClass('Last'); 
     } 
     $output .= '<li>'.$this->_entries[$i].'</li>'; 
    } 
    $output .= 
      '</ul>'. 
     '</nav>'; 
    return $output; 
} 

developper может легко спроектировать это, украшая код с помощью Firebug или читает PHP код, но дизайнер не хотел бы его. Чтобы решить эту проблему, я хотел бы использовать систему шаблонов PHP. Это, например, было бы гораздо более читаемым дизайнером.

<table> 
    <?php foreach($users as $user); ?> 
    <tr> 
     <td><?= $user->firstName ?></td> 
     <td><?= $user->lastName ?></td> 
    </tr> 
    <?php endforeach; ?> 
</table> 

Моя проблема в том, как я могу, используя шаблоны PHP, создавать многоразовые виды? Например, представьте, что у меня есть представление, представляющее изображение большого пальца с изображением и подробные сведения об этом. Если мне нужно отобразить страницу, содержащую 100 из них, как я могу это сделать? Должен ли я потребовать просмотр 100 раз? Будет ли он выполняться/анализироваться/загружаться с проклятого медленного диска 100 раз? Я не вижу, как я мог бы создать какой-то «видный стиль» с помощью templaetes. Есть ли у вас какие-либо идеи или даже примеры?

Спасибо за чтение.

+0

Я бы утверждать, что вы именуя вид не вид - частичный вид в большинстве. IMHO-представление создало бы всю html-страницу с вызовами частичных представлений для логических элементов, таких как аккордеоны – Basic

+0

Давайте назовем эти части HTML тогда :) – Virus721

+0

@Basic Я бы сказал, что представление может просто состоять из нескольких представлений и оставить это на этом. Я не понимаю, почему представление, которое не является цельной HTML-страницей, не должно быть обычным представлением. Зачем делать это различие? Кроме того, как я вижу это, определяя страницу «Просмотр как HTML», вы говорите, что файл CSV, документ PDF или данные JSON не могут быть представлением. И хотя я не эксперт MVC, я бы сказал, что возможность переключения между различными форматами с одинаковыми данными - это в точности то, что делает MVC стоящим. – toon81

ответ

2

Чтобы предотвратить повторное чтение файла, вы можете загрузить файл один раз и сохранить его содержимое в переменной.

Повторяющиеся строки отвечают за воззвание и нежелательно находиться внутри самого шаблона.

Что касается шаблонирования себя, я бы рекомендовал избегать использования шаблонов чисто PHP в пользу пассивных шаблонов с переменными/заполнителей, как это:

<!-- table.tpl - Template for table. --> 
<table> 
{{rows}} 
</table> 

<!-- table-row.tpl - Template for table row. --> 
<tr> 
    <td>{{first_name}}</td> 
    <td>{{last_name}}</td> 
</tr> 

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

$tableTpl = file_get_contents('tpl_dir/table.tpl'); 
$rowTpl = file_get_contents('tpl_dir/table-row.tpl'); 

$rows = array(
    array(
     'first_name' => 'Lorem', 
     'last_name' => 'Ipsum' 
    ), 
    array(
     'first_name' => 'Foo', 
     'last_name' => 'Bar' 
    ) 
); 

$rowsFrags = array(); 

// This loop can be moved to a method of a template engine class. 
foreach ($rows as $row) { 
    $names = array_keys($row); 

    foreach ($names as &$name) { 
     $name = '{{' . $name . '}}'; 
    } 

    $rowsFrags[] = str_replace($names, array_values($row), $rowTpl); 
} 

$rowsCode = implode("\n", $rowsFrags); 
$tableCode = str_replace('{{rows}}', $rowsCode, $tableTpl); 

echo $tableCode; 
+0

Спасибо за ваш ответ. Поэтому в основном вы предлагаете заменить токены своими значениями внутри HTML-кода. Это выглядит хорошо, но я беспокоюсь о производительности здесь. Не делает все эти str_replace медленными? Кроме того, почему выбор вручную шаблона решения вместо встроенного, который, я полагаю, быстрее? – Virus721

+0

Шаблонный движок, как показано в моем ответе, обеспечивает более чистый код шаблона (более удобный для дизайнера в частности), большее разделение данных из презентации (фундаментальная конструктивная особенность хорошего веб-приложения) и больше контроля над выходным кодом (предотвращение избыточности в частности, линии). Производительности вполне достаточно для большинства реальных веб-приложений (я лично использую подобный подход [в виде шаблона машинного моделирования с такими методами, как 'loadTemplate()', 'processVar()', 'processVars()', 'processList()' и т. д.] на всех сделанных мной веб-сайтах). –

+0

Хорошо, спасибо. – Virus721

Смежные вопросы