Наши заметки о MODx
В этом разделе мы будем собирать небольшую копилку секретов по работе с системой управления контентом сайта (CMS) MODx. Эти заметки ни в коем случае не претендуют на лавры документации. На нашем сайте тема MODx вообще занимает небольшой уголок, и эти материалы мы размещаем только потому, что по роду основной работы нам приходится оказывать техническую поддержку нескольким десяткам организаций, использующих наши прототипы сайтов. В то же время кое-что может пригодиться и другим людям.
Мы не претендуем на изложение "истины в последней инстанции". Наверняка в этих заметках гуру MODx найдут неточности и ошибки. Мы будем очень благодарны, если на это нам укажут в комментариях.
В заметках мы стараемся не просто сразу приводить готовое правильное решение, но и показываем, как мы набивали шишки в процессе поиска.

Подключение AjaxFileManager к TinyMCE


Итак, мы подключаем AjaxFileManager самой последней версии RC5 к редактору TinyMCE версии 3.2.7.0.

На момент написания статьи имеется версия TinyMCE 3.3rc1. В отношении AFM у неё нет никаких отличий, но есть свои баги, пока ограничивающие использование этой версии в MODx.

1. Скачиваем Ajax File and Image Manager с сайта разработчика.

2. Создаем папку assets\plugins\ajaxfilemanager\  и копируем в неё содержимое папки ajaxfilemanager из архива, чтобы внутри появились подпапки

  • assets\plugins\ajaxfilemanager\inc\
  • assets\plugins\ajaxfilemanager\jscripts\
  • assets\plugins\ajaxfilemanager\langs\
  • plugins\ajaxfilemanager\session\
  • assets\plugins\ajaxfilemanager\theme\

и все вложенные файлы.

3. Идём в папку TinyMCE, сохраняем файл tinymce.functions.php в виде копии, например old_tinymce.functions.php и начинаем редактировать tinymce.functions.php. Предполагаем, что он был из штатной сборки MODx с подключением MCPUK.

Редактирование tinymce.functions.php

Суть настроек TinyMCE в этом файле заключается в формировании средствами PHP огромной строки $tinymceInit, в которую включаются любые настройки редактора. Сам-то редактор написан на Javascript, а MODx — на PHP, вот и требуется специальный «посредник». В отношении файлового менеджера имеется такой код:

Штатные настройки FileBrowser (фрагмент tinymce.functions.php)

if($theme == "editor" || $theme == "custom"){
 if($frontend=='false' || ($frontend=='true'&& $webuser))
{ $tinymceInit .= ($use_browser==1 ? "  
file_browser_callback: \"myFileBrowser\",\n":"");

В этом кусочке кода в строке $tinymceInit по условию задается в качестве значения для параметра file_browser_callback имя функции  myFileBrowser. Далее по тексту идёт описание этой функции  в переменной $tinyCallback с использованием специального синтаксиса.

Определение $tinyCallback

$tinyCallback = <<<TINY_CALLBACK
 function myFileBrowser (field_name, url, type, win) {
  if (type == 'media') {type = win.document.getElementById('media_type').value;}
 var cmsURL = '{$base_url}manager/media/browser/mcpuk/browser.php?Connector={$base_url}manager/media/browser/mcpuk/connectors/php/connector.php&ServerPath={$base_url}&editor=tinymce3&editorpath={$tinyURL}';
  switch (type) {
    case "image":
     type = 'images';
      break;
     case "media":
            case "qt":
            case "wmp":
            case "rmp":
                type = 'media';
                   break;
            case "shockwave":
             case "flash":
                type = 'flash';
              break;
             case "file":
            type = 'files';
             break;
          default:
        return false;
}
if (cmsURL.indexOf("?") < 0) {
            cmsURL = cmsURL + "?type=" + type;
        }
        else {
            cmsURL = cmsURL + "&type=" + type;
        }
        
var windowManager = tinyMCE.activeEditor.windowManager.open({
    file : cmsURL,
    width : screen.width * 0.7,  
    height : screen.height * 0.7,
    resizable : "yes",
    inline : "yes",  
    close_previous : "no"
 }, {
    window : win,
    input : field_name
});
if (window.focus) {windowManager.focus()}
return false;
}
TINY_CALLBACK;

Смысл этой функции в том, что:

В качестве файлового менеджера запускается manager/media/browser/mcpuk/browser.php с кучей аргументов, которые здесь же и формируются;

Устанавливаются параметры окна файлового менеджера, и анализируются результаты работы этого окна.

Теперь, понимая суть, мы можем и заменить Mcpuk на любой файловый менеджер. Нам нужен AFM. Нам необходимо только переписать определение $tinyCallback.

Переопределение $tinyCallback

$tinyCallback = <<<TINY_CALLBACK
 function myFileBrowser(field_name, url, type, win) {
 var ajaxfilemanagerurl = "{$base_url}assets/plugins/ajaxfilemanager4/ajaxfilemanager.php";
  switch (type) {
    case "image":
          break;
    case "media":
          break;
    case "flash":
          break;
     case "file":
          break;
      default:
      return false;
}
var windowManager = tinyMCE.activeEditor.windowManager.open({
         file : ajaxfilemanagerurl,
         width : screen.width * 0.7,
         height : screen.height * 0.7,
         resizable : "yes",
        inline : "yes",
        close_previous : "no"
}, {
    window : win,
    input : field_name
});
 if (window.focus) {windowManager.focus()}
return false;
}
TINY_CALLBACK;

Смысл этой функции в том, что:

  • В качестве файлового менеджера запускается assets/plugins/ajaxfilemanager4/ajaxfilemanager.php без дополнительных параметров;
  • Устанавливаются параметры окна файлового менеджера, и анализируются результаты работы этого окна — так же, как и с любым другим файловым менеджером.

Обратите внимание на существенные отличия — для AFM мы не формируем специальных параметров, указывающих, какую папку просматривать — images, files или media.
Мы позволяем обзор, начиная с корня, т.е. с папки assets.

 

В результате всех этих махинаций у нас должен запускаться AFM при щелчках по кнопке Просмотр в диалоговых окнах вставки изображений и ссылок. При выборе файла AFM должен возвращать в соответствующее диалоговое окно относительное имя файла.

Теперь можем приступать к настройкам самого AFM.

10-03-2010 16:35:35



    Содержание раздела «Подключение AjaxFileManager»:
Комментарии любых посетителей

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