【问题标题】:Best way to implement PHP constants in Javascript在 Javascript 中实现 PHP 常量的最佳方法
【发布时间】:2012-03-27 04:05:40
【问题描述】:

所以我正在使用 Codeignitor,并试图找出以一种简洁的可维护方式与我的 javascript 共享常量的最佳方法。

1) 在视图中,我可以像页脚一样呼出我的变量(yuuuck!) 2)我可以解析包含javascript模板的部分视图并将其注入我的视图(也许?) 3) 我可以动态创建一个像 myJavascript.js.php 这样的 javascript 文件并将其包含在我的标题中。

在 MVC 框架中将 PHP 实现为 JS 的最佳可维护方式是什么?

【问题讨论】:

    标签: php javascript model-view-controller codeigniter


    【解决方案1】:

    我知道就编程技能而言,它不是最好的,但最终它是我使用的并且它正在工作。简而言之:我将所有常量放在一个 xml 文件中,并且我有这个小脚本,它生成两个具有相同内容但语法不同的单独文件。我只是用我的价值观粘贴代码。如果它对任何人有用,我将非常乐意提供帮助。 xml 是最简单的;价值

    <?php
    define("GECOXML_PATH","../xml/geco.xml");
    define("PHP_GECO_FN","../.includes/geco.php");
    define("JS_GECO_FN","../js/geco.js");
    echo "********   GECO (GEnerate COnstants files for PHP and JS) **********<br>";
    echo "<br>";
    echo "         input xml file: ". GECOXML_PATH."<br>";
    echo "         output php file: ". PHP_GECO_FN."<br>";
    echo "         output js file: ". JS_GECO_FN."<br>";
    echo "********************************************************************<br>";
    
    $geco = (object)xmlParse(GECOXML_PATH);
    echo "<br>";
    echo "<br>";
    echo "************ PHP GECO ************* <br>";
    echo "<br>";
    $PHP =  gecoPHP($geco);
    echo "<br>";
    echo "<br>";
    echo "************** JS GECO ************<br>";
    echo "<br>";
    $JS = gecoJS($geco);
    writeFiles($PHP, $JS);
    
    //****** Functions *********
    
    function xmlParse ($url) {
            $fileContents= file_get_contents($url);
            $fileContents = str_replace(array("\n", "\r", "\t"), '', $fileContents);
            $fileContents = trim(str_replace('"', "'", $fileContents));
            return simplexml_load_string($fileContents);
        }
    
    function writeFiles($PHPcontent, $JScontent)
    {
                echo "<br> PhP ok:". file_put_contents(PHP_GECO_FN, $PHPcontent)  . "<br>";
                echo "<br> JS ok:" . file_put_contents(JS_GECO_FN, $JScontent) . "<br>";
    }
    
    function gecoPHP($gecoOBJ)
    {
        foreach ($gecoOBJ as $key => $value)
        {
            if (is_numeric(str_replace(" ","",$value)))
                {
                    $line = "define(\"" . $key . "\",". intval($value) .  ");\n";
                }
                else
                {
                    $line = "define(\"" . $key . "\",\"". $value .  "\");\n";
                }
            $phpContent = $phpContent . $line;
         echo $line."<br>";
        }
       return "<?php\n"$phpContent."?>";
    }
    
    function gecoJS($gecoOBJ)
    {
        foreach ($gecoOBJ as $key => $value)
        {
            if (is_numeric(str_replace(" ","",$value)))
                {
                    $line = "var " . $key . "=". $value . ";\n";
                }
                else
                {
                    $line = "var " . $key . "=\"". $value . "\";\n";
                }
            $JSContent =  $JSContent . $line;
        echo $line."<br>";
        }
       return $JSContent;
    }
    ?>
    

    【讨论】:

    • 格式化时出现问题:所以 xml:
    【解决方案2】:

    为了让我的变量得到很好的包装,我使用了一个 JSON 对象——这样我就不会遇到编码、斜杠、必须手动更新我添加的每个变量的 JavaScript...

    $variables_to_view['js_variables']['var_name'] = $var_name;
    

    然后将其传递给视图

    php_variables = <?php echo json_encode($js_variables) ?>;
    alert(php_variables.var_name);
    

    【讨论】:

      【解决方案3】:

      您可以创建 php 文件。 类似 script.js.php?outfor=1;

       <?php
        header("Content-type:text/javascript"); //can be application/javascript.
       ?>
      
       ABC = <?php echo $abc?>
       CBA = <?php echo $cba?>
       BAC = <?php echo $bac?> //and so on.
      

      一些附加信息。 如果您在函数中使用“var”,则该变量将仅在该函数中可见,而没有“var”则表示全局变量。

      所以。

      function abc() 
      {
        var a = 1; //only in abc()
        b=2;  //global
      }
      

      【讨论】:

        【解决方案4】:

        你可以像这样使用短标签:

        例如: 你想在 js 中使用 $abc 变量,那么你需要在 js 中写这个

        var abc = <?=$abc?>;
        

        【讨论】:

        • 即使是常规的 php 标签和 echo 也可以工作......这是 OP 问题中的选项 1)
        • 可以,但我更喜欢这种方式,因为它更方便使用
        【解决方案5】:

        在脚本标签中回显变量似乎没有任何问题。事实上,像 BackboneJS 这样的框架是 encouraging 你这样做是为了处理你需要传递给客户端代码的数据。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-16
          • 1970-01-01
          • 2014-09-16
          • 1970-01-01
          • 2010-10-14
          相关资源
          最近更新 更多