В Yii, как лучше отправить POST как выбор результатов поиска, так и ранее введенную модель формы обратно в контроллер формы? - PullRequest
3 голосов
/ 07 января 2012

Чтобы заполнить поле формы Yii, пользователям часто нужно искать запись модели, на которую ссылаются (например, поиск профиля друга в социальном приложении).Я уверен, что другие приложения Yii делают это элегантно.Но в моем грязном подходе на странице результатов поиска я использую CHtml::submitButton для отправки двух моделей обратно в форму, содержащую:

  1. "найденную" запись (идентификатор пользователя, связанный с одним изпрофили из результатов поиска)
  2. ранее введенное содержимое поля формы (поля характеристики отношений)

В качестве альтернативы виджет автозаполнения работает хорошо, но не выполняет детальный поиск, которыйМне нужно (например, поиск по частичному имени и названию города или штата или другого содержимого профиля пользователя).

В качестве альтернативы вы могли бы подумать, что в представлении результатов поиска я мог бы изменить члена формы, чтобы он содержалнайденную запись (идентификатор пользователя нового друга) и просто отправьте / отправьте измененную модель со страницы результатов поиска.Но чтобы это работало, каждому из результатов поиска в списке необходим уникальный идентификатор пользователя, заполненный в этом поле формы, и я не могу понять, как продублировать модель формы, прежде чем изменять эту одну часть на стороне сервера для каждого поискаРезультаты «отправить» или «выбрать» кнопки, и просто не представляется правильным создавать все эти модели форм.Так что, похоже, работает, чтобы представить две отдельные модели, используя подчиненные формы (в представлении результатов поиска), с submitButton POSTing моделью и дополнительным параметром (идентификатором пользователя) отдельно.

Есть лилучший способ? ... связывать страницу результатов поиска и поле формы и из нее, сохраняя уже введенные данные и заполняя искомое поле выбранной записью из результатов поиска.

Вот контроллеры / 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 )); }

Вот начало просмотров / 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), который отправляет идентификатор пользователя для заполнения поля друзей в форме (которая получает имя из идентификатора):

<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 ]

1 голос
/ 07 января 2012

Лучшая альтернатива, которую я вижу, - впитать виджет поисковика внутри формы.

0 голосов
/ 10 января 2012

Оказывается, вы можете просто заменить поле формы, содержащее первичный ключ, на соответствующее значение, прежде чем отправлять обратно в форму 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')));
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...