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


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

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

print_top_html();

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

print_bottom_html();

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

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

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

Author: Steve, 2009-08-08

7 answers

Одним из решений, по крайней мере, в случае 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
Author: codeincarnate, 2009-08-08 00:45:19

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

Посмотрите сюда http://www.smarty.net/

 4
Author: Cleiton, 2016-01-05 22:41:24

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

Layout.php

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

Затем

Whatever_page.php

<?php

$content = "Hello World";

include( 'layout.php' );
 2
Author: Peter Bailey, 2009-08-08 00:38:55

Звучит так, как будто вам нужно использовать include() или require()

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

output html code for page

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

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

 1
Author: PaulBM, 2009-08-08 00:42:57

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

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

<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, поэтому вам не нужно полагаться на глобальные переменные $в PHP, чтобы убедиться, что ваши пути CSS и Javascript верны в зависимости от вашей среды разработки (разработка, постановка, продвижение...). Наиболее распространенными являются:

#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
Author: ajhit406, 2010-01-24 16:24:39

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

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

 0
Author: Anirvan, 2009-08-08 00:40:24

Я использую частичную систему 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
Author: Bryan M., 2010-01-24 17:11:32