Yii CActiveForm ожидает объект, а не массив

Моя цель: я пытаюсь отфильтровать модель на основе параметра GET и заполнить форму на основе этого.

Что мне нужно, так это то, что когда пользователи выбирают значок обновления в Gridview, я буду

  1. возьмите "номер телефона", который они хотят редактировать,
  2. заполните форму данными телефонного номера
  3. позволить пользователю редактировать эти данные для номера телефона и отправить
  4. Затем я запускаю свой собственный запрос на обновление 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 ответа

Решение

Вот что вы можете сделать, чтобы это исправить:

  1. ваша форма пытается использовать маркировку моделей, но вы дали массив, ->findAll() вернет массив моделей, здесь вам нужно single object of model

  2. ошибка, которую вы имеете, потому что $model в filter вашей сетки должен быть объект модели, который здесь будет пытаться проверить с использованием этой модели, поэтому не будет работать, когда вы даете ей массив ваших моделей,

  3. если вы хотите отфильтровать результаты на основе чего-либо, вы должны сделать это там, где 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));

    }
Другие вопросы по тегам