web-dev-qa-db-fra.com

Type de champ personnalisé J3.3 - enregistrement

J'essaie de créer mon propre type de champ et cela fonctionne bien jusqu'à présent, mais les valeurs ne sont pas enregistrées dans la base de données, où dois-je procéder? Je sais qu'il y a une question similaire mais je ne suis pas satisfait de la réponse.

#__items
#__tags
#__item_tags

J'interroge uniquement les balises pour obtenir les options, puis la table d'intersection pour obtenir celles sélectionnées, l'identifiant de l'article étant déjà connu. Ma classe hérite de JFormFieldList pour obtenir la fonctionnalité getInput. J'utilise ce champ à l'intérieur d'un formulaire XML pour le définir pour la vue.

<?php
defined('_JEXEC') or die;

JFormHelper::loadFieldClass('list');

class JFormFieldMyTag extends JFormFieldList
{
    protected $type = 'MyTags';

    protected function getOptions()
    {
        $db = JFactory::getDbo();

        $query = $db->getQuery(true);
        $query->select('all tags')->from('tags');
        $db->setQuery($query);
        $rows = $db->loadObjectList();
        $this->value = $this->getSelected(); // The input function takes this as an array of the selected values
        return $rows;
    }

    protected function getSelected()
    {
        $db = JFactory::getDbo();

        $query = $db->getQuery(true);
        $query  ->select('only the selected ones')->from('intersection')->where('id' = $this->getAttribute('id');
        $db->setQuery($query);
        $rows = $db->loadObjectList();
        return $rows;
    }
}

Ce dont j'ai besoin, c'est d'un moyen de supprimer et d'ajouter des entrées à la table des intersections, joomla ne semble pas le faire automatiquement et je ne trouve rien dans la documentation.

1
Vic

Bien sûr, CMS ne connaît pas votre table d'intersection (dans votre cas, il s'agit de #__item_tags). Lorsque vous enregistrez un élément, seul le CMS met à jour la table #__items Correspondante.

Vous devez en outre appeler la méthode pour enregistrer vos balises. Le meilleur endroit pour cela est la méthode save() de votre modèle. Je ne vois pas tout le code de votre composant, mais cela devrait ressembler à ceci:

public function save($data)
{
    // Try to save the item
    if (!parent::save($data))
    {
        return false;
    }

    // The item is saved, lets save the tags
    if (!$this->saveTags($data))
    {
        return false;
    }

    return true;
}

Ou vous pouvez utiliser la méthode postSaveHook() du contrôleur pour exécuter votre méthode saveTags(). Voir l'exemple dans CategoriesControllerCategory .

1
Dmitry Rekun