Множественият SQL списък на Joomla 1.7 не е предварително избран при редактиране

В моя потребителски компонент на 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!

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

    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);
}

И НЕ използвайте filter="safehtml" :)

Успех на всички!


person Hans Wassink    schedule 05.01.2012    source източник
comment
Можете ли да покажете php кода, откъдето получавате формуляра?   -  person Gaurav    schedule 09.01.2012
comment
Ами да, по-голямата част от него е там ‹?php echo $this-›form-›getInput('colors'); ?› заобиколен от формуляр така :‹form action=‹?php echo JRoute::_('index.php?option=com_products&layout=edit&id=' . (int) $this-›item-›id); ?› method=post name=adminForm id=item-form class=form-validate› ‹/form›   -  person Hans Wassink    schedule 10.01.2012
comment
Можеш ли кода на модула? как получаваш обект на формуляр?   -  person Gaurav    schedule 10.01.2012
comment
Точно там в предишния ми коментар: ‹form action=‹?php echo JRoute::_('index.php?option=com_products&layout=edit&id=' . (int) $this-›item-›id); ?› method=post name=adminForm id=item-form class=form-validate› Няма form-›create или нещо подобно   -  person Hans Wassink    schedule 10.01.2012


Отговори (2)


Ако следвате стандартите на 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);
    }
}
person guilleva    schedule 11.01.2012
comment
Гилева!! Моят герой.. Всъщност се занимавах с това, но това беше преди да използвам SQL полето за данни. Само една редакция: getItem() получава обект: не масив! така че заменете $data['colors'] с $data->colors. Bounty е вашият начин! - person Hans Wassink; 11.01.2012
comment
Благодаря, Ханс, мисля, че $data е обект, когато се извлича от базата данни, например когато елементът е отворен за редактиране, но е и масив, когато потребителят изпрати формуляра и има грешка с данните и формулярът се показва отново с подадените данни. Така че актуализирах отговора, за да се справя и с двата случая. - person guilleva; 11.01.2012
comment
btw: преди известно време моето магическо множество sql поле автоматично записваше данни като 1,3,4, когато маркирах тези опции... Но сега вече не. Премахнах filter=safehtml от sql полето xml и то спря да работи. Когато върнах този елемент обратно, той отново започна да съхранява нещо, но съхраняваше „Масив“. Не мисля, че съм променил много други неща, така че сега си мисля, че може би никога не е запазил 1,3,4, но може би сам съм го написал в db. Въпросът ми към вас @guilleva трябва ли да записва 1,3,4 автоматично или има някъде функция savemydata(), където първо трябва да разширя своя масив? - person Hans Wassink; 12.01.2012
comment
Актуализирах отговора с инструкции как можете да го запишете като низ. - person guilleva; 12.01.2012
comment
Гуилева! Благодаря, човече... Трябваше сам да разбера тези неща, но фактът, че рамката прави толкова много за мен, ме направи мързелив :D - person Hans Wassink; 12.01.2012
comment
Между другото Гуилева, какво става само със спасяването на задника ми... Върви и се захващай с още проблеми тук! :) - person Hans Wassink; 13.01.2012
comment
Вие, господине, заслужавате медал! Не можах да разбера защо данните не се съхраняват в продължение на добър час, докато не прочетох публикацията ви за презаписване на метода за свързване. - person Adam B; 09.10.2013

Данните ми бяха съхранени малко по-различно като {"0":"3841","1":"3889"}, така че правилният код за преобразуването е

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

Благодаря ви за решението, много полезно.

person Umbobabo    schedule 17.01.2012
comment
Ами това е само защото вашите данни са били съхранени като JSON във вашия конкретен компонент. Това не е особено уместно в случая, но благодаря за допълнението :) - person Hans Wassink; 18.01.2012