1. Приветствуем Вас на неофициальном форуме технической поддержки XenForo на русском языке. XenForo - коммерческий форумный движок от бывших создателей vBulletin, написанный на PHP.

1.1.3 Расширение Xenforo_Image_Gd

Тема в разделе "Вопросы и ответы по XenForo Framework", создана пользователем Василий Рожков, 31.07.2013.

Загрузка
  1. Василий Рожков

    Василий Рожков Новичок

    Регистрация:
    24.04.13
    Сообщения:
    10
    Симпатии:
    0
    Версия XF:
    1.1.3
    Добрый день! Помогите, знакомлюсь с XenForo и не могу сдвинуться с места.
    Для добавления функционала одного плагина потребовалось расширить класс Xenforo_Image_Gd. Делал все как тут
    http://xenforo.com/community/threads/how-to-add-more-actions-to-an-existing-controller.11202/Но не работает. Создавал свое событие (load_class_image):
    Снимок.PNG

    в Листенере:
    class Vinavb_CustomNodeIcon_Listener {
    public static function load_class_image($class, array &$extend)
    {
    if ($class == 'XenForo_Image_Gd')
    {
    $extend[]='Vinavb_CustomNodeIcon_XenForo_Image_Gd';
    }
    }
    .................
    Расширенный класс:
    class Vinavb_CustomNodeIcon_XenForo_Image_Gd extends XFCP_Vinavb_CustomNodeIcon_XenForo_Image_Gd
    {
    public function ImageCopyToCorner($image2,$size,$small_size)
    {
    .................
    }

    }

    ругается на строчку $image=Vinavb_CustomNodeIcon_XenForo_Image_Gd::createFromFile($filePath,IMAGETYPE_JPEG);
    по причине
    Class 'Vinavb_CustomNodeIcon_XenForo_Image_Gd' not found


    Перекопал инструкции по XFCP не могу разобраться что не так. Пробовал не создавать событие, а выбирать из существующих - результат тот же.
     
  2. Yoskaldyr

    Yoskaldyr Пользователь

    Регистрация:
    27.09.10
    Сообщения:
    1 921
    Симпатии:
    1 163
    Версия XF:
    1.0.4
    События load_class_image - нет в XenForo. Вы создали событие в админке, но ведь его никто не запускает в коде.
    Большинство классов (модели, контроллеры и т.п.) создаются через XenForo_Application::resolveDynamicClass, где и запускаются load_class_* события. В случае же с image создается через обычный new, поэтому и нет никаких событий.

    Как вариант с помощью этого хака можно динамически отнаследовать практически любой класс.
     
    Oleg-2012 нравится это.
  3. Василий Рожков

    Василий Рожков Новичок

    Регистрация:
    24.04.13
    Сообщения:
    10
    Симпатии:
    0
    Версия XF:
    1.1.3
    Спасибо, пробую разобраться с хаком. Сомневаюсь что мне достаточно знаний чтобы понять все.
    Поправьте если где-то я допускаю ошибку. Пропишу как я понял по шагам. Задача та же: расширить Xenforo_Image_Gd:
    Установил Хак, прописал в config.php WHM_Core_Autoloader::getProxy();

    в своем листенере пишу
    public static function initListeners(WHM_Core_Listener $events) {
    $events->addExtenders(
    array(
    'proxy_class' => array(
    'XenForo_Image_Gd' => array(
    'Vinavb_CustomNode_Icon_Xenforo_Image_Gd'
    )
    )
    )
    );

    затем создать обработчик события init_listeners
    Vinavb_CustomNodeIcon_Listener :: initListeners

    и class Vinavb_CustomNodeIcon_XenForo_Image_Gd extends XFCP_Vinavb_CustomNodeIcon_XenForo_Image_Gd
    должно работать? Видимо я что-то упускаю..
     
  4. Yoskaldyr

    Yoskaldyr Пользователь

    Регистрация:
    27.09.10
    Сообщения:
    1 921
    Симпатии:
    1 163
    Версия XF:
    1.0.4
    по идее именно так и все должно работать. Но надо понимать как расширяется класс и какое у него в результате имя. Это для того чтобы нормально работали все static методы. Дебаг режим хорошо показывает какие классы подгрузились.
     
  5. Василий Рожков

    Василий Рожков Новичок

    Регистрация:
    24.04.13
    Сообщения:
    10
    Симпатии:
    0
    Версия XF:
    1.1.3
    Посмотрел в дебаг режиме. Если в качестве расширяемого класса указывать Xenforo_Link то все работает и я вижу подгружаемые классы:
    internal_data\proxy_classes\XenForo_Link__136794856.php
    library\Vinavb\CustomNodeIcon\Xenforo\Image\Gd.php
    Но если указывать XenForo_Image_Gd - то классы не загружаются.
     
  6. Yoskaldyr

    Yoskaldyr Пользователь

    Регистрация:
    27.09.10
    Сообщения:
    1 921
    Симпатии:
    1 163
    Версия XF:
    1.0.4
    Проверяете на какой странице? Просто насколько я знаю этот класс используется только при загрузке файлов и довольно проблематично увидеть его в дебаге, т.к. страницы его использующие, это обычно post-запросы и дебаг их не посмотреть.
     
  7. Василий Рожков

    Василий Рожков Новичок

    Регистрация:
    24.04.13
    Сообщения:
    10
    Симпатии:
    0
    Версия XF:
    1.1.3
    Проверяю на странице редактирования раздела, потому что именно там должна проходить работа моего плагина.
    Но мой то класс library\Vinavb\CustomNodeIcon\Xenforo\Image\Gd.php должен загружаться.
    и если наследовать его от XenForo_Image_Gd, то должно загрузиться что-то наподобие как я понял:

    internal_data\proxy_classes\XenForo_Image_Gd__136794856.php --- добавлено : Aug 1, 2013 6:51 AM ---
    или он будет подгружаться только когда загружен XenForo_Image_Gd ?

    Да проверил, когда загружаешь изображение он все-таки создает
    internal_data\proxy_classes\XenForo_Image_Gd__1374662107.php
    Но мне то нужно чтобы он всегда загружался
    --- добавлено : Aug 1, 2013 7:09 AM ---
    Добавил строчку в коде с вызовом функции из XenForo_Image_Gd - теперь он постоянно будет подгружаться и все работает. Конечно заплатка и не красиво, но пока что пойдет. Спасибо за помощь. думаю хак в будущем мне еще пригодиться
     

Поделиться этой страницей