Главная » PHP » Приучаем MODx хранить код в файлах
Куда Вы попали?

Информационная связь с потребителем, безусловно, реально стабилизирует социометрический рейтинг, не считаясь с затратами. Стиль менеджмента стабилизирует конвергентный анализ зарубежного опыта, оптимизируя бюджеты. Емкость рынка вырождена. Стратегический маркетинг, не меняя концепции, изложенной выше, основан на тщательном анализе данных.
А если серьёзно, это просто блог.

Нужен сайт?

Тогда, возможно, Вы попали туда куда нужно.
Я занимаюсь созданием сайтов "под ключ".
Оцените качество работы, посмотрев
портфолио. Если Вы не рассчитываете на демпинг, связаться со мной можно при помощи формы обратной связи.



Для "спасибо"
Установите Flash-плеер

Авторизация

Есть что сказать?


Приучаем MODx хранить код в файлах

В системе MODx все шаблоны и чанки (а также некоторые сниппеты, плагины) хранятся в базе данных. Редактировать их в админке очень неудобно. Для подсветки синтаксиса есть плагин EditArea, но во-первых он работает не так быстро как хотелось бы, а во-вторых функционала маловато. Куда удобнее было бы, если бы код хранился в файлах, ведь их можно открывать в редакторе, к которому привык. Погуляв на форуме, я нашел несколько решений этой задачи. Оказалось, что совсем не обязательно вносить изменения в код системных файлов.

Шаблоны и чанки

Сразу хочу предупредить. Когда код хранится в БД после редактирования в админке, кэш сайта автоматически очищается. После редактирования файлов кэш нужно будет очищать вручную (кнопка "Очистить кэш").

На форуме MODx я нашел вот такой простой сниппет:

<?php
// Snippet to include files from filesystem
 
if ( !isset($file) || $file== "" ) return "No file specified."; //check if there's a file given.
 
//Start the buffer
ob_start();
 
//include
include $file;
 
//get contents from the buffer
$ob_contents = ob_get_contents();
 
//and kill/delete the buffer
ob_end_clean();
 
//return it to MODx
return $ob_contents;
?>

С помощью него можно "инклудить" любые файлы. Например можно в системе создать шаблон с одной строчкой

[[includeFile? &file=`assets/templates/mytemplate/mainpage.tpl`]]

Т.е. теперь в БД будет храниться только одна строка кода, а весь код шаблона будет храниться в файле. Также в него можно вставить другие файлы (чанки), например код "шапки" (header) и "подвала" (footer).

Как же быть с чанкими сниппетов? Два из основных сниппета Ditto и Wayfinder позволяют подключать чанки таким способом (пример для Wayfinder):

&rowTpl=`@FILE:assets/templates/mytemplate/menu_rowTpl.tpl`

Для сниппетов, которые эту возможность не поддерживают можно использовать такую функцию:

function fetchTpl($tpl){
  global $modx;
  $template = "";
  if($modx->getChunk($tpl) != ""){
    $template = $modx->getChunk($tpl);
  }else if(substr($tpl, 0, 6) == "@FILE:"){
    $tpl_file = MODX_BASE_PATH . substr($tpl, 6);
    $template = file_get_contents($tpl_file);
  }else if(substr($tpl, 0, 6) == "@CODE:"){
    $template = substr($tpl, 6);
  }else{
    $template = FALSE;
  }
  return $template;
}

В коде сниппета нужно заменить все вызовы функции getChunk() на fetchTpl() и вставить код функции. Кстати, в новой версии (0.9.2) сниппета Shopkeeper это уже сделано.

Сниппеты и плагины

Все коды сниппетов можно тоже вынести в файлы, а в админке в поле "Код сниппета" вставить:

<?php
require 'assets/snippets/mysnippet/mysnippet.php';
?>

Для безопасности в файле с кодом сниппета в самом верху нужно вставить такой код:

defined('IN_PARSER_MODE') or die();

Это подходит также для плагинов.

Вот и всё. Эти решения, конечно, не идеальные, зато без "хака" системы.



Написать комментарий

  • Обязательные для заполнения поля помечены знаком *.
Код подтверждения:


Andchir
Ответов: 1
Комментарий
2 Дмитрий
Ответ #2 дата : Thu February 04, 2010, 20:34:30
Да, но не забывайте, что вытащенный из базы PHP-код пропускается через eval(), а это тоже требует ресурсов и не малых. "Эвалиться" одна строка думаю будет быстрее чем 1000 строк.
Дмитрий
Ответов: 1
Комментарий
Re: Приучаем MODx хранить код в файлах
Ответ #1 дата : Thu February 04, 2010, 11:26:37
Способ хороший но для режима девелопмента на продакшн сайтах все таки лучше весь код вернуть в базу по одной простой причине - быстродействие
то есть имея код в базе мы получаем в нагрузку только запрос к самой базе а используя require к запросу в базу мы получаем еще и лишний инклуд файла что сказывается на быстродействии хотя имхо один два файла подключаемых таким образом роли не сыграют
Последняя правка: February 04, 2010, 20:28:28 пользователем Andchir