Небольшой фикс для aceAdminPanel чтобы он не конфликтовал с плагином DokuWiki

Предыстория


LiveStreet 0.4.2
Ставим плагины aceAdminPanel (v 1.4.166) и DokuWiki (v 1.0).
Заходим (под админом вашего livestreet) в Wiki и нажимаем на кнопку «Управление».
И видим на странице кучку ошибок:

[ERROR:classLoad] configuration
File not found: Z:/home/livestreet.net/www/classes/modules/configuration/Configuration.class.php
[ERROR:classLoad] setting
File not found: Z:/home/livestreet.net/www/classes/modules/setting/Setting.class.php
[ERROR:classLoad] setting_string
File not found: Z:/home/livestreet.net/www/classes/modules/string/String.class.php
[ERROR:classLoad] setting_password
File not found: Z:/home/livestreet.net/www/classes/modules/password/Password.class.php
[ERROR:classLoad] setting_email
File not found: Z:/home/livestreet.net/www/classes/modules/email/Email.class.php
[ERROR:classLoad] setting_richemail
File not found: Z:/home/livestreet.net/www/classes/modules/richemail/Richemail.class.php
[ERROR:classLoad] setting_numeric
File not found: Z:/home/livestreet.net/www/classes/modules/numeric/Numeric.class.php
[ERROR:classLoad] setting_numericopt
File not found: Z:/home/livestreet.net/www/classes/modules/numericopt/Numericopt.class.php
[ERROR:classLoad] setting_onoff
File not found: Z:/home/livestreet.net/www/classes/modules/onoff/Onoff.class.php
[ERROR:classLoad] setting_multichoice
File not found: Z:/home/livestreet.net/www/classes/modules/multichoice/Multichoice.class.php
[ERROR:classLoad] setting_dirchoice
File not found: Z:/home/livestreet.net/www/classes/modules/dirchoice/Dirchoice.class.php
[ERROR:classLoad] setting_hidden
File not found: Z:/home/livestreet.net/www/classes/modules/hidden/Hidden.class.php
[ERROR:classLoad] setting_fieldset
File not found: Z:/home/livestreet.net/www/classes/modules/fieldset/Fieldset.class.php
[ERROR:classLoad] setting_undefined
File not found: Z:/home/livestreet.net/www/classes/modules/undefined/Undefined.class.php
[ERROR:classLoad] setting_no_class
File not found: Z:/home/livestreet.net/www/classes/modules/no/No.class.php
[ERROR:classLoad] setting_no_default
File not found: Z:/home/livestreet.net/www/classes/modules/no/No.class.php
[ERROR:classLoad] setting_multicheckbox
File not found: Z:/home/livestreet.net/www/classes/modules/multicheckbox/Multicheckbox.class.php
[ERROR:classLoad] setting_sepchar
File not found: Z:/home/livestreet.net/www/classes/modules/sepchar/Sepchar.class.php
[ERROR:classLoad] setting_savedir
File not found: Z:/home/livestreet.net/www/classes/modules/savedir/Savedir.class.php
[ERROR:classLoad] setting_authtype
File not found: Z:/home/livestreet.net/www/classes/modules/authtype/Authtype.class.php
[ERROR:classLoad] setting_im_convert
File not found: Z:/home/livestreet.net/www/classes/modules/im/Im.class.php
[ERROR:classLoad] setting_disableactions
File not found: Z:/home/livestreet.net/www/classes/modules/disableactions/Disableactions.class.php
[ERROR:classLoad] setting_compression
File not found: Z:/home/livestreet.net/www/classes/modules/compression/Compression.class.php
[ERROR:classLoad] setting_license
File not found: Z:/home/livestreet.net/www/classes/modules/license/License.class.php
[ERROR:classLoad] setting_renderer
File not found: Z:/home/livestreet.net/www/classes/modules/renderer/Renderer.class.php

Если мы отключаем aceAdminPanel и заходим в «Управление» Wiki, то не одной ошибки не появляется.

Не изящное решение малой кровью


Создаем эти недостающие пустые файлы и папки. :)
Но это не наш путь.

Более менее изящное решение


Не создаем кучу файлов и папок а создаем одну такую парочку с файлом к примеру
/classes/modules/multicheckbox/Multicheckbox.class.php

А в файле пишем такой код:
<?php
echo "Multicheckbox.class.php:
";
echo "<pre>";
debug_print_backtrace();
echo "</pre>";
?>


При загрузке этой же самой странички в Wiki вы получим на странице:

...

Multicheckbox.class.php:

#0  include_once() called at [Z:\home\livestreet.net\www\plugins\aceadminpanel\include\adm_helper.php:556]
#1  HelperPluginLoader->ClassLoad(setting_multicheckbox) called at [Z:\home\livestreet.net\www\plugins\aceadminpanel\include\adm_helper.php:539]
#2  HelperPluginLoader->Autoloader(setting_multicheckbox)
#3  spl_autoload_call(setting_multicheckbox)
#4  class_exists(setting_multicheckbox) called at [Z:\home\livestreet.net\www\wiki\lib\plugins\config\settings\config.class.php:809]
#5  require_once(Z:\home\livestreet.net\www\wiki\lib\plugins\config\settings\config.class.php) called at [Z:\home\livestreet.net\www\wiki\lib\plugins\config\admin.php:21]
#6  include_once(Z:\home\livestreet.net\www\wiki\lib\plugins\config\admin.php) called at [Z:\home\livestreet.net\www\wiki\inc\plugincontroller.class.php:86]
#7  Doku_Plugin_Controller->load(admin, config, ) called at [Z:\home\livestreet.net\www\wiki\inc\pluginutils.php:29]
#8  plugin_load(admin, config) called at [Z:\home\livestreet.net\www\wiki\inc\html.php:1353]
#9  html_admin() called at [Z:\home\livestreet.net\www\wiki\inc\template.php:225]
#10 tpl_admin() called at [Z:\home\livestreet.net\www\wiki\inc\template.php:127]
#11 tpl_content_core(admin) called at [Z:\home\livestreet.net\www\wiki\inc\events.php:91]
#12 Doku_Event->trigger(tpl_content_core, 1) called at [Z:\home\livestreet.net\www\wiki\inc\events.php:197]
#13 trigger_event(TPL_ACT_RENDER, admin, tpl_content_core) called at [Z:\home\livestreet.net\www\wiki\inc\template.php:44]
#14 tpl_content() called at [Z:\home\livestreet.net\www\wiki\lib\tpl\livestreet\main.php:101]
#15 include(Z:\home\livestreet.net\www\wiki\lib\tpl\livestreet\main.php) called at [Z:\home\livestreet.net\www\wiki\inc\actions.php:157]
#16 act_dispatch(admin) called at [Z:\home\livestreet.net\www\wiki\doku.php:84]

