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

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

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

 print_top_html ();

/ * весь код / ​​HTML для этой конкретной страницы * /

print_bottom_html (); 

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

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

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

7 ответов

Решение

Одним из решений, по крайней мере, в случае 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

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

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

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

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

layout.php

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

затем

whatever_page.php

<?php

$content = "Hello World";

include( 'layout.php' );

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

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

output html code for page

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

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

Вы спрашивали, как другие языки справляются с этим, и я не видел ничего, кроме 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

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

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

Я использую систему частичных 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(); ?>
Другие вопросы по тегам