在Yii中,如何最好地发布搜索结果选择&以前输入的表格模型回到表格控制器?

时间:2012-01-07 00:27:41

标签: forms search yii

要完成Yii表单字段,用户通常需要搜索引用的模型记录(例如在社交应用中搜索朋友的个人资料)。我相信其他Yii应用程序正在优雅地做到这一点。但在我的脏方法中,在搜索结果页面中,我使用CHtml::submitButton将两个模型POST回包含以下内容的表单:

  1. “找到”记录(与搜索结果中的某个配置文件关联的用户ID)
  2. 先前输入的表单字段内容(关系表征字段)
  3. 或者,自动填充小部件效果很好,但不会进行我需要的详细搜索(例如,根据部分名称和城市或州或其他用户个人资料内容进行搜索)。

    或者,您可以认为在搜索结果视图中我可能能够修改表单成员以包含找到的记录(新朋友的用户ID),并且只需从搜索结果页面POST /提交修改后的模型。但是为了工作,列表中的每个搜索结果都需要在该表单字段中填充唯一的用户ID,在为每个搜索修改一个成员服务器端之前,我无法弄清楚如何复制表单模型结果'“提交”或“选择”按钮,创建所有这些表单模型似乎并不正确。 所以似乎有用的是使用子表单(在搜索结果视图中)提交两个单独的模型,submitButton分别发布模型和额外参数(用户ID)。

    有更好的方法吗? ...链接到搜索结果页面和表单字段,保留已输入的数据并使用选定的记录填充搜索到的字段搜索结果。

    这是控制器/ SiteController:

    public function actionBefriend() {
        $model=new BefriendForm;
        if(isset($_POST['BefriendForm'])) {
            $model->attributes=$_POST['BefriendForm'];
            if ($model->validate()) {
                $model->createFriendship();
                $this->redirect('Index'); } 
            else
                $er=$model->getErrors(); }
        if(isset($_POST['idfriend'])) {
            $model->idfriend=$_POST['idfriend']; }
        if(isset($model->idfriend)) {
            $model->friend_name=Bio::model()->findByPk($model->idfriend)->name; }
        $this->render('newFrienship', array('model' =>$model)); // newFriendship is the form view }
    

    这是控制器/ Bio.php(个人资料)

    public function actionIndex() {
        $criteria = new CDbCriteria();
        $model=new BefriendForm;
        if(isset($_GET['q']))
            $q = $_GET['q'];
        elseif (isset($_POST['BefriendForm']))  {
            $model->attributes=$_POST['BefriendForm'];
            $q = $model['friend_name']; }
        if(isset($q))   {
            $criteria->compare('name', $q, true, 'OR');
            $criteria->compare('city', $q, true, 'OR');
            $criteria->compare('state', $q, true, 'OR');
            $criteria->compare('bio_text', $q, true, 'OR'); }
        else
            $q = '';
        $dataProvider=new CActiveDataProvider('Bio', array('criteria'=>$criteria));
        $this->render('index',array('dataProvider'=>$dataProvider, 'q'=>$q, 'model'=>$model )); }
    

    这是views / site / newFriendship(表单视图)的开始

    <?php $form=$this->beginWidget('CActiveForm', array(
        'id'=>'newFriendship-BefriendForm',
        'enableAjaxValidation'=>true,)); ?>
    

    这是views / bio / index.php(搜索结果索引页面)的核心:

    <?php $this->widget('zii.widgets.CListView', array(
    'dataProvider'=>$dataProvider,
    'itemView'=>'_view',
    'viewData'=>array('model'=>$model) )); ?>
    

    这是views / bio / _view.php中的搜索结果行,它链接回BefriendForm(SiteController),它发送用户的id以填充表单中的friend字段(从id获取名称):< / p>

    <form method="POST">
        <input type="hidden" name="idfriend" value="<?php echo $data->idfriend ?>" />
        // Here's that submit button that I can't get to send both the model 
        //and the idfriend back to the form to repopulate it
        //   without manually writing HTML to submit all the fields individually
        //   or creating 2 subforms to submit together with a signle submitButton.
        <?php echo CHtml::submitButton('Befriend', array('submit' => array('site/Befriend'),'model'=$model);
    </form>
    

2 个答案:

答案 0 :(得分:1)

我能看到的最好的选择是在表单中吸收搜索器小部件。

答案 1 :(得分:0)

当用户点击“选择”或“Befriend”按钮回到NewFriendship表单之前,您可以将包含主键的表单字段替换为适当的值。因此,只有一个模型从搜索结果页面回发到原始表单。

将问题中的views / bio / _view.php替换为......

<?php
foreach($model->attributeNames() as $name)
  if($name != 'friend_id')
    echo CHtml::activeHiddenField($model,$name);
  else
    echo CHtml::activeHiddenField($model,$name,array('value'=>$data->getPrimaryKey()));
echo CHtml::submitButton('Befriend', array('submit' => array('site/Befriend')));
?>