Чтобы заполнить поле формы Yii, пользователям часто нужно искать запись модели, на которую ссылаются (например, поиск профиля друга в социальном приложении).Я уверен, что другие приложения Yii делают это элегантно.Но в моем грязном подходе на странице результатов поиска я использую CHtml::submitButton
для отправки двух моделей обратно в форму, содержащую:
- "найденную" запись (идентификатор пользователя, связанный с одним изпрофили из результатов поиска)
- ранее введенное содержимое поля формы (поля характеристики отношений)
В качестве альтернативы виджет автозаполнения работает хорошо, но не выполняет детальный поиск, которыйМне нужно (например, поиск по частичному имени и названию города или штата или другого содержимого профиля пользователя).
В качестве альтернативы вы могли бы подумать, что в представлении результатов поиска я мог бы изменить члена формы, чтобы он содержалнайденную запись (идентификатор пользователя нового друга) и просто отправьте / отправьте измененную модель со страницы результатов поиска.Но чтобы это работало, каждому из результатов поиска в списке необходим уникальный идентификатор пользователя, заполненный в этом поле формы, и я не могу понять, как продублировать модель формы, прежде чем изменять эту одну часть на стороне сервера для каждого поискаРезультаты «отправить» или «выбрать» кнопки, и просто не представляется правильным создавать все эти модели форм.Так что, похоже, работает, чтобы представить две отдельные модели, используя подчиненные формы (в представлении результатов поиска), с 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>