Создание собственного аддона

RamonRa

Участники
Сообщения
8
Реакции
1
Баллы
60
Вопрос по написанию своего аддона.

Решил попробовать себя в написании аддонов для xenForo 2. Для начала взялся просто сделать аддон, который бы увеличивал максимальное количество символов в названии узла. На поприще интернета нашел только , который это делает. Сделал все по их , создал свой установочник, изменил БД, нашел нужный мне класс в ядре, от которого нужно экстендится. В общем в итоге все заработало. Но возник вопрос, правильно ли я это реализовал, т.к. нутром чую, что возможно нужно делать иначе.

В файлах своего аддона я создал структуру, как и было описано в офф. документации 1603862361417.png
А в коде я экстедился от этого класса, и скопировал ВЕСЬ код нужной мне функции, буквально только поменяв одну цифру ('maxLength' => 50 на 150). Вот кусок кода
Код:
class Node extends XFCP_Node
{
    public static function getStructure(Structure $structure)
    {
        $structure->table = 'xf_node';
        $structure->shortName = 'XF:Node';
        $structure->primaryKey = 'node_id';
        $structure->contentType = 'node';
        $structure->columns = [
            'node_id' => ['type' => self::UINT, 'autoIncrement' => true, 'nullable' => true],
            'title' => ['type' => self::STR, 'maxLength' => 150,
.........................

Собственно вопрос - после обновления xenForo основной класс ведь может поменяться. Мне теперь после каждого обновления нужно копировать эту функцию себе, меняя только одну цифру? Это правильно? Возможно нужно было как-то по другому сделать столь незначительное изменение?

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

первая тема на форуме, если создал не в том разделе - извиняюсь и прошу модеров переместить. Принимаю любую конструктивную критику, спасибо.
 
Покопавшись с кодом нашел ответ - нет, весь код функции 100% не нужно копипастить, а нужно только сначала выполнить функцию родительского класса:
$structure = parent::getStructure($structure);

Затем переопределить нужные параметры
$structure->columns['title']['maxLength'] = 150;

И вернуть обновленный объект:
return $structure;

В итоге код выглядит так:
PHP:
namespace Demo\TestAddon\XF\Entity;

use XF\Mvc\Entity\Structure;

class Node extends XFCP_Node
{
    public static function getStructure(Structure $structure)
    {
        $structure = parent::getStructure($structure);
        $structure->columns['title']['maxLength'] = 150;

        return $structure;
    }
}

Тему можно закрывать, но может кому-нибудь когда-нибудь пригодится.
 
Нужно понять как это работает, а не копипастить и в тупую что-то менять.
Первый вариант с копипастом в корне не корректен, ибо может ломать сторонние плагины, которые так же работают со структурой.
Ну и структуру сущности можно и лучше менять слушая эвент entity_structure.
 
Ну и структуру сущности можно и лучше менять слушая эвент entity_structure.
Если не трудно, не могли бы объяснить, чем прослушивание эвента лучше аддона? Написание отдельного аддона была в документации, поэтому и делал через него.
 
RamonRa, вопрос некорректен. Эвент листенер привязывается к дополнению. В разделе с написанием плагина-примера как раз таки обработчик и используется.
 
RamonRa, вопрос некорректен. Эвент листенер привязывается к дополнению. В разделе с написанием плагина-примера как раз таки обработчик и используется.
Спасибо большое за дельные советы (лайк поставить не могу, видимо репутации еще мало). Удалил свое расширение класса и переделал на Event Listener, как Вы и посоветовали.
 
Современный облачный хостинг провайдер | Aéza
Назад
Сверху Снизу