在创建配置文件时覆盖配置文件 - Prestashop

Overriding the profiles in creation of profiles - Prestashop

我想在创建配置文件时添加一个包含配置文件的下拉列表。我使用了覆盖,下拉菜单正确出现并也保存在数据库中但是在编辑或查看时它没有制作 "dropdown selected ".

还有很多警告都带有未定义的名称、未定义的类型。我将分享我的代码:-

AdminProfilesController.php

    class AdminProfilesController extends AdminProfilesControllerCore
{
    public function __construct()
    {
        $this->bootstrap = true;
        $this->context = Context::getContext();
        $this->table = 'profile';
        $this->className = 'Profile';
        $this->multishop_context = Shop::CONTEXT_ALL;
        $this->lang = true;
        $this->addRowAction('edit');
        $this->addRowAction('delete');
        $this->addRowActionSkipList('delete', array(1));

        // For add a fields via an override of $fields_form, use $fields_form_override
        if (is_array($this->fields_form_override) && !empty($this->fields_form_override)) {
         $this->fields_form[0]['form']['input'] = array_merge($this->fields_form[0]['form']['input'], $this->fields_form_override);
     }

     $this->bulk_actions = array(
        'delete' => array(
            'text' => $this->l('Delete selected'),
            'confirm' => $this->l('Delete selected items?'),
            'icon' => 'icon-trash'
            )
        );

     $this->fields_list = array(
        'id_profile' => array(
            'title' => $this->l('ID'),
            'align' => 'center',
            'class' => 'fixed-width-xs'
            ),
        'name' => array('title' => $this->l('Name'))
        );

     $this->identifier = 'id_profile';

     /* Fetch All Profiles*/
     $admin_levels = Profile::adminLevels();
     foreach ($admin_levels as $row) {         
      $values_access[] = array(
        'id' => $row['id_admin'],
        'name' => $this->l($row['admin_level_name']),
        'label' => $this->l($row['admin_level_name']),
        'val' => $row['id_admin']                                
        );
  }

  $this->fields_form = array(
    'legend' => array(
        'title' => $this->l('Profile'),
        'icon' => 'icon-group'
        ),
    'input' => array(
        array(
            'type' => 'text',
            'label' => $this->l('Name'),
            'name' => 'name',
            'required' => true,
            'lang' => true,
            ),
        ),

    $this->fields_form_override = array(
        array(
            'type' => 'select',
            'label' => $this->l('Access Levels'),
            'name' => 'id_admin',   
                // 'lang' => true,                 
            'col' => '4',                   
            'options' => array(
                'query' => $values_access,
                'id' => 'id',
                'name' => 'name',
                'val' => 'val'
                ),
            ),
        ),


    'submit' => array(
        'title' => $this->l('Save'),
        )
    );

  $list_profile = array();
  foreach (Profile::getProfiles($this->context->language->id) as $profil) { 
    $list_profile[] = array('value' => $profil['id_profile'], 'name' => $profil['name']);
}

parent::__construct();
}



}

在 类 文件夹中

Profile.php

class Profile extends ProfileCore
{
    /** @var string Name */
    public $name;
    public $id_admin;

    /**
     * @see ObjectModel::$definition
     */
    public static $definition = array(
        'table' => 'profile',
        'primary' => 'id_profile',
        'multilang' => true,
        'fields' => array(
            /* Lang fields */
            'name' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'required' => true, 'size' => 32),
            'id_admin' => array('type' => self::TYPE_INT, 'lang' => true)           
            ),
        );

    /** Fetching Admin Access Levels */
    public static function adminLevels()
    {
        $access_level = Db::getInstance()->ExecuteS('SELECT *  FROM '._DB_PREFIX_.'admin_levels');
        return $access_level;
    }
}

谁能帮我解决这个问题。我正在使用 prestashop 1.6

配置文件结构与默认相同。 profile_lang 结构变化 列类型 id_lang 整数 (10) 无符号
id_profile 整数 (10) 无符号
名称 varchar(128)
id_admin 整数 (11)

尝试只使用:

$this->fields_form_override = array(
            array(
                'type' => 'select',
                'label' => $this->l('Access Levels'),
                'name' => 'id_admin_level',   
                'lang' => true,                 
                'col' => '4',                   
                'options' => array(
                    'query' => $values_access,
                    'id' => 'id',
                    'name' => 'name',
                    'val' => 'val'
                    ),
                ),
        );

如果您检查它的使用位置:

// For add a fields via an override of $fields_form, use $fields_form_override
if (is_array($this->fields_form_override) && !empty($this->fields_form_override)) {
     $this->fields_form[0]['form']['input'] = array_merge($this->fields_form[0]['form']['input'], $this->fields_form_override);
}

它将覆盖字段与 $this->fields_form[0]['form']['input'] 合并,所以 $this->fields_form _override 需要采用相同的格式。

另一个解决方案是将名称 $this->fields_form_override 更改为 $this->fields_form 而不是 parent::__construct(); 使用 AdminController::__construct() 绕过(忽略)AdminProfile 构造函数。