“Right"执行管理任务的方法


"Right" Way to Perform Admin Tasks?

我试图把一个可以执行一些自定义排序任务的管理模块放在一起,我遇到了一个问题,我似乎找不到答案。基本上,我在Admin配置中添加了一个部分,其中包含几个按钮,用于扫描最近的订单,并在订单项上设置一些可稍后使用的自定义值。为此,我在system.xml中添加了一个按钮,用于重定向到控制器。控制器执行必要的任务(或实例化模型来完成此任务),然后需要重定向回它来自的管理页面。这是让我困惑的部分。我似乎无法找出最好的方法来传递当前的URL从管理部分通过到控制器,所以控制器知道在哪里重定向回。当然,我可以硬编码它,但我真的不希望这样做。此外,这是正确的做法吗?如果控制器没有布局,它的唯一目的就是在点击按钮时做一些事情,有没有更好的方法?

假设这是正确的方法,这里有一些块从我的文件供参考。

system.xml

这是system.xml声明按钮的部分。请注意,我正在使用自定义frontend_model类,因为这是我可以让它工作的唯一方法(有更好的方法吗?)

<fields>
    <calcmargin translate="label">
        <label>Calculate Margins</label>
        <comment>
            <![CDATA[Calculates the order margins]]>
        </comment>
        <frontend_type>button</frontend_type>
        <frontend_model>sorting/source_buttons_calcmargin</frontend_model>
        <sort_order>10</sort_order>
        <show_in_default>1</show_in_default>
        <show_in_website>1</show_in_website>
        <show_in_store>1</show_in_store>
    </calcmargin>
</fields>

config . xml

在config.xml中,我声明了我的管理路由器(除其他外)

<admin>
    <routers>
        <sorting>
            <use>admin</use>
            <args>
                <module>VPS_Sorting</module>
                <frontName>sorting</frontName>
            </args>
        </sorting>
    </routers>
</admin>

按钮来源

这是我的源按钮类

中的_getElementHtml函数
public function _getElementHtml(Varien_Data_Form_Element_Abstract $element)
{
    //save the current URL in the sorting/data singleton for future use
    Mage::getSingleton('sorting/data')->setSortingReturnUrl(Mage::helper('core/url')->getCurrentUrl());
    $this->setElement($element);
    $html = $this->getLayout()->createBlock('adminhtml/widget_button')
    ->setType('button')
    ->setClass('scalable')
    ->setLabel($this->buttonLabel)
    ->setOnClick("setLocation('$this->buttonUrl')")
    ->toHtml();
    return $html;
}

注意:$this->buttonUrl是之前使用$this->getUrl('sorting/index/calcmargin')

设置的

在这种情况下,我有一个名为Data.php的模型,我使用getSingleton实例化并设置返回URL。

IndexController

public function calcmarginAction()
{
    $orderCollection = Mage::getModel('sales/order')->getCollection();
    foreach($orderCollection as $order)
    {
        //Do Stuff
        //...
    }
    echo "DONE...now return to " . Mage::getSingleton('sorting/data')->getSortingReturnUrl();
    //outputs: 'DONE...now return to '...so clearly the value wasn't saved
}

不幸的是,当它到达控制器时,该值不再存在。所以我想我真的不明白单例模式是如何工作的,以及它们会存在多久……

我还尝试保存core/session单例中的值,但这也不起作用。

那么,如果你还和我在一起,我该怎么做有什么想法吗?

谢谢!

正如您所知道的,单例仅对页面请求有效,要持续更长时间,您需要会话。但是,对于控制器有一种更简单的方法,将它放在echo;

的位置。
$this->_redirectReferer();

作为题外话,我不认为配置部分是执行操作的按钮的理想选择。也许应该使用System> Tools菜单…

你正在做一个实际的重定向,在HTTP重定向?或者你是在向另一个控制器进行转发?

如果你正在做一个真正的重定向,这是可怕的。不要这样做。停止。完全重新设计。

您应该创建一个包含计算边距代码的操作帮助器。

回答你的另一个问题,如果控制器没有布局或视图脚本(由于控制器的性质),那么它不应该被用户调用。这很可能是一个cron作业,其中布局是禁用的。

做你想做的事情的更好的方法是使用动作助手。控制器从单个请求映射,因此,一条路由(或多条路由)将映射到单个控制器。然而,如果一些代码被许多控制器使用,那么它应该是一个操作助手。