XF 2.1 Прокинуть значение опции в ячейку массива с определенным ключом

Версия XenForo
2.1.x

ArtiOnMoon

Проверенные
Сообщения
63
Реакции
36
Баллы
715
Добрый день. Я совсем туплю уже несколько часов и не понимаю как мне правильно связать опцию созданную в админ панели и php файл.
В моем коде перечень опций задан следующим образом.

Мой код
PHP:
protected $options = [
        'allowed_schemes' => ['http', 'https'],
        'require_authority' => true,
        'allow_empty' => false,
        'allowed_site' => []
    ];


Моя задача передать в ячейку с ключом allowed_site значения из ACP. В админ панели создана соответствующая группа настроек и настройка с типом str.
В документации я прочитал, что опции задаются следующим образом:
$perPage = $this->options()->demoPortalFeaturedPerPage;
Однако, этот код мне не совсем подходит. Тогда я нашёл у наследуемого класса следующую функцию:

Код из класса родителя
PHP:
    public function setOption($key, $value)
    {
        if (!array_key_exists($key, $this->options))
        {
            throw new \InvalidArgumentException("Unknown option $key in " . get_class($this));
        }

        $this->options[$key] = $value;
    }

И решил её применить, однако из-за моих весьма поверхностных знаний я видимо где-то ошибся. Вопрос в том как правильно прокинуть значения из ACP в php файл?


Мой код
PHP:
    public function setOption($key, $value) {
        $options = parent::setOption($key, $value);
            $key = allowed_site;
            $value = $this->options()->allowedsite;
            $this->options[$key] = $value;
            return $options;
    }
 
А теперь покажите, какие опции вы имеете в виду. Из всего вашего поста мало что понятного можно выдернуть


В документации я прочитал, что опции задаются следующим образом:
Не задаются, а считываются


правильно связать опцию созданную в админ панели и php файл
Может покажете параметры опции и свой файл?
 
  • Мне нравится
Реакции: Hope
Листинг чуть поменялся, но все остается по прежнему

Вот место в ACP, откуда опция должна задаватся.


Вот листинг.
PHP:
<?php

namespace ArtiOnMoon\Charlist\XF\Validator;

use XF\Validator\AbstractValidator;

    class Mylink extends AbstractValidator
    
    {        
        protected $options = [
        'allowed_schemes' => ['http', 'https'],
        'require_authority' => true,
        'allow_empty' => false,
        'allowed_site' => []
    ];
    
    public function setOption($key, $value) {
        $options = parent::setOption($key, $value);
            $key = allowed_site;
            $value = $this->options()->allowedsite;
            $this->options[$key] = $value;
            return $options;
    }    
    
        public function isValid($value, &$errorKey = null)
    {
        
        if ($this->options['allow_empty'] && $value === '')
        {
            return true;
        }

        // romanize and deaccent to allow all accented chars to be considered valid
        $value = utf8_romanize(utf8_deaccent($value));

        if (!preg_match('#
            ^
            (?P<scheme>[a-z][a-z0-9+.-]*)
            :
            (?P<authority>//
                (?:
                    (?P<userinfo>[a-z0-9\-._~!$&\'()*+,;=:%]+)
                    @
                )?
                (?P<host>[a-z0-9\-.]+)
                (?:
                    :
                    (?P<port>[0-9]+)
                )?
            )?
            (?P<path>
                /[^?\#]*
            )?
            (?:
                \?
                (?P<query>[^\#]*)
            )?
            (?:
                \#
                (?P<fragment>.*)
            )?
            $
        #ix', $value, $match))
        {
            $errorKey = 'invalid';
            return false;
        }

        $scheme = strtolower($match['scheme']);
        if ($this->options['allowed_schemes'] && !in_array($scheme, $this->options['allowed_schemes']))
        {
            $errorKey = 'disallowed_scheme';
            return false;
        }
        
        
        $site = strtolower($match['host']);
            if ($this->options['allowed_site'] && !in_array($site, $this->options['allowed_site'])) {
                $errorKey = 'disallowed_site';
                return false;
            }

        if ($this->options['require_authority'] && empty($match['authority']))
        {
            $errorKey = 'no_authority';
            return false;
        }

        return true;
    }

    public function coerceValue($value)
    {
        if ($value === 'http://')
        {
            $value = '';
        }
        else if (substr(strtolower($value), 0, 4) == 'www.')
        {
            $value = 'http://' . $value;
        }

        return $value;
    }
}
 
Последнее редактирование:
  • Мне нравится
Реакции: Hope
Я вас попросил параметры показать, а вы кидаете код валидатора который к опциям вообще никак не относится


Извините, скрин не загрузился. Надеюсь правильно вас понял. Это просто строка1234.PNG
 
Последнее редактирование:
  • Мне нравится
Реакции: Hope
Загрузился он. Кнопку Edit нажмите. Или вы вообще опции создавали каким-то непонятным образом и не ознакомились с параметрами и функционалом?

Просто строка.
1579532802903.png
 
А, я вас неправильно понял. Ну так заходите в родительский класс и смотрите как работает конструктор
1579533206269.png
Есть прекрасный метод setupOptionDefaults(). Его и используем, и получаем что-то типа такого

PHP:
    protected $options = [
        'allowed_schemes'   => ['http', 'https'],
        'require_authority' => true,
        'allow_empty'       => false,
        'allowed_site'      => []
    ];

    protected function setupOptionDefaults()
    {
        $this->options['allowed_site'] = $this->app->options()->allowed_site;
    }
 
А, я вас неправильно понял. Ну так заходите в родительский класс и смотрите как работает конструктор
Посмотреть вложение 112074
Есть прекрасный метод setupOptionDefaults(). Его и используем, и получаем что-то типа такого

PHP:
    protected $options = [
        'allowed_schemes'   => ['http', 'https'],
        'require_authority' => true,
        'allow_empty'       => false,
        'allowed_site'      => []
    ];

    protected function setupOptionDefaults()
    {
        $this->options['allowed_site'] = $this->app->options()->allowed_site;
    }


Вот оно что. Я был близок в последних своих хождениях. Мне не хватило этого многозначительного app. Без него функция options() была не декларирована в php-сценарии. Спасибо
 
Современный облачный хостинг провайдер | Aéza
Назад
Сверху Снизу