web-dev-qa-db-fra.com

Où utiliser JInput dans MVC

Je suis curieux de savoir où obtenir les données de JInput dans le modèle de conception MVC. Par exemple, dans une situation où j'ai besoin d'une valeur JInput à utiliser dans une requête dans une méthode de classe de modèle, dois-je obtenir la valeur JInput ou dois-je la passer de la vue ou ça compte?

6
doovers

Dans une structure MVC appropriée, seul votre contrôleur devrait interface avec vos données de demande, dans ce cas JInput, et les dépendances injectées dans la vue et le modèle lorsqu’il est instancié dans le contrôleur.

Avec la structure actuelle du CMS, les trois éléments de la structure MVC s'interfacent souvent avec les données de la demande. Dans les modèles, cela se fait généralement dans la méthode populateState() et les vues sont plus souvent dans les fichiers de disposition qu'elles chargent que dans la classe réelle.

11
Michael

Je suis fermement convaincu qu'il devrait être récupéré le cas échéant.

C’est-à-dire que vous devriez toujours utiliser JInput sinon vous dupliquez des données et vous enfreignez potentiellement DRY .

Une classe view devrait récupérer des données pour renseigner les modèles de view (/tmpl fichiers) ou layouts du model, n'injectant pas de valeurs dans le model. Après tout, view concerne la présentation des données et l'interface utilisateur, et non la manipulation des données ou le traitement des actions de l'utilisateur.

2
Craig

JInput n'offre pas une telle fonctionnalité; vous devrez donc peut-être utiliser $ _POST.

si vous pouvez avoir l'entrée sous la forme d'un tableau (et utilisez JInput :: getArray ())

ou

un objet encodé en json (vous utilisez json_decode (JInput :: getString ()))

http://developer.joomla.org/manual/chap-Joomla_Platform_Manual-Input.html

http://docs.joomla.org/Retrieving_request_data_using_JInput

1
kumarramalingam

J'utilise généralement JInput dans le contrôleur pour acheminer la demande, puis la passe au modèle via un objet de registre.

Dans l’idéal, vous transmettriez les données de la demande au contrôleur à partir de la logique de votre routeur, afin de faciliter l’ID dans vos contrôleurs, mais ... au moins de cette façon, les dépendances de la demande sont injectées dans le modèle et je n’ai pas besoin d’avoir accès à JInput pour le tester.

Une fois que j'ai les données dans le modèle, je peux les utiliser pour définir l'état du modèle, puis le contrôleur injecte ce modèle dans la vue avec toutes les données nécessaires pour répondre aux demandes de données d'affichage déjà chargées dans ses propriétés.

1
Joomsavvy

Bien que déjà répondu, je vais essayer d'expliquer dans ma perspective sur.

Joomla! est une implémentation vraiment géniale et flexible de MVC.

A propos de votre problème de remplissage d'une vue avec les données de Modèle , en fonction sur les données soumises par l’utilisateur via $ _GET. Voici comment je le fais.

La première chose que je voudrais dire, c’est qu’outre les modèles, vues et contrôleurs courants, il existe une autre catégorie de fichiers largement utilisés dans Joomla !, ce sont les mini-contrôleurs. Oui vous avez bien lu.

Ce sont les fichiers directement dans le dossier de vue.

En voici quelques uns.

view.html.php
view.raw.php
view.pdf.php

En plus de servir à générer différents types de sortie, ils servent également de contrôleur (d'une certaine manière).

Ainsi, dans des cas comme le vôtre, il n'est pas nécessaire d'impliquer des contrôleurs pour obtenir les données du modèle. Tout ce que vous avez à faire est d’obtenir les données soumises à l’aide de jinput sanitize et de les transmettre sous forme d’objet ou de tableau ou simplement de variable simple au modèle.

Voici un exemple:

view.html.php
<?php
//-- No direct access
defined('_JEXEC') || die('=;)');

class compoViewDashboard extends JViewLegacy {
    public function display($tpl = null) {
        if (JRequest::getVar('layout') == 'somelayout') {
            $jinput = JFactory::getApplication()->input;
            $data = $jinput->post->get('xyz', 'null', 'INT');

            /* If you are calling method from other(different) model you can use the following one line else you can skip it. */
            $this->setModel(JModelLegacy::getInstance('syllabus', 'compoModel'));
            $model = $this->getModel('syllabus');
            $this->courses= $model->getcourses($data);
        }
        parent::display($tpl);
    }
}

C'est ça.

Disclaimer: - N'oubliez pas qu'il s'agit de ma propre implémentation et que ce n'est peut-être pas le moyen idéal. Vous devez donc le faire approuver par les professionnels avant d'utiliser l'un de mes codes dans l'environnement de production.

Remarque: - Je sais que JRequest est obsolète, mais il doit rester conforme à Joomla! équipe de base, puisque le noyau l’utilise aussi partout.

1
Mohd Abdul Mujib