快速总结:我在用户个人资料上有一个类似Facebook的活动墙。有多种"排序"选项可供选择。因此,如果他们只想看到自己的活动,请点击"您的活动"。这部分工作得很好。我正在为这个拼图添加一个新的部分,他们还可以对某些类型的活动进行排序,例如:帖子、评论、投票等。
我试图做的是,如果他们已经选择了他们的活动,然后他们选中了帖子和回复复选框,它应该只显示他们的帖子和回复。
我正在使用复选框,以便他们可以随意检查/取消选中内容,并 jquery ajax/php 来调用它。以下是复选框:
<div class="activitySelector">
<a href="" id="stalk" class="selectOrder">Following Activity</a> • <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')";
}
}
}
因此,本质上这需要做的是意识到"您的活动"(用户)已经被选中,然后如果之后选择了"帖子"和"回复",那么只显示您的帖子和回复。现在,它只显示其中一个(如果同时选择了"帖子"和"回复",它似乎只显示您的回复。这是一半的哈哈。
我想过也许设置 cookie 之类的东西,这样它就会记住他们检查过的内容,但如果可能的话,我想远离它。
任何帮助将不胜感激,因为我正在尝试使用这些很酷的新功能重新启动:)
更新:这是我添加的 foreach 语句。Echo 在那里看看它是否正确调用它,它确实如此。选中和关闭框会显示帖子/响应/投票 - 它只是不显示任何结果:/
我想我需要做一些事情,如果有超过 1 个选项,请将 AND 更改为 OR,以便它选择所有这些选项......或?不过似乎无法让它正常工作。
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'";
}
}
}
正在发生的事情是,您没有将所有选中的值发送到服务器。只需将点击绑定更改为以下内容:
$('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);
}
});
}
});
如您所见,我们发送所有已检查的 ID (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
?>
希望这有帮助。干杯