如何将变量从zend框架传递到javascript / jquery?

时间:2010-04-10 09:42:19

标签: javascript jquery ajax zend-framework

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

感谢

6 个答案:

答案 0 :(得分:5)

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

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

来源:ZF documentation

答案 1 :(得分:2)

<?php
$this->view->foo = $foo;
?>

在您看来:

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

答案 2 :(得分:2)

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

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

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

prependVarsetVaroffsetSetVar也是为了方便起见。

答案 3 :(得分:1)

<?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->headScript()添加到视图或布局脚本中。

答案 4 :(得分:1)

我知道这将是迟到的答案,而且我使用过@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)创建一个包含在tag中的公共视图文件,它检查一个属性(一个数组),让我们说$ this-&gt; 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->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-&gt; view-&gt; jsVars like

//在您的操作方法中

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

现在test将在您的任何脚本文件中定义为数组,无论您在哪个实例中包含了js文件。

答案 5 :(得分:0)

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

在控制器内部,您要将变量传递给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文件。