2 votes

La liste de SQL multiples de Joomla 1.7 n'est pas présélectionnée lors de la modification.

Dans mon composant personnalisé joomla j'ai utilisé le type de champ 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" /> 

De mon point de vue, j'appelle le champ comme ceci :

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

Ce qui me donne une jolie boîte de sélection comme celle-ci :

<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>

Lorsque j'enregistre ce champ de couleurs, après avoir sélectionné le bleu et le rouge par exemple, il est enregistré comme 1,3 dans ma base de données. Joomla fait tout le travail pour moi... (MERCI Joomla)

Je suis peut-être trop gourmand, mais je m'attends à ce que Joomla présélectionne ces valeurs pour moi lorsque je modifie une entrée après l'avoir enregistrée. Il le fait avec tous les autres types de champs, alors pourquoi pas ici ? Y a-t-il quelque chose que j'oublie ?

Merci en avance !

edit : la fonction bind dans la réponse, je l'ai un peu modifiée.

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

Et N'UTILISEZ PAS de filtre="safehtml" :)

Bonne chance à tous !

5voto

guilleva Points 546

Si vous suivez les normes de Joomla, vous devriez avoir une méthode appelée "loadFormData" dans votre modèle. Vous pouvez ainsi être sûr que le champ est converti en tableau lorsqu'il est récupéré dans la base de données, par exemple :

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

Vous devrez également remplacer votre méthode bind dans votre classe de table :

<?php
public function bind($src, $ignore = array())
{
    if (parent::bind($src, $ignore) && is_array($this->colors)){
        $this->colors = implode(',', $this->colors);
    }
}

0voto

Umbobabo Points 1

Mes données étaient stockées un peu différemment comme {"0" : "3841", "1" : "3889"} donc le bon code pour la conversion est

$data->postcode = (array)json_decode($data->postcode) ;

Merci pour votre solution, très utile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X