Prestashop 1.6 - 将自定义字段添加到类别

时间:2015-06-09 14:57:11

标签: php prestashop prestashop-1.6

我想知道如何在类别中添加自定义字段以及如何在后台编辑(在说明字段下)。 我要添加的字段是名称description_long

字段类型为TEXT

我已经覆盖了我的前厅,我的场地显示得很好。

替换\类\ Category.php

<?php 

class Category extends CategoryCore
{

    public $description_long;

    /**
     * @see ObjectModel::$definition
     */
    public static $definition = array(
        'table' => 'category',
        'primary' => 'id_category',
        'multilang' => true,
        'multilang_shop' => true,
        'fields' => array(
            'nleft' =>              array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt'),
            'nright' =>             array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt'),
            'level_depth' =>        array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt'),
            'active' =>             array('type' => self::TYPE_BOOL, 'validate' => 'isBool', 'required' => true),
            'id_parent' =>          array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt'),
            'id_shop_default' =>    array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'),
            'is_root_category' =>   array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
            'position' =>           array('type' => self::TYPE_INT),
            'date_add' =>           array('type' => self::TYPE_DATE, 'validate' => 'isDate'),
            'date_upd' =>           array('type' => self::TYPE_DATE, 'validate' => 'isDate'),
            // Lang fields
            'name' =>               array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isCatalogName', 'required' => true, 'size' => 128),
            'link_rewrite' =>       array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isLinkRewrite', 'required' => true, 'size' => 128),
            'description' =>        array('type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isCleanHtml'),
            'description_long' =>   array('type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isCleanHtml'), // CUSTOM FIELD
            'meta_title' =>         array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 128),
            'meta_description' =>   array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 255),
            'meta_keywords' =>      array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 255),
        ),
    );
}

没有发现任何助手,有人可以帮忙吗?

3 个答案:

答案 0 :(得分:12)

对于在这里苦苦挣扎的人来说,完整

要将新的description_long字段添加到Prestashop类别中的类别,您需要3个步骤:

  1. 更新数据库
  2. 将名为description_long的字段添加到category_lang表中,您可以模仿描述列的特征

    1. 覆盖类别
    2. 使用以下代码在此处/override/classes/Category.php创建一个文件:

      class Category extends CategoryCore
      {
      
          public $description_long;
      
          public function __construct($id_category = null, $id_lang = null, $id_shop = null){
              self::$definition['fields']['description_long'] = array('type' => self::TYPE_HTML, 'lang' => true);
              parent::__construct($id_category, $id_lang, $id_shop);
          }
      
      }
      
      1. 覆盖AdminCategoriesControllerCore类
      2. 使用以下代码在/override/controllers/admin/AdminCategoriesController.php中创建一个文件:

        class AdminCategoriesController extends AdminCategoriesControllerCore{
        
        
            public function renderForm()
            {
                $this->fields_form_override =array(
                    array(
                        'type' => 'textarea',
                        'label' => $this->l('Description long'),
                        'name' => 'description_long',
                        'lang' => true,
                        'autoload_rte' => true,
                        'hint' => $this->l('Invalid characters:').' <>;=#{}',
                    ),
                );
        
                return parent::renderForm();
            }
        }
        

答案 1 :(得分:3)

要在后台添加一个字段,您需要覆盖AdminCategoriesController,正好是函数renderForm()并在其中添加新字段。 为此,在/ override / controllers / admin /下创建一个新文件AdminCategoriesController,然后在其中声明原始控制器的扩展名,并从原始核心文件中完全复制renderForm函数。

class AdminCategoriesController extends AdminCategoriesControllerCore
{

    public function renderForm()
    {
        ...
    }
}

现在我们必须在几个地方编辑它,首先我们需要在描述下添加新字段,因此搜索声明'name'=&gt;在renderForm()中的'description',你会看到它是一个数组列表,每个数组都在描述一个表单字段。在描述数组后面添加我们的新字段:

 array(
                    'type' => 'textarea',
                    'label' => $this->l('Description long'),
                    'name' => 'description_long',
                    'lang' => true,
                    'autoload_rte' => true,
                    'hint' => $this->l('Invalid characters:').' <>;=#{}',
                ),

此声明要求Prestashop创建一个具有以下规范的新字段:

  • textarea字段
  • 多语言字段
  • 要编辑的javascript插件

  • 名称“description_long”

通过这种方式声明一个字段,我们将允许prestashop像任何其他Class属性一样处理它,因此我们不需要任何工作来添加和更新数据库中的字段。

现在我们的 renderForm()函数还有最后一件事要做,现在最后一条指令是parent::renderForm(),在原始类中调用AdminController来询问它渲染表单,但是现在因为我们正在扩展类,所以指令调用我们的父级AdminCategoriesControllerCore,覆盖我们所有的工作并显示默认表单。为了避免这种情况,请将parent::renderForm更改为AdminController::renderForm(),以明确调用感兴趣的类。

答案 2 :(得分:0)

在覆盖类<{p>>的url = 'http://mozilla.org' client.navigate(url) client.go_back() client.go_forward() assert client.get_url() == url 函数中添加此行

__construct

其中public function __construct($id_category = null, $id_lang = null, $id_shop = null) { self::$definition['fields']['description_long'] = array('type' => self::TYPE_HTML, 'lang' => true); parent::__construct($id_category, $id_lang, $id_shop); } 是您的新字段名称。