XF 2.3 Модификация файла .php для увеличения рейтинга с 5 до 10 звезд.

Версия XenForo
2.3

nond

Проверенные
Сообщения
263
Реакции
109
Баллы
8,145
Стандартная система рейтинга заточена под 5 звезд.

Проверка на установку значения от 1 до 5 находится в .php файлах разных аддонов:

src\addons\XenAddons\AMS\Entity\ArticleRating.php
src\addons\XenAddons\Showcase\Entity\ItemRating.php
src\addons\XenAddons\UBS\Entity\BlogEntryRating.php
src\addons\XFMG\Entity\Rating.php
src\addons\XFRM\Entity\ResourceRating.php

Вся соль кроется в этой строке 'max' => 5
'rating' => ['type' => self::UINT, 'required' => true, 'min' => 1, 'max' => 5],

Естественно, при ручной замене в исходнике .php значения с 5 на 'max' => 10 дает результат, но:
'rating' => ['type' => self::UINT, 'required' => true, 'min' => 1, 'max' => 10],

В связи с этим возникает несколько проблем:

1. При обновлении плагина файл заменяется и прямые правки пропадают.
2. Инспектор файлов системы орёт красным цветом на "Неожиданное содержание" с указанием ссылок на эти файлы
3. Прямое редактирование .php - не комильфо.

Каким образом можно реализовать такие изменения в нескольких файлах?

