Разделите вигет pjax на часть формы и часть результата

#yii2 #pjax

Вопрос:

Я использую Yii2, ActiveForm и виджет Yii2 pjax для обработки формы поиска со списком результатов.

Но по причине компоновки я должен разделить этот пакет на две части: форму поиска, которая должна быть расположена в заголовке страницы, и список результатов, который должен быть размещен в середине страницы.

Это означает, что невозможно сделать что-то подобное (псевдокод):

 Pjax::begin  $form=gt;activeForm::begin..  ActiveForm::end();   ListView::widget... Pjax::end()  

Что мне нужно, так это поместить форму ActiveForm в заголовок макета, разместить вигет ListView в центре страницы и сказать pjax: прочитайте ввод из формы, загрузите данные с сервера и замените представление clist. Возможно ли это с помощью встроенных функций виджетов?

У меня это не сработало, может быть, я неправильно понял основную концепцию?

Ответ №1:

Используя gridview (или виджет, который использует SearchModel), вы можете использовать отдельную модель для поиска моделей в заголовке и отображать результаты в представлении gridview, где вы предпочитаете

таким образом, вам понадобится только блок pjax

 lt;?= $this-gt;render('_search', ['model' =gt; $searchModel]); ?gt;  lt;?php Pjax::begin(); ?gt;  lt;?= GridView::widget([   ...  ]); ?gt;  lt;?php Pjax::end(); ?gt;  

для других решений, не основанных на gridview, и когда вам нужно несколько отдельных блоков pjax

Вы можете попробовать использовать именованный блок pjax, используя значение для идентификатора

 lt;?php yiiwidgetsPjax::begin(['id'=gt;'pjax-block1']); ?gt; ....  .... lt;?php yiiwidgetsPjax::end(); ?gt;    lt;?php yiiwidgetsPjax::begin(['id'=gt;'pjax-block2']); ?gt; .... .... lt;?php yiiwidgetsPjax::end(); ?gt;   

и если вам нужно, вы можете управлять определенным обновлением с помощью jquery

 $.pjax.reload({container: '#pjax-block1', async: false}); $.pjax.reload({container: '#pjax-block2', async: false});