@Suleyman95

Yii2, pjax, checkbox. Проблема с чекбоксами?

Друзья, попал в очень для меня странную ситуацию). В общем, есть у меня строка поиска и фильтр с чекбоксами (жанры, авторы). Форма обернута в 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>
  • Вопрос задан
  • 267 просмотров
Пригласить эксперта
Ответы на вопрос 1
kimono
@kimono
Web developer
Gridview dataprovider и т.п. не использую, все пишу руками.

Отлично. Похвально. Но ваши руки пишут хуже тех, которые писали GridView и DataProvider.

Если не обращать внимания на ваш говнокод, то проблема в том, что когда вы отмечаете чекбоксы, то они отправляются именно в том порядке, в котором указаны на странице, а не в том, в котором вы их нажимаете.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы