web-dev-qa-db-fra.com

Composant MVC Tableau de données JForm en conversion de chaîne avant save ()

J'ai un formulaire d'administrateur avec un champ de formulaire multisélect. Cliquer sur save consiste à passer ceci sous forme de tableau et je voudrais convertir ces valeurs de tableau en chaîne délimitée par des virgules avant de sauvegarder dans la base de données. Pour être honnête, je ne sais pas comment accéder à cette propriété à partir de la méthode save () de mon contrôleur afin de réaliser la conversion de tableau en chaîne.

form data i want to access and modify

Jusqu'ici, je me suis retrouvé avec une page complètement bancaire ou un message d'erreur:

Erreur d'enregistrement a échoué avec l'erreur suivante:

Aucune erreur répertoriée. Je ne peux que supposer que c'est parce que je passe un tableau à un champ de base de données qui attend une chaîne.

C'est ce que j'ai maintenant. C'est sans doute très loin de la vérité. Je suis sur le point de prendre des photos dans le noir, dans l'espoir d'avoir de la chance.

edit: ok donc ceci effectue la conversion de tableau en chaîne mais ne semble pas définir la valeur avant de le soumettre à la base de données. toujours pas tout à fait là mais se rapprocher, je pense.

function save($key = null, $urlVar = null) {
    // get database and query objects
    $db = JFactory::getDBO();
    $query = $db->getQuery(true);

    // get submitted form data
    $data = JFactory::getApplication();
    $array = $data->input->post->getArray();

    echo "<pre>";
    print_r($array);
    echo "</pre>";

    // Convert Instructor(s) field to an array after being fetched from the database
    if (is_array($array['jform']['instructors'])){
        $instructors = implode(',', $array['jform']['instructors']);
    }
    unset($array['jform']['instructors']);
    $array['jform']['instructors'] = $instructors;
    echo $array['jform']['instructors'];
    // run the parent's save function
    parent::save($key = null, $urlVar = null);
}
3
dustaMaphone

Dans MVC, le contrôleur est chargé d'extraire les données de la demande et de les transmettre au modèle.

Au moment où vous manipulez les données de la demande dans votre méthode de sauvegarde écrasée, vous appelez ensuite la méthode de sauvegarde parent (qui récupérera de nouvelles données de demande).

Un meilleur endroit pour votre modification serait le modèle. Il existe également une méthode de sauvegarde (appelée automatiquement par le contrôleur, vous pouvez donc supprimer votre méthode de sauvegarde de de votre contrôleur ).

Dans votre classe de modèle, vous pouvez mettre ce code:

public function save($data)
{
    if (is_array($data['instructors']))
    {
        $data['instructors'] = implode(',', $data['instructors']);
    }

    return parent::save($data);
}

Si vos données proviennent d'un champ à sélection multiple, vous souhaiterez peut-être reconvertir la chaîne en tableau lorsque vous modifierez un élément. Le meilleur endroit pour cela est la méthode loadFormData ():

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

    if (empty($data))
    {
        $data = $this->getItem();
        $data->instructors = explode(',', $data->instructors);
    }

    return $data;
}
3
fruppel