XF 2.1 Расширение абстрактного класса

Версия XenForo
2.1.x

ArtiOnMoon

Проверенные
Сообщения
64
Реакции
36
Баллы
715
Здравствуйте. Недавно спрашивал про валидатор и все же пришел к тому, что написал расширение для дополнительного поля типа Url. Однако, захотелось вынести эту штуку в отдельный тип поля. Полез в БД и нашёл столбец "match_type" - то что надо! Решил расширить допустимые значения точно так же как сделал с display_group, то есть так.

Попытка изменения столбца.
PHP:
public function installStep2()
    {
        $this->schemaManager()->alterTable('xf_user_field', function(Alter $table)
        {
            $table->changeColumn('match_type')->addValues('mylink');
        });
    }

PHP:
<?php

namespace ArtiOnMoon\Charlist;

use XF\AddOn\AbstractSetup;
use XF\AddOn\StepRunnerInstallTrait;
use XF\AddOn\StepRunnerUninstallTrait;
use XF\AddOn\StepRunnerUpgradeTrait;

use XF\Db\Schema\Alter;
use XF\Db\Schema\Create;

class Setup extends AbstractSetup
{
    use StepRunnerInstallTrait;
    use StepRunnerUpgradeTrait;
    use StepRunnerUninstallTrait;

public function installStep1()
    {
        $this->schemaManager()->alterTable('xf_user_field', function(Alter $table)
        {
            $table->changeColumn('display_group')->addValues('my_new_display_group');
        });
    }

  public function installStep2()
    {
        $this->schemaManager()->alterTable('xf_user_field', function(Alter $table)
        {
            $table->changeColumn('match_type')->addValues('mylink');
        });
    }
  

    public function uninstallStep1()
    {
        $db = \XF::db();
        $db->query("UPDATE `xf_user_field` SET `display_group` = 'personal' WHERE `display_group` = 'my_new_display_group'");

        $this->schemaManager()->alterTable('xf_user_field', function(Alter $table)
        {
            $table->changeColumn('display_group')->removeValues('my_new_display_group');
        });
    }
    public function uninstallStep2()
    {
        $db = \XF::db();
        $db->query("UPDATE `xf_user_field` SET `match_type` = 'url' WHERE `match_type` = 'mylink'");

        $this->schemaManager()->alterTable('xf_user_field', function(Alter $table)
        {
            $table->changeColumn('match_type')->removeValues('mylink');
        });
    }

}

Однако при установке получил ошибку.
In Column.php line 202:
xf_user_field: Cannot add values to a column when existing values are not loaded/do not apply

PHP:
            'match_type' => ['type' => self::STR, 'default' => 'none',
                'allowedValues' => ['none', 'number', 'alphanumeric', 'email', 'url', 'color', 'date', 'regex', 'callback', 'validator'],
                'api' => true
            ],

Как это исправить? И почему так получилось? ?
 
Последнее редактирование:
Хосподи, что? Зачем?

Ну валидатор просто запрещает людям вводить левые ссылки в кастомные поля. Сделано это, для того чтобы исключить фишинг и вредоносные ссылки.
Ну а выводить отдельным чекбоксом, во-первых, для практики. Во-вторых, после меня забилженным аддоном будут пользоваться люди, которые вообще слабо разбирается во всем этом и разбираться не будут. Поэтому моя задача сделать аддон простым в использовании для юзверя. Не думаю, что ручной ввод названия валидатора кому-то понравится.
 
Последнее редактирование:
Окей, если верить этому выражению если значение которое я пытаюсь добавить не является массивом, то мне выкидывает эту ошибку, НО ровно тем же путём я добавлял переменую "my_new_display_group" в display_group, которая так же не является массивом. В чем фишка?
 
ArtiOnMoon, конструкция $this вам о чём-то говорит?
Это ссылка на объект который мы вызываем. Окей, ясно. Допустим это не array, но как тогда записать это в БД? Какой метод использовать?

Отвечая на UPD. Я потом собирался свести методы. Просто в данный момент времени удобнее работать так.


PHP:
public function installStep2()
    {
        $this->schemaManager()->alterTable('xf_user_field', function(Alter $table)
        {
            $table->changeColumn('match_type')->addValues(['mylink']);
        });
    }
Это увы или к счастью не работает. Ошибка та же.
 
Это ссылка на объект который мы вызываем. Окей, ясно. Допустим это не array, но как тогда записать это в БД? Какой метод использовать?

Отвечая на UPD. Я потом собирался свести методы. Просто в данный момент времени удобнее работать так.



Это увы или к счастью не работает. Ошибка та же.
Вы прежде чем таблицу трогать, посмотрели бы на её столбцы. match_type далеко не enum, в отличии от display_group, а просто varbinary
1579376262718.png
 
Если не ошибаюсь, то там через репозиторий + через событие app_setup добавить значение в контейнер...
Как репозиторий и событие связаны с ошибкой в установщике при изменении в базе данных?
Разве что имелось в виду не расширять класс(кстати, надеюсь ТС расширяет не AbstractField, а UserField), а просто всунуть туда дополнительную колонку, однако при чем тут репозиторий всё равно непонятно
 
Современный облачный хостинг провайдер | Aéza
Назад
Сверху Снизу