【问题标题】:php session variable updated by select box to show/hide div's of different languagesphp会话变量由选择框更新以显示/隐藏不同语言的div
【发布时间】:2013-12-21 05:55:50
【问题描述】:

首先,为这个问题的简单性道歉,但这超出了我的技能水平,我已经完成了我的研究,我不能再盯着它了。

我正在构建一个需要 3 种不同语言(英语、西班牙语和葡萄牙语)的网站,这些语言是通过右侧栏上的“选择”输入来选择的。我有一个显示/隐藏相关 div onchange 的 js 函数,但是当我离开页面时会话变量消失了。我也不确定如何在更改页面时获取保存的显示/隐藏 div 以保持状态。所有页面都使用一个调用 session_start() 的标题模板

选择框码:

<div id="languageSelect">
<?php
$_SESSION['language'] = $_POST['languageDropdown'];
?>
<form method="post" action="<?php echo $PHP_SELF;?>">
    <select name="languageDropdown" id="languageDropdown" class="languageDropdown" onchange="selectLanguage();submit();">
        <option name="English" value="English" <?php if (($_SESSION['language'] == '') || ($_SESSION['language'] == 'English')) echo 'selected="selected"'; ?>>English</option>
        <option name="Español" value="Español" <?php if ($_SESSION['language'] == 'Español') echo 'selected="selected"'; ?>>Español</option>
        <option name="Português" value="Português" <?php if ($_SESSION['language'] == 'Português') echo 'selected="selected"'; ?>>Português</option>
    </select>
    </form>
</div>

