Làm thế nào để gọi một hành động điều khiển bên ngoài magento?


7

Chúng ta có thể tạo các tập lệnh php chạy bên ngoài magento. Và cũng sử dụng các chức năng magento bằng cách sử dụng đoạn mã sau trong nó.

define('ROOT', '');
    $mage_php_url = ROOT.'app/Mage.php';

    if (!empty($mage_php_url) && file_exists($mage_php_url) && !is_dir($mage_php_url))
    {
        // Include Magento's Mage.php file.
        require_once ( $mage_php_url );
        umask(0);
        Mage::app();
    }

Trong các loại kịch bản lệnh này, chúng ta có thể gọi trực tiếp các mô hình, khối, trình trợ giúp, vv Nhưng làm thế nào chúng ta có thể gọi một hành động điều khiển ở đây? Bất kỳ đề xuất sẽ được đánh giá cao.


Tại sao bạn cần điều này và không trực tiếp yêu cầu bộ điều khiển / hành động đó?
FlorinelChis

Câu trả lời:


25

Magento không thực sự được thiết kế để làm điều này, điều đó có nghĩa là bạn có thể sử dụng các đối tượng điều khiển như bất kỳ đối tượng nào khác, nhưng sẽ có các biến chứng. Vì các phương thức này được gọi từ ngữ cảnh HTTP, nên chúng sẽ thường xuyên thực hiện mọi việc với các đối tượng yêu cầu và phản hồi hoặc dựa vào một số trạng thái phiên không tồn tại khi bạn chạy mọi thứ từ lệnh hàng.

Điều đó nói rằng, sau đây sẽ làm việc

// require you file        
if(!class_exists('Mage_Customer_AccountController')) //in case the class already exists
{
    require_once('Mage/Customer/controllers/AccountController.php');        
}

// instantiate your controller, using the `Mage:app()` object to grab the required request and response
$controller         = new Mage_Customer_AccountController(
                            Mage::app()->getRequest(),
                            Mage::app()->getResponse()
                        );        

// grab request and response object to manipulate as needed 
// (i.e. controller action expects post variables, etc.)

$request            = $controller->getRequest();
$response           = $controller->getResponse();

//manipulate things as per above

//call the action
$controller->someAction();

Cảm ơn rât nhiều. Tôi đã kiểm tra mã. Nó hoạt động hoàn hảo.
Sukeshini

Cách vượt qua Param trong hành động không tham số của bộ điều khiển lõi với $ controller-> someAction (); như trong trường hợp của tôi, tôi cần xóa mục danh sách mong muốn khỏi removeAction () của trình điều khiển chỉ mục
Học viên Magento 2

Xin vui lòng cho tôi biết làm thế nào để sử dụng trong magento 2? Tôi đang thử sử dụng với lớp trình điều khiển bao gồm hàm __construct nhưng nó không vượt qua must be an instance.
xanka

1

Đây là một cách để làm điều đó:

file_get_contents('http://url.com/[...]/controller/action/');

Làm xong! :)

Hoặc bạn có thể ghi đè yêu cầu (vì vậy có vẻ như yêu cầu đó là hành động đó) và sau đó chỉ cần gọi Mage::run().

Trên một lưu ý nghiêm trọng hơn, phụ thuộc rất nhiều vào những gì bạn đang thực sự làm trong hành động đó. Bạn có cần Magento khởi tạo không, bạn có cần toàn bộ luồng yêu cầu hay không.

Nếu bạn không cần luồng yêu cầu, v.v., bạn có thể làm:

Mage::app();
require_once 'path/to/controller.php';
$my_controller = new YourController;
$my_controller->doSomething();

Nếu bạn cần nhiều hơn, bạn có thể bắt đầu đào bằng cách xem Mage::run()chức năng. Một điểm khởi đầu tốt khác là api.php, nơi bạn có thể thấy cách khởi tạo một phiên bản nhẹ của Magento. Sau đó chỉ cần làm theo dòng yêu cầu.

Nhìn vào nhận xét của Alan: Nếu bộ điều khiển của bạn là một thể hiện của Mage_Core_Controller_Varien_Action(và bộ điều khiển Magento của bạn phải), bạn cần gửi một đối tượng yêu cầu và một đối tượng phản hồi đến bộ điều khiển:

 public function __construct(Zend_Controller_Request_Abstract $request, Zend_Controller_Response_Abstract $response, array $invokeArgs = array())
    {
        $this->_request = $request;
        $this->_response= $response;

        Mage::app()->getFrontController()->setAction($this);

        $this->_construct();
    }

4
Các đối tượng điều khiển yêu cầu một đối tượng yêu cầu và đáp ứng trong hàm tạo của chúng.
Alan Storm

2
hai cách không được đề xuất cùng một lúc :-( yêu cầu dữ liệu bằng cách gọi uri của riêng bạn và thực hiện việc này với fopen & co
bukart
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.