我需要向订单模型添加一个自定义属性(“ dynamics_ord ”)。
成功保存订单后,管理员需要定义此属性,最好在主订单区域中的 admin/sales_order/view 上。
它必须独立于发票/ cargo 等-可能附加到订单“edit
”事件。
我为其他实体(尤其是客户)设置了许多自定义属性。而且我意识到这是相同的过程。但由于尚无明显的“更新”操作,因此我不清楚如何使用此属性修改订单。 “编辑”可能很有意义,但我宁愿不要不必要地重复订单。
设置好该属性后,我要在 sales_order/index 网格中显示它。
(注意=请查看this related thread以获取有效的解决方案。)
该模块的最终状态(以及其他需要此解决方案的人):
/sales_order/view/屏幕截图:
WACI_SalesExt
app/local/WACI/SalesExt
/Block
/Adminhtml
/Sales
-Dynamicsord.php
/controllers
/Adminhtml
/Sales
- OrderController.php
/etc
- config.xml
/Helper
- Data.php
/sql
/waci_salesext_setup
-mysql4-install-0.2.0.php
config.xml
<?xml version="1.0"?>
<config>
<modules>
<WACI_SalesExt>
<version>0.2.0</version>
</WACI_SalesExt>
</modules>
<global>
<helpers>
<WACI_SalesExt>
<class>WACI_SalesExt_Helper</class>
</WACI_SalesExt>
</helpers>
<blocks>
<WACI_SalesExt>
<class>WACI_SalesExt_Block</class>
</WACI_SalesExt>
<adminhtml> <!-- unclear if i need this second declaration for admin-->
<WACI_SalesExt>
<class>WACI_SalesExt_Block</class>
</WACI_SalesExt>
</adminhtml>
</blocks>
<models>
<WACI_SalesExt>
<class>WACI_SalesExt_Model</class>
<resourceModel>salesext_mysql4</resourceModel>
</WACI_SalesExt>
</models>
<resources>
<waci_salesext_setup>
<setup>
<module>WACI_SalesExt</module>
<class>Mage_Sales_Model_Mysql4_Setup</class>
</setup>
<connection>
<use>core_setup</use>
</connection>
</waci_salesext_setup>
<waci_salesext_write>
<connection>
<use>core_write</use>
</connection>
</waci_salesext_write>
<waci_salesext_read>
<connection>
<use>core_read</use>
</connection>
</waci_salesext_read>
</resources>
</global>
<admin>
<routers>
<adminhtml>
<use>admin</use>
<args>
<modules>
<WACI_SalesExt after="Mage_Adminhtml_Sales">WACI_SalesExt_Adminhtml</WACI_SalesExt>
</modules>
</args>
</adminhtml>
</routers>
</admin>
</config>
WACI/SalesExt/sql/waci_salesext_setup/mysql4-install-0.2.0.php
$installer = $this;
$installer->startSetup();
$installer->addAttribute('order', 'dynamics_ord', array(
'type' =>'varchar',
'visible' => true,
'required' => false,
'is_user_defined' => false,
'note' => 'Dynamics ORD')
);
$installer->getConnection()->addColumn($installer->getTable('sales_flat_order'), 'dynamics_ord','VARCHAR(255) NULL DEFAULT NULL');
$installer->getConnection()->addColumn($installer->getTable('sales_flat_order_grid'), 'dynamics_ord','VARCHAR(255) NULL DEFAULT NULL');
$installer->endSetup();
模板/销售/订单/ View /info.phtml
<?php echo $this->getLayout()->createBlock('WACI_SalesExt/adminhtml_sales_dynamicsord')->setOrderId($_order->getId())->toHtml() ?>
模板/sales/ord_form.phtml
<?php if ('sales_order' == Mage::app()->getRequest()->getControllerName() ): ?>
<tr>
<td class="label"><label for="dynamics_ord">Dynamics ORD</label></td>
<td class="value">
<form action="<?php echo $this->getFormUrl(); ?>" method="post" id="ord_form">
<input type="hidden" name="form_key" value="<?php echo $this->getFormKey(); ?>" />
<input type="hidden" name="token" value="<?php echo $this->getToken(); ?>" />
<div class="">
<input type="text" class="input-text" name="dynamics_ord" value="<?php echo $this->getOrder()->getData('dynamics_ord'); ?>" style="width:150px; float:left; display:inline;" />
<button onclick="editForm.submit()" style="float:left;margin:3px 10px 0;">Update</button>
</div>
</form>
<script type="text/javascript">
editForm = new varienForm('ord_form');
</script>
</td>
</tr>
<?php endif; ?>
WACI_SalesExt_Block_Adminhtml_Sales_Dynamicsord
class WACI_SalesExt_Block_Adminhtml_Sales_Dynamicsord extends Mage_Adminhtml_Block_Template
{
public function __construct()
{
parent::__construct();
$this->setTemplate('sales/ord_form.phtml');
}
public function getOrder(){
return Mage::registry('current_order');
}
public function getFormUrl(){
return Mage::helper("adminhtml")->getUrl('*/sales_order/editord', array('order_id'=>$this->getOrder()->getId()) );
}
}
WACI_SalesExt_Adminhtml_Sales_OrderController
include_once Mage::getModuleDir('controllers', 'Mage_Adminhtml') . DS . 'Sales' . DS . 'OrderController.php';
class WACI_SalesExt_Adminhtml_Sales_OrderController extends Mage_Adminhtml_Sales_OrderController
{
public function editordAction()
{
$postData = $this->getRequest()->getPost();
Mage::log('WACI_SalesExt_Adminhtml_Sales_OrderController::ordEditAction'.print_r($postData, true) );
$id = $this->getRequest()->getParam('order_id');
$order = Mage::getModel('sales/order')->load($id);
$order->setDynamicsOrd($postData['dynamics_ord']);
$order->save();
// return to sales_order view
Mage::app()->getResponse()->setRedirect(Mage::helper('adminhtml')->getUrl("adminhtml/sales_order/view", array('order_id'=> $id)));
}
}
一直在寻找有关此问题的一些信息,this SO thread似乎非常接近我想要做的事情。但是尚不清楚我是否可以通过此工作流程创建可编辑的输入。
我会注意到我使用的是Mage 1.11-并且我已经收集到标准的EAV模式不再用于订单模型。
干杯-
更新
(注意“当前”模块的内容。)
在这一点上,我认为我的路由器设置不正确。在您的示例中,您调用了
<?php echo $this->getEditFormUrl(); ?>
。我不确定这是否应该输出格式化的操作URL,但事实并非如此。我放下了自己的路由器,但是仍然无法正确击中路由器。当前, Action 形式中的值=
action ="http://my.domain.com/index.php/my_admin/sales_order/editord/key/2e56d7f560dc4d356e3ef9519764b8a84858e5cd40d3c1f5821a423b949b9a6a/"
并点击“找不到页面”。据我所知,路由器在这里应该是准确的。我尝试了许多不同的组合;我显然在管理路由器问题上缺少重要的内容。我了解
key/ee6
...可能让我感到困惑,但是我不清楚如何适本地处理它。更新
路由问题是一个简单的错误,我不必要地使它变得复杂:我有一个拼写错误的目录名“AdminHtml”和“Adminhtml”,这导致路由器丢失。
哦,Magento ...
谢谢@ R.S。寻求帮助。
最佳答案
您可以尝试在订单详细信息页面的“帐户信息”部分添加“可编辑的输入”。
在/app/design/adminhtml/default/default/template/sales/order/view/info.phtml中
添加
<?php echo $this->getLayout()->createBlock('salesext/adminhtml_editform')->setOrderId($_order->getId())->toHtml() ?>
在你的街区
<?php
class WACI_SalesExt_Block_Adminhtml_Editform extends Mage_Adminhtml_Block_Template
{
public function __construct()
{
parent::__construct();
$this->setTemplate('salesext/edit_form.phtml');
}
public function getOrder(){
return Mage::registry('current_order');
}
public function getFormUrl(){
return Mage::helper("adminhtml")->getUrl('*/sales_order/editField', array('order_id'=>$this->getOrder()->getId());
}
...
在/app/design/adminhtml/default/default/template/salesext/edit_form.phtml中
<?php if ('sales_order' == Mage::app()->getRequest()->getControllerName() : ?>
<div id="change-order-email" style="display:none">
<form action="<?php echo $this->getEditFormUrl(); ?>" method="post" id="edit_form">
<input type="hidden" name="form_key" value="<?php echo $this->getFormKey(); ?>" />
<input type="hidden" name="token" value="<?php echo $this->getToken(); ?>" />
<table cellspacing="4" class="form-list">
<tr>
<td>Field</td>
<td><input .... class="required-entry validate-email" /></td>
</tr>
</table>
</form>
<button onclick="editForm.submit()">Change</button>
</div>
<script type="text/javascript">
editForm = new varienForm('edit_form');
</script>
<?php endif; ?>
在/app/code/local/CWACI/SalesExt/controllers/Adminhtml/Sales/OrderController.php中
<?php
include_once Mage::getModuleDir('controllers', 'Mage_Adminhtml') . DS . 'Sales' . DS . 'OrderController.php';
class CWACI_SalesExt_Adminhtml_Sales_OrderController extends Mage_Adminhtml_Sales_OrderController
{
public function editFieldAction()
{
$postData = $this->getRequest()->getPost();
$id = $this->getRequest()->getParam('order_id');
$order = Mage::getModel('sales/order')->load($id);
$order->setFieldName($postData[field_name]);
.....
$order->save();
在你的config.xml中
...
<admin>
<routers>
<adminhtml>
<use>admin</use>
<args>
<modules>
<CWACI_SalesExt after="Mage_Adminhtml_Sales">CWACI_SalesExt_Adminhtml</CWACI_SalesExt>
</modules>
</args>
</adminhtml>
</routers>
</admin>
.....
另请参阅Setting custom Admin theme from a Module以防止直接对核心模板进行修改。