Друзья, попал в очень для меня странную ситуацию). В общем, есть у меня строка поиска и фильтр с чекбоксами (жанры, авторы). Форма обернута в pjax. Gridview dataprovider и т.п. не использую, все пишу руками. При изменении формы или чекбоксов идёт ajax запрос на экшен и все меняется без перезагрузки. Все работает нормально, единственное, когда выбираю чекбоксы сверху вниз поочередно, срабатывает нормально, данные меняются в соответствии с выбранным жанром, а когда выбираю один из предыдущих жанров (т.е. не вниз, а вверх по списку), то уже не срабатывает, каждый раз показывает данные из нижнего выбранного жанра. Получается что Yii::$app->request->post('genre') не меняется при выборе предыдущего жанра. Надеюсь что хоть немного понятливо объяснил).
Вот контроллер
class BookController extends Controller
{
public function actionIndex()
{
if (Yii::$app->request->post()) {
$dd = Yii::$app->request->post('genre');
}
$genres = Genre::find()->all();
$authors = Authors::find()->with()->all();
$books = Books::find()->all();
$q = Yii::$app->request->post('q');
$author = Yii::$app->request->post('author');
$genre = Yii::$app->request->post('genre');
if ($author && !$genre && !$q) {
$books = Books::find()->joinWith(['booksAuthors'])->where(['books_authors.author_id' => $author])->all();
}
elseif (!$author && $genre && !$q) {
$books = Books::find()->joinWith(['booksGenres'])->where(['books_genres.genre_id' => $genre])->all();
}
elseif (!$author && !$genre && $q) {
$books = Books::find()->where(['like', 'name', $q])->all();
}
elseif ($author && !$genre && $q) {
$books = Books::find()->joinWith(['booksAuthors'])->where(['like', 'name', $q])->andWhere(['books_authors.author_id' => $author])->all();
}
elseif (!$author && $genre && $q) {
$books = Books::find()->joinWith(['booksGenres'])->where(['like', 'name', $q])->andWhere(['books_genres.genre_id' => $genre])->all();
}
elseif ($author && $genre && !$q) {
$books = Books::find()->joinWith(['booksGenres', 'booksAuthors'])->where(['books_authors.author_id' => $author])->andWhere(['books_genres.genre_id' => $genre])->all();
}
elseif ($author && $genre && $q) {
$books = Books::find()->joinWith(['booksGenres', 'booksAuthors'])->where(['like', 'name', $q])->andWhere(['books_authors.author_id' => $author])->andWhere(['books_genres.genre_id' => $genre])->all();
}
// var_dump(Books::find()->joinWith(['booksAuthors'])->where(['like', 'name', 'три'])->andWhere(['books_authors.author_id' => 444])->all());
// if (Yii::$app->request->post('q')) {
// $q = Yii::$app->request->post('q');
// $books = Books::find()->where(['like', 'name', $q])->all();
// }
return $this->render('index', [
'genres' => $genres,
'books' => $books,
'authors' => $authors,
'dd' => $dd,
]);
}
}
Вот вьюшка
$this->registerJs(
"
$(document).on('change keyup', '.form-horizontal', function(){
$('#login-form').closest('form').submit();
});
"
);
?>
<div class="row row-no-gutters">
<div class="col-xs-12 col-md-8">
<?php Pjax::begin(['linkSelector' => '#testpjax']); ?>
<?php var_dump($dd); ?>
<?php
$form = ActiveForm::begin([
'action' => 'index',
'method' => 'post',
'id' => 'login-form',
'options' => ['class' => 'form-horizontal', 'data-pjax' => ''],
]) ?>
<div class="form-group">
<div>
<input name="q" value="<?= Yii::$app->request->post('q') ?>" type="search" class="form-control"
placeholder="Найти ..." style="display: inline; width: 90%">
<?= Html::submitButton('Найти', ['class' => 'btn btn-primary', 'id' => 'testpjax']) ?>
<p class="toggle" style="margin-top: 10px; font-size: 18px" onclick="$('.col-md-4').toggle('display')">
Фильтр
<span class="glyphicon glyphicon-triangle-bottom""></span>
</p>
<div class="col-md-4" style="display: none">
<p>Жанры</p>
<?php foreach ($genres as $genre) : ?>
<?php $checked = ''; ?>
<?php if (Yii::$app->request->post('genre') == $genre->id) : ?>
<?php $checked = 'checked'; ?>
<p><input <?= $checked ?> type="checkbox" name="genre" value="<?= $genre->id ?>"> <?= $genre->name ?></p>
<?php else: ?>
<p><input type="checkbox" name="genre" value="<?= $genre->id ?>"> <?= $genre->name ?></p>
<?php endif; ?>
<?php endforeach; ?>
</div>
<div class="col-md-4" style="display: none">
<p>Авторы</p>
<?php foreach ($authors as $author) : ?>
<?php $checked = ''; ?>
<?php if (Yii::$app->request->post('author') == $author->id) : ?>
<?php $checked = 'checked'; ?>
<?php endif; ?>
<p><input <?= $checked ?> type="checkbox" name="author" value="<?= $author->id ?>"> <?= $author->name ?></p>
<?php endforeach; ?>
</div>
<div class="col-md-4" style="display: none"></div>
</div>
</div>
<?php ActiveForm::end() ?>
<?php foreach ($books as $book) : ?>
<h3><?php echo $book->name . '<br>'; ?></h3>
<img src="../images/<?php echo $book->image ?>" alt="..." class="img-thumbnail" style="width: 200px">
<footer>
Автор:
<?php foreach ($book->booksAuthors as $books_authors) : ?>
<cite title="Source Title">
<a href="#"><?php echo $books_authors->author->name; ?></a>
</cite>
<?php endforeach; ?>
</footer>
<footer>
Жанр:
<?php foreach ($book->booksGenres as $books_genres) : ?>
<cite title="Source Title">
<a href="#"><?php echo $books_genres->genre->name; ?></a>
</cite>
<?php endforeach; ?>
</footer>
<br>
<small><?php echo $book->description ?></small>
<hr>
<?php endforeach; ?>
<?php Pjax::end(); ?>
</div>
</div>