【问题标题】:how to pass variable from zend framework to javascript/jquery?如何将变量从 zend 框架传递到 javascript/jquery?
【发布时间】:2010-04-10 09:42:18
【问题描述】:

如何将变量从 zf 传递到 javascript/jquery?

谢谢

【问题讨论】:

标签: javascript jquery ajax zend-framework


【解决方案1】:

您可以使用 Headscript View Helper 动态创建您的 javascript 它的功能如下:

<?php $this->headScript()->captureStart() ?>
var action = '<?php echo $this->baseUrl ?>';
$('foo_form').action = action;
<?php $this->headScript()->captureEnd() ?>

来源:ZF documentation

【讨论】:

  • 有人知道如何将属性添加到使用它创建的脚本中吗?根据我可以从文档中获得的内容,它将类似于以下内容,但似乎没有呈现... inlineScript()->captureStart("PREPEND", $type = ' text/javascript', $attrs = ["nonce" => "r@nd0m"]) ?>
  • 也试过了,$this->inlineScript()->captureStart("PREPEND", 'text/javascript', ["nonce" => "r@nd0m"])
  • 呃。看起来定义 captureStart 参数可能只存在于 headScripts 中。这太傻了。
【解决方案2】:
<?php
$this->view->foo = $foo;
?>

在你看来:

<script type="text/javascript">
var foo = <?=Zend_Json::encode($this->foo)?>;
</script>

【讨论】:

  • 我想将变量传递给 js 文件
  • 你可以在你的js文件中使用这个变量,只要在你的js文件被包含之前执行这段代码
  • 我会提取变量以保持 js 干净。在控制器中:$this-&gt;view-&gt;headScript()-&gt;appendScript('var_foo='.$foo); 和 js:var foo = _foo
【解决方案3】:

我知道这是一个老问题,但我相信其他人可以从中受益:

您可以使用 this extended HeadScript class 并将变量从控制器传递给 JavaScript,如下所示:

$this->view->headScript()->appendVar('dogName', 'Rocky')
                         ->appendVar('dogPictures', $pictures);

prependVarsetVaroffsetSetVar 也为方便起见提供。

【讨论】:

  • 嘿 Bogdan,我正在尝试使用它,但我得到“致命错误:在 /var/www/xxxx/zf2/2.2.2 中找不到类 'Application\View\Helper\HeadScript' /library/Zend/ServiceManager/AbstractPluginManager.php 第 170 行”。我觉得这是一个设置问题,但是我的应用程序模块类的 getViewHelperConfig 中有 HeadScript 指向 Application\View\Helper\HeadScript。此外,我必须将声明更改为 Application_View_Helper_HeadScript 类扩展 HeadScript 以消除找不到 Zend\View\Helper\HeadScript 的错误。有点新手,不知道下一步该做什么。
  • 终于用 autoload_classmap.php 加载它,但它说“prependVar”方法不存在。那我就放弃了。只需在我的视图中使用声明javascript变量的方法,然后附加javascript文件即可。
  • 很抱歉给您带来麻烦,@mutatron。此类与 Zend Framework 2 不兼容。对于仍在使用 Zend Framework 1 的任何人,我添加了proper installation steps
【解决方案4】:
<?php

class SomeController extends Zend_Controller_Action {
    public function indexAction() {
        // a file
        $this->view->headScript()->appendFile('yourJsFile.js');
        // inline script
        $message = 'hello!';
        $this->view->headScript()->appendScript("jQuery(function(){alert('$message');});");
    }
}

这要求您将echo $this-&gt;headScript() 添加到您的视图或布局脚本中。

【讨论】:

  • 如何在 js 文件中获取 $message,当我尝试在 js 文件中使用 $message 时出现错误未定义变量
  • 你不应该在你的 JS 中使用$message,它是一个 PHP 变量,在插入普通 JS 之前会被 PHP 解析。
【解决方案5】:

我知道这将是迟到的答案,并且我使用了@chelmertz 解决方案,但目前我遇到了一些问题。我在一个复杂的 UI 应用程序中工作,我的外部 javascript 文件中需要大量 php 数组和其他 json 对象。并且包含我的 js 脚本并不统一,所以每次如果我需要从 php 到 javascript 的一些东西,我必须检查整个东西,比如 ....

1) 我是否将 appendScript() 放置在正确的位置,以便 some.js 脚本会找到我定义的变量

2) 将传递给 appendScript() 的生成字符串是有效的 js 语法。 还有更多...

我专门为 Zend Framework 开发了另一种方法。 我在这里写了一个详细的教程 http://rupeshpatel.wordpress.com/2012/09/21/add-json-objects-arrays-and-variables-from-php-to-javascript/

总结:

1) 创建一个包含在标签中的通用视图文件,它检查一个属性(一个数组),比如说视图对象的 $this->jsVars 并定义 js 变量
这个视图文件的代码

<script>
<?php if(!empty($this->jsVars)){ ?>

<?php
foreach($this->jsVars as $var) {
if($var['type'] == 'json'){
?>
var <?php echo $var['name']?> = JSON.parse('<?php echo $var['value'];?>');
<?php } elseif($var['type'] == 'text'){ ?>
var <?php echo $var['name']?> = "<?php echo $var['value'];?>";
<?php }else{?>
var <?php echo $var['name']?> = <?php echo $var['value'];?>;
<?php
}}?>

<?php }?>

</script>

2) 在 echo $this-&gt;headScript() 之前的布局文件中呈现此视图,以便所有外部脚本都具有这些 js 变量

<?php
echo $this->render('index/include_js_vars.phtml'); // rendering view

                $this->headScript()->prependFile(JS_BASE_URL.'/jquery-1.7.2.min.js');
$this->headScript()->appendFile(JS_BASE_URL.'/jquery.blockUI.js');
$this->headScript()->appendFile(JS_BASE_URL.'/commonJS.js');
$this->headScript()->appendFile('http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js');

                echo $this->headScript();
?>

3) 将 php 数组或 json 对象附加到 $this->view->jsVars like

//在你的动作方法中

$test = array('mango','orange','banana');
$this->view->jsVars[] = array('name'=>'test','type'=>'json','value'=>json_encode($test));

现在test 将在您的任何脚本文件中定义为一个数组,无论您在什么情况下包含您的 js 文件。

【讨论】:

    【解决方案6】:

    我来到这里并尝试了所有答案,但没有一个对我有帮助,所以我最终做的是下一个(也许为时已晚,但可能对其他人有所帮助):

    在你想要将变量传递给 js 的控制器内部:

    public function someAction()
    {
        $var = array(
            'test' => 'phpVar',
            'test2' => 'phpVar2'
        );
    
        $this->view->jsVar = $var;
    }
    

    现在在您的布局中,在 head 标签内,在加载任何其他脚本之前执行以下操作:

    $this->headScript()->appendScript('var phpVars='.json_encode($this->jsVar));
    

    最后在你的js文件中,你就可以访问变量phpVars了:

    console.log(phpVars);
    

    您可以在控制台中看到:

    Object {test: "phpVar", test2: "phpVar2"}
    

    能够访问每个变量,例如 phpVars.testphpVars.test2

    现在您可以随时将变量从控制器传递到 js 文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-23
      • 1970-01-01
      • 2011-01-23
      • 1970-01-01
      • 2017-10-23
      • 2011-04-02
      • 2010-11-02
      • 2021-12-30
      相关资源
      最近更新 更多