+

Бриф на дизайн сайта.

Joomla select multiple insert in to db automatically

Программирование

Автор: admin

Делая кое-что в joomla 1.7, столкнулся с тем, что не записывается само по себе добавленное мною поле select multiple в неком компоненте (component) joomla. Казалось бы, если на сервер поступает число или строка, то скрипт который наследует класс JTable знает что с этим полем делать, а вот когда поступает массив, то не знает. Хотя по умолчанию могли бы сделать и обычный implode через запятую. Ну да ладно. Решение нашел в википедии, правда на англицком языке.

Поэтому и решил написать этот пост, так как на русском языке в поиске выпадет ноль.

Короче говоря нужно в классе который наследует JTable  дописать такую вот функцию

function bind( $array, $ignore = '' )
    {
        if (key_exists( 'field-name', $array ) && is_array( $array['field-name'] )) {
	        $array['field-name'] = implode( ',', $array['field-name'] );
        }
 
        return parent::bind( $array, $ignore );
    }

Ясное дело, что “field-name” необходимо поменять на название поля в базе данных, в которое и будет записана строка, в которой через запятую будут записаны значения выбранных опций в select multiple.

В комментариях поступил вопрос “еще бы как выделение сохранять multiple списка…)”. Отвечаю на своем примере :

<!--?php $fieldName=array(); if(strlen($this--->conf-&gt;fieldName)&gt;0){
$fieldName = explode(',', $this-&gt;conf-&gt;fieldName);
}
$query = "SELECT id, title FROM #__usergroups";
$db=JFactory::getDbo();
$db-&gt;setQuery($query);
$usergroups = $db-&gt;loadObjectList();
?&gt;
 
<select name="field-name[]" multiple="multiple"> <!--?php foreach ($usergroups AS $k =--> $v): ?&gt; <option value="&lt;?php echo $v-&gt;id; ?&gt;">id, $fieldName)) { echo "selected"; } ?&gt;&gt;<!--?php echo $v--->title; ?&gt;</option> <!--?php endforeach; ?--> </select>

В данном случае я делаю мульти выбор юзерских групп, их можно выбрать несколько.  Выделяются только те, которые есть в строке, которую мы достали из базы данных и превратили в массив с помощью функции explode . Переменную fieldName я сам придумал, вы можете использовать любое название.
Благодаря пользователю Brr нашлось решение для joomla 2.5, которое несколько отличается от предыдущих версий.
Далее идет цитата

В модели JModelAdmin, которая используется для создание формы в админке, есть определенный пустой метод prepareTable(), он вызывается перед занесением данных в бд, переопределяем его в своей модели:

protected function prepareTable(&$table) {
if(isset($table->field_name) && is_array($table->field_name)) $table->field_name=implode(,, $table->field_name);
}

этот метод возьмет массив выбранных элементов поля сохранит в виде строки через “,”.

Также, для обратного преобразования строки в массив при выводе в форме есть еще один предопределенный метод loadFormData(), унаследованный классом JModelAdmin от JModelForm, сам по себе он ничего не делает, его нужно переопределить в своем классе. Он выполняет загрузку данных по-умолчанию в поля формы, и тут же мы преобразуем строку в массив:

protected function loadFormData() {
 
$data=JFactory::getApplication()->getUserState('com_fteach.edit.workplan.data', array());
 
if(empty($data)) {
$data=$this->getItem();
}
 
if(isset($data->field_name) && !is_array($data->field_name)) $data->field_name=explode(',', $data->field_name);
 
return $data;
}

Вуаля, все работает:)

Спасибо за внимание.
Будут вопросы, отвечу в комментариях…

Комментарии:

Оставить комментарий

=