Как дублированный HTML-код представлен в вашей кодовой базе без дублирования? - PullRequest
4 голосов
/ 08 августа 2009

Большая часть HTML на большом веб-сайте дублируется на разных страницах (верхний и нижний колонтитулы, навигационные меню и т. Д.). Как вы разрабатываете свой код так, чтобы весь этот дублирующий HTML фактически не дублировался в вашем коде? Например, если я хочу изменить навигационные ссылки с <ul> на <ol>, я бы хотел сделать это изменение только в одном файле.

Вот как я видел, как одна конкретная кодовая база справилась с этой проблемой. Код для каждой страницы выглядит так:

print_top_html();

/* all the code/HTML for this particular page */

print_bottom_html();

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

Есть ли лучший способ?

Я в основном работаю с сайтами PHP, но мне было бы интересно услышать решения для других языков (я не уверен, является ли этот вопрос независимым от языка).

Ответы [ 7 ]

4 голосов
/ 08 августа 2009

Я не программист php, но я знаю, что мы можем использовать систему шаблонов под названием Smarty, которая работает с шаблонами (представлениями), что-то вроде asp.net mvc с Razor.

смотрите здесь http://www.smarty.net/

2 голосов
/ 08 августа 2009

Одним из решений, по крайней мере, в случае PHP (и других языков программирования) являются шаблоны. Вместо того, чтобы иметь две функции, как у вас выше, вместо этого будет смесь HTML и PHP, как это.

<html>
  <head>
   <title><?php print $page_title ?></title>
   <?php print $styles ?>
   <?php print $scripts ?>
  </head>

  <body>
    <div id="nav">
      <?php print $nav ?>
    </div>
    <div id="content">
      <?php print $content ?>
    </div>
  </body>
</html>

Каждая переменная в этом шаблоне будет содержать HTML, созданный другим шаблоном, HTML, созданный функцией, или также содержимое из базы данных. Существует несколько шаблонизаторов PHP , которые работают более или менее таким образом.

Вы создаете шаблон для HTML, который вы обычно используете снова и снова. Тогда использовать его было бы примерно так.

<?php
  $vars['nav'] = _generate_nav();
  $vars['content'] = "This is the page content."
  extract($vars);  // Extracts variables from an array, see php.net docs
  include 'page_template.php'; // Or whatever you want to name your template

Это довольно гибкий способ работы, который используют многие фреймворки и системы управления контентом.

2 голосов
/ 08 августа 2009

Вот действительно, действительно упрощенная версия обычного метода.

layout.php

<html>
  <body>
    <?php echo $content; ?>
  </body>
</html>

Тогда

whatever_page.php

<?php

$content = "Hello World";

include( 'layout.php' );
1 голос
/ 24 января 2010

Вы спрашивали, как другие языки справляются с этим, и я не видел ничего, кроме PHP, поэтому я призываю вас проверить Rails. Соглашение Rails элегантно и отражает версию @codeincarnate на PHP.

В платформе MVC текущее представление отображается внутри файла макета для конкретного контроллера, который инкапсулирует соответствующее представление текущего метода. Он использует метод yield для определения раздела, в который должно быть вставлено содержимое представления. Общий файл макета выглядит следующим образом:

<html>
  <head>
    <% #stylesheet and js includes %>
   <body>
     <div id="header">Header content, menus, etc…</div>
    <%= yield %>
    <div id="footer">Footer content</div>
   </body>   
</html>

Это позволяет приложению иметь другой внешний вид или другую навигацию в зависимости от контроллера. На практике я не использовал разные файлы макетов для каждого контроллера, а вместо этого полагаюсь на макет по умолчанию, который называется «приложение».

Однако предположим, что у вас был веб-сайт компании с отдельными контроллерами для «информации», «блога» и «администратора». Затем вы можете изменить навигацию для каждого в чистом и ненавязчивом виде, обрабатывая различные виды компоновки в их соответствующих файлах компоновки, которые соответствуют их контроллерам.

Вы всегда можете установить пользовательский макет в методе контроллера, указав:

render :layout => 'custom_layout'

В Rails также есть отличные вспомогательные методы, поэтому вам не нужно полагаться на переменные $ global в PHP, чтобы гарантировать правильность путей CSS и Javascript в зависимости от среды разработки (dev, staging, prod…). Наиболее распространенными являются:

#looks in public/stylesheets and assumes it's a css file
stylesheet_link_tag "filename_without_extension"

#looks in public/javascripts and assumes it's a js file
javascript_include_tag "jquery"

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

http://guides.rubyonrails.org/layouts_and_rendering.html

1 голос
/ 08 августа 2009

Похоже, вам нужно использовать include () или require ()

<?php
include("header.inc.php");

output html code for page

include("footer.inc.php");
?>

Файлы верхнего и нижнего колонтитула могут содержать все распространенные HTML-коды сайта.

0 голосов
/ 24 января 2010

Я использую систему партиалов Zend_View (очень похоже на Rails). Частичное - это, по сути, небольшой HTML-шаблон, имеющий собственную переменную область видимости. Его можно вызвать изнутри, например:

<?php echo $this->partial('my_partial.phtml', array( 'var1' => $myvar ));

Переменные, которые передаются в конструкцию, связываются с локальными переменными внутри самого партиала. Очень удобно для повторного использования.

Вы также можете визуализировать частичное изнутри обычного кода, если вы пишете вспомогательный объект, где у вас более сложная логика, чем вы обычно чувствуете себя комфортно, вставляя представление.

public function helperFunction()
{
   // complex logic here

   $html = $this->getView()->partial('my_partial.phtml', array('var1' => $myvar ));
   return $html;
}

Тогда, по вашему мнению,

<?php echo $this->myHelper()->helperFunction(); ?>
0 голосов
/ 08 августа 2009

То, что вы предложили, работает нормально. Пока print_top_html и print_bottom_html остаются синхронизированными (и вы можете использовать автоматические тесты, чтобы проверить это), вам больше не нужно беспокоиться о них, оставляя вас сосредоточиться на real контенте сайт - материал посередине.

Кроме того, вы можете объединить print_top_html и print_bottom_html в один вызов и отправить ему HTML-код (или обратный вызов) для размещения в середине.

...