Làm thế nào để tôi gọi một chức năng điều khiển trong ajax?


7

Đây là nội dung của .../template/exportdb/attributes.phtmltập tin của tôi :

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

Đây là tập tin điều khiển của tôi:

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

Đây là config.xmlnội dung:

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

Nhưng con bọ lửa chỉ cho tôi 404 , tôi không Attibutes_ajaxActionhoạt động. Tại sao?

Kết quả: kết quả


Điều gì xảy ra nếu bạn truy cập url trực tiếp? Ý tôi là thông qua trình duyệt. Tôi không chắc chắn về _ trong url, hãy thử thay đổi tên của hàm thành ajacAction và gọi nó trong trình duyệt để xem điều gì sẽ xảy ra.
mbalparda

Thật kỳ lạ, nhưng nó mang lại cho tôi trang chủ của magento, tôi cũng đã đổi tên từ Attribut_ajaxAction trong AjaxAction
Attila Naghi

Bạn đang gọi một bộ điều khiển quản trị từ frontend. Đó là một hành vi dự kiến. Xem sự kế thừa của lớp trình điều khiển của bạn.
mbalparda

Cũng Nếu tôi sử dụng url ajax như thế này: url: '<? Php echo $ this->? GetUrl ( "adminhtml / thuộc tính / ajax")>' trong firebug tại HTML nó mang lại cho tôi trang chủ
Attila Naghi

Tôi không thực sự hiểu những gì bạn đã đường, bạn có thể cụ thể hơn? cảm ơn nhiều !
Attila Naghi

Câu trả lời:


6

Thay vì $this->getUrl(), bạn có thể thử

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

Xin lưu ý phương pháp là Ajaxvà không ajax. Điều này là do bộ điều khiển của bạn bao gồm một phương thức AjaxAction()và nó không phải là ajaxAction().

Nói chung đây là những gì Mage::getUrl('module/controller/method')trông giống như. Các lĩnh vực là tự giải thích tôi hy vọng.

Tại sao mã của bạn không hoạt động?

Điều này là do bạn đang gọi getUrl()trên $thisđó là sai. getUrl()chức năng đến bên trong Magevà nó là một chức năng tĩnh. Vì vậy, bạn cần phải gọi phương thức đó như thế nàyMage::getUrl()

Wierd rằng, Mage::getUrl()không làm việc cho bạn. Tôi sẽ điều tra lý do khi tôi có thời gian rảnh. Bây giờ tôi sẽ trả lời tại sao Mage::helper('adminhtml')->getUrl()làm việc.

Mage::helper('adminhtml')sẽ trả về lớp người trợ giúp quản trị viên. Cụ thể hơn, nó trả về lớp Mage_Adminhtml_Helper_Datađược đặt tại app/code/core/Mage/Adminhtml/Helper/Data.php. Nếu bạn xem trong tập tin này, bạn có thể tìm thấy phương phápgetUrl()

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

Bạn có thể thấy rằng trong trường hợp phần quản trị, magento sử dụng Mage_Adminhtml_Model_Urllớp mô hình để tạo url. Đây là lý do chính xác tại sao tôi Mage::getUrl()không làm việc trong trường hợp này. Điều này là do Mage::getUrl()sử dụng Mage_Core_Model_Urllớp mô hình để tạo url, mà tôi nghĩ thường được sử dụng để tạo url giao diện.

Vì vậy, điểm quan trọng là Magento sử dụng một lớp mô hình đặc biệt Mage_Adminhtml_Model_Urlđể xử lý các url quản trị viên magento


Tôi đang sử dụng cái này: <? Php echo Mage :: helper ('adminhtml') -> getUrl ('adminhtml / thuộc tính / ajax'); ?> và nó đang hoạt động, với ajax chứ không phải Ajax. Tại sao ?
Attila Naghi

và nếu tôi không sử dụng phần trợ giúp Tôi nhận được kết quả (xem hình ảnh trong bài viết của tôi). Bạn có thể giải thích tại sao? Tôi hoàn toàn bối rối :)
Attila Naghi

hãy thử Mage :: getUrl () và cho tôi biết kết quả
Rajeev K Tomy

Tôi cũng đã thử như thế này: Mage :: getUrl ('adminhtml / thuộc tính / Ajax'); và tôi nhận được kết quả từ hình ảnh
Attila Naghi

Cách duy nhất nó hoạt động với tôi là sử dụng Mage :: helper ('adminhtml') ... nhưng đừng hỏi tôi tại sao
Attila Naghi

5

Yêu cầu của bạn không đến được bộ điều khiển của bạn do cách bạn đã xác định tài nguyên bộ điều khiển trong config.xml. Bạn đang sử dụng xây dựng một URL với cuộc gọi:

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

nhưng bạn đã xác định bộ điều khiển của mình với:

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

Vấn đề nằm ở chỗ bạn chưa khai báo bộ điều khiển mới bằng frontName, thay vì sử dụng beforecú pháp để báo cho Magento tìm kiếm bộ điều khiển khớp trong mô-đun của bạn trước khi quay lại Mage_Adminhtml. Đây là một cách tốt để làm việc cho quản trị viên, nhưng để làm cho nó hoạt động, bạn phải nhắm mục tiêu mô-đun quản trị theo yêu cầu của bạn chứ không phải của riêng bạn. Điều này sẽ kích hoạt logic để kiểm tra mô-đun của bạn cho khớp trước, sau đó trở lại Mage_Adminhtml.

Vì vậy, khi bạn đang tạo URL, bạn cần sử dụng:

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

sẽ nhắm mục tiêu mô-đun quản trị, bộ điều khiển thuộc tính của bạn và hành động ajax trong bộ điều khiển đó. Sử dụng getUrl()phương thức trình trợ giúp adminhtml sẽ bao gồm khóa cần thiết trong URL được tạo (nếu không, yêu cầu quản trị viên sẽ bị từ chối).

Bằng cách sử dụng:

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

bạn sẽ cần phải hủy bỏ bộ điều khiển của riêng bạn thay vì sử dụng beforevà đặt frontName tương tự như sau trong 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>

Tôi đã sử dụng $ this-> getUrl ('adminhtml / thuộc tính / ajax');. Xin vui lòng xem kết quả trong img từ bài viết của tôi.
Attila Naghi

Tôi không hiểu tại sao, nhưng url này: "<? Php echo Mage :: helper ('adminhtml') -> getUrl ('adminhtml / Properties / ajax');?>" Đang hoạt động với tôi, bạn có thể giải thích cho tôi không xin vui lòng ?
Attila Naghi

URL của Frontend và backend được xử lý hoàn toàn khác nhau. URL cuối cùng hầu như sẽ luôn yêu cầu thêm khóa vào URL để xác thực yêu cầu, nếu không nó sẽ không được định tuyến. Nếu $this->getUrl()không nhắm mục tiêu một phương thức khối tùy chỉnh mà lần lượt gọi getUrl()phương thức trình trợ giúp adminhtml thì bạn sẽ cần gọi phương thức này từ mẫu vì nó sẽ thêm khóa bắt buộc vào URL.
Jonathan Hussey

5

Bắt đầu js trong tập tin any.phtml!

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

Viết ứng dụng điều khiển / mã / cục bộ / Gói / Mô-đun / bộ điều khiển / IndexContoder.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 !";
            }
        }

    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.