Сохранение моего PHP красивым

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

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

Спасибо!

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
11
0
5 043
14
Перейти к ответу Данный вопрос помечен как решенный

Ответы 14

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

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

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

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

http://www.phpmvc.net/

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

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

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

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

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

Одно из решений - использовать шаблоны. Посмотрите на систему шаблонов Умный, чтобы найти довольно простой в использовании вариант.

Любой механизм шаблонов был бы решением этой проблемы без накладных расходов, связанных с фреймворком MVC. Smarty - отличный выбор.

Ian 22.09.2008 12:54

Создание системы шаблонов (Smarty) поверх другой системы шаблонов (самого PHP) в принципе накладно. Я за использование таких приемов, как XSL Transformations (w3schools.com/xsl) Twan

Twan 22.09.2008 13:40

Чувак, серьезно ... XSLT слишком сложен и определенно не нужен из того, о чем говорил OP. Для начала вам понадобится некоторый XML для преобразования.

nickf 22.09.2008 16:34

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

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

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

Например

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

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

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

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

Ответ принят как подходящий

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

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

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

Затем укажите, где и когда вам это нужно. Напр .:

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.

Imran 22.09.2008 17:20

Да, иногда я жалею, что никто не сказал мне это в первые годы моей жизни. Люди должны позволять новичкам просто делать что-то, а не просить их сделать идеальный старт для каждой новой технологии, к которой они приходят.

e-satis 29.10.2008 21:43

Я настоятельно рекомендую учёный вместо smarty,

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

Отделение логики от представления не означает, что вся ваша бизнес-логика должна быть на 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 с конкатенацией строк.

troelskn 22.09.2008 14:46

Вы абсолютно правы. И тег CDATA тоже всегда хорош. Но я не учел их, так как они только запутали цель этого поста :)

Twan 22.09.2008 14:52

Проверьте этот вопрос о разделении 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 внутри шаблона / представления. Действительно ли это лучший метод, чем полагаться на объект представления контроллера / фреймворка, чтобы избежать символов и просто передать данные в представление для отражения? Я лично пользуюсь последним. Контроллер отвечает за получение и обработку данных. Это не ответственность за просмотры. Он просто отображает данные, а не манипулирует ими.

Gary Green 13.08.2010 18:27

Каким образом фреймворк (а тем более контроллер) знает, что нужно сделать для выхода из стадии просмотра вывода? Он может включать не только экранирование HTML, но и шаблоны значений в URL (urlencode / rawurlencode в зависимости от того, какой бит), или строковые литералы JavaScript (json_encode), или строковый литерал CSS, или вставляемый фрагмент HTML (двойное кодирование HTML) , или, может быть, он выводит содержимое в обычное текстовое электронное письмо (без кодировки). Если контроллер предварительно закодировал все в HTML, это не сработает. Экранирование контекста - это основная задача представления.

bobince 14.08.2010 03:07

Другие вопросы по теме