Хранение моего PHP довольно

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

Выполнение этого, тем не менее, делает мой PHP-код ужасным... он действительно испортит форматирование и "форму" кода. Как мне обойти это? Включая пользовательские функции "html dump" внизу моих сценариев? То же самое, но с включением? Heredocs (не выглядят слишком хорошо)?

Спасибо!

Ответ 1

Не паникуйте, каждый свежий веб-программист сталкивается с этой проблемой.

У вас есть возможность отделить вашу программную логику от вашего дисплея. Во-первых, попробуйте создать собственное решение, используя два файла для каждой веб-страницы:

  • один с только PHP-кодом (без HTML), который заполняет переменные
  • другой с HTML и очень немного PHP: это ваш дизайн страницы

Затем укажите, где/когда вам это нужно. E.G:

myPageLogic.php

<?php

// pure PHP code, no HTML

$name = htmlspecialchars($_GET['name']);
$age = date('Y') - htmlspecialchars($_GET['age']);

?>

myPageView.php

// very few php code
// just enought to print variables
// and some if / else, or foreach to manage the data stream

<h1>Hello, <?php $name ?> !</h1>

<p>So your are <?php $age?>, hu ?</p>

(Вы можете использовать альтернативный синтаксис PHP для этого. Но не старайтесь сделать его идеальным для первого время, действительно.)

myPage.php

<?php

require('myPageLogic.php');
require('myPageView.php');
?>

Не беспокойтесь о проблемах с производительностью. Это не ваш приоритет, как новичок. Это решение несовершенно, но поможет вам решить проблему с вашим уровнем программирования и научит вас основам.

Затем, как только вам понравится эта концепция, купите книгу о шаблоне MVC (или посмотрите на записи). Это то, что вы хотите сделать СЛЕДУЮЩЕЕ ВРЕМЯ. Затем вы попробуете несколько шаблонных систем и фреймворков, но LATER. На данный момент, просто код и учиться с самого начала. Вы можете прекрасно кодировать такой проект, как новобранец, это прекрасно.

Ответ 2

Используйте подход mvc.

http://www.phpmvc.net/

Это не то, что вы заберете через пару часов. Вам действительно нужно практиковать это. Главное - контроллер получит доступ к вашей модели (слой db), сделает материал для ваших данных и затем отправит его в представление для рендеринга. Это упрощено, но вам просто нужно читать и практиковать его, чтобы понять это.

Это то, что я использовал, чтобы помочь мне изучить его. http://www.onlamp.com/pub/a/php/2005/09/15/mvc_intro.html

Ответ 3

Попробуйте как можно больше разделить свой контент и макет из своего кода. Каждый раз, когда вы пишете какой-либо HTML файл в формате .php, остановитесь и подумайте: "Это действительно принадлежит?"

Одним из решений является использование шаблонов. Посмотрите на Smarty templating system для довольно простой в использовании опции.

Ответ 4

Выполнение этого, тем не менее, делает мой PHP-код ужасным... он действительно испортит форматирование и "форму" кода. Как мне обойти это?

Рассматривайте свой PHP и HTML как единую иерархию с единой последовательной структурой отступов. Таким образом, структура окружения PHP, такая как "if" или "for", вводит новый уровень отступов, а его содержимое всегда представляет собой сбалансированный набор начальных и конечных тегов. По сути, вы делаете свой PHP "хорошо сформированным" в смысле XML-термина, независимо от того, используете ли вы XHTML или нет.

Пример:

<div class="prettybox">
    Hello <?php echo(htmlspecialchars($name)) ?>!
    Your food:
    <?php foreach($foods as $food) { ?>
        <a href="/food.php?food=<?php echo(urlencode($food)) ?>">
            <?php echo(htmlspecialchars($food)) ?>
        </a>
    <?php } ?>
    <?php if (count($foods)==0) { ?>
        (no food today)
    <?php } ?>
</div>

С осторожностью относитесь к религиозной догме о разделении логики и разметки, поднимая голову в ответах здесь снова. Хотя вы, конечно, хотите сохранить свою бизнес-логику вне кода вывода страницы, это не обязательно означает, что накладные расходы от использования отдельных файлов, классов, шаблонов и фреймворков действительно необходимы для того, что вы делаете. Для простого приложения, скорее всего, достаточно просто поместить файл action/logic в верхнюю часть файла и вывод страницы ниже.

