Wir können PHP-Skripte erstellen, die außerhalb von Magento ausgeführt werden. Verwenden Sie auch Magento-Funktionen, indem Sie das folgende Codefragment verwenden.
define('ROOT', '');
$mage_php_url = ROOT.'app/Mage.php';
if (!empty($mage_php_url) && file_exists($mage_php_url) && !is_dir($mage_php_url))
{
// Include Magento's Mage.php file.
require_once ( $mage_php_url );
umask(0);
Mage::app();
}
In solchen Skripten können wir Modelle, Blöcke, Helfer usw. direkt aufrufen. Aber wie können wir hier eine Controller-Aktion aufrufen? Anregungen werden geschätzt.
magento-1.7
controllers
Sukeshini
quelle
quelle
Antworten:
Magento ist nicht wirklich entwickelt , um dies zu tun, das heißt , Sie können Controller - Objekte wie jedes andere Objekt verwenden, aber es wird Komplikationen sein. Da diese Methoden aus einem HTTP-Kontext aufgerufen werden sollen, tun sie sehr oft Dinge mit den Anforderungs- und Antwortobjekten oder stützen sich auf einen Sitzungsstatus, der einfach nicht vorhanden ist, wenn Sie Dinge über den Befehl ausführen Linie.
Das heißt, das Folgende wird funktionieren
quelle
must be an instance
.Hier ist ein Weg, dies zu tun:
file_get_contents('http://url.com/[...]/controller/action/');
Erledigt! :) :)
Oder Sie können die Anforderung überschreiben (es scheint also, dass sich die Anforderung auf diese Aktion bezieht) und dann einfach aufrufen
Mage::run()
.Im Ernst, hängt viel davon ab, was Sie tatsächlich in dieser Aktion tun. Benötigen Sie Magento instanziiert, benötigen Sie den gesamten Anforderungsfluss und so weiter?
Wenn Sie den Anforderungsfluss usw. nicht benötigen, können Sie Folgendes tun:
Wenn Sie mehr brauchen, können Sie mit dem Graben beginnen, indem Sie sich die
Mage::run()
Funktion ansehen. Ein weiterer guter Ausgangspunkt istapi.php
, wo Sie sehen können, wie Sie eine leichtgewichtige Version von Magento instanziieren. Folgen Sie dann einfach dem Anforderungsablauf.Betrachten Sie Alans Kommentar: Wenn Ihr Controller eine Instanz von ist
Mage_Core_Controller_Varien_Action
(und Ihre Magento-Controller sollten es sein), müssen Sie ein Anforderungsobjekt und ein Antwortobjekt an den Konstruktor senden:quelle