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

时间:2017-07-26 12:33:07

标签: php mysql prestashop prestashop-1.6

我想在创建个人资料时添加一个带有个人资料的下拉列表。我曾经使用过覆盖,下拉列表正确地存储并保存在数据库中,但是当编辑或查看它时没有选择“下拉列表”。

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

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();
}



}

在Classes文件夹中

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 int(10)unsigned
id_profile int(10)unsigned
name varchar(128)
id_admin int(11)

1 个答案:

答案 0 :(得分:1)

尝试使用:

$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构造函数。