2014-10-02 3 views
0

Я использую (или, по крайней мере, привязываю) функцию PHP HEREDOC в качестве механизма шаблонов. Я реализовал внешнюю строку вызывающего абонента, которая может напрямую обрабатывать внешние функции в HEREDOC, и это работает успешно.Weird HEREDOC output order

Проблема, с которой я столкнулся сейчас, состоит в том, что порядок определенных функций кажется приоритетным и выполняется первым, независимо от других функций и/или кода внутри конкретного HEREDOC.

Как это исправить?

(Пожалуйста, обратите внимание, что я начинающий PHP Я сделал свою домашнюю работу, но не смог найти решение Спасибо...)

ФУНКЦИЯ PROCESOR:

function heredoc($input) 
    { 
    return $input; 
    } 
    $heredoc = "heredoc"; 

Heredoc ШАБЛОН:

function splicemaster_return_full_page() 
    { 
    global $heredoc; 
    $title ="This is document title"; 
    echo <<<HEREDOC 
<!DOCTYPE html> 
<html lang="en"> 
<head> 
<meta charset="utf-8"> 
{$heredoc(splice_html_title($title))} 
</head> 
<body> 
{$heredoc(splicemaster_return_message())} 
{$heredoc(splice_quick_add_article_form())} 
{$heredoc(display_all_articles_in_a_html_table())} 
</body> 
</html> 
HEREDOC; 
    } 

вопрос под рукой с "{$ Heredoc (display_all_articles_in_a_html_table())} ", который выводится перед всем остальным, что приводит к сломанному HTML.

Любая помощь была оценена, я довольно долго стучу головой об этом.

UPDATE:

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

function testout() 
    { 
    $title = "This is document title"; 

echo "<!DOCTYPE html>"; 
echo '<html lang="en">'; 
echo  "<head>"; 
echo  '<meta charset="utf-8">'; 
echo   "<title>". $title . "</title>"; 
echo  "</head>"; 
echo  "<body>"; 
echo splicemaster_return_message(); 
echo splice_quick_add_article_form(); 
echo display_all_articles_in_a_html_table(); 
echo  "</body>"; 
echo "</html>"; 

    } 

(Как это выглядит не важно - у меня есть функция HTML процессор.)

UPDATE 2

ОК, так что я нашел "грязную" исправить, Тхо это не объясняет почему двигатель работает так, как он. (Я также тестировал на другой машине, с diff. Php):

function splicemaster_return_full_page() 
    { 
    global $heredoc; 
    $title ="This is document title"; 

    echo <<<HEREDOC 
<!DOCTYPE html> 
<html lang="en"> 
<head> 
<meta charset="utf-8"> 
{$heredoc(splice_html_title($title))} 
</head> 
<body> 
{$heredoc(splicemaster_return_message())} 
{$heredoc(splice_quick_add_article_form())} 
HEREDOC; 
    echo <<<HEREDOC 
{$heredoc(display_all_articles_in_a_html_table())} 
</body> 
</html> 
HEREDOC; 
    } 
+0

Я бы предложил не использовать HEREDOC для шаблонирования целых страниц, чтобы быть честным .. использовать OB и загружать шаблоны ...если честно, почему бы не взглянуть на использование рамки для вашего программирования, поскольку все эти проблемы будут уже решены. –

+0

Спасибо за повтор; Что такое «OB»? Кроме того, рамки не мои вещи, по крайней мере, не для этого проекта. (И да, вы можете вызывать функции в HEREDOC, вам просто нужно «переименовать» функции a a a a string.) – mrmut

ответ

0

Я задал этот (аналогичный) вопрос на другом сайте, ища, почему это происходит, и нашел виновника.

Проблема была в вызываемых функциях, которые выводят (или печатают) функции, вместо этого возвращая их. Когда я переключаюсь на возврат, код выводится соответствующим образом.

0

Здесь вы не должны использовать heredoc. Или действительно пытайтесь отобразить весь html-документ внутри функции. Вот как html должен быть обработан с помощью php. Примечание. Я также уверен, что вы не можете вызывать функции в инструкции heredoc.

<?php $title = "This is document title"; ?> 
<!DOCTYPE html> 
<html lang="en"> 
    <head> 
     <meta charset="utf-8"> 
     <?php echo splice_html_title($title); ?> 
    </head> 
    <body> 
     <?php 
      echo splicemaster_return_message() 
       . splice_quick_add_article_form() 
       . display_all_articles_in_a_html_table(); 
     ?> 
    </body> 
</html> 

Вы можете видеть, насколько это чище, что значительно облегчает редактирование, когда это необходимо. Вы просто помещаете это в файл «page.php», например.

include_once('page.php'); 

И включите его, где бы вы ни называли эту функцию splicemaster_return_full_page.

+0

Я пытаюсь построить «html-фрагменты», которые я бы только вывел, поскольку мой поток управляет процессами/страницей. Я создаю небольшую CMS с одним файлом. Теперь это работает, но, как представляется, точка прерывания заключается в том, как выводить данные. Наверное, у меня есть возможность вызвать внешние файлы, но я надеялся, что смогу сделать это так. - Работая таким образом, вы предлагаете разбить мой PHP, я думаю, поскольку страница не обрабатывается линейно, а как программа. (Tho Я попробую это, у вас нет подсказки, будет ли это работать или нет.) – mrmut

+0

Хорошо, поэтому я попробовал это. - Мне не нравится эта постоянная работа и выход из программы. Делает код сложным для управления! :-(Другое дело, что конкатенированное эхо выводило LAST-функцию FIRST ?? - Оно работало только в том случае, если я выводил его эхо по эхо (эхо для каждого вызова функции). – mrmut

+0

Я не думаю, что эхо, –