web-dev-qa-db-fra.com

Modèle / Vue extrayant des données à partir d'API externe

J'ai un modèle qui extrait les données de deux API externes, concaténant les tableaux renvoyés, et un modèle de vue qui l'affiche. J'ai une sous-vue qui n'aura besoin que de l'une des API.

Voici donc ma question:
Qu'est-ce qui lance réellement la demande de modèle à l'API?
Le view.html.php, ou le voir les modèles?

S'il s'agit du fichier view.html.php, une seconde méthode de modèle n'est pas nécessaire et je peux simplement réutiliser la demande.
Si le modèle de vue le extrait, le fait de couper les demandes d'API en deux accélérera la demande.

modèles/domains.php

public function getPrices() {
        $dispatcher = JEventDispatcher::getInstance();
        $prices = $dispatcher->trigger('getData', 'products/customer-price.json');
        $cats = $dispatcher->trigger('getData', 'products/category-keys-mapping.json');

        $result = array();
        $result[]['product'] = $cats[0];
        $result[]['prices'] = $prices[0];

        if (isset($cats[0]['status'])) {
            JError::raiseError(400, $cats[0]['ERROR']);
            return false;
        } else {
            if (!isset($this->prices)) {
                $this->prices = $result;
            }
            return $this->prices;
        }
    }

    public function getTlds() {
        $dispatcher = JEventDispatcher::getInstance();
        $cats = $dispatcher->trigger('getData', 'products/category-keys-mapping.json');
        $dispatcher->trigger('end');

        $result = array();
        $result[]['product'] = $cats[0];

        if (isset($cats[0]['status'])) {
            JError::raiseError(400, $cats[0]['ERROR']);
            return false;
        } else {
            if (!isset($this->tlds)) {
                $this->tlds= $result;
            }
            return $this->tlds;
        }
    }

views/domains/view.html.php

function display($tpl = null) {
    // Assign data to the view
    $this->prices = $this->get('prices');
    $this->tlds = $this->get('tlds');

    // Check for errors.
    if (count($errors = $this->get('Errors'))) {
        JLog::add(implode('<br />', $errors), JLog::WARNING, 'jerror');
        return false;
    }

    // Display the view
    parent::display($tpl);
}
2
James Shaver

Vous pouvez réellement le faire dans les deux sens, selon la méthode que vous préférez. La façon dont vous appelez actuellement les fonctions dans le fichier view.html.php est assez courante, mais vous pouvez également appeler ces fonctions à partir de votre présentation (vue secondaire?) En incluant le modèle sur cette page.

Disposition 1

$model = JModelLegacy::getInstance('ViewName','ComponentNameModel');
$prices = $model->getPrices();

Disposition 2

$model = JModelLegacy::getInstance('ViewName','ComponentNameModel');
$ids = $model->getIds();

Assurez-vous simplement que ViewName est le nom de votre vue actuelle et ComponentNameModel est le nom de votre composant, suivi de Model

Exemple: composant com_users

$model = JModelLegacy::getInstance('Login','UsersModel');

(Login est le nom de la vue et Users est le nom du composant)

$prices = $model->getPrices();

Pour plus de précisions, le nom du modèle peut être le modèle que vous souhaitez inclure dans le fichier de modèle, mais il ne doit pas nécessairement s'agir du nom du modèle de la vue actuelle. Si vous souhaitez inclure un modèle "commun" ainsi que votre modèle de vue normal, vous pouvez inclure les deux. J'utilise beaucoup cette méthode avec le développement de mes composants. Je conserve les tâches courantes (mise en forme du texte, etc.) dans un modèle commun et l'inclut dans mon modèle de vue.

4
Terry Carter