web-dev-qa-db-fra.com

Charger une vue administrateur unique avec plusieurs tables et formulaires

Nous avons deux tables contenant des données et nous devons importer les données des deux tables et les afficher dans une seule vue.

Nous avons un seul fichier XML qui contient les champs des deux tables.

La fonction 'getForm' dans le modèle est capable de charger tous les champs à partir de XML et de charger les éléments HTML du formulaire.

Le problème est que la fonction 'getItem' ne peut importer que des données d'une table et non de l'autre. Je pense que puisque la fonction 'getTable' est liée à la première table, elle n’apporte que les données de la première table.

Comment pouvons-nous charger des données de la deuxième table dans getItem?

2
Malaiselvan

Dans votre classe de modèle, vous souhaitez remplacer la méthode getItem de la manière suivante:

public function getItem() {
    $item = parent::getItem();

    $item->second_table = $this->getSecondTable($item->second_table_foreign_key);
    $item->third_table = $this->getThirdTable($item->third_table_foreign_key);
    return $item;
}

La clé ici est que vous appelez toujours la classe parent getItem car beaucoup de choses se passent en arrière-plan, en particulier si vous avez un type de cache activé. Maintenant, même si vous n'avez pas de vue, vous devez configurer un modèle et une classe de table pour la table secondaire. De cette façon, vous pouvez facilement charger les données pertinentes à partir de vos méthodes d'assistance:

private function getSecondTable($id) {
    $model = JModelLegacy::getInstance('SecondTable','MyComponentModel');
    $table = $model->getTable('SecondTable', 'MyComponentTable');
    return $table->load($id);
}

Il est important que vos noms de champs de définition XML de formulaire correspondent toujours aux noms de colonne réels des deuxième et troisième tables. Enfin, vous devrez faire l'inverse pour l'événement de sauvegarde. Encore une fois, vous allez surcharger la méthode de sauvegarde dans le modèle:

public function save($data) {
    $this->saveSecondTableData($data);
    $this->saveThirdTableData($data);
    parent::save($data);
}

Vous pouvez utiliser la classe table à nouveau dans vos méthodes d'assistance pour enregistrer:

private function saveSecondTableData($data) {
    $model = ModelLegacy::getInstance('SecondTable','MyComponentModel');
    $table = $model->getTable('SecondTable', 'MyComponentTable');
    $table->bind($data);
    $table->store();
    parent::save($data);
}

C’est un exemple extrêmement simple, il ya beaucoup de diligence raisonnable que j’ai laissée de côté; telles que la vérification d'erreur, la validation de formulaire côté serveur, la liaison de table, le chargement et le stockage d'événements et l'affichage d'alertes, etc.

En outre, cela suppose que vous souhaitiez enregistrer toutes les modifications apportées aux données de la table auxiliaire dans la base de données. Si tout ce que vous voulez, c'est afficher les données qu'une jointure à gauche dans la méthode de modèle getListQuery () devrait résoudre immédiatement.

Cependant, le concept de base pour connecter plusieurs tables à une seule vue est là.

4
Brian Bolli