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


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


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>

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 !";
            }
        }

    }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.