Сохраняя мой PHP довольно - PullRequest
       32

Сохраняя мой PHP довольно

11 голосов
/ 22 сентября 2008

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

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

Спасибо!

Ответы [ 14 ]

26 голосов
/ 22 сентября 2008

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

Вы ДОЛЖНЫ отделить логику вашей программы от вашего дисплея. Сначала попробуйте создать собственное решение, используя два файла для каждой веб-страницы:

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

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

myPageLogic.php

<?php

// pure PHP code, no HTML

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

?>

1016 * 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 . А пока просто пишите код и учитесь с самого начала. Вы можете отлично закодировать такой проект, как новичок, это нормально.

8 голосов
/ 22 сентября 2008

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

http://www.phpmvc.net/

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

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

4 голосов
/ 22 сентября 2008

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

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

2 голосов
/ 22 сентября 2008

Однако из-за этого мой 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>

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

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

1 голос
/ 22 сентября 2008

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

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

0 голосов
/ 22 сентября 2008

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

0 голосов
/ 22 сентября 2008

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

0 голосов
/ 22 сентября 2008

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

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

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

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

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

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

0 голосов
/ 22 сентября 2008

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

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

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

0 голосов
/ 22 сентября 2008

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

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

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