(Например, из одного из комментариев выше, если htmlspecialchars() - это функция вывода страницы, вы определенно не хотите вставлять бит действия своего PHP, смешанный во всей бизнес-логике. Всегда сохраняйте текст как равные, неэкранированные строки до тех пор, пока она не покинет вашу прикладную логику. Если ввести "echo (htmlspecialchars (...))" все время слишком многословно, вы всегда можете сделать функцию с коротким именем, таким как "h", что делает то же.)

Ответ 5

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

Если вы еще этого не сделали, я бы посмотрел на некоторые PHP-шаблоны, такие как Smarty.

Ответ 6

В таких случаях я все время записываю все в переменную или иногда в массив, а затем повторяю переменную/массив. У этого есть дополнительное преимущество, что страница всегда делает за один раз, а не постепенно.

Ответ 7

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

Ознакомьтесь с идеалами методов программирования MVC на Wikipedia

Ответ 8

Вам нужна фреймворк. Это не только сделает ваш код довольно (из-за уже упомянутого шаблона контроллера модели, MVC) - это сэкономит вам время из-за компонентов, которые уже написаны для него.

Я рекомендую QCodo, это потрясающе; есть и другие - CakePHP, Symfony.

Ответ 9

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

например

if ($_SESSION['logged_in'])
     include(TPL_DIR . 'main_logged_in.tpl'); 
else
     include(tPL_DIR . 'main.tpl');

просто простой пример

Ответ 10

как указано выше.. вы фиксируете симптом, а не проблему.

Вам нужно разделение логики и презентации. Что можно сделать с какой-то структурой mvc. Даже если вы не хотите полностью заходить в рамки mvc. Шаблонный движок необходим, по крайней мере, если ваша логика достаточно сложна, чтобы у вас были проблемы с тем, что вы объясняете

Ответ 11

Я настоятельно рекомендую savant вместо smarty,

  • вам не нужно изучать новый шаблонный язык для создания шаблонов, шаблоны savant записываются в php
  • Если вы не хотите использовать php, вы можете определить свой собственный "язык" с помощью компилятора
  • он легко расширяется вашими собственными объектами php

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

Ответ 12

Вместо того, чтобы внедрять системы шаблонов поверх системы шаблонов (сам PHP), создавая накладные расходы по умолчанию, вы можете найти более надежное решение, например XSL Transformations, который также соответствует правилам MVC (при условии, что вы отделите свой поиск данных, плюс я лично разделил логику от отображения XML с разными файлами).

Представьте себе следующую информацию в массиве, которую вы хотите отобразить в таблице.

Array
{
  [car] => green
  [bike] => red
}

Вы легко создаете script, который выводит эту информацию в XML:

echo "<VEHICLES>\n";
foreach(array_keys($aVehicles) as $sVehicle)
  echo "\t<VEHICLE>".$sVehicle."</NAME><COLOR>".$aVehicles[$sVehicle]."</COLOR></VEHICLE>\n";
echo "</VEHICLES>\n";

Результат в следующем XML:

<VEHICLES>
  <VEHICLE>
    <NAME>car</NAME>
    <COLOR>green</COLOR>
  </VEHICLE>
  <VEHICLE>
    <NAME>bike</NAME>
    <COLOR>red</COLOR>
  </VEHICLE>
</VEHICLES>

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

<xsl:template match="VEHICLES">
  <TABLE>
    <xsl:apply-templates select="VEHICLE">
  </TABLE>
</xsl:template>

<xsl:template match="VEHICLE">
  <TR>
    <TD><xsl:value-of select="NAME"></TD>
    <TD><xsl:value-of select="COLOR"></TD>
  </TR>
</xsl:template>

Et voila, у вас есть:

<TABLE>
  <TR>
    <TD>car</TD>
    <TD>green</TD>
  </TR>
  <TR>
    <TD>bike</TD>
    <TD>red</TD>
  </TR>
</TABLE>

Теперь для этого простого примера это немного перебор; но для сложных структур в больших проектах это абсолютный способ сохранить вашу логику сценариев от вашей разметки.

Ответ 13

Отметьте question об отделении PHP и HTML, есть различные способы сделать это, включая самонастраивающиеся системы шаблонов, шаблонные системы, такие как Smarty, PHP, как система шаблонов на ней, и т.д. и т.д. и т.д.

Ответ 14

Я думаю, что у вас есть два варианта, либо используйте MVC Framework, либо используйте ленивый шаблон, который наложил бы значительные накладные расходы на ваш код. Очевидно, что я с первым, я думаю, что изучение MVC является одним из лучших трюков в веб-разработке в книге.