it-swarm.com.de

Modell / Ansicht, die Daten von externen APIs abruft

Ich habe ein Modell, das Daten von zwei externen APIs abruft, die zurückgegebenen Arrays verkettet, und eine Ansichtsvorlage, die sie anzeigt. Ich habe eine Unteransicht, die nur eine der APIs benötigt.

Meine Frage lautet also:
Was initiiert eigentlich die Modellanforderung an die API?
Das view.html.php oder das view templates?

Wenn es sich um die Datei view.html.php handelt, ist keine zweite Modellmethode erforderlich, und ich kann die Anforderung einfach wiederverwenden.
Wenn die Ansichtsvorlage sie abruft, würde das Halbieren der API-Anforderungen die Anforderung beschleunigen.

models/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

Sie können es tatsächlich so oder so tun, je nachdem, welche Methode Sie bevorzugen. Die Art und Weise, wie Sie derzeit die Funktionen in der Datei view.html.php aufrufen, ist weit verbreitet. Sie können diese Funktionen jedoch auch in Ihrem Layout aufrufen (Unteransicht?), Indem Sie das Modell auf dieser Seite einfügen.

Layout 1

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

Layout 2

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

Stellen Sie einfach sicher, dass ViewName der Name Ihrer aktuellen Ansicht und ComponentNameModel der Name Ihrer Komponente gefolgt von Model ist

Beispiel: Komponente com_users

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

(Login ist der Name der Ansicht und Users ist der Name der Komponente)

$prices = $model->getPrices();

Zur Verdeutlichung kann der Modellname ein beliebiges Modell sein, das Sie in die Vorlagendatei aufnehmen möchten. Er muss nicht der Name des Modells der aktuellen Ansicht sein. Wenn Sie sowohl ein "allgemeines" Modell als auch Ihr normales Ansichtsmodell einbeziehen möchten, können Sie beide einbeziehen. Ich benutze diese Methode häufig bei meiner Komponentenentwicklung. Ich halte die allgemeinen Aufgaben (Textformatierung usw.) in einem allgemeinen Modell und beziehe dies in mein Ansichtsmodell ein.

4
Terry Carter