Ajaxでコントローラー関数を呼び出すにはどうすればよいですか?


7

これは私の.../template/exportdb/attributes.phtmlファイルの内容です:

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

これは私のコントローラーファイルです:

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

これはconfig.xml内容です:

<?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>

しかし、Firebugは404を表示しAttibutes_ajaxActionます。機能しません。どうして?

結果: 結果


URLに直接アクセスするとどうなりますか?つまり、ブラウザ経由です。URLの_がわからない場合は、関数の名前をajacActionに変更し、ブラウザで呼び出して何が起こるか確認してください。
mbalparda 2014

奇妙ですが、magentoのホームページが表示されます。また、AjaxActionのAttributes_ajaxActionから名前を変更しました
Attila

フロントエンドから管理コントローラーを呼び出しています。これは予想される動作です。コントローラークラスの継承を確認します。
mbalparda 2014

また、次のようなajax urlを使用すると、url: '<?php echo $ this-> getUrl( "adminhtml / attributes / ajax")?>'がHTMLのFirebugでホームページに表示されます
Attila Naghi

私はあなたが何を提案したか本当に理解していません。ありがとう !
Attila Naghi 2014

回答:


6

の代わりに$this->getUrl()、あなたは試すことができます

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

方法はAjaxありませんのでご了承くださいajax。これは、コントローラーがメソッドで構成されており、メソッドAjaxAction()ではないためajaxAction()です。

通常、これはMage::getUrl('module/controller/method')次のようになります。フィールドは自明です。

コードが機能しないのはなぜですか?

これはgetUrl()$thisどちらが間違っているかを要求しているためです。getUrl()関数は内部Mageにあり、静的関数です。だからあなたはこのようにそのメソッドを呼び出す必要がありますMage::getUrl()

それMage::getUrl()はあなたのために働いていません。暇があればその理由を調べます。今私はなぜMage::helper('adminhtml')->getUrl()働いたのか答えます。

Mage::helper('adminhtml')管理ヘルパークラスを返します。より具体的には、にあるクラスMage_Adminhtml_Helper_Dataを返しapp/code/core/Mage/Adminhtml/Helper/Data.phpます。このファイルを見ると、メソッドを見つけることができますgetUrl()

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

adminセクションの場合、magentoはMage_Adminhtml_Model_UrlURLを生成するためにモデルクラスを使用していることがわかります。これが、Mage::getUrl()このケースでうまくいかなかった正確な理由です。これは、あるMage::getUrl()用途Mage_Core_Model_Url私は、一般的にフロントエンドURL生成のために使用したと思われるURLを生成するためにモデルクラス、。

したがって、重要な点は、MagentoがMage_Adminhtml_Model_Urlmagento管理URLを処理するために特別なモデルクラスクラスを使用することです。


私はこれを使用しています:<?php echo Mage :: helper( 'adminhtml')-> getUrl( 'adminhtml / attributes / ajax'); ?>そして、それはajaxではなくajaxで動作しています。どうして ?
Attila Naghi 2014

ヘルパーパーツを使用していない場合は、結果を取得します(私の投稿の画像を参照してください)。理由も教えてください。私は完全に混乱しています:)
Attila Naghi 2014

Mage :: getUrl()を試して結果を知らせてください
Rajeev K Tomy

私も次のように試しました:Mage :: getUrl( 'adminhtml / attributes / Ajax'); 画像から結果を取得しています
Attila Naghi 2014

それは私の作品の唯一の方法は、メイジ::ヘルパー(「adminhtml」)を使用している...しかし、ドン; tは、なぜ私に尋ねる
アッティラNaghi

5

でコントローラーリソースを定義した方法が原因で、リクエストがコントローラーに到達していませんconfig.xml。あなたは呼び出しでURLを作成しています:

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

しかし、あなたはあなたのコントローラを以下で定義しました:

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

問題は、新しいコントローラーをで宣言しておらずfrontNamebefore構文を使用してMagentoにモジュール内のコントローラーの一致を検索してからに戻すことMage_Adminhtmlです。これは管理者向けの良い方法ですが、それを機能させるためには、自分自身ではなく、リクエストで管理モジュールをターゲットにする必要があります。これにより、最初にモジュールの一致をチェックするロジックがトリガーされ、次にに戻りMage_Adminhtmlます。

したがって、URLを生成するときは、以下を使用する必要があります。

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

これは、管理モジュール、属性コントローラー、およびそのコントローラー内のajaxアクションをターゲットにします。adminhtmlヘルパーgetUrl()メソッドを使用すると、生成されたURLに必要なキーが含まれます(それ以外の場合、管理者へのリクエストは拒否されます)。

を使用して:

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

before次のようにfrontName を使用して設定するのではなく、独自のコントローラーを削除する必要があったでしょう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>

$ this-> getUrl( 'adminhtml / attributes / ajax');を使用しました。私の投稿の画像で結果をご覧ください。
Attila Naghi 2014

理由はわかりませんが、「<?php echo Mage :: helper( 'adminhtml')-> getUrl( 'adminhtml / attributes / ajax');?>」が機能します。説明してください。お願いします ?
Attila Naghi 2014

フロントエンドとバックエンドのURLはまったく異なる方法で処理されます。バックエンドURLでは、リクエストを検証するために、実質的に常にキーをURLに追加する必要があります。そうでない場合、ルーティングされません。場合は$this->getUrl()順番にadminhtmlヘルパー呼び出すカスタムブロック方式ターゲットにしないgetUrl()方法を、あなたはそれがURLに必要なキーが追加されますように、テンプレートからこのメソッドを呼び出す必要があります。
Jonathan Hussey 2014

5

any.phtmlファイルでjsを開始します!

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

コントローラapp / code / local / Package / Module / controllers / 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 !";
            }
        }

    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.