dimayakovlev.ru


Сохранение содержания страницы в переменную в GetSimple CMS

Знакомая каждому опытному пользователю функция GetSimple CMS get_page_content() выводит содержание страницы в шаблоне оформления. Но при разработке возможны варианты, когда требуется не вывести содержание, а сохранить его в переменную для дальнейшего использования.

Первый вариант, приходящий в голову - использовать глобальную переменную $content. До вызова функции get_page_content() в этой глобальной переменной хранится “сырое” содержание страницы - содержание в том виде, в котором оно было сохранено в XML-документе страницы. Поэтому оно может отличаться от ожидаемого, что можно проверить при помощи следующего PHP-кода:

<?php var_dump($content); ?>

Это происходит потому что функция get_page_content() не просто выводит содержимое глобальной переменной $content, но и выполняет ряд дополнительных действий:

  • вызывает хук content-top;
  • вызывает функцию strip_decode();
  • вызывает фильтр content;
  • вызывает функцию strip_content();
  • вызывает хук content-bottom.

Для того, чтобы вместо вывода сохранить результат выполнения функции get_page_content() в переменой, следует использовать контроль вывода:

<?php
ob_start();
get_page_content();
$content = ob_get_contents();
ob_end_clean();
?>

В результате выполнения кода в переменной $content будет сохранён полный вывод функции get_page_content(). Включение в него результата вызова хуков content-top и content-bottom может быть нежелательно, поэтому предлагаю использовать следующую универсальную функцию.

<?php
/**
 * Return Page Content
 *
 * @param boolean $hook Enable or disable hooks
 * @uses $content 
 * @uses exec_action
 * @uses exec_filter
 * @uses strip_decode
 *
 * @return string Content of the page
 */
function return_page_content($hook = true) {
  global $content;
  ob_start();
  get_page_content();
  if ($hook) exec_action('content-top');
  $content = strip_decode($content);
  $content = exec_filter('content', $content);
  if(getDef('GSCONTENTSTRIP', true)) $content = strip_content($content);
  echo $content;
  if ($hook) exec_action('content-bottom');
  $content = ob_get_contents();
  ob_end_clean();
  return $content;
}
?>

Приведённая функция, так же, как функция get_page_content(), изменяет глобальную переменную $content, поэтому в шаблоне оформления должна вызываться только одна из них и только один раз.