【问题标题】:Magento custom admin module wysiwyg integrationMagento 自定义管理模块所见即所得集成
【发布时间】:2015-02-11 19:39:26
【问题描述】:

我根据教程here 创建了一个管理模块。我正在尝试根据here 找到的信息将我的两个表单输入更改为所见即所得的编辑器。但是,每当我加载编辑页面时,我都会收到错误Call to a member function setCanLoadTinyMce() on a non-object$this->getLayout()->getBlock('head') var_dumps 为 false。

Namespace/Slides/Block/Adminhtml/Slide/Edit.php 如下所示

class Namespace_Slides_Block_Adminhtml_Slide_Edit
    extends Mage_Adminhtml_Block_Widget_Form_Container
{
    protected function _prepareLayout() 
    {
        parent::_prepareLayout();
        if (Mage::getSingleton('cms/wysiwyg_config')->isEnabled()) {
            $this->getLayout()->getBlock('head')->setCanLoadTinyMce(true);
        }
    }

    protected function _construct() 
    {
        //... Construction stuff
    }
}

命名空间/Slides/Block/Adminhtml/Slide/Edit/Form.php

class Cfw_Slides_Block_Adminhtml_Slide_Edit_Form
    extends Mage_Adminhtml_Block_Widget_Form
{

    protected function _prepareForm() 
    {
       //...Do some things first, like create the fieldset..


        //Add the editable fields
        $this->_addFieldsToFieldset($fieldset, array(
            'foreground_image' => array(
                'label' => $this->__('Foreground Image'),
                'input' => 'image',
                'required' => false,
            ),
            'background_image' => array(
                'label' => $this->__('Background Image'),
                'input' => 'editor',
                'required' => true,
                'config' => Mage::getSingleton('cms/wysiwyg_config')->getConfig(),
                'wysiwyg' => true,
            ),
            'description' => array(
                'label' => $this->__('Text Overlay'),
                'input' => 'editor',
                'required' => false,
                'config' => Mage::getSingleton('cms/wysiwyg_config')->getConfig(),
                'wysiwyg' => true,
            )
        )); 
        return $this;
    }


    protected function _addFieldsToFieldset(
        Varien_Data_Form_ElementFieldset $fieldset, $fields)
    {
        $requestData = new Varien_Object($this->getRequest()->getPost('slideData'));
        foreach ($fields as $name => $_data) {
            if ($requestValue = $requestData->getData($name)) {
                $_data['value'] = $requestValue;
            }

            //Wrap all fields with slideData group
            $_data['name'] = "slideData[$name]";

            //Generally, label and title are always the same
            $_data['title'] = $_data['label'];

            //If no new value exists, use the existing slide data.
            if (!array_key_exists('value', $_data)) {
                $_data['value'] = $this->_getSlide()->getData($name);
            }

            //Finally, call vanilla funcctionality to add field.
            $fieldset->addField($name, $_data['input'], $_data);
        }
        return $this;
    }


}

我不确定你是否需要它,但这也是我的文件结构

Namespace
-Slides
--Block
---Adminhtml
----Slide
-----Edit
------Form.php
-----Edit.php
-----Grid.php
----Slide.php
--controllers
---Adminhtml
----SlideConroller.php
--etc
---config.xml
--Helper
---Data.php
--Model
---Resource
----Slide
-----Collection.php
----Slide.php
---Slide.php
--sql
---namespace_slides_setup
----install-0.0.1.php

【问题讨论】:

    标签: php magento magento-1.9


    【解决方案1】:

    问题是 Magento 找不到您的 head 块。

    而不是使用:

    $this->getLayout()->getBlock('head')->setCanLoadTinyMce(true);

    试着这样称呼它:

    Mage::app()->getLayout()->getBlock('head')->setCanLoadTinyMce(true);

    如果这不起作用,这是一个不同的问题,但问题仍然是 Magento 找不到 head 块。

    【讨论】:

    • 我试过这个,但结果是一样的。我可以做些什么来阻止它访问头部吗?我不确定它是否相关,但我也得到了Class 'Mage' not found in /app/www/sites/cfw/app/code/core/Mage/Core/functions.php on line 244,但只是指出了一些错误打印代码。
    • 这很奇怪,因为您在 if 条件中调用 Mage::getSingleton,所以我们知道它之前看到了 Mage。几个不太可能但可能是问题的事情:对于Mage not found,您是否在__construct()Edit.php 函数中调用parent::__construct();?这不太可能,但是在遵循这些教程时,他们通常会忽略<?php 标签,因此人们可能会忘记将它们添加到他们的文件中,我只提到因为您的代码示例中没有它们,但您可能只是省略了它们。回家后我会尝试复制你的代码,看看能找到什么。
    • 不,我没有包含parent::_construct()。我现在添加了它,虽然结果是一样的。在提供代码时,我有意删除了所有 php 标签。我从教程中输入代码而不是复制和粘贴,因为我觉得我实际上会这样学习它,而且 Sublime 具有正确的语法突出显示,所以我不认为它是 php 标签。如果有帮助,我已将其余代码放入 Github
    【解决方案2】:

    我想您不再需要解决方案,但我使用与您相同的教程遇到了同样的问题。

    'head' 块(因此 setCanLoadTinyMce())在 Edit.php 和 Form.php 中通过 _prepareLayout() 函数不可用。

    “head”块在editAction() 函数中的$this->loadLayout() 和$this->renderLayout 之间的控制器(在您的情况下为SlideController.php)中可用。

    SlideController.php

    $this->loadLayout()
            ->_addContent($brandBlock)
            ->renderLayout();
    

    $this->loadLayout() ;               
    $this->_addContent($brandBlock);                                        
    $this->getLayout()->getBlock('head')->setCanLoadTinyMce(true);
    $this->renderLayout();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-18
      • 2014-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多