PHP MVC: где разместить динамически генерируемый Javascript - PullRequest
3 голосов
/ 11 января 2010

Большинство систем PHP MVC следуют шаблону, в котором запрос направляется на конкретное действие контроллера, а затем контроллер устанавливает набор переменных для использования в представлении.

Когда вы находитесь в рабочей среде агентства / службы, которая использует много динамического HTML для элементов пользовательского интерфейса, этот шаблон приводит к большому количеству JavaScript, генерируемому с переменными представления

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

Хотя это работает, я обнаружил, что это приводит к просмотрам с ужасной смесью спагетти HTML, PHP и Javascript. Это также оскорбляет некоторый класс фронтенд-разработчиков, которые считают, что весь javascript должен быть включен во внешние файлы.

Итак, каковы ваши модели / практики для решения этой проблемы? В частности, если вы хотите предоставить набор данных по умолчанию для виджета Javascript в среде PHP MVC, как вы это делаете, сохраняя при этом чистоту и модульность? Это просто вопрос дисциплины, или существуют ли особые шаблоны проектирования , которые могут навязать здесь модульность **, в то же время предоставляя талантливым разработчикам на стороне клиента среду для работы с разметкой.

Ответы [ 2 ]

3 голосов
/ 11 января 2010

EDIT : Что ж, вам не нужно разбираться в этом, либо вы можете просто иметь класс / функцию php, который просто проксирует ob_start / ob_get_clean, а затем сохраняет js где-то и выводит js в другом месте. вам не обязательно поддерживать или интегрировать функциональность библиотеки через php ...

если что-то может быть так просто, как что-то вроде следующего:

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();

и по вашему мнению:

<?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 и их соответствующие классы помощников вида для хорошего примера функциональности.

0 голосов
/ 12 января 2010

Большая часть этой дискуссии посвящена лучшим практикам. Честно говоря, если <100 строк, ИМХО, то, что вы делаете, хорошо. Другой подход состоит в том, чтобы просто вызвать функцию из представления и получить js в качестве отдельного файла, например, (с соответствующими значениями по умолчанию): </p>

<script src='/js/widgets.js'></script>

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

Вы также можете использовать шаблонный плагин jQuery, например, Dojo, но часто я нахожу больше проблем, чем его ценность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...