Я включаю файл в один из моих методов класса, и в этом файле есть html + php-код. Я возвращаю строку в этом коде. Я явно написал {{newsletter}}
а затем в своем методе я сделал следующее:
$contactStr = include 'templates/contact.php'; $contactStr = str_replace("{{newsletter}}",$newsletterStr,$contactStr);
Однако он не заменяет строку. Единственная причина, по которой я это делаю, – это то, что когда я пытаюсь передать переменную во включенный файл, она, похоже, не распознает ее.
$newsletterStr = 'some value'; $contactStr = include 'templates/contact.php';
Итак, как мне реализовать метод замены строк?
Вы можете использовать PHP в качестве механизма шаблонов. Нет необходимости в конструкциях {{newsletter}}
.
Скажем, вы выведете переменную $newsletter
в файл шаблона.
// templates/contact.php <?php echo $newsletter; ?>
Чтобы заменить переменные, выполните следующие действия:
$newsletter = 'Your content to replace'; ob_start(); include('templates/contact.php'); $contactStr = ob_get_clean(); echo $contactStr; // $newsletter should be replaces by `Your content to replace`
Таким образом, вы можете создать собственный механизм шаблонов.
class Template { protected $_file; protected $_data = array(); public function __construct($file = null) { $this->_file = $file; } public function set($key, $value) { $this->_data[$key] = $value; return $this; } public function render() { extract($this->_data); ob_start(); include($this->_file); return ob_get_clean(); } } // use it $template = new Template('templates/contact.php'); $template->set('newsletter', 'Your content to replace'); echo $template->render();
Самое лучшее в этом: вы можете сразу использовать условные инструкции и циклы (полный PHP).
Это код, который я использую для шаблонов, должен делать трюк
if (preg_match_all("/{{(.*?)}}/", $template, $m)) { foreach ($m[1] as $i => $varname) { $template = str_replace($m[0][$i], sprintf('%s', $varname), $template); } }
может быть, немного поздно, но я смотрел что-то вроде этого.
Проблема в том, что include не возвращает содержимое файла, и проще было бы использовать функцию file_get_contents.
$template = file_get_contents('test.html', FILE_USE_INCLUDE_PATH); $page = str_replace("{{nombre}}","Alvaro",$template); echo $page;
Используйте output_buffers вместе с PHP-переменными. Он гораздо более безопасный, совместимый и многоразовый.
function template($file, $vars=array()) { if(file_exists($file)){ // Make variables from the array easily accessible in the view extract($vars); // Start collecting output in a buffer ob_start(); require($file); // Get the contents of the buffer $applied_template = ob_get_contents(); // Flush the buffer ob_end_clean(); return $applied_template; } } $final_newsletter = template('letter.php', array('newsletter'=>'The letter...'));
нет, не включайте для этого. include
выполняет php-код. и это возвращаемое значение – это значение, возвращаемое включенным файлом, или если нет возврата: 1.
То, что вы хотите, это file_get_contents()
:
// Here it is safe to use eval(), but it IS NOT a good practice. $contactStr = file_get_contents('templates/contact.php'); eval(str_replace("{{newsletter}}", $newsletterStr, $contactStr));