Error when trying to load Dual Listbox in Yii2

2019-09-08 04:11发布

In the project that I want to develop, user can upload an Excel file (xls,xlsx) to system. The excel sheet has headers in the first row, and value in another row. System has a default excel template that consist the rule for headers sequence such as (Name, Age, Sex), but sometimes user use their own excel template so sometimes the header sequence become like this (Sex, Name, Age).

To handle this sequence, I've a plan to make a mapping process to handle the headers sequence before save the value to database. I wanna use dual list box. I've 2 a table in database for this process:

  1. Header -> has to column (header_id, header_name), all the headers from file has been save in here. Each headers saved with their own header_id and header_name
  2. Info -> the value from the excel file save here.

and I also has a pure (not generated by Gii) CostumizedHeaderController.php, CostumizeHeader.php, Index.php

This is code in CostumizeHeaderController:

class CostumizeHeaderController extends Controller {

//put your code here

public function actionShowHeaders() {
$model = new CostumizeHeader();
$model->loadHeaders();
    $items = \backend\models\CostumizeHeader::getAllHeader();

    return $this->render('index', [
                'model' => $model,
                'items' => $items
    ]);
}}

Code in model (CostumizeHeader.php)

class CostumizeHeader {
//put your code here

/**
 * @var array IDs of the favorite foods
 */
public $list_headers = [];

public function rules() {
    return [
            [['list_headers'], 'string', 'max' => 255],
    ];
}

/**
 * @return array customized attribute labels
 */
public function attributeLabels() {
    return [
        'list_headers' => 'list Costumized Header',
    ];
}

public function loadHeaders() {
    $this->list_headers = [];
    $headers = Header::find()->all();
    foreach ($headers as $ff) {
        $this->list_headers[] = $ff->header_id;
    }
}

public static function getAllHeader() {
    $headers = Header::find()->asArray()->all();
    $items = ArrayHelper::map($headers, 'header_id', 'nama_header');
    return $items;
}

code in index.php

 <?php
$form = ActiveForm::begin([
            'id' => 'favorite-form',
            'enableAjaxValidation' => false,
]);
?>

<?= $form->field($model->list_headers, 'list_headers')->widget(DualListbox::className(), [
            'model' => $model,
            'items' => $items,
            'name'=>'nama_header',
            'attribute' => 'list_headers', 
            'options' => [
                'multiple' => true,
                'size' => 15,
            ],
            'clientOptions' => [
                'nonSelectedListLabel' => 'Available Header',
                'selectedListLabel' => 'Final Header',
                'moveOnSelect' => false,
            ],
        ])
        ->hint('Select the header according the sequence.');
?>

I've try to var_dump in controller and got this Array ( [1] => age [2] => sex [3] => name . And I've been check the header table, and all the headers from excel file have been imported to database. But I still got an error, like this Call to a member function formName() on a non-object. I wish anybody can help me to solve this problem. Thankyou

1条回答
女痞
2楼-- · 2019-09-08 04:43

Inside your view page I think you are using field incorretly $model->list_headers should be $model only.

your index.php must be as follows:

<?php
$form = ActiveForm::begin([
            'id' => 'favorite-form',
            'enableAjaxValidation' => false,
]);
?>

<?= $form->field($model, 'list_headers')->widget(DualListbox::className(), [
            'model' => $model,
            'items' => $items,
            'name'=>'nama_header',
            'attribute' => 'list_headers', 
            'options' => [
                'multiple' => true,
                'size' => 15,
            ],
            'clientOptions' => [
                'nonSelectedListLabel' => 'Available Header',
                'selectedListLabel' => 'Final Header',
                'moveOnSelect' => false,
            ],
        ])
        ->hint('Select the header according the sequence.');
?>
查看更多
登录 后发表回答