2017-01-20 4 views
0

J'ai créé un composant Joomla MVC personnalisé qui garde une trace des informations de kilométrage de voiture. Une partie importante de ceci est d'archiver les informations de kilométrage anciennes par voiture et de les afficher à un utilisateur connecté. Ce que j'essaie de faire est d '"archiver" les anciennes informations de kilométrage dans une autre table de ma base de données lorsque le kilométrage est mis à jour. Maintenant, je ne sais pas exactement comment remplacer la fonction save() par défaut, mais je voulais commencer avec une fonction de barre d'outils personnalisée qui est capable d'écrire l'enregistrement dans une table. Simple et simple. Voilà ce que je l'ai fait jusqu'à présent:Joomla MVC Component - Fonction de sauvegarde personnalisée pour un seul enregistrement

J'ai ajouté un nouveau bouton ma barre d'outils en administrator/components/com_cars/vues/voiture/view.html.php

JToolBarHelper::custom('car.archive', 'archive.png', 'archive_f2.png', 'Archive Mileage', false); 

Puis j'ai ajouté l'archive de fonction à "administrateur/components/com_cars/controllers/car"

L'ajout d'une simple déclaration d'écho confirme que le bouton fonctionne. Cependant, la prochaine chose dont j'ai besoin est que les informations de l'enregistrement actif (c'est-à-dire l'enregistrement qui a été ouvert à partir de la liste) sont écrites dans la nouvelle table lorsque le bouton "Archiver le kilométrage" est cliqué. Donc, fondamentalement, je fais une duplication de l'enregistrement qui est sélectionné, mais en l'enregistrant dans une autre table. Je dois donc de modifier la programmation si une autre table est utilisée pour mettre cherche actuellement les données Voici comment mon fichier contrôleur pour « voiture » (pas de voitures).

class CarsControllerCar extends JControllerForm 
{ 
/** 
* Constructor 
* 
* @throws Exception 
*/ 
public function __construct() 
{ 
    $this->view_list = 'cars'; 
    parent::__construct(); 
} 
public function archive() 
{ 

    // Get the input 
    $input = JFactory::getApplication()->input; 
    $ids = $this->input->get('cid', array(), 'array'); 

    try 
    { 
     if (empty($ids)) 
     { 
      throw new Exception(JText::_('COM_CARS_NO_ELEMENT_SELECTED')); 
     } 

     ArrayHelper::toInteger($ids); 
     $model = $this->getModel(); 
     $model->archive($ids); 
     $this->setMessage(Jtext::_('COM_CARS_ITEMS_SUCCESS_DUPLICATED')); 
    } 
    catch (Exception $e) 
    { 
     JFactory::getApplication()->enqueueMessage($e->getMessage(), 'warning'); 
    } 

    $this->setRedirect('index.php?option=com_cars&view=cars'); 

} 

} 

Cela devrait alors passer la données au modèle qui l'insère dans la bonne table. Comment construire le modèle de la meilleure façon possible pour recevoir et traiter les données n'est plus tout à fait clair. Puis-je simplement utiliser une requête de base de données pour l'ajouter à la base de données ou dois-je utiliser du code en fonction de la fonction dupliquée pour faire le travail?

Il est un peu flou pour moi comment obtenir les données de cet enregistrement particulier dans le contrôleur, puis le transmettre au modèle pour le traiter dans la base de données.

Répondre

0

d'abord tout ce que vous devez changer

JToolBarHelper::custom('car.archive', 'archive.png', 'archive_f2.png', 'Archive Mileage', false); 

Pour

JToolBarHelper::custom('car.archive', 'archive.png', 'archive_f2.png', 'Archive Mileage', true); 

Le dernier paremeter vous permet de choisir les éléments de la liste, puis dans votre contrôleur, vous devriez être en mesure d'obtenir id d'éléments de

$ids = $this->input->get('cid', array(), 'array'); 

Modifier

Pour id de l'élément de cliquage à l'intérieur page article, juste obtenir id param de l'entrée:

$this->input->get('id', null, 'int'); 

Explications

Tous les travaux bouton de barre d'outils de la même manière, cliquer dessus Mettez l'acton dans le champ "action" de la forme de joomla et postez-le, ainsi quand vous montrez une page d'article c'est toujours d'une action de poteau.

+0

Je comprends ce que vous dites mais je n'aurai pas à sélectionner une valeur dans la liste car je suis dans le formulaire d'édition de l'article. Donc, je ne fais rien sur l'aperçu de la liste des records, j'ai déjà fait la sélection. – Badger

+0

ok, voir mon edit;) – Yoleth

+0

Je ne suis pas capable de faire fonctionner cela.Dans ma console, je peux voir que l'application attend un élément sélectionné. Comme je suis sur la page de l'article elle-même, cela ne devrait pas être un problème et le dossier actuel devrait être pris. L'utilisation de "false" dans mon instruction action ignore l'erreur mais redirige vers l'endroit où le contrôleur pointe et affiche un message d'erreur indiquant qu'aucun enregistrement n'a été sélectionné. Je vais éditer ma question un peu plus en détail afin que vous sachiez ce que j'essaie d'accomplir – Badger