web-dev-qa-db-fra.com

Comment savoir si JTable-> save () insère ou met à jour un enregistrement?

J'ai un composant Joomla 3 personnalisé qui permet de créer des utilisateurs dans l'interface et d'ajouter des champs à une autre table. Maintenant, je dois un peu changer cette procédure: je dois envoyer un email au nouvel utilisateur avec son nom d'utilisateur et son mot de passe lorsqu'il est enregistré.

En théorie, c'est vraiment trivial. Dans mon modèle, je devrais mettre à jour la fonction save () et, après la sauvegarde, j'envoie le courrier électronique. Et c'est correct. Mais le problème est le suivant: comment savoir que je crée un nouvel utilisateur et non une mise à jour et ancien utilisateur? J'ai consulté la documentation de Joomla3, mais je ne sais pas comment faire cela ...

Pouvez-vous m'aider s'il vous plaît?

1
mHouses

J'ai essayé toutes les méthodes possibles et l'option la plus sûre consiste à ajouter un répartiteur avant les fonctions de sauvegarde, puis à le détacher.

Implémentez la fonction de sauvegarde de cette manière dans votre modèle:

public function save ($data)
{
    $dispatcher = JDispatcher::getInstance();
    $eventHandler = new EventHandler($dispatcher, $this);

    $return = parent::save($data);

    $dispatcher->detach($eventHandler);

    return $return;
}

Ajoutez la classe suivante à votre modèle:

class EventHandler extends JEvent
{

    private $model = null;

    public function __construct (&$subject, $model)
    {
        parent::__construct($subject);

        $this->model = $model;
    }

    public function onContentBeforeSave ($context, $event, $isNew)
    {}

    public function onContentAfterSave ($context, $event, $isNew)
    {
        if ($context != 'com_dpcalendar.event' && $context != 'com_dpcalendar.form')
        {
            return;
        }

        if ($isNew)
        {
            // send mail
        }
    }

    public function onContentBeforeDelete ($context, $event)
    {}

    public function onContentAfterDelete ($context, $event)
    {}

    public function onContentChangeState ($context, $pks, $value)
    {}
}

Je sais que cela ressemble à une grosse surcharge mais cela vous fera économiser.

4
Laoneo

Si votre modèle est hérité de la classe JModelAdmin, vous pouvez rechercher un nouvel enregistrement comme suit:

$isNew = $this->getState($this->getName() . '.new');

Sinon, vous devriez vérifier les données que vous enregistrez - que la clé primaire soit définie ou non. Voir cette partie du code de JModelAdmin class.

3
Dmitry Rekun