Joomla 1.7 множественный список SQL предварительно не выбран при редактировании - PullRequest
2 голосов
/ 05 января 2012

В моем пользовательском компоненте joomla я использовал тип поля SQL (item.xml):

    <field name="colors" type="sql" query="SELECT id ,name FROM #__products_colors" multiple="multiple" key_field="id" value_field="name" class="inputbox"
         label="colors" description="COM_PRODUCTS_FORM_DESC_ITEM_COLORS" /> 

На мой взгляд, я называю это поле следующим образом:

<?php echo $this->form->getInput('colors'); ?>

Что даетмне приятный и плавный выбор, например:

<select id="jform_colors" class="inputbox" multiple="multiple" name="jform[colors][]" aria-invalid="false">
<option value="1">blue</option>
<option value="2">yellow</option>
<option value="3">red</option>
<option value="4">green</option>
<option value="5">purple</option>

Когда я сохраняю это поле цветов, после выбора синего и красного, например, оно сохраняется как 1,3 в моей базе данных.Joomla делает всю работу за меня ... (СПАСИБО Joomla)

Теперь, возможно, я становлюсь жадным, но каким-то образом я ожидаю, что Joomla предварительно выберет эти значения для меня, когда я редактирую запись после сохранения.Это происходит с любым другим типом поля, так почему бы и нет?Есть ли что-то, что я забыл?

Спасибо в adv!

edit: функция привязки в ответе, я немного ее подправил.

    public function bind($array, $ignore = '') {
    if (isset($array['params']) && is_array($array['params'])) {
        $registry = new JRegistry();
        $registry->loadArray($array['params']);
        $array['params'] = (string) $registry;
    }
    //print_r($array);
    if (key_exists('colors', $array) && is_array($array['colors'])) {
        echo "pwn";
        $array['colors'] = implode(',', $array['colors']);
    }

    if (isset($array['metadata']) && is_array($array['metadata'])) {
        $registry = new JRegistry();
        $registry->loadArray($array['metadata']);
        $array['metadata'] = (string) $registry;
    }
    return parent::bind($array, $ignore);
}

И НЕ использовать фильтр= "safehtml":)

Удачи всем!

Ответы [ 2 ]

5 голосов
/ 11 января 2012

Если вы следуете стандартам Joomla, в вашей модели должен быть метод loadFormData. Там вы можете быть уверены, что поле извлекается в массив при извлечении из базы данных, например:

<?php
protected function loadFormData()
{
    // Check the session for previously entered form data.
    $data = JFactory::getApplication()->getUserState('com_yourcomponent.edit.item.data', array());

    if (empty($data)) {
        $data = $this->getItem();
    }

    // THIS IS WHAT YOU MUST BE MISSING
    if (is_array($data) && !is_array($data['colors'])){
        $data['colors'] = explode(',',$data['colors']);
    } elseif (is_object($data) && !is_array($data->colors)) {
        $data->colors = explode(',',$data->colors);
    }

    return $data;
}
?>

Вам также потребуется переопределить ваш метод связывания в классе таблицы:

<?php
public function bind($src, $ignore = array())
{
    if (parent::bind($src, $ignore) && is_array($this->colors)){
        $this->colors = implode(',', $this->colors);
    }
}
0 голосов
/ 17 января 2012

Мои данные хранились немного иначе, как {"0": "3841", "1": "3889"}, поэтому правильный код для преобразования -

$ data-> postcode = (массив) json_decode ($ data-> postcode);

Спасибо за ваше решение, очень полезно.

...