Javascript代码sn-p(成功改变当前页面的语言)

    function selectLanguage() {
if (document.getElementById('languageDropdown').selectedIndex == 0){
    $('#nav-en').show();
    $('#content-en').show();
    $('#nav-es').hide();
    $('#content-es').hide();
    $('#nav-pt').hide();
    $('#content-pt').hide();
}

我尝试解决问题的方法是在提交会话变量时让选择框保持其选项()然后让 javascript 函数读取在页面加载时仍选择哪个选项并显示/隐藏相关div 的,但还没有这样的运气。

$(function(){

if (document.getElementById('languageDropdown').selectedIndex == 0){
    $('#nav-en').show();
    $('#content-en').show();
    $('#nav-es').hide();
    $('#content-es').hide();
    $('#nav-pt').hide();
    $('#content-pt').hide();
}
if (document.getElementById('languageDropdown').selectedIndex == 1){
    $('#nav-en').hide();
    $('#content-en').hide();
    $('#nav-es').show();
    $('#content-es').show();
    $('#nav-pt').hide();
    $('#content-pt').hide();
}
if (document.getElementById('languageDropdown').selectedIndex == 2){
    $('#nav-en').hide();
    $('#content-en').hide();
    $('#nav-es').hide();
    $('#content-es').hide();
    $('#nav-pt').show();
    $('#content-pt').show();
}
});

我对 php 还很陌生,但我已经完成了我的研究,所以任何帮助都将不胜感激。

【问题讨论】:

  • “会话变量消失”是什么意思? $_SESSION['language'] = $_POST['languageDropdown'] - 也许这一行在不是发布请求时进行评估并将会话变量设置为空?
  • @vbo 很抱歉这里含糊不清。我在用于测试会话变量的几页上有回声。 在我换页之前,它会显示“语言为:英语”。此时它恢复为“语言是:”
  • 好的。那么会话变量赋值呢?看起来它必须被if ($_POST)包围。
  • @vbo 你能详细说明一下吗?你是说 if ($_POST) {$_SESSION['language'] = $_POST['languageDropdown'];} 吗?
  • 是的。当您更改会话变量时,您的代码中只有一个位置。无论如何尝试调试它何时被调用并分配什么值。

标签: javascript php drop-down-menu session-variables


【解决方案1】:

您可以使用以下代码创建另一个脚本update-language.php

<?php 

session_start();
$_SESSION['language'] = $_GET['languageDropdown'];

?>

然后,在您的 javascript 中(使用 jQuery,看起来您正在部分使用),您可以编写:

jQuery(function($){
    $("#languageDropdown").change(function(){
        $.get("update-language.php",{languageDropdown:$(this).val()});
    });
});

这不会像您尝试的那样重新加载页面,但它会加载新脚本,该脚本将更新会话变量,以便当页面重新加载时它会识别新选择的语言。

jQuery 中的$.get() 命令将通过 AJAX 加载脚本,因此您不需要刷新页面。

这是我测试过的完整代码:

index.php

<?php session_start(); 
if($_SESSION['language'] == '') $_SESSION['language'] = "English";
?>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Change Language</title>
    </head>
    <body>

            <div id="languageSelect">
                <p>Your current language is:
                    <select name="languageDropdown" id="languageDropdown" class="languageDropdown">
                <option name="English" value="English" <?php if ($_SESSION['language'] == 'English') echo 'selected="selected"'; ?>>English</option>
                <option name="Español" value="Español" <?php if ($_SESSION['language'] == 'Español') echo 'selected="selected"'; ?>>Español</option>
                <option name="Português" value="Português" <?php if ($_SESSION['language'] == 'Português') echo 'selected="selected"'; ?>>Português</option>
                  </select>
                </p>
            </div>

            <nav id="nav-en" <?php if ($_SESSION['language'] != 'English') echo 'style="display:none"'; ?>><a href="#link">English Navigation</a></nav>
            <nav id="nav-es" <?php if ($_SESSION['language'] != 'Español') echo 'style="display:none"'; ?>><a href="#link">Español Navigation</a></nav>
            <nav id="nav-pt" <?php if ($_SESSION['language'] != 'Português') echo 'style="display:none"'; ?>><a href="#link">Português Navigation</a></nav>

            <section id="content-en" <?php if ($_SESSION['language'] != 'English') echo 'style="display:none"'; ?>>
                <h1>English Content</h1>
            </section>
            <section id="content-es" <?php if ($_SESSION['language'] != 'Español') echo 'style="display:none"'; ?>>
                <h1>Español Content</h1>
            </section>
            <section id="content-pt" <?php if ($_SESSION['language'] != 'Português') echo 'style="display:none"'; ?>>
                <h1>Português Content</h1>
            </section>

            <script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
      <script type="text/javascript">
      jQuery(function($){

        $("#languageDropdown").change(function(){

            //update the language session
            $.get("update-language.php",{languageDropdown:$(this).val()});

            //change the current interface language
            $("#content-en, #content-es, #content-pt, #nav-en, #nav-es, #nav-pt").hide();
            if($(this).val() == "English")
                $("#content-en, #nav-en").show();
            else if($(this).val() == "Español")
                $("#content-es, #nav-es").show();
            else if($(this).val() == "Português")
                $("#content-pt, #nav-pt").show();

        });

      });
      </script>

    </body>
</html>

update-language.php

<?php 

session_start();
$_SESSION['language'] = $_GET['languageDropdown'];

?>

有更简单的方法可以构建像这样的小型语言系统,但这完全是另一个讨论。希望此解决方案适合您的需求和您已有的代码。

【讨论】:

  • 感谢您的回复,我已经实现了您的解决方案,但回显显示没有会话变量。我完全没有使用 Ajax 的经验。我很高兴以最简单的方式实现这一点,因为该网站不太可能增加其复杂性。我只需要获取会话变量以在页面之间保持其值,然后我就可以从那里找出它。
  • 很抱歉,您无法得到最初的答案。根据我的建议,我提供了一些完整的(工作)代码,应该可以在上面编辑的答案中解决问题。
  • 非常感谢斯科特的努力。我能够在没有 ajax 的情况下实现一个凌乱的解决方案,但我肯定会得到这个工作。非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多