Находится это в файлах в описаниях функции примерно так:
PHP:
public static function getStructure(Structure $structure)
    {
        $structure->table = 'xf_xa_ams_article_rating';
        $structure->shortName = 'XenAddons\AMS:ArticleRating';
        $structure->primaryKey = 'rating_id';
        $structure->contentType = 'ams_rating';
        $structure->columns = [
            'rating_id' => ['type' => self::UINT, 'autoIncrement' => true, 'nullable' => true],
            'article_id' => ['type' => self::UINT, 'required' => true],
            'user_id' => ['type' => self::UINT, 'required' => true],
            'username' => ['type' => self::STR, 'maxLength' => 50,
                'required' => 'please_enter_valid_name'
            ],
            'rating' => ['type' => self::UINT, 'required' => true, 'min' => 1, 'max' => 5],
            'title' => ['type' => self::STR, 'default' => '', 'maxLength' => 100],
            'rating_date' => ['type' => self::UINT, 'default' => \XF::$time],
            'rating_state' => ['type' => self::STR, 'default' => 'visible',
                'allowedValues' => ['visible', 'moderated', 'deleted']
            ],
            'is_review' => ['type' => self::BOOL, 'default' => false],
            'pros' => ['type' => self::STR, 'default' => ''],
            'cons' => ['type' => self::STR, 'default' => ''],
            'message' => ['type' => self::STR, 'default' => ''],
            'author_response_contributor_user_id' => ['type' => self::UINT, 'default' => 0],
            'author_response_contributor_username' => ['type' => self::STR, 'maxLength' => 50, 'default' => ''],
            'author_response' => ['type' => self::STR, 'default' => ''],
            'custom_fields' => ['type' => self::JSON_ARRAY, 'default' => []],
            'warning_id' => ['type' => self::UINT, 'default' => 0],
            'warning_message' => ['type' => self::STR, 'default' => '', 'maxLength' => 255],
            'is_anonymous' => ['type' => self::BOOL, 'default' => false],
            'attach_count' => ['type' => self::UINT, 'default' => 0],
            'last_edit_date' => ['type' => self::UINT, 'default' => 0],
            'last_edit_user_id' => ['type' => self::UINT, 'default' => 0],
            'edit_count' => ['type' => self::UINT, 'default' => 0],
            'ip_id' => ['type' => self::UINT, 'default' => 0],
            'embed_metadata' => ['type' => self::JSON_ARRAY, 'nullable' => true, 'default' => null]
        ];
 
Это всё прекрасно. Я обожаю короткие ответы людей связанных с программированием с предложением ссылок для изучения.
Понимаю, критический недостаток времени на ответ. Бывает.
А помимо предложения покурить мануалы, DEV и т.д. в кратце есть идеи, куда копать?
 
В создание плагина и расширение сущности через обработчики событий.
 
В создание плагина и расширение сущности через обработчики событий.
В одной из ранних тем было такое предложение от Mirovinger

И да, один момент не описали, в дополнении присутствует проверка, которая просто не даст установить больше, нужно модифицировать один файл.
src/addons/XFRM/Entity/ResourceRating.php

"не нужно модифицировать, а сделать оверрайд"

В связи с этим возникает вопрос:
Что подразумевается под "оверрайд"?
И если это рабочая тема, нет ли более простого решения для изменения .php, а конкретно значения проверки с 5 до 10 без написания плагина?
 
Нашел еще вариант ответа по возможному решению
Можно переопределить через плагин. В принципе процесс стандартен написанию любого другого плагина который что-то меняет в поведении движка, вот только учитывайте что расширением класса решить вопрос не получится и дополнение будет выглядеть как полное копирование существующей функции и внесение правок в нее. Соответственно если в будущих версиях движка авторы что-то поправят в функции - вам также придется править, иначе будет ломать движок. Но такое высокоуровневое обычно только на крупные релизы трогают.
 
Нужно создать обработчики события entity_structure для нужных сущностей и изменить параметры для нужного столбца. Примеры есть по ссылке выше.
 
Что подразумевается под "оверрайд"?
Перезапись существующего метода своим кодом. Так тоже можно сделать, но Atikin предлагает через обработчик событий

И если это рабочая тема, нет ли более простого решения для изменения .php, а конкретно значения проверки с 5 до 10 без написания плагина?
Нет. Плагин и есть решение, которое группирует всё то, что вы сделали. Плагин это база, а дальше плагин уже может быть или простым, или сложным

Нужно создать обработчики события entity_structure для нужных сущностей и изменить параметры для нужного столбца. Примеры есть по ссылке выше.
Прямо по ссылке вам дали пример, только вам нужно так сделать для, например, src\addons\XFRM\Entity\ResourceRating.php и столбца rating
PHP:
public static function resourceRatingEntityStructure(\XF\Mvc\Entity\Manager $em, \XF\Mvc\Entity\Structure &$structure)
{
    $structure->columns['rating'] = ['type' => self::UINT, 'required' => true, 'min' => 1, 'max' => 10, 'api' => true];
}
Только учитывайте, что указано в оригинальном файле. Параметры могут отличаться
 

Делать «хак» в исходниках — плохая идея​


  • обновление аддона перезапишет правки;
  • File health check («Инспектор файлов») будет ругаться;
  • код-стайл XenForo прямо запрещает редактировать чужие файлы.

В XenForo 2 для таких вещей предусмотрены расширения (class extension) и слушатели события entity_structure.
Мы создаём свой мини-аддон, который в момент построения структуры сущности меняет предел max с 5 на 10. Оригинальные файлы остаются нетронутыми, инспектор спокоен, а при апдейте аддонов наш патч применяется снова.




Шаг 1. Создаём каркас аддона​


bash
КопироватьРедактировать
php cmd.php xf-addon:create ratingTen
# отвечаем на вопросы мастера, получаем папку
# src/addons/RatingTen


(Можно и вручную, главное — чтобы получился addon.json и нужные директории.)




Шаг 2. Регистрируем слушатель entity_structure​


addon.json


jsonc
КопироватьРедактировать
{
"title": "10-Star Ratings",
"description": "Поднимает лимит рейтинга до 10 для AMS, Showcase, UBS, XFMG, XFRM",
"version_id": 1000010,
"version_string": "1.0.0",
"dev": "you",
"listeners": [
{
"event_id": "entity_structure",
"callback_class": "RatingTen\\Listener",
"callback_method": "entityStructure",
"execute_order": 10
}
]
}




Содержимое src/addons/RatingTen/Listener.php​


php
КопироватьРедактировать
<?php

namespace RatingTen;

use XF\Mvc\Entity\Structure;

class Listener
{
/**
* Срабатывает каждый раз, когда XF строит структуру сущности.
*
* @param Structure $structure Структура
* @param string $class Полное имя класса сущности
*/
public static function entityStructure(Structure &$structure, string $class): void
{
// Список нужных сущностей
static $targets = [
\XenAddons\AMS\Entity\ArticleRating::class,
\XenAddons\Showcase\Entity\ItemRating::class,
\XenAddons\UBS\Entity\BlogEntryRating::class,
\XFMG\Entity\Rating::class,
\XFRM\Entity\ResourceRating::class
];

if (!in_array($class, $targets, true))
{
return;
}

// Меняем ограничение поля rating
if (isset($structure->columns['rating']))
{
$structure->columns['rating']['max'] = 10;
}
}
}


  • Одного файла достаточно — он сработает для всех перечисленных сущностей.
  • При желании можно заменить слушатель пятью класс-расширениями — сути не меняет.



Шаг 3. Устанавливаем аддон​


bash
КопироватьРедактировать
php cmd.php xf-addon:install ratingTen


или через панель администратора.
 
  • Мне нравится
Реакции: nond
Современный облачный хостинг провайдер | Aéza
Назад
Сверху Снизу