Как записать php+html в одном более красивом файле?

<?
if($id == 2) {
?>
       html goes here
<?
} 
else { 
?>
       if id is not 2 then something goes here
<?
}
?>

Как я могу записать php+html в одном файле, более красивом, не изучая присяжного острослова?

7
задан Mitch Dempsey 8 May 2010 в 22:24
поделиться

12 ответов

Вы можете использовать альтернативный синтаксис PHP для управляющих структур:

<? if ($id == 2): ?>
    <h2>some html</h2>
<? else: ?>
    <h2>another html chunk</h2>
<? endif ?>

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

23
ответ дан 6 December 2019 в 05:42
поделиться

Мне нравится и я использую метод soulmerge. Но выход еще один:

<?php

if ($id == 2)
echo <<< END
    <h2>some html</h2>
END;
else
echo <<< END
    <h2>another html chunk</h2>
END;

?>
1
ответ дан 6 December 2019 в 05:42
поделиться

Можно сделать вот так...

<?
$html_1 = <<<EOH
my html goes here
EOH;

$html_2 = <<<EOH
my html <i>something else</i> html goes here
EOH;

echo ($id==2?$html_1:$html_2);
?>

Но если вы хотите облегчить работу дизайнеров, просто используйте внешние файлы:

<?
$html=($id==2 ? file_get_contents("html_1.html") : file_get_contents("html_2.html") );
$html=str_replace("%php generated content%", 1 + 1, $html );
echo $html;
?>

и используйте ваши предопределенные ключевые слова для вставки php рассчитанного контента (как %php generated content% заменяется на 2 (1 + 1) в этом примере)

0
ответ дан 6 December 2019 в 05:42
поделиться

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

<? if($id == 2) {    ?>

       <p>html goes here</p>

<? } else       {    ?>

       <span>if id is not 2 then something goes here</span>

<? }                 ?>

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

0
ответ дан 6 December 2019 в 05:42
поделиться

Для улучшения возможной ремонтопригодности (дизайна) в будущем я бы предложил примерно следующее:

<?php
if ($id == 2){
$someText = 'I like your id!';
}else{
$someText = 'I love your id!';
}
?>
<html>
...complex html...
<p><?php echo $someText ?></p> <!-- or <?= $someText ?> -->
...complex html...
</html>
4
ответ дан 6 December 2019 в 05:42
поделиться

Вы можете реализовать шаблон проектирования MVC (Модель, Представление, Контроллер), ваш код можно использовать в качестве модели для загрузки представления :

<?php
if($id == 2) 
{
 //somes variable and array controls
}
else  
{
 //somes variable and array controls
}
//include the view
include('view.php');
?>

В view.php вы показываете html-страницу только с эхом для переменных и массива php.

5
ответ дан 6 December 2019 в 05:42
поделиться

Я рекомендую HEREDOC для некоторого HTML-кода.

Например:

<?php
if($id==2)
 echo <<<EOT
Blah
EOT;
else
 echo <<<EOT
Your id is <b>{$id}</b>
EOT;
?>

Кроме того, вы можете попробовать подход, при котором у вас есть два файла: файл php и файл phtml. Файл php является основной логикой, затем файл phtml является выводом html.

Как и в вашем примере,

// logic.php file
if($id==2)
 $sOutput = 'Yes';
else
 $sOutput = 'No';
// somewhere at the end of the file
include 'logic.phtml';

// logic.phtml
<html>
<title><?=$sOutput?></title>
<body>
Blah blah blah <?=$sOutput?> you can login
</body>
</html>
2
ответ дан 6 December 2019 в 05:42
поделиться

Добавляя к ответу DaNieL, вы можете сделать что-то вроде:

function htmlVars($html, $vars){
    $html = preg_replace_callback('/@\[([0-9a-zA-Z_\$]*)\]/',function ($matches) use ($vars){
  return isset($vars[$matches[1]])?$vars[$matches[1]]:"";
 },$html);
 return $html;
}

Пример:

echo htmlVars('foo is @[foo] and bar is not @[bar]',
    Array('foo'=>'foo','bar'=>'barz'));

Результат:

foo is foo and bar is not barz

Анонимные функции работают только для php 5.3 или выше

