【问题标题】:Mixing php and javascript - should we use json here?混合 php 和 javascript - 我们应该在这里使用 json 吗?
【发布时间】:2012-06-15 20:24:51
【问题描述】:

考虑到以下代码被剪断:

if('<?= Yii::app()->controller->action->id?>' == 'create'){
 $("#Event_name").focusout(function(){
  $.ajax({
    success: function(html)
    {
     type: 'get',
     url: '<?php echo $this->createUrl('related'); ?>'

这行得通。但... 这是一种正确的做法吗?我宁愿一侧有 php,另一侧有 javascript,这有意义吗?

谁能给我一个例子,说明如果正确完成,这样的事情会是什么样子?

【问题讨论】:

    标签: php javascript json yii


    【解决方案1】:

    我对您使用的框架不是很熟悉,但如果您将变量从控制器传递到您的视图会更好:

    控制器:

    ...
    $action_id = Yii::app()->controller->action->id;
    $created_url = $this->createUrl('related'); //$this might not be in context here
    
    $this->render('your_view_name', array('action_id'=>$action_id, 'created_url'=>$created_url));
    ...
    

    查看:

    if('<?= $action_id ?>' == 'create'){
     $("#Event_name").focusout(function(){
      $.ajax({
        success: function(html)
        {
         type: 'get',
         url: '<?= $created_url ?>'
    

    【讨论】:

    • “最好将变量从控制器传递到视图” - 请问为什么?我确实在这里和那里读了很多,但我不确定为什么这是最佳实践。 (我接受任何带有去阅读文本的链接。;))
    • 这可能是最接近您正在寻找的东西。即使您使用 JSON,您仍然需要 PHP 在您的 js 代码中设置变量。前任。 var params = = json_encode(array('action_id'=>$action_id, 'created_url'=>$created_url))?>,那么在你的js中,你可以这样做: if (params.action_id == 'create') ...
    • @MEM - 将变量传递给您的视图,以便清楚地将控制器与视图分开(尽可能),您会看到,如果您在视图中执行此操作,您只需要知道什么正在显示,不用担心它的值背后的逻辑(因为它在控制器中),除此之外,它是可读的
    【解决方案2】:

    是的,您应该使用 JSON。这样您就不必担心字符串中间的引号或&lt;/script&gt;

    if(<?= json_encode(Yii::app()->controller->action->id) ?> == 'create'){
       ...
         url: <?php echo json_encode($this->createUrl('related')); ?>
    

    【讨论】:

    • 所以我们在 javascript 中有 php 标签这一事实不是我们应该避免的。这是自然的吗?
    • 可以接受。只需确保使用 JSON,以便发出 JavaScript 文字。
    【解决方案3】:

    就个人而言,我建议将该条件移到您的控制器中。很简单,可以用PHP处理,不需要在模板中检查那个方程。

    我对 Yii 不是很熟悉,不过可以改写如下:

    $action_id = Yii::app()->controller->action->id;
    $params = array();
    if ($action_id == 'action') {
        $created_url = $this->createUrl('related'); //$this might not be in context here
        $params['handler'] = $this->render('yourhandler.tpl.php', array('created_url'=>$created_url));
    }
    $this->render('your_view_name', $params);
    

    【讨论】:

      【解决方案4】:

      CJavaScript::encode() 是你的人,它是传递变量和数组,甚至将字符串从 PHP 转义到 JavaScript 的好方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多