2008-09-22 8 views
10

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

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

Спасибо!

ответ

25

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

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

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

Затем укажите, где и когда это необходимо. EG:

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> 

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

myPage.php

<?php 

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

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

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

+0

Вот что я делаю сейчас. Обработайте данные в скрипте, включив соответствующий сценарий «view». В сценарии просмотра, я только эхо переменные внутри HTML и использовать if-else, петли, когда это необходимо. – Imran 2008-09-22 13:20:24

0

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

0

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

Заканчивать идеалы, лежащие в практике программирования MVC в Wikipedia

7

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

http://www.phpmvc.net/

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

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

1

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

Если вы еще не ознакомились с некоторыми шаблонами PHP, такими как Smarty.

4

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

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

+0

Любой механизм шаблонов был бы решением этого без накладных расходов структуры MVC. Smarty - отличный выбор. – Ian 2008-09-22 08:54:46

+1

Система шаблонов (Smarty) поверх другой системы шаблонов (сама по себе PHP) в принципе оклад. Я все использую такие методы, как XSL Transformations (http://www.w3schools.com/xsl/) Twan – Twan 2008-09-22 09:40:15

+1

человек, серьезно ... XSLT является waaaaay слишком сложным и определенно ненужным из того, о чем говорил OP. Для начала вам понадобится XML, чтобы преобразовать в первую очередь. – nickf 2008-09-22 12:34:47

0

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

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

0

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

, например

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

только простой примером

0

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

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

0

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

  • вам не придется изучать новый шаблонный «язык» для того, чтобы создать шаблоны, Savant шаблоны написаны на PHP
  • , если вы не» т хочет использовать PHP вы можете определить свой собственный шаблон «язык» с компилятором
  • это легко расширяемого вашей собственной PHP объектов

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

0

Вместо того, чтобы внедрять системы шаблонов поверх системы шаблонов (сам PHP), создавая накладные расходы по умолчанию, вы можете найти более надежное решение, например XSL Transformations, которое также соответствует MVC princples (при условии, что вы разделяете свои данные, а также я лично разделил логику с отображением 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

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

0

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

2

Выполнение этого, тем не менее, делает мой 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 ', что делает то же самое.)