0
ответ дан 6 December 2019 в 05:42
поделиться

На самом деле есть два случая:

1) Код шаблона. Я бы рекомендовал подход soulmerge с альтернативным синтаксисом для управляющих структур.

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

Для 2 я предпочитаю что-то вроде:

public function draw(){
    $html = array();
    foreach($this->item as $item){
       $html[] = <<<EOD 
<li class="{$item->class()}">{$item->label()}</li>
EOD;
    }
    return implode($html);
}

Я предпочитаю это любой альтернативе, которая может включать блоки ob_start () и ?> . Вы всегда хотите, чтобы ваши функции возвращали строки, а не эхо-вывод напрямую, чтобы вызываемые объекты имели возможность объединять и иным образом манипулировать результатами, не передавая бремя буферизации вывода на вызываемого.

Heredoc позволяет легко идентифицировать строковый вывод, и хотя я считаю, что нарушение отступов некрасиво, в конечном итоге оно оказывается весьма эффективным, поскольку вывод в формате html выделяется как маленькие стикеры. Это и тот факт, что в моей среде IDE (PDT) он красиво подсвечивается зеленым. (Не видно здесь в выделителе SO ...), поэтому всегда ясно, в каком именно "режиме" я нахожусь.

Напротив, метод ?> усложняет чтобы отличить html от кода php. После того, как вы сделаете это пару раз, вам станет неприятно отслеживать, нужен ли вам ?> или . Наконец, часто бывает сложнее выполнять замены с помощью func ()?> vs {$ obj-> func ()}

Если в вашем коде больше сложный, то, возможно, пришло время провести рефакторинг. Мне нравится heredoc, потому что если я делаю что-то специальное, это будет выделяться и станет действительно очевидным через пару месяцев (ad-hoc имеет тенденцию превращаться в комок грязи, когда вы добавляете требования), когда я получил 40 строк heredoc, которые могли начинаться как 5. Когда я возвращаюсь, смотрю на свой код и разрабатываю не полностью специальную версию, намного легче определить части файла, в которых я был плох. Это восходит к липким заметкам, зеленому выделению комментария, которое я также сделал по поводу отступа.

0
ответ дан 6 December 2019 в 05:42
поделиться
 <?php

if($id == 2) {
  //echo all your html stuff
  echo "<title>Title is where id is 2</title>";
  echo "<h1>Hellow</h1>";

}
else {

  echo "<title>Title is where id isn't 2</title>";

}

?> 
-2
ответ дан 6 December 2019 в 05:42
поделиться

Используя это - PHP echo. Если это то, что вы хотите, то есть - возможно, будет удобнее продолжить то, что вы делаете, если вы выводите большие объемы HTML.

-2
ответ дан 6 December 2019 в 05:42
поделиться

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

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

Если вы работаете с дизайнерами и производительность не является вашей первой задачей, вы можете создать html-файл с простыми заполнителями, в которые должен помещаться динамический контент, а затем заменить его на php (str_replace, preg_replace) .. но это будет медленнее ваше приложение.

Пример:

//html template
// the @[var] syntax is just as an example
<title>@[title]</title>
<body>
    @[content]
</body>

и ваш файл шаблона:

$title = 'Hello world';
if($id == 2){
    $content = get_content();
}else{
    $content = get_another_content();
}
//really, this is just as example ;)
ob_start();
include('template.html');
$output = ob_get_clean();
echo str_replace(
    array('@[title]', '@[content]'),
    array($title, $content),
    $output
);

Это действительно базовый пример, имеющий 2 проблемы:

  1. Производительность;
  2. Дизайнеры должны быть проинструктированы НЕ касаться заполнителей.

Более простым решением может быть:

//html template
<title><?php echo $title; ?></title>
<body>
    <?php echo $content; ?>
</body>

и php:

$title = 'Hello world';
if($id == 2){
    $content = get_content();
}else{
    $content = get_another_content();
}
include('template.php');

Но повторение html должно быть по возможности уменьшено, это не является хорошей практикой, и оно смешивает логику с контентом Логика есть логика, данные - это данные, и жизнь хороша

2
ответ дан 6 December 2019 в 05:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: