В проекте, который я хочу разработать, пользователь может загрузить файл Excel (xls, xlsx) в систему.
Лист Excel имеет заголовки в первом ряду и значение в другом ряду. Система имеет шаблон Excel по умолчанию, который
состоит из правила для последовательности заголовков, такого как (имя, возраст, пол), но иногда пользователь использует собственный шаблон Excel, поэтому иногда последовательность заголовков становится такой (пол, имя, возраст).
Чтобы обработать эту последовательность, я планирую сделать процесс сопоставления для обработки последовательности заголовков перед сохранением значения в базе данных. Я хочу использовать двойной список.
У меня есть 2 таблицы в базе данных для этого процесса:
и у меня также есть чистый (не сгенерированный Gii) CostumizedHeaderController.php, CostumizeHeader.php, Index.php
Это код в 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
]);
}}
Код в модели (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;
}
код в 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.');
?>
Я попытался var_dump в контроллере и получил этот массив ([1] => age [2] => sex [3] => name).
И я проверил таблицу заголовков, и все заголовки из файла Excel были импортированы в базу данных.
Но я все еще получил ошибку, как это Вызов функции-члена formName () для необъекта.
Я бы хотел, чтобы кто-нибудь помог мне решить эту проблему. Спасибо
На вашей странице просмотра, я думаю, что вы используете поле неправильно $model->list_headers
должно быть $model
только.
Ваш index.php должен быть следующим:
<?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.');
?>
Других решений пока нет …