首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP :动态生成Javascript的地方

PHP :动态生成Javascript的地方
EN

Stack Overflow用户
提问于 2010-01-11 19:38:07
回答 2查看 2.3K关注 0票数 3

大多数PHP系统遵循这样一种模式,即将请求路由到特定的控制器操作,然后控制器设置一组变量以便在视图中使用。

当您在一个对UI元素使用大量动态HTML的代理/服务工作环境中时,这种模式将导致使用视图变量生成大量的javascript

代码语言:javascript
复制
<script type="text/javascript">
    jQuery(document).ready(function(){
        $('#ui-element).init(
            {
                'param1':<?=$this->param1;?>,
                'param2':<?=$this->param2;?>,                   
            }
        );
    });
</script>

虽然这是可行的,但我发现它会导致视图与HTML、PHP和Javascript的可怕的意大利面混在一起。它还冒犯了一类前端开发人员,他们认为所有的javascript都应该包含在外部文件中。

那么,您处理这个问题的模式/实践是什么呢?具体来说,当您想在PHP框架中为Javascript小部件提供默认数据集时,如何在保持整洁和模块化的同时做到这一点?这仅仅是一个纪律问题,还是,是否有特定的设计模式可以在这里强制模块化**,同时仍然为有才华的客户端开发人员提供了一个以标记为中心的工作环境。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-01-11 19:54:53

编辑:好吧,您不需要这么详细,您也可以简单地拥有一个php类/函数,它只需代理ob_start/ob_ get _,然后将js存储在某处,然后输出其他地方的js。您不必通过php支持或集成库的功能.

如果有些事情可能很简单,如下所示:

代码语言:javascript
复制
class UnobtrusiveJsHelper {
  protected static $_instance;
  protected $_js = array();
  protected $_ready = array();

  public static function getInstance()
  {
  }

  public static function setInstance(UnobtrusiveJsHelper $instance)
  {
  }

  public function captureStart($key = null)
  {
    if(null !== $key)
    {
      $this->_js[$key] = null;
    }
    ob_start();
  }

  public function captureEnd($key = null)
  {
    if(null !== $key)
    {
      $this->_js[$key] = ob_get_clean();
      return;
    }
    $this->_js[] = ob_get_clean();

   public function __toString()
   {
      return $this->dumpJs() . $this->_dumpReady();
   }

   public function dumpJs(array $attributes = null)
   {
      if(!empty($this->_js))
      {
         return "<script type=\"text/javascript\">". implode("\n", $this->_js) . "</script>";
      }

      return null;
   }

   public function dumpReady(array $attributes = null)
   {
      if(!empty($this->_js))
      {
         return '<script type="text/javascript">$(document).ready(function(){'. implode("\n", $this->_js) . '});</script>';
      }

      return null;
   }

}

然后在控制器中:$js = UnobtrusiveJsHelper::getInstance();

在你看来:

代码语言:javascript
复制
<?php $js->captureStart(); ?>
  var myjsvariable = 0;
<?php $js->captureEnd();

在您的布局中(这里有两个步骤的视图):<?php echo isset($js) ? $js : null ?>

这就是你使用帮手的目的。例如,在Zend_Framework中,所有这些小onLoad/Ready片段都被添加到堆栈中。然后,它们在头上的一个地方被一次性排出。

我为jQ使用了一个特殊的助手,它也在Symfony下执行类似的操作。

这些允许类似于$jq->setVar('myjsvar', 1);的内容,然后当我转储它时,会得到如下内容:

var myjsvar = 1;在一个脚本标签中的头部。

看看ZendX_Jquery和Zend_Dojo以及它们各自的视图助手类,看看这个功能的一个很好的例子。

票数 3
EN

Stack Overflow用户

发布于 2010-01-11 23:05:26

很多讨论都是关于最佳实践的。老实说,如果< 100行,IMHO,你做的是好的。另一种方法是从视图中调用函数,并将js作为单独的文件,如下所示(具有适当的默认值):

代码语言:javascript
复制
<script src='/js/widgets.js'></script>

<script type="text/javascript">
    jQuery(document).ready(function(){
         showSomeWidget(<?=$this->name ?> , <?=$this->place ?> );
    }
</script>

您也可以使用一些像Dojo这样的jQuery模板插件,但是我经常发现比它更有价值的麻烦。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2044396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档