...


Посмотрим стек вызова. Почешем затылок. И полезем в файл \plugins\aceadminpanel\include\adm_helper.php
А точнее нас с вами интересует класс HelperPluginLoader.

Далее посмотрим в функцию этого класса (HelperPluginLoader) Autoloader.
Видим строчку
if ($this->AutoloadIgnoreClass($sClassName)) return;


Смотрим в функцию AutoloadIgnoreClass.
Нас интересует что происходит внутри. Используем грязный отладочный прием. (добавили строчку с комментарием dbg)
public function AutoloadIgnoreClass($sClassName)
    {
        if ($this->aAutoloaderSkipPrefix) {
            foreach ($this->aAutoloaderSkipPrefix as $sPrefix) {
                error_log($sClassName."\n", 3, "dbg_call.log"); //dbg
                if (0 === strpos($sClassName, $sPrefix)) {
                    return true;
                }
            }
        }
        return false;
    }


Опять загрузим ту же самую страничку в Wiki и после посмотрим в файл dbg_call.log (если хотите то и путь до файла можно указать)

Содержимое файла:
PluginAceAdminPanel_ActionAdmin
PluginAceadminpanel_Inherits_ActionAdmin
configuration
setting
setting_string
setting_password
setting_email
setting_richemail
setting_numeric
setting_numericopt
setting_onoff
setting_multichoice
setting_dirchoice
setting_hidden
setting_fieldset
setting_undefined
setting_no_class
setting_no_default
setting_multicheckbox
setting_sepchar
setting_savedir
setting_authtype
setting_im_convert
setting_disableactions
setting_compression
setting_license
setting_renderer


Видим по лог-файлу что в нем встречаются как раз те самые классы которые у нас в кучке ошибок на страничке в Wiki.

Вспоминаем про функцию AutoloadIgnoreClass и про переменную aAutoloaderSkipPrefix.
Смотрим ее значение
protected $aAutoloaderSkipPrefix = array('DbSimple_');


Заменяем на вот это
protected $aAutoloaderSkipPrefix = array('DbSimple_','setting_');


Опять загрузим ту же самую страничку в Wiki уже видим что ошибок стало гораздо меньше.
Еще разок правим $aAutoloaderSkipPrefix
protected $aAutoloaderSkipPrefix = array('DbSimple_','setting_','setting','configuration');

Опять загрузим ту же самую страничку в Wiki уже видим что ошибок нет. Бинго! :)

Вопрос к автору плагина aceAdminPanel

Как более корректно подправить ваш плагин что бы он не пытался загрузить не livestreet плагины?

5 комментариев

avatar
По этой же причине не использую aceAdminPanel — уж слишком много она должна знать о «внешнем мире», что бы нормально работать. Пока это не часть движка — такое поведение не нормально. :(

Но несомненно, плагин очень полезный. (:
avatar
А можно конкретнее — чего еще должна знать админпанель, чтобы нормально работать?
avatar
По хорошему, любой плагин вообще ничего не должен знать об окружении, а любую информацию получать средствами движка.

По этому, решение с $aAutoloaderSkipPrefix, предложенное xRay — «не айс», т.к. создается лишняя связь между независимыми классами.

Я, вероятно, упустил появление параметра конфигурации «autoloader_error». Полезная опция :) Давно добавили?
avatar
По хорошему, любой плагин вообще ничего не должен знать об окружении, а любую информацию получать средствами движка.
Согласен на все 100. Но, к сожалению, не всегда это получается.

К тому же тут есть еще нюансы с автоподгрузкой классов. Сама по себе вещь эта замечательная, но только когда подход единый. Но даже в «чистом» ЛС уже две разных схемы подгрузки — сам движок и библиотека DbSimple. Они по разному определяют, что и откуда грузить надо, если нужный класс еще не подгружен. А был еще период, когда в движке вдруг новая схема именования классов была принята, и много плагинов было со старой схемой, и нужно было как-то ужить новый движок со старыми плагинами. А в ДокуВики подгрузка классов вообще как-то через… в общем, немного странно сделана.

Короче, корни проблемы тут никак не в плагине :)

Когда добавился этот параметр уж не помню, лень лазить по истории версий, но сейчас он по умолчанию отключен, и проблем, типа описанных у ТС быть не должно.
avatar
Как более корректно подправить ваш плагин что бы он не пытался загрузить не livestreet плагины?
Вообще-то, достаточно было всего один параметр в конфиге изменить, чтобы админка не выдавала сообщений о незагруженных классах. По умолчанию он это разрешал. Сейчас выложил последнюю версию (1.4.170), где, кроме прочего, этот параметр установлен в false, и таких сообщений выдаваться не будет.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.