Как отсортировать несколько опций, когда более чем один флажок установлен с помощью jQuery / AJAX и PHP - PullRequest
1 голос
/ 08 мая 2011

Быстрое подведение итогов: у меня есть профили активности в стиле Facebook в профилях пользователей. Есть несколько вариантов «сортировки» на выбор. Поэтому, если они хотят видеть, скажем, только свою активность, они нажимают «Ваша активность». Эта часть работает отлично. Я добавляю новый фрагмент в эту головоломку, где они также могут сортировать определенные виды деятельности, такие как: сообщения, комментарии, голоса и т. Д.

Я пытаюсь заставить это сделать, если у них уже выбрана активность, а затем они отмечают флажки «Сообщения и ответы», в ней должны отображаться только их сообщения и ответы.

Я использую чекбоксы, чтобы они могли ставить / снимать галочки по желанию и jquery ajax / php для вызова этого. Вот чекбоксы:

<div class="activitySelector">
    <a href="" id="stalk" class="selectOrder">Following Activity</a> &bull; <a href="" id="user" class="selectOrder">Your Activity</a>
</div>
<input type="checkbox" class="sortOption" id="post" /><label for="post">Posts</label>
<input type="checkbox" class="sortOption" id="response" /><label for="response">Responses</label>

Вот jQuery / ajax:

$('input[type=checkbox]').live("click", function(){

    $('input:checked').each(function(){
        var ID = $('.activitySelector .selected').attr("id");
        var optionID = $(this).attr("id");

        if (optionID) {
            $('ul.streamActivity').html('<img src="/images/ajax-loader.gif" class="loader" alt="" />');

            $.ajax({
                type: "POST",
                url: "/profile/sort_activity.php",
                data: "sort="+ID+"&option="+optionID+"&user=<?php echo $user; ?>",
                cache: false,
                success: function(html){
                    $("ul.streamActivity").html(html);
                }
            });
        }
    });
});

И, наконец, PHP (я только показываю код, который имеет отношение к тому, о чем я говорю ... Мне не нужно показывать полный запрос, так как он работает отлично, я просто хочу, чтобы вы могли получить право на головную боль: P): sort_activity.php

if ($sort == "user") {
    $checkActivity .= " WHERE a.name = '$user'";
    $activityNum .= " WHERE a.name = '$user'";

    if ($option == "post") {
        if ($option == "response") {
            $checkActivity .= " AND a.type = 'Post' AND (a.type = 'Comment' OR a.type = 'Advice')";
            $activityNum .= " AND a.type = 'Post' AND (a.type = 'Comment' OR a.type = 'Advice')";
        } else {
            $checkActivity .= " AND a.type = 'Post'";
            $activityNum .= " AND a.type = 'Post'";
        }
    } elseif ($option == "response") {
        if ($option == "post") {
            $checkActivity .= " AND a.type = 'Post' AND (a.type = 'Comment' OR a.type = 'Advice')";
            $activityNum .= " AND a.type = 'Post' AND (a.type = 'Comment' OR a.type = 'Advice')";
        } else {
            $checkActivity .= " AND (a.type = 'Comment' OR a.type = 'Advice')";
            $activityNum .= " AND (a.type = 'Comment' OR a.type = 'Advice')";
        }
    }
}

Итак, по сути, для этого нужно понять, что «Ваша активность» (пользователь) уже была выбрана, и затем после этого выбирается ЕСЛИ «Сообщения» И «Ответы», после чего отображаются только ВАШИ сообщения и ответы. Прямо сейчас, он отображает только одно или другое (если выбраны оба «сообщения» и «ответы», кажется, что отображаются только ваши ответы. Это уже наполовину) l

Я думал о том, чтобы устанавливать куки или что-то подобное, чтобы он запомнил то, что они проверяли, но я хотел бы держаться подальше от этого, если это вообще возможно.

Любая помощь будет принята с благодарностью, так как я пытаюсь перезапустить эти классные новые функции:)

UPDATE: Вот оператор foreach, который я добавил. Эхо находится там, чтобы увидеть, правильно ли он его называет, и это так. Включение и выключение флажков отображает сообщение / ответ / голосование - оно просто не отображает никаких результатов: /

Я думаю, что мне нужно сделать что-то вроде: если есть более 1 опции, измените И на ИЛИ, чтобы выбрать все из них ... может быть? Не могу заставить его работать должным образом.

if (isset($options)) {
foreach ($options as $option) {
    echo $option .'<br />';
    if ($option['post']) {
        $checkActivity .= " AND a.type = 'Post'";
        $activityNum .= " AND a.type = 'Post'";
    }

    if ($option['response']) {
        $checkActivity .= " AND (a.type = 'Comment' OR a.type = 'Advice')";
        $activityNum .= " AND (a.type = 'Comment' OR a.type = 'Advice')";
    }

    if ($option['vote']) {
        $checkActivity .= " AND a.type = 'Vote'";
        $activityNum .= " AND a.type = 'Vote'";
    }
}
}

1 Ответ

2 голосов
/ 08 мая 2011

Что происходит, вы отправляете не все проверенные значения на сервер. Просто измените привязку клика к этому:

$('input[type=checkbox]').live("click", function(){
    var options = []; //We'll send an array of options instead only one
    var ID = $('.activitySelector .selected').attr("id");
    $('input:checked').each(function(){        
        var optionID = $(this).attr("id");
        options.push("options[]="+optionID);
    });
    if (options.length) {
        $('ul.streamActivity').html('<img src="/images/ajax-loader.gif" class="loader" alt="" />');

        $.ajax({
            type: "POST",
            url: "/profile/sort_activity.php",
            data: "sort="+ID+"&options="+options.join("&")+"&user=<?php echo $user; ?>", //Here we're sending 'options'
            cache: false,
            success: function(html){
                $("ul.streamActivity").html(html);
            }
        });
    }        
});

Как видите, мы отправляем все проверенные идентификаторы (options) , а не только один .

Серверная сторона:

<?php
  $options = $_POST['options'];
  //Now $options is an array with all checked IDs
  foreach($options as $option)... //Do your stuff with $options. Everything else remains the same
?>

Надеюсь, это поможет. Приветствия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...