Ajax & 会话变量? Worksafe Filter(选择性图像隐藏)

Ajax & Session Variables? Worksafe Filter (selective image hiding)

我正在建立一个摄影作品集。我的一些图片有裸体,所以我想默认隐藏这些图片,直到用户单击 "Toggle Worksafe Mode" 按钮。

我可以使用标准 form post(和会话)来完成,但是当用户 backs 或 reloads。我试图找出 AJAX post 来避免这种情况。

更新:这是工作代码。请注意,这不适用于 "slim" jQuery 发行版;这是我遇到麻烦的主要原因之一。

图像索引页:

<?php
    session_start();
    if (!isset($_SESSION['Worksafe_Mode'] {
        $_SESSION['Worksafe_Mode'] = 1;
    }
?>
<!-- other page content -->
<script src="scripts/jquery-3.2.1.min.js"></script>
<!-- other page content -->
<button type="button" id="Worksafe_Button" name="Worksafe_Button">
    Toggle Worksafe Mode
</button>
<script>
    $('#Worksafe_Button').click(function() {
        $.post("worksafe_mode_toggle.php")
            .done(function(data) {
                window.location.href = window.location.href;
        });
    });
</script>
<!-- other page content -->
<?php
$Connection = Connect();
$query = mysqli_query($Connection, 'SELECT uri, name, nsfw FROM images ORDER BY uri');

while($row = mysqli_fetch_assoc($image)) {
    if ($_SESSION['Worksafe_Mode'] == 1 && $row['nsfw'] == 1) {
        echo 'If you are over 18, toggle Worksafe Mode to view this image';
    }
    else {
        echo '<img alt="'.$row['title'].'" src="../'.$row['uri'].'/s.jpg" srcset="../'.$row['uri'].'/m.jpg 2x">';
    }
}
?>

worksafe_mode_script:

session_start();
if (isset($_SESSION['Worksafe_Mode'])) {
    if ($_SESSION['Worksafe_Mode'] == 1) {
        $_SESSION['Worksafe_Mode'] = 0;
    }
    else {
        $_SESSION['Worksafe_Mode'] = 1;
    }
}

我认为 ajax 对你来说是一个很好的方法。

我可能会做一些事情,例如默认显示一页 SFW 图片以及切换按钮。

当他们单击按钮时,它会触发 ajax 向后端请求 sets/un-sets toggleWorksafe.php 中的会话值。最后触发页面刷新。

在页面刷新期间,PHP 代码检查是否设置了会话变量并显示过滤或未过滤的图像集,并更改按钮的文本以匹配。

实施:

<head> 部分中包含 jQuery(jQuery 简化了 ajax 调用):

<!DOCTYPE html>
<html>

<head>
  <script src="https://code.jquery.com/jquery-3.2.1.min.js" integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" crossorigin="anonymous"></script>
</head>

<body>
  <?php
    session_start();
    if (!isset($_SESSION['Worksafe_Mode'])) {
        $_SESSION['Worksafe_Mode'] = 'yes';
    }
  ?>

  <button id="workSafe" type="button" name="Worksafe_Toggle_Button">
  <?php 
    if ($_SESSION['Worksafe_Mode'] == 'no') {
      echo 'Hide NSFW images';
    }
    else {
      echo 'Include NSFW images';
    }
  ?>
  </button>

  <!-- display safe images by default -->
  <?php 
    if ($_SESSION['Worksafe_Mode'] == 'no') {
      echo '<br/><br/>Showing NSFW images';
    }
    else {
      echo '<br/><br/>Showing safe images only';
    }
  ?>

  <!-- any other page content here -->

  <script>
    $('#workSafe').click(function() {

      // ajax request to page toggling session value
      $.post("/toggleWorksafe.php")
        .done(function(data) {
          window.location.href = window.location.href; // trigger a page refresh
        });
    });
  </script>
</body>

</html>

toggleWorksafe.php:

<?php 
    session_start();
    if (isset($_SESSION['Worksafe_Mode'])) {
        if ($_SESSION['Worksafe_Mode'] == 'yes') {
            $_SESSION['Worksafe_Mode'] = 'no';
        }
        else {
            $_SESSION['Worksafe_Mode'] = 'yes';
        }
    }
    else {
        $_SESSION['Worksafe_Mode'] = 'yes';
    }
?>

有几种方法可以做到这一点,这与您如何隐藏加载图像有关。

1。简单方法

如果你不关心用户的年龄,只需要切换,那么你可以只用一个js变量,一个cookie,两个版本的link。这样,您就不会 隐藏 图像,而是 加载 它们。过滤在服务器中完成,您可以在服务器中使用数据库查询或简单的文件夹分离。例如:

var nsfw = read_cookie('nsfw', false); // not an actual js function, search for how to read cookie in js --- read cookie value, default to false

function loadImage(nsfw){
    if (nsfw){
        $.get('nsfw-image-list-url', function(resp){
            // the url should return a json with list of image urls
            var list = resp;  // jQuery automatically parse json with the right MIME
            list.forEach(function(val){
                // insert image to page
                $('#container').append('<img src="' + val + '/>');
            });
        });
    } else {
        $.get('sfw-image-list-url', function(resp){
            // the url should return a json with list of image urls
            var list = resp;  // jQuery automatically parse json with the right MIME
            list.forEach(function(val){
                // insert image to page
                $('#container').append('<img src="' + val + '/>');
            });
        });
    }
}

在你的按钮点击事件中:

nsfw = !nsfw;
// clear the image first if needed
$('#container').empty();
loadImage(nsfw);

2。另一种简单的方法,但不像#1

那么简单

你也可以只用一个 link 来做到这一点 returns 具有它的类型的图像列表,例如 nsfw 或其他东西。

注意:此方法仍然使用cookie

例如返回的列表是这样的:

[
    {"url": "some-image-1.jpg", "nsfw": "true"}, 
    {"url": "some-image-2.jpg", "nsfw": "false"}, 
    {"url": "some-image-3.jpg", "nsfw": "true"}, 
    {"url": "some-image-4.jpg", "nsfw": "false"}, 
    {"url": "some-image-5.jpg", "nsfw": "false"}, 
    {"url": "some-image-6.jpg", "nsfw": "true"}
]

那么你只要满足条件就渲染它。

function renderImage(nsfw){
    $.get('image-list-url', function(resp){
        list.forEach(function(val, key){
            if (nsfw || !val.nsfw){
                $('#container').append('<img src="' + val.url + '/>');
            }
        });
    });
}

以及许多其他太长无法解释的方法,例如使用 Angular、React 或 Vue

在重新加载或返回之间仍然使用 cookie,并且不考虑用户的年龄。

至于基于会话的方法,只有在需要验证用户年龄时才需要

也就是说,如果您的网站具有包含 DOB(出生日期)数据的会员功能,如果是这样,您可以使用@KScandrett 的回答

确认重新提交表单是因为您在成功提交表单后没有执行重定向。

查看此 wiki 页面,了解正确的操作方法。 https://en.wikipedia.org/wiki/Post/Redirect/Get