Yii CActiveForm ожидает объект, а не массив
Моя цель: я пытаюсь отфильтровать модель на основе параметра GET и заполнить форму на основе этого.
Что мне нужно, так это то, что когда пользователи выбирают значок обновления в Gridview, я буду
- возьмите "номер телефона", который они хотят редактировать,
- заполните форму данными телефонного номера
- позволить пользователю редактировать эти данные для номера телефона и отправить
- Затем я запускаю свой собственный запрос на обновление SQL, основанный на новых данных.
Моя проблема Моя сетка может успешно захватить номер телефона для выбранной строки. Он может успешно отправить это в метод обновления контроллера (см. Ниже). Однако я не могу отфильтровать модель на основе этого телефонного номера, а затем заполнить форму этой моделью.
Моя ошибка
get_class() expects parameter 1 to be object, array given
/framework/web/helpers/CHtml.php(2220)
/framework/web/helpers/CHtml.php(2220): get_class(array())
/framework/web/helpers/CHtml.php(1236): CHtml::resolveName(array(), "TelephoneNumbers_TelephoneNumber")
/framework/web/widgets/CActiveForm.php(562): CHtml::activeLabelEx(array(), "TelephoneNumbers_TelephoneNumber", array())
/views/dateAudiid/editupdateform.php(18): CActiveForm->labelEx(array(), "TelephoneNumbers_TelephoneNumber")
/framework/web/CBaseController.php(126): require("/var/www/OMReport/protected/views/dateAudiid/editupdateform.php")
Вот мой Gridview.
$this->widget('bootstrap.widgets.TbGridView', array(
'id'=>'dateaudiidcondensed-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
'columns'=>array(
array(
'class'=>'bootstrap.widgets.TbButtonColumn',
'template'=>'{update}',
'buttons'=>array
(
'update' => array
(
'url'=>'Yii::app()->createUrl("dateAudiid/Update/",array("TelephoneNumbers_TelephoneNumber"=>$data->TelephoneNumbers_TelephoneNumber))',
),
),
),
'TelephoneNumbers_TelephoneNumber',
'FormId_Formid',
'Date',
'AudibeneID_Audibene_ID'
),
));
Вот мой контроллер
public function actionUpdate($TelephoneNumbers_TelephoneNumber)
{
$criteria=new CDbCriteria;
$criteria->compare('TelephoneNumbers_TelephoneNumber',$_GET['TelephoneNumbers_TelephoneNumber'],true);
$criteria->limit = 1;
$criteria->offset = 1;
$model = DateAudiidCondensedByAudibeneId::model()->findAll($criteria);
$this->render('editupdate',array('model'=>$model));
}
Вот мой взгляд
<?php
/* @var $this DateAudiidController */
/* @var $model DateAudiidCondensedByAudibeneId */
?>
<h1>Update Assignments </h1>
<?php echo $this->renderPartial('editupdateform', array('model'=>$model)); ?>
Вот моя форма
<div class="form">
<?php
$form=$this->beginWidget('CActiveForm', array(
'id'=>'date-audiid-condensed-by-audibene-id-customupdate-form',
'enableAjaxValidation'=>false,
)); ?>
<p class="note">Fields with <span class="required">*</span> are required.</p>
<?php
echo $form->errorSummary($model); ?>
<div class="row">
<?php echo $form->labelEx($model,'TelephoneNumbers_TelephoneNumber'); ?>
<?php echo $form->textField($model,'TelephoneNumbers_TelephoneNumber'); ?>
</div>
<div class="row">
<?php echo $form->labelEx($model,'FormId_Formid'); ?>
<?php echo $form->textField($model,'FormId_Formid'); ?>
<?php echo $form->error($model,'FormId_Formid'); ?>
</div>
<div class="row">
<?php echo $form->labelEx($model,'Date'); ?>
<?php echo $form->textField($model,'Date'); ?>
<?php echo $form->error($model,'Date'); ?>
</div>
<div class="row">
<?php echo $form->labelEx($model,'AudibeneID_Audibene_ID'); ?>
<?php echo $form->textField($model,'AudibeneID_Audibene_ID'); ?>
<?php echo $form->error($model,'AudibeneID_Audibene_ID'); ?>
</div>
<div class="row buttons">
<?php echo CHtml::submitButton('Submit'); ?>
</div>
<?php $this->endWidget(); ?>
</div><!-- form -->
Мои мысли / Что я пробовал до сих пор
Я возвращаю модель в виде массива... но моя форма хочет это как объект. Мне нужно что-то изменить в том, как я фильтрую свою модель в действии "Обновление контроллера", однако я не вижу, как это сделать. Все мои другие методы используют подобную модель фильтрации кода.
2 ответа
Вот что вы можете сделать, чтобы это исправить:
ваша форма пытается использовать маркировку моделей, но вы дали массив,
->findAll()
вернет массив моделей, здесь вам нужноsingle object of model
ошибка, которую вы имеете, потому что
$model
вfilter
вашей сетки должен быть объект модели, который здесь будет пытаться проверить с использованием этой модели, поэтому не будет работать, когда вы даете ей массив ваших моделей,если вы хотите отфильтровать результаты на основе чего-либо, вы должны сделать это там, где
dataprovider
вашей сетки заполняется, поэтому в этом случае находится в$model->search()
получить параметр и добавить его к этому criteria
чтобы ваша сетка могла выглядеть так:
$this->widget('bootstrap.widgets.TbGridView', array(
'id'=>'dateaudiidcondensed-grid',
'dataProvider' => $model->search(), //create a new model with search scenario
'filter' => $model, // here use that model to validate fields
'columns'=>array(
.
.
.
),
));
и в ваших моделях метод поиска:
public function search() {
$criteria = new CDbCriteria;
// grab the sent data and use it here
$tel = Yii::app()->request->getParam('TelephoneNumbers_TelephoneNumber' , null);
if(!empty($tel))
$criteria->compare('TelephoneNumbers_TelephoneNumber' , $tel , true);
.
.
.
return new CActiveDataProvider($this, array(
'criteria' => $criteria,
));
}
Вот что в итоге сработало для меня
Использование 'findByAttributes' для фильтрации и возврата модели в форму
public function actionUpdate($TelephoneNumbers_TelephoneNumber)
{
$model = DateAudiidCondensedByAudibeneId::model()->findByAttributes(array("TelephoneNumbers_TelephoneNumber" => $_GET['TelephoneNumbers_TelephoneNumber']));
$this->render('editupdate',array('model'=>$model));
}