PHP MVC: Put Nerede dinamik JavaScript oluşturuldu

2 Cevap php

Çoğu PHP MVC sistemleri istemi belirli bir denetçi eylemine yönlendirilir ve sonra kontrolör görünümünde kullanılmak üzere değişken bir demet ayarlar bir deseni izleyin.

UI elemanları için dinamik HTML bir çok kullanan bir ajans / hizmetleri çalışma ortamında olduğunuzda, bu desenleri javascript bir sürü görünümü değişkenler ile oluşturulan yol açar

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

Bu çalışır, ben HTML, PHP ve JavaScript korkunç bir spagetti karışımı ile görüş yol buldum. Ayrıca tüm javascript dosyaları harici dahil edilmesi gerektiğini düşünüyor ön-uç geliştirici belli bir sınıfını rahatsız.

Yani, bu sorunla başa çıkmak için desenler / yöntemler nelerdir? Özellikle, bir PHP MVC çerçevesinde bir Javascript widget için bir veri varsayılan kümesi sağlamak istediğinizde, temiz ve modüler şeyler tutarken bunu nasıl yaparsınız? Hala yetenekli istemci tarafı geliştiricilere içeri çalışmak için bir işaretleme merkezli çevre verirken, burada ** modülerlik zorlayabilir sadece bir disiplin meselesi, ya da are there specific design patterns mi

2 Cevap

EDIT: Well you dont have to get that elaborate either you could simple have a php class/function that just proxies to ob_start/ob_get_clean and then stores the js somewhere then outputs the js elsewhere. you dont necessarily have to support or integrate the functionality of the library through php...

aşağıdaki gibi bir şey gibi basit somthing olabilir eğer:

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;
   }

}

ve sonra denetleyicisi: $js = UnobtrusiveJsHelper::getInstance();

ve görünümde:

<?php $js->captureStart(); ?>
  var myjsvariable = 0;
<?php $js->captureEnd();

and in your layout (assumign two-step view here): <?php echo isset($js) ? $js : null ?>


Bu sizin için bir yardımcıya ne kullanın. Örneğin Zend_Framework tüm bu küçük onLoad/Ready parçacıkları bir yığın eklenir. Sonra bir anda kafasına bir tek yerde tüm çıktıya vardır.

Ben de Symfony'de altında benzer bir şey yapar i Jq için kullanabileceğiniz özel bir yardımcım var.

Bu ben bu dökümü zaman $jq->setVar('myjsvar', 1); sonra ben gibi bir şey almak gibi şeyler için izin:

var myjsvar = 1; kafasına bir komut dosyası etiketi.

Bir ZendX_Jquery ve Zend_Dojo bakmak ve işlevsellik için iyi bir örnek kendi görünüm yardımcı dersleri almak.

Bu tartışma bir çok konuda en iyi uygulamaları. Dürüst olmak gerekirse, eğer < 100 satır, IMHO, ne yaptığını gayet iyi. Farklı bir yaklaşım sadece görünümünden işlevini çağırın ve (uygun varsayılan ile) böyle ayrı bir dosya olarak JS, sahip olmak istiyorsunuz:

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

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

Ayrıca Dojo gibi bazı jQuery çiftleşmiş eklentisi kullanabilirsiniz ancak genellikle kendi değer daha fazla sorun bulabilirsiniz.