Wie rufe ich eine Controller-Funktion in Ajax auf?

7

Dies ist der Inhalt meiner .../template/exportdb/attributes.phtmlDatei:

<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.xmlInhalt:

<?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_ajaxActionfunktionieren. Warum?

Das Ergebnis: Ergebnis

Attila Naghi
quelle
Was passiert, wenn Sie direkt auf die URL zugreifen? Ich meine über den Browser. Ich bin mir nicht sicher über das _ in der URL, versuche den Namen der Funktion in ajacAction zu ändern und rufe es im Browser auf, um zu sehen, was passiert.
Mbalparda
seltsam, aber es gibt mir die Homepage von Magento, außerdem habe ich den Namen von Attributes_ajaxAction in AjaxAction
Attila Naghi
Sie rufen einen Admin-Controller vom Frontend aus auf. Es ist ein erwartetes Verhalten. Sehen Sie sich die Vererbung Ihrer Controller-Klasse an.
Mbalparda
Auch wenn ich die Ajax-URL wie folgt verwende: URL: '<? Php echo $ this-> getUrl ("adminhtml / attribute / ajax")?>' In Firebug bei HTML gibt es mir die Homepage
Attila Naghi
Ich verstehe nicht wirklich, was Sie vorgeschlagen haben, können Sie genauer? vielen Dank !
Attila Naghi

Antworten:

6

Stattdessen $this->getUrl()können Sie es versuchen

 Mage::getUrl('adminhtml/attributes/Ajax');

Bitte beachten Sie, dass die Methode ist Ajaxund nicht ajax. Dies liegt daran, dass Ihr Controller aus einer Methode besteht AjaxAction()und nicht ajaxAction().

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 , $thisdie falsch ist. getUrl()Funktion kommt rein Mageund 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 es Mage::helper('adminhtml')->getUrl()funktioniert hat.

Mage::helper('adminhtml')gibt die Admin-Hilfsklasse zurück. Insbesondere wird die Klasse zurückgegeben, Mage_Adminhtml_Helper_Datadie sich bei befindet app/code/core/Mage/Adminhtml/Helper/Data.php. Wenn Sie in diese Datei schauen, können Sie die Methode findengetUrl()

public static function getUrl($route='', $params=array())
{
    return Mage::getModel('adminhtml/url')->getUrl($route, $params);
}

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, warum Mage::getUrl()es in diesem Fall nicht funktioniert hat, vermute ich. Dies liegt daran, dass Modellklassen Mage::getUrl()verwendet Mage_Core_Model_Urlwerden, 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_Urlfür die Verarbeitung von Magento-Administrator-URLs verwendet

Rajeev K Tomy
quelle
Ich benutze dies: <? Php echo Mage :: helper ('adminhtml') -> getUrl ('adminhtml / attribute / ajax'); ?> und es funktioniert, mit Ajax nicht Ajax. Warum ?
Attila Naghi
und wenn ich den Hilfsteil nicht benutze, bekomme ich das Ergebnis (siehe das Bild in meinem Beitrag). Kannst du auch erklären warum? Ich bin total verwirrt :)
Attila Naghi
Versuchen Sie Mage :: getUrl () und lassen Sie mich das Ergebnis wissen
Rajeev K Tomy
Ich habe es auch so versucht: Mage :: getUrl ('adminhtml / attribute / Ajax'); und ich bekomme das Ergebnis aus dem Bild
Attila Naghi
Die einzige Möglichkeit für mich ist die Verwendung von Mage :: helper ('adminhtml') ... aber frag mich nicht warum
Attila Naghi
5

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:

$this->getUrl('attributes/attibutes_ajax'); // also a typo here, missing 'r', underscore should also be '/'

Sie haben Ihren Controller jedoch definiert mit:

<attin_exportdb before="Mage_Adminhtml">Attin_Exportdb_Adminhtml</attin_exportdb>

Das Problem liegt in der Tatsache, dass Sie keinen neuen Controller mit a deklariert haben frontName, sondern die beforeSyntax verwendet haben, um Magento anzuweisen, nach einer Controller-Übereinstimmung in Ihrem Modul zu suchen, bevor Sie zu zurückkehren Mage_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ückzukehren Mage_Adminhtml.

Wenn Sie also die URL generieren, müssen Sie Folgendes verwenden:

Mage::helper('adminhtml')->getUrl('adminhtml/attributes/ajax');

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:

Mage::helper('adminhtml')->getUrl('attributes/attributes/ajax');

Sie hätten Ihren eigenen Controller löschen müssen, anstatt beforeeinen frontName zu verwenden und festzulegen, der dem folgenden in Ihrem ähnlich ist config.xml:

<?xml version="1.0"?>
<config>
    ....
    <admin>
        <routers>
            <exportdb>
                <use>admin</use>
                <args>
                    <module>Attin_Exportdb</module>
                    <frontName>attributes</frontName>
                </args>
            </exportdb>
        </routers>
    </admin>
    ....
</config>
Jonathan Hussey
quelle
Ich habe $ this-> getUrl ('adminhtml / attribute / ajax'); verwendet. Bitte sehen Sie das Ergebnis im Bild von meinem Beitrag.
Attila Naghi
Ich verstehe nicht warum, aber diese URL: "<? Php echo Mage :: helper ('adminhtml') -> getUrl ('adminhtml / attribute / ajax');?>" Funktioniert für mich, können Sie mir erklären Bitte ?
Attila Naghi
Frontend- und Backend-URLs werden völlig unterschiedlich behandelt. Für Backend-URLs muss praktisch immer ein Schlüssel zur URL hinzugefügt werden, um die Anforderung zu validieren. Andernfalls wird sie nicht weitergeleitet. Wenn Sie $this->getUrl()nicht auf eine benutzerdefinierte Blockmethode abzielen, die wiederum die Hilfsmethode adminhtml aufruft, müssen getUrl()Sie diese Methode aus der Vorlage aufrufen, da sie den erforderlichen Schlüssel zur URL hinzufügt.
Jonathan Hussey
5

Initiiere js in any.phtml Datei!

jQuery.ajax({
    url: "/package/module/index/getdata"
    type: "POST",
    data: {key: 'value'},
    success: function(response){
        console.log(response);
    }
});

Schreiben Sie die Controller-App / den Code / local / Package / Module / controller / IndexController.php

    Package_Module_IndexContoller extends Mage_Core_Controller_Front_Action{
        public function getdataAction(){
            if($data = $this->getRequest()->getPost("key")){
                echo "data received !";
            }else{
                echo "unable to receive data !";
            }
        }

    }
Kishor Parida
quelle