Ошибка в waHtmlControl или нет? Исправлено

1

Дело вот в чем, я галочку в первом поле не ставил, она ставится сама. При этом, если убрать все галочки с groupbox - все нормально, но вот если отметить что-нибудь другое, то самая первая все равно поставится.

Тестировал следующим способом (settings.php для плагина):

$plugin_model = new shopPluginModel();
$delivery_methods = $plugin_model->select("`id` as `value`, `name` as `title`, `id` as `description`")->where('`status` = 1')->fetchAll();

return array(
    'methods' => array(
        'control_type' => 'groupbox',
        'title' => 'Способы доставки',
        'options' => $delivery_methods,
        'description' => '<pre>' . print_r($this->getSettings('methods'), 1) . '</pre>'
    ),
);

А если я запишу содержимое options вручную, то все нормально, но массивы ничем не отличаются:

$delivery_methods = Array ( 
    Array ( 'value' => 1, 'title' => 'Курьер' ), 
    Array ( 'value' => 2, 'title' => 'Почта России' ),
    Array ( 'value' => 3, 'title' => 'EMS Почта России' )
);

При нажатии "Сохранить", передаются нужные отмеченные поля, но если заново открыть страницу настроек, то, опять же, первое поле становится отмеченным.

Из waHtmlControl меня настораживает только эти строки:

$checkbox_params['value'] = empty($option['value']) ? $option['value'] : 1;
$checkbox_params['checked'] = in_array($option['value'], $params['value'], true) || !empty($params['value'][$option['value']]);

4 комментария

  • +1
    Константин Шевский Константин Шевский 17 апреля 2016 09:15 #

    Проблема была в том, что отмеченные поля - строка "1", а значение value возвращается в виде строки, собственно, нужно просто получать value, не совпадающий со строкой "1".

  • +1
    ITFrogs ITFrogs 1 мая 2016 12:11 #

    Я об этом баге и на старом форуме писал и на новом. Пока никаких изменений нет.

    Дело в том, что, в качестве value нельзя передавать числовые значения.

    Если превратить их в строки, то все работает нормально. Напримсер "id1". Потом вырезаем буквы и остаются необходимые значения.

    Это принуждение к костылированию. Надеюсь когда-то это исправят.

  • +1
    Syrnik.com Syrnik.com 15 мая 2016 18:07 #

    А кстати.

    У меня для вашего случая есть отдельный контрол (возможно, вам придется его переименовать, т.к. у меня обычно свой экшен для настроек и контролы я вручную регистрирую, а для штатного экшена настроек нужно другое именование метода чтоб контрол автоматом регистрировался)

    У вас в итоге в настройках получается массив [цифровой_id]=>1. То есть в ключах массива будут нужные id. :)

    settings.php

    'ship_methods'      => array(
        'title'            => 'Методы доставки',
        'description'      => 'Выберите методы доставки',
        'control_type'     => 'AssocGroupbox',
        'value'            => array(),
        'options_callback' => array('shopMypluginPluginSettingsAction', 'deliveryMethodsOptions'),
    )
    

    контрол

    public function controlAssocGroupbox($name, $params = array())
    {
        $control = '';
        $options = isset($params['options']) ? (is_array($params['options']) ? $params['options'] : array($params['options'])) : array();
        if (!is_array($params['value'])) {
            $params['value'] = array();
        }
        waHtmlControl::addNamespace($params, $name);
        $wrappers = ifempty($params['options_wrapper'], array()) + array(
                'title_wrapper'       => ' %s',
                'description_wrapper' => '<span class="hint">%s</span>',
                'control_wrapper'     => '%2$s' . "\n" . '%1$s' . "\n" . '%3$s' . "\n",
                'control_separator'   => "<br>",
            );
        unset($params['options_wrapper']);
        $params = array_merge($params, $wrappers);
        $checkbox_params = $params;
        if (isset($params['options'])) {
            unset($checkbox_params['options']);
        }
        $id = 0;
        foreach ($options as $option) {
            //TODO check that $option is array
            $checkbox_params['value'] = empty($option['value']) ? $option['value'] : 1;
            $checkbox_params['checked'] = array_key_exists($option['value'], $params['value']) && $params['value'][$option['value']];
            $checkbox_params['title'] = empty($option['title']) ? null : $option['title'];
            $checkbox_params['description'] = ifempty($option['description']);
            $control .= waHtmlControl::getControl(waHtmlControl::CHECKBOX, $option['value'], $checkbox_params);
            if (++$id < count($options)) {
                $control .= $params['control_separator'];
            }
        }
        return $control;
    }
    

    Колбэк для опций shopMypluginPluginSettingsAction::deliveryMethodsOptions()


    public static function deliveryMethodsOptions()
    {
        $ShopPlugin = new shopPluginModel();
        $plugins = $ShopPlugin->listPlugins('shipping');
        $methods = array();
    
        foreach ($plugins as $plugin) {
            $methods[] = array('value' => $plugin['id'], 'title' => $plugin['name']);
        }
    
        return $methods;
    }
    


    • +2

      Окей, но мне это явно не пригодится, нет смысла подстраивать свой плагин под "забагованность" платформы.

      Бтв, в одной версии вебасиста это исправили втихаря, то есть нигде не написали, что оно пофикшено. Так что щас проблемы нет

      Добавление новых комментариев к этой теме отключено.