We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 9198
    • 100 Posts
    Озадачился я интеграцией форума Vanilla в MODx, но все что находил (в том числе и для других CMS) это только использование форумом внешней таблицы пользователей, что уже хорошо, но недостаточно.
    Решения содания темы для форума похожей на сайт или встраивания через iframe меня не устраивали. Решил дальше покопать тему и поделится результами, может кому пригодится.

    Итак, для интеграции нужно:
    1. Сначала интегрировать базу пользователей http://modxcms.com/forums/index.php/topic,14109.msg99816.html#msg99816

    2. В MODx создать документ, в котором будет отображаться форум. Создать плагин, который будет вызываться на событии OnWebPageInit и для определенной страницы вызывать форум черех include
    <?php
    $forum_path = 'vanilla/';
    $forum_docid = 47;
    
    $e = &$modx->Event;
    
    global $vanilla_result;
    $vanilla_result = array();
    
    global $Head;
    
    $vanilla_path = MODX_BASE_PATH.$forum_path;
    if ($e->name == 'OnWebPageInit' && $modx->documentIdentifier==$forum_docid) {
      ob_start();
      $vanillaentry = isset($_GET['vanillapage'])?$_GET['vanillapage'].'.php':'index.php';
      include($vanilla_path.$vanillaentry);
      ob_clean();
    	
    	foreach($Head->Scripts as $script) {
    		$modx->regClientStartupScript($script);
    	}
    	foreach($Head->StyleSheets as $style) {
    		$modx->regClientCSS($style['Sheet'],$style['Media']);
    	}
    }
    ?>
    


    В нем $forum_path - путь к установленной vanilla, $forum_docid - идентификатор документа, в котором будет отображаться форум.
    $vanilla_result это массив, которому в теме vanilla будет присваиваться результат в виде части форума. $vanilla_result[’Content’] - сожержимое, $vanilla_result[’Menu’] - меню форума, $vanilla_result[’Panel’] - панель, итд.

    3. Создать тему для vanilla, где в каждом файле вместо вывода html кода присваивать его в $vanilla_result. Например для списка тем файл discussions.php
    <?php
    // Note: This file is included from the library/Vanilla/Vanilla.Control.DiscussionGrid.php class.
    global $vanilla_result;
    ob_start();
    .....
    $vanilla_result['Content'] = ob_get_clean();
    ?>
    

    В файлах panel.php,menu.php присваивать нужно $vanilla_result[’Panel’], $vanilla_result[’Menu’] итд
    Мою тему можно скачать http://rapidshare.com/files/244048540/vanilla.zip
    В настройках указать эту тему по-умолчанию

    4. Создать сниппет VanillaControl выводящий часть форума:
    <?php
    $control = isset($control)?$control:'Content';
    global $vanilla_result;
    return isset($vanilla_result[$control])?$vanilla_result[$control]:'';
    ?>
    

    Вызывать [!VanillaControl? &control=`Content`!] для вставки содержимого, [!VanillaControl? &control=`Panel`!] для вставки панели, итд

    5. Направить вызов vanilla через MODx, для этого нужно отредактировать .htaccess
    Если vanilla не использует ЧПУ, то
    RewriteCond %{REQUEST_URI} !.*ajax.*
    RewriteRule vanilla/(.*)\.php index.php?vanillapage=$1&q=vanilla [L,QSA] 
    

    q=vanilla это alias страницы в MODx

    Скриншоты:


      • 26704
      • 115 Posts
      круто! жаль с IPB такого не получится sad (мне по крайней мере так кажется)
        • 19880
        • 54 Posts
        Warning: require(MODx/settings.php) [function.require]: failed to open stream: ��� ������ ����� ��� �������� in /home/users2/m/mmice/domains/mmice.jino.ru/vanilla/conf/MODx/settings.php on line 3

        Fatal error: require() [function.require]: Failed opening required ’MODx/settings.php’ (include_path=’.:/usr/local/lib/php’) in /home/users2/m/mmice/domains/mmice.jino.ru/vanilla/conf/MODx/settings.php on line 3

        Где же я ошибся, интересно ((
          • 12088
          • 8 Posts
          Думаю, не актуально, но ошибка при интеграции базы пользователей форума с modx.

          У меня другой вопрос. При интеграции форума в modx возникает проблема в плагине. error_log молчит. Просто выводится чистый лист. Помогает комментирование строчки
          include($vanilla_path.$vanillaentry);

          Если попробовать присоединить самопальный php файл из папки с форумом и передать глобальную переменную $vanilla_result, то значение выводит. Что может тормозить работу скрипта?
          Я уже весь файл index.php у форума завернул в ob_start(); ... ob_clean();
          Версия ванилы 1.1.2 Пользователи интегрируются. Версия modx 1.0.4

          Может ли это быть exit функция ванилы или modx? Версию ванилы я брал ту же, что и в рассмотренном примере.
            • 9198
            • 100 Posts
            Честно говоря этим способом я ни разу так и не воспользовался, кроме как в тестовых целях. Для реального проекта сделал по другому, хотя суть осталась та же.
            Написал простенькое расширение для Vanilla RenderToVar, которое весь вывод оборачивает в ob_start, ob_end
            Попробуйте этим способом, может больше повезет smiley
            http://narod.ru/disk/23035707000/modxvanilla.zip.html
              • 12088
              • 8 Posts
              Спасибо огромное за столь быстрый ответ!

              Все же была проблема в ваниле. При комментировании die в функции Write файла Framework.Class.ErrorManager.php все встало на свои места
              Fatal error: Call to a member function Permission() on a non-object in /home/www/z142501/htdocs/forum/library/Vanilla/Vanilla.Class.DiscussionManager.php on line 194
              Косяк проявил себя в пользовательском классе.

              Буду пробовать вашу интеграцию. Сразу возник вопрос: в архиве 2 схожих архива: ModX и vanilla. Оба - темы для ванилы? И куда прикрепить Render To Variable ?
                • 9198
                • 100 Posts
                Ага, vanilla.zip лишний, это старая тема из первого поста. Просто выложил то, что кому-то недавно по почте отправлял.

                Точно путь не помню, но RenderToVar нужно к расширениям Ваниллы, т.е. путь примерно forum/extensions и включить это расширение в настройках Vanilla
                  • 12088
                  • 8 Posts
                  Интеграция прошла успешно. Полет нормальный. grin
                  Что сделал:

                  1. Установил Vanilla как сниппет http://modxcms.com/forums/index.php/topic,45105.msg267359.html#msg267359
                  Описание установки повергает в уныние. В основном все вертится вокруг базовой интеграции пользователей sql-инъекцией и изменения глобальной конфигурации. Ко всему этому добавлена вставка всей страницы в контент и операции над url с помощью .htaccess
                  При установке темы, приложенной в архиве со сниппетом у меня вылезли sql-ошибки. Исправил обратно.

                  2. Подключил файл default.php (создал папку в extentions и добавил его туда) вместе с темой из архива (modx). Установил тему через админку. Работает! Однако оперировать с массивом $vanilla_result так и не удается. Хотя меня получившийся вариант вполне устраивает. Остается подправить dom и css =)

                  Может кому поможет моя шестичасовая полоса неудач laugh
                  EVD, отдельное спасибо!
                    • 12088
                    • 8 Posts
                    Камней по пути все больше.
                    Главной проблемой интеграции vanilla, как оказалось, является ее ajax-ориентированность. Функции оперирования с разделами и постами завязаны исключительно на js обращении к скриптам папки /ajax
                    Обращение-то происходит, но вот сессия при этом обращении не сохраняется.

                    Вопрос стоит, как же сессию-то сохранить при таком раскладе? =\
                      • 9198
                      • 100 Posts
                      Да, была такая же проблема.
                      Но сейчас уже не помню как решил, но тогда решил как-то быстро.
                      По памяти там причина была в том что при Ajax запросе передается PostBackKey и сравнивается с результатом функции $Context->Session->GetCsrfValidationKey(), и из-за того что какая-то переменная не инициализирована получается то ванилла заново ключ генерит и ключи разные получаются.

                      А почему она не инициализирована получается я точно уже не помню, либо из-за того что переменная глобальная, поэтому в плагине VanillaBridge я объявлял некоторые переменные глобальными, наверное это из-за того что MODx плагины выполняет через eval() в ванилле они получались не инициализированными . Либо что-то в конфигурационном файле MODx\settings.php