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






В таких случаях я записываю все постепенно в переменную или иногда в массив, а затем повторяю переменную / массив. Дополнительное преимущество заключается в том, что страница всегда отображается за один раз, а не постепенно.
В этой ситуации я создаю файлы «шаблонов» данных HTML, которые я включаю, а затем обрабатываю их с помощью регулярных выражений. Это сохраняет код в чистоте и упрощает передачу частей дизайнеру или другому специалисту по HTML.
Ознакомьтесь с идеалами, лежащими в основе практики программирования MVC, на Википедия
Используйте подход MVC.
Это не то, что вы уловите за пару часов. Вам действительно нужно это практиковать. Главное, что контроллер будет обращаться к вашей модели (слою db), выполнять какие-либо действия с вашими данными, а затем отправлять их в представление для рендеринга. Это слишком упрощенно, но вам просто нужно прочитать и попрактиковаться, чтобы понять это.
Это то, что я использовал, чтобы научиться этому. http://www.onlamp.com/pub/a/php/2005/09/15/mvc_intro.html
Судя по звучанию вашей проблемы, кажется, что у вас нет большого разделения между логикой и представлением в вашем коде. При разработке приложения это очень важно по причинам, которые точно демонстрирует ситуация, с которой вы сейчас сталкиваетесь.
Если вы еще этого не сделали, я бы взглянул на некоторые движки шаблонов PHP, такие как Умный.
Постарайтесь как можно больше отделить свой контент и макет от кода. Каждый раз, когда вы пишете какой-либо HTML в файле .php, остановитесь и подумайте: "А этот В самом деле здесь?"
Одно из решений - использовать шаблоны. Посмотрите на систему шаблонов Умный, чтобы найти довольно простой в использовании вариант.
Создание системы шаблонов (Smarty) поверх другой системы шаблонов (самого PHP) в принципе накладно. Я за использование таких приемов, как XSL Transformations (w3schools.com/xsl) Twan
Чувак, серьезно ... XSLT слишком сложен и определенно не нужен из того, о чем говорил OP. Для начала вам понадобится некоторый XML для преобразования.
Вам нужен фреймворк. Это не только сделает ваш код красивым (благодаря уже упомянутому шаблону модель-представление-контроллер, MVC), но и сэкономит ваше время из-за компонентов, которые уже написаны для него.
Я рекомендую QCodo, это потрясающе; есть и другие - CakePHP, Symfony.
Если это большой проект, подойдет фреймворк. Если нет, создайте несколько файлов шаблонов и в верхней части страницы решите, какой файл шаблона включить.
Например
if ($_SESSION['logged_in'])
include(TPL_DIR . 'main_logged_in.tpl');
else
include(tPL_DIR . 'main.tpl');
просто простой пример
как упоминалось выше .. вы устраняете симптом, а не проблему ..
Что вам нужно, так это разделение логики и представления. Это можно сделать с помощью какой-то структуры mvc. Даже если вы не хотите полностью использовать фреймворк mvc ... Механизм создания шаблонов необходим, по крайней мере, если ваша логика достаточно сложна, чтобы у вас возникли проблемы с тем, что вы объясняете
Не паникуйте, каждый новый веб-программист сталкивается с этой проблемой.
Вы ДОЛЖНЫ отделить логику своей программы от дисплея. Сначала попробуйте создать собственное решение, используя два файла для каждой веб-страницы:
Затем укажите, где и когда вам это нужно. Напр .:
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 (или поищите записи о переполнении стека). Это то, что вы хотите сделать В СЛЕДУЮЩИЙ РАЗ. Затем вы попробуете некоторые системы шаблонов и фреймворки, но ПОТОМ. А пока просто кодируйте и учитесь с самого начала. Вы можете отлично написать такой проект, как новичок, это нормально.
Вот чем я занимаюсь сейчас. Обработайте данные в сценарии, включая соответствующий сценарий просмотра. В сценарии просмотра я отображаю только переменные внутри HTML и при необходимости использую циклы if-else.
Да, иногда я жалею, что никто не сказал мне это в первые годы моей жизни. Люди должны позволять новичкам просто делать что-то, а не просить их сделать идеальный старт для каждой новой технологии, к которой они приходят.
Я настоятельно рекомендую учёный вместо smarty,
Отделение логики от представления не означает, что вся ваша бизнес-логика должна быть на php, а ваша логика представления - в чем-то еще, разделение - это концептуальная вещь, вы должны отделить логику, которая подготавливает данные, от той, которая их показывает. Очевидно, что бизнес-логика не обязательно должна содержать элементы представления.
Вместо реализации системы шаблонов поверх системы шаблонов (самого PHP), создавая накладные расходы по умолчанию, вы можете выбрать более надежное решение, такое как Преобразования XSL, которое также соответствует Принципы 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 voila, у вас есть:
<TABLE>
<TR>
<TD>car</TD>
<TD>green</TD>
</TR>
<TR>
<TD>bike</TD>
<TD>red</TD>
</TR>
</TABLE>
Теперь для этого простого примера это немного перебор; но для сложных структур в больших проектах это абсолютный способ уберечь логику сценариев от разметки.
Используйте htmlspecialchars при создании xml / html с конкатенацией строк.
Вы абсолютно правы. И тег CDATA тоже всегда хорош. Но я не учел их, так как они только запутали цель этого поста :)
Проверьте этот вопрос о разделении PHP и HTML, есть разные способы сделать это, в том числе самописные системы шаблонов, системы шаблонов, такие как Smarty, PHP как самостоятельная система шаблонов и т. д. И т. Д.
Я думаю, что у вас есть два варианта: либо использовать MVC Framework, либо использовать ленивый способ создания шаблонов, который приведет к значительным накладным расходам на ваш код. Очевидно, я придерживаюсь первого мнения и считаю, что изучение MVC - один из лучших приемов веб-разработки в книге.
Doing that, however, makes my php code look horrific... it really messes with the formatting and "shape" of the code. How should I get around this?
Рассматривайте свой 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, которая будет делать то же самое.)
Это интересный способ использования urlencode и htmlspecialchars внутри шаблона / представления. Действительно ли это лучший метод, чем полагаться на объект представления контроллера / фреймворка, чтобы избежать символов и просто передать данные в представление для отражения? Я лично пользуюсь последним. Контроллер отвечает за получение и обработку данных. Это не ответственность за просмотры. Он просто отображает данные, а не манипулирует ими.
Каким образом фреймворк (а тем более контроллер) знает, что нужно сделать для выхода из стадии просмотра вывода? Он может включать не только экранирование HTML, но и шаблоны значений в URL (urlencode / rawurlencode в зависимости от того, какой бит), или строковые литералы JavaScript (json_encode), или строковый литерал CSS, или вставляемый фрагмент HTML (двойное кодирование HTML) , или, может быть, он выводит содержимое в обычное текстовое электронное письмо (без кодировки). Если контроллер предварительно закодировал все в HTML, это не сработает. Экранирование контекста - это основная задача представления.
Любой механизм шаблонов был бы решением этой проблемы без накладных расходов, связанных с фреймворком MVC. Smarty - отличный выбор.