我正在创建一个新的小部件,允许将自定义文本/ HTML添加到页面中。我注意到如果您输入包含双引号的文字,它的第一次出现以及之后的所有内容都会被切断,以便您在尝试再次编辑小部件时丢失数据。< / p>
为了确保我没有搞砸,我能够通过向页面添加一个库存小部件 - 目录产品链接,在全新安装的Magento(1.7)上验证此问题。如果您将Anchor Custom Text
设置为带双引号的内容,再次插入和编辑,您将看到文本已被截断。
我不确定问题出在哪里。数据已成功写入tinyMCE内容元素,但在某处以及admin/widget/loadOptions
路由的Ajax.Request调用之间会出现格式错误。
我在这里找到了一篇相关的文章: http://www.behrendt.io/2013/04/12/using-a-wysiwyg-editor-in-a-magento-widget/
作者在底部提到在传输小部件数据时需要覆盖控制器以使用base64编码。这似乎对我有用,但我想确定。
以下是我遇到问题的一个直观例子:
之前有人见过吗?知道它来自哪里?怎么修? :)谢谢。
答案 0 :(得分:2)
通过覆盖Mage_Widget_Adminhtml_WidgetController
:
http://www.behrendt.io/2013/04/12/using-a-wysiwyg-editor-in-a-magento-widget/
我进一步采用了他的解决方案,并决定在构建窗口小部件代码时编码所有值:
# Namespace_Module_Adminhtml_WidgetController extends Mage_Widget_Adminhtml_WidgetController
public function buildWidgetAction()
{
$type = $this->getRequest()->getPost('widget_type');
$params = $this->getRequest()->getPost('parameters', array());
$asIs = $this->getRequest()->getPost('as_is');
if($type == 'namespace/module_widget')
{
foreach($params as $key => $value)
{
$params[$key] = base64_encode($value);
}
}
$html = Mage::getSingleton('widget/widget')->getWidgetDeclaration($type, $params, $asIs);
$this->getResponse()
->setBody($html);
}
这意味着在加载小部件进行编辑时我还必须对它们进行解码:
# Namespace_Module_Adminhtml_WidgetController extends Mage_Widget_Adminhtml_WidgetController
public function loadOptionsAction()
{
try {
$this->loadLayout('empty');
if( ($paramsJson = $this->getRequest()->getParam('widget')) )
{
$request = Mage::helper('core')->jsonDecode($paramsJson);
if(is_array($request))
{
$optionsBlock = $this->getLayout()->getBlock('wysiwyg_widget.options');
if(isset($request['widget_type']))
{
$optionsBlock->setWidgetType($request['widget_type']);
}
if(isset($request['values']))
{
if($optionsBlock->getWidgetType() == 'namespace/module_widget')
{
foreach($request['values'] as $key => $value)
{
$request['values'][$key] = base64_decode($value);
}
}
$optionsBlock->setWidgetValues($request['values']);
}
}
$this->renderLayout();
}
}
catch (Mage_Core_Exception $e)
{
$result = array('error' => true, 'message' => $e->getMessage());
$this->getResponse()
->setBody(Mage::helper('core')->jsonEncode($result));
}
}
最后,在我的widget块中,我不得不动态解码所有数据:
# Namespace_Module_Block_Widget
public function getData($key = '', $index = null)
{
if('' === $key)
{
$data = $this->_data;
foreach($data as $key => $value)
{
if(is_scalar($value))
{
$data[$key] = base64_decode($value);
}
}
}
else
{
$data = parent::getData($key, $value);
if(is_scalar($data))
{
$data = base64_decode($data);
}
}
return $data;
}
如果类似的编码机制是核心代码的一部分,那就太好了。