我有一个扩展,它应该为用户(在magento后端以管理员身份登录)提供更改前端区域中某些配置的能力。我想在前端有一个链接,通过ajax加载配置区域,并让用户可以编辑并在加载的div中保存此配置。我想使用magento后端表单,所以我不必自己编写表单。
我当前的方法在页面上有链接,并通过ajax加载正确的后端页面(例如,系统>配置>设计)。对于这种方法,我创建了一个扩展Mage_Adminhtml_Controller_Action的Controller。这个Controller从ajax请求中获取params并使用一个动作(比如类Mage_Adminhtml_System_ConfigController的editAction)来获得后端的正确配置页面。
我的问题是: - 仅显示正确的区域(我只希望用户仅编辑系统>配置>设计下的“主题”部分)其他一切都不可用...那么如何删除此配置部分的所有信息?
表单需要JS变量Form_Key。如何获取当前的Form_Key(在前端)?
在ajax加载内容后,表单无法正确初始化。因此,如果我正在尝试提交表单,我的firebug说“JS-Error:configForm未定义”。如何解决这种形式的初始化?有什么想法吗?
我真的希望这里有人能给我一个提示如何解决这个问题,让后端配置工作在前端。
答案 0 :(得分:0)
这是未经测试的,但它应该足以让你走上正确的轨道:
在前端,大多数块都是通过布局XML实例化的。在adminhtml
区域,这是不同的,因此您需要更多地使用PHP实例化。
在您的AJAX操作中,我假设您当前正在调用loadLayout()
和renderLayout()
要仅输出特定部分,请使用以下内容:
public function yourAjaxAction()
{
// assuming the required config section is set in the AJAX request
$sectionCode = $this->getRequest()->getParam('section');
$sections = Mage::getSingleton('adminhtml/config')->getSections();
$blockName = (string)$sections->frontend_model;
if (empty($blockName)) {
$blockName = Mage_Adminhtml_Block_System_Config_Edit::DEFAULT_SECTION_BLOCK;
}
$block = $this->getLayout()->createBlock($blockName)->initForm();
// Set the AJAX response content
$this->getResponse()->setBody($block->toHtml());
}
可以通过提取表单键
Mage::getSingleton('core/session')->getFormKey()
它必须以回发到服务器的形式出现。您可以使用以下代码使用formkey创建HTML隐藏字段:
// If loadLayout() was called:
$formkeyHtml = Mage::app()->getLayout()->getBlock('formkey')->toHtml();
// If working without layout XML:
$formkeyHtml = Mage::app()->getLayout()->createBlock('core/template', 'formkey')
->setTemplate('formkey.phtml') // adminhtml theme formkey
//->setTemplate('core/formkey.phtml') // frontend theme formkey
->toHtml();
configForm
变量是包含配置字段的DOM元素的JS varienForm
对象
它使用以下实例化:
// config_edit_form is the CSS id
configForm = new varienForm('config_edit_form');
varienForm
声明位于 js / varien / form.js 文件中。
系统配置还使用了一些额外的JavaScript。 Magento总是在这些块中添加以设置系统配置JS环境:
Mage::app()->getLayout()->getBlock('js')->append(
$this->getLayout()->createBlock('adminhtml/template')
->setTemplate('system/shipping/ups.phtml')
);
Mage::app()->getLayout()->getBlock('js')->append(
$this->getLayout()->createBlock('adminhtml/template')
->setTemplate('system/config/js.phtml')
);
Mage::app()->getLayout()->getBlock('js')->append(
$this->getLayout()->createBlock('adminhtml/template')
->setTemplate('system/config/applicable_country.phtml')
);
我希望能让你开始。