我正在尝试组建一个可以执行一些自定义排序任务的管理模块,我遇到了一个似乎无法找到答案的问题。基本上,我在Admin配置中添加了一个部分,其中有几个按钮可以扫描最近的订单,并在订单项上设置一些我可以在以后使用的自定义值。为此,我在 system.xml 中添加了一个重定向到控制器的按钮。控制器执行必要的任务(或实例化模型),然后需要重定向回它来自的管理页面。这是令我困惑的部分。我似乎无法找出将当前URL从管理部分传递到控制器的最佳方法,以便控制器知道重定向到哪里。当然,我可以硬编码,但我真的不愿意。此外,这是否是正确的方法呢?如果没有控制器的布局,并且唯一的目的是在点击按钮时执行操作,是否有更好的方法可以解决它?
假设这是正确的方法,这里有一些来自我的文件的块供参考。
这是声明按钮的 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中,我声明了我的管理路由器(以及其他内容)
<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-&gt; buttonUrl 早先使用$this->getUrl('sorting/index/calcmargin')
设置
在这种情况下,我有一个名为 Data.php 的模型,我使用 getSingleton 实例化并设置返回URL。
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 单例中保存该值,但这也不起作用。
所以,如果你还和我在一起,对我该做什么的想法呢?
谢谢!
答案 0 :(得分:0)
您正在进行实际重定向,就像在HTTP重定向中一样?或者你正在向不同的控制器前进?
如果你正在做一个可怕的实际重定向。不要这样做。停止。完全重新设计。
您应该创建一个包含calc边距代码的动作帮助器。
要回答您的其他问题,如果控制器没有布局或视图脚本(由于控制器的性质),则不应由用户调用。它很可能就像一个cron作业,其布局被禁用。
做你想做的更好的方法是使用Action Helpers。控制器根据各个请求进行映射,因此,一个路由(或多个路由)将映射到单个控制器。但是,如果许多控制器使用某些代码,那么它应该是一个动作帮助器。
答案 1 :(得分:0)
正如您已经解决的那样,单身人士只对页面请求有效,持续时间超过此时间,您需要会话。然而,控制器有一种更简单的方法,用它代替你的回声;
$this->_redirectReferer();
顺便说一下,我不认为配置部分对于执行操作的按钮来说是理想的。也许系统&gt;工具菜单改为......