Вставьте значения после того, как компилятор прошел строку - PullRequest
1 голос
/ 14 июня 2010

Для начала я использую PHP с ob_start () и ob_flush.

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

<head>
<script type="text/javascript" src="javascript/ajax_objects.js"></script>

//Enter More Code Here Later

</head>

То, что я пытаюсь сделать, это после того, как компилятор завершит работу и достигнет конца файла, и найдет больше библиотек для добавления, есть ли способ, где я могу добавить больше библиотек в ту часть, где написано // Введите больше кода Вот ? Я знаю, что это возможно, используя Javascript / AJAX, но я пытаюсь сделать это только с помощью php.

Ответы [ 2 ]

1 голос
/ 14 июня 2010

http://php.net/manual/en/function.ob-start.php

Пример # 1 описывает, что именно вы пытаетесь сделать: Вы можете создать функцию обратного вызова, вызываемую при вызове ob_end_flush ().

Например:

<?php
function replaceJS($buffer) {
  return str_replace("{JS_LIBS}", 'the value you want to insert', $buffer);
}
ob_start("replaceJS");
?>
<head>
<script>
{JS_LIBS}
</script>
</head>
<?php
ob_end_flush();
?>

Выход в этом случае будет:

<head>
<script>
the value you want to insert
</script>
</head>
0 голосов
/ 14 июня 2010

Один из вариантов, это добавить «маркер». Поэтому замените //Enter More Code Here Later на <!-- HEADCODE-->.

Затем, позже, когда вы будете готовы отправить клиенту (вы упомянули использование ob_flush ()), просто выполните:

$headContent = ''; //This holds everything you want to add to the head
$html = ob_get_clean();
$html = str_replace('<!-- HEADCODE-->', $headContent, $html);
echo $html;

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

class MyOutputBuffer {
    $positions = array (
        'HEAD' => '',
    );

    public function addTo($place, $value) {
        if (!isset($this->positions[$place])) $this->positions[$place] = '';
        $this->positions[$place] .= $value;
    }

    public function render($string) {
        foreach ($this->positions as $k => $v) {
           $string = str_replace('<!-- '.$k.'CODE-->', $v, $string);
        }
        return $string;
    }
}

$buffer = new MyOutputBuffer();
ob_start(array($buffer, 'render'));

Тогда в вашем коде просто наберите $buffer->addTo('HEAD', '<myscript>');

...