Дело вот в чем, я галочку в первом поле не ставил, она ставится сама. При этом, если убрать все галочки с 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", а значение value возвращается в виде строки, собственно, нужно просто получать value, не совпадающий со строкой "1".
Я об этом баге и на старом форуме писал и на новом. Пока никаких изменений нет.
Дело в том, что, в качестве value нельзя передавать числовые значения.
Если превратить их в строки, то все работает нормально. Напримсер "id1". Потом вырезаем буквы и остаются необходимые значения.
Это принуждение к костылированию. Надеюсь когда-то это исправят.
А кстати.
У меня для вашего случая есть отдельный контрол (возможно, вам придется его переименовать, т.к. у меня обычно свой экшен для настроек и контролы я вручную регистрирую, а для штатного экшена настроек нужно другое именование метода чтоб контрол автоматом регистрировался)
У вас в итоге в настройках получается массив [цифровой_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; }Окей, но мне это явно не пригодится, нет смысла подстраивать свой плагин под "забагованность" платформы.
Бтв, в одной версии вебасиста это исправили втихаря, то есть нигде не написали, что оно пофикшено. Так что щас проблемы нет