Заменить синтаксис heredoc - PullRequest
2 голосов
/ 29 марта 2011

Я новичок в php, и у меня есть система шаблонов, в которой я изначально использовал синтаксис heredoc, но с тех пор решил избавиться от него по ряду причин.

У меня есть что-то похожее на это:

    public function display_admin() {

    return <<<ADMIN_FORM

    <form action="{$_SERVER['PHP_SELF']}" enctype="multipart/form-data" method="post">
      <label for="title">Title:</label><br />
      <input name="title" id="title" type="text" maxlength="220" />
      <div class="clear"></div>
      <label for="bodytext">Body Text:</label><br />
      <textarea name="bodytext" id="bodytext"></textarea>
      <input type="submit" value="Create This Entry!" />
    </form>

    ADMIN_FORM; }

И я вызываю это на странице, используя это:

$obj = new myCMS();
echo $obj->display_admin();

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

Ответы [ 2 ]

3 голосов
/ 29 марта 2011

Прежде всего, нет особых причин вставлять большие блоки HTML в функцию PHP.
вызов $obj->display_admin(); не имеет особого смысла.
, тогда как

$data = array('bodytext' => $text);
$obj->set_data($data);
$obj->set_template('admin_form')
$obj->display();

.

Далее, heredoc - абсолютно не шаблонное решение.
В то время как сам PHP.

Итак, создайте файл admin_form.tpl.php

<form action="" enctype="multipart/form-data" method="post">
  <label for="title">Title:</label><br />
  <input name="title" id="title" type="text" maxlength="220" />
  <div class="clear"></div>
  <label for="bodytext">Body Text:</label><br />
  <textarea name="bodytext" id="bodytext"><?=$data['bodytext']?></textarea>
<? if ($data['id']): ?>
  <input name="id" id="id" type="hidden" value="<?=$data['id']?>" />
<? endif ?>
  <input type="submit" value="Create This Entry!" />
</form>

и просто включите его в нужное место - скорее всего, в ваш шаблонный класс.

3 голосов
/ 29 марта 2011

HEREDOCS - единственный практичный выбор многострочного текстового построения такого рода. Ваши единственные другие варианты - это построчное объединение или «выход» из режима PHP и использование некоторой буферизации вывода.

$text = "blah blah blah";
$text .= "blah blah blah";
$text .= "blah blah blah";

ob_start(); ?>
blah blah blah
blah blah blah
blah blah blah
<? $text = ob_get_clean(); 

$text = <<<EOL
blah blah blah
blah blah blah
blah blah blah
EOL;

Из 3-х heredocs гораздо полезнее. Вам не нужно беспокоиться о экранировании кавычек в текстовом теле, а с переменными функциями вы можете даже выполнять вызовы функций в тексте сейчас, чтобы выполнять такие вещи, как htmlspecialchars() вызовы, без необходимости предварительно определять любой такой текст за пределами heredoc. блок.

$formfield = htmlspecialchars($_POST['somefield']);
$txt = <<<EOL
<input type="text" value="$formfield" />
EOL;

против

$hsc = function($x) { return htmlspecialchars($x); };

$txt = <<<EOL
<input type="text" value="{$hsc($_POST['somefield'])}" />
EOL;

комментарий:

Ничто не говорит, что вы не можете объединить heredocs:

$txt = <<<EOL
blah blah blah
EOL;

$txt .= <<<EOL
more blah
EOL;

В конце концов, heredoc просто создает строку, в которой есть несколько строк текста. Вы можете разбить монолитный одиночный heredoc на две или более секций и поместить ваши условные if() вещи между ними.

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

$conditional = function($parameter) { return (($parameter == 1) ? 'Success' : 'Failure'); }

$txt = <<EOL
Your login attempt
resulted in {$conditional($somevalue)}.
How does that make you feel?
EOL;

* 1023 смотри выше *

$txt = <<<EOL
Your login attemp
resulted in
EOL;
$txt .= (($somevalue == 1) ? 'Success' : 'Failure');
$txt .= <<<EOL
.
How does that make you feel?
EOL;
...