2012-03-28 9 views
5

Estoy tratando de insertar archivos JS en la vista, pero se están insertando en el orden incorrecto.

En mi default.ctp tengo este

$this->Html->script(array(
    'https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js', 
    'global' 
), array('inline'=>false)); 

echo $this->fetch('script'); 

En mi opinión tengo esto:

$this->Html->script('jquery.fancybox.pack', array('inline' => false)); 

Pero cuando veo la fuente que sale de esta manera:

<script type="text/javascript" src="/js/jquery.fancybox.pack.js"></script> 
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> 
<script type="text/javascript" src="/js/global.js"> 

Que obviamente es el orden incorrecto, por lo que el complemento jQuery no funciona.

¿Qué estoy haciendo mal?

Respuesta

6

En general, hago eco de los scripts necesarios en el diseño (en lugar de agregarlos al búfer) y luego el script block (scripts almacenados en el búfer) después. Esto garantiza que los scripts necesarios para cada vista se repitan primero. Su default.ctp sería algo como esto en su lugar:

// get echoed immediately 
echo $this->Html->script(array(
    'https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js', 
    'global' 
)); 
// everything else from the view, echoed after 
echo $this->fetch('script'); 

O bien, puede especificar un bloque especial para las secuencias de comandos anteriores.

echo $this->Html->script(array(
    'https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js', 
    'global' 
), array('block' => 'firstScripts'); 
echo $this->fetch('css'); 
echo $this->fetch('firstScripts'); 
echo $this->fetch('script'); 
+0

Esto es lo que tenía al principio, pero realmente me gustó poner todo en '$ this-> fetch ('script');' porque se aseguraba de que todo el CSS fuera primero, luego todo JS. No es un CSS, un JS, un CSS, etc. – 472084

+0

¿No son css y scripts en diferentes bloques? ¿Y no puedes asignarlos a bloques de todos modos? http://book.cakephp.org/2.0/en/views.html#using-blocks-for-script-and-css-files – jeremyharris

+0

Lo que quise decir es que si hace eco de CSS en línea en su vista, estará debajo del JS en el diseño, y estoy tratando de mantener todo el CSS primero --- Los bloques funcionan muy bien pero el problema que tengo es que los archivos JS agregados en la vista se agregan antes que los archivos JS en el diseño, por lo que no puedes tener jQuery en el diseño y los complementos específicos en cada vista, ya que los complementos estarán por encima de la llamada jQuery. – 472084

2

No estoy seguro de cuánto tiempo invirtió en la construcción de su sistema actual, pero puede intentar usar un ayudante hierarchical resource loader, en lugar del CakePHP estándar.

El cargador de recursos estándar lamentablemente no tiene forma de ocuparse de las dependencias entre diferentes archivos y simplemente los carga en el orden en que los proporciona (la vista se analiza antes del diseño).

+0

Gracias, es una pena que se analizan en este orden, de lo contrario no existiría este problema. – 472084

0

Utilice esto en la sección de la cabeza.

Html->script('jquery-1.11.1.js') ?>
fetch('script') ?>