Magento Widgets截断包含行情的字段

时间:2014-05-29 04:44:57

标签: php magento widget

我正在创建一个新的小部件,允许将自定义文本/ 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编码。这似乎对我有用,但我想确定。

以下是我遇到问题的一个直观例子:

Steps to Re-produce

之前有人见过吗?知道它来自哪里?怎么修? :)谢谢。

1 个答案:

答案 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;
}

如果类似的编码机制是核心代码的一部分,那就太好了。