Dies ist der Inhalt meiner .../template/exportdb/attributes.phtml
Datei:
<span id = "attributes">Generate</span>
<script type="text/javascript">
jQuery(function () {
jQuery("#attributes").click(function(){
jQuery.ajax({
url: "<?php echo $this->getUrl('adminhtml/attributes/ajax'); ?>"
}).done(function() {
alert("Hey");
});
});
});
</script>
Dies ist meine Controller-Datei:
<?php
class Attin_Exportdb_Adminhtml_AttributesController extends Mage_Adminhtml_Controller_Action{
public function IndexAction() {
$this->loadLayout();
$this->getLayout()->getBlock("head")->setTitle($this->__("Export Attributes"));
//$this->getLayout()->createBlock('exportdb/adminhtml_attributes');
//$this->getLayout()->getBlock("exportdb/adminhtml_attributes");
$block = $this->getLayout()->createBlock('Mage_Core_Block_Template','attributes_exp_db',array('template' => 'exportdb/attributes.phtml'));
$this->getLayout()->getBlock('content')->append($block);
$this->renderLayout();
}
public function AjaxAction(){
echo "ajax";
}
}
Dies ist der config.xml
Inhalt:
<?xml version="1.0"?>
<config>
<modules>
<Attin_Exportdb>
<version>0.1.0</version>
</Attin_Exportdb>
</modules>
<global>
<helpers>
<exportdb>
<class>Attin_Exportdb_Helper</class>
</exportdb>
</helpers>
<blocks>
<exportdb>
<class>Attin_Exportdb_Block</class>
</exportdb>
</blocks>
</global>
<admin>
<routers>
<adminhtml>
<args>
<modules>
<attin_exportdb before="Mage_Adminhtml">Attin_Exportdb_Adminhtml</attin_exportdb>
</modules>
</args>
</adminhtml>
</routers>
</admin>
</config>
Aber der Firebug zeigt mir den 404 , ich kann nicht Attibutes_ajaxAction
funktionieren. Warum?
Das Ergebnis:
Antworten:
Stattdessen
$this->getUrl()
können Sie es versuchenBitte beachten Sie, dass die Methode ist
Ajax
und nichtajax
. Dies liegt daran, dass Ihr Controller aus einer Methode bestehtAjaxAction()
und nichtajaxAction()
.Im Allgemeinen
Mage::getUrl('module/controller/method')
sieht das so aus. Die Felder sind hoffentlich selbsterklärend.Warum hat Ihr Code nicht funktioniert?
Dies liegt daran , Sie fordern
getUrl()
auf ,$this
die falsch ist.getUrl()
Funktion kommt reinMage
und es ist eine statische Funktion. Sie müssen diese Methode also so aufrufenMage::getUrl()
Seltsamerweise
Mage::getUrl()
funktioniert das nicht für dich. Ich werde den Grund untersuchen, wenn ich etwas Freizeit habe. Jetzt werde ich antworten, warum esMage::helper('adminhtml')->getUrl()
funktioniert hat.Mage::helper('adminhtml')
gibt die Admin-Hilfsklasse zurück. Insbesondere wird die Klasse zurückgegeben,Mage_Adminhtml_Helper_Data
die sich bei befindetapp/code/core/Mage/Adminhtml/Helper/Data.php
. Wenn Sie in diese Datei schauen, können Sie die Methode findengetUrl()
Sie können sehen, dass Magento im Admin-Bereich die Modellklasse verwendet
Mage_Adminhtml_Model_Url
, um die URL zu generieren. Dies ist der genaue Grund, warumMage::getUrl()
es in diesem Fall nicht funktioniert hat, vermute ich. Dies liegt daran, dass ModellklassenMage::getUrl()
verwendetMage_Core_Model_Url
werden, um die URL zu generieren, die meiner Meinung nach allgemein für die Generierung von Frontend-URLs verwendet wird.Der große Punkt ist also, dass Magento eine spezielle Modellklassenklasse
Mage_Adminhtml_Model_Url
für die Verarbeitung von Magento-Administrator-URLs verwendetquelle
Ihre Anfrage erreicht Ihren Controller nicht, weil Sie Ihre Controller-Ressource in Ihrem Controller definiert haben
config.xml
. Sie verwenden das Erstellen einer URL mit dem Aufruf:Sie haben Ihren Controller jedoch definiert mit:
Das Problem liegt in der Tatsache, dass Sie keinen neuen Controller mit a deklariert haben
frontName
, sondern diebefore
Syntax verwendet haben, um Magento anzuweisen, nach einer Controller-Übereinstimmung in Ihrem Modul zu suchen, bevor Sie zu zurückkehrenMage_Adminhtml
. Dies ist eine gute Möglichkeit, Dinge für den Administrator zu tun. Damit dies funktioniert, müssen Sie das Admin-Modul in Ihrer Anfrage als Ziel festlegen, nicht Ihr eigenes. Dies löst die Logik aus, Ihr Modul zuerst auf Übereinstimmung zu prüfen und dann auf zurückzukehrenMage_Adminhtml
.Wenn Sie also die URL generieren, müssen Sie Folgendes verwenden:
Dies zielt auf das Admin-Modul, Ihren Attribut-Controller und die Ajax-Aktion in diesem Controller ab. Bei Verwendung der Hilfsmethode adminhtml
getUrl()
wird der erforderliche Schlüssel in die generierte URL aufgenommen (andernfalls wird eine Anfrage an den Administrator abgelehnt).Durch die Nutzung:
Sie hätten Ihren eigenen Controller löschen müssen, anstatt
before
einen frontName zu verwenden und festzulegen, der dem folgenden in Ihrem ähnlich istconfig.xml
:quelle
$this->getUrl()
nicht auf eine benutzerdefinierte Blockmethode abzielen, die wiederum die Hilfsmethode adminhtml aufruft, müssengetUrl()
Sie diese Methode aus der Vorlage aufrufen, da sie den erforderlichen Schlüssel zur URL hinzufügt.Initiiere js in any.phtml Datei!
Schreiben Sie die Controller-App / den Code / local / Package / Module / controller / IndexController.php
quelle