2012-08-13 13 views
5

Należy dodać warunkowo i programowo plik JS wewnątrz pliku bloku. Próbowałem z tymi kodami:Jak dodać JS programowo w Magento?

if (Mage::getStoreConfig('mymodule/settings/enable')) { 
$this->getLayout()->getBlock('head')->addJs('path-to-file/file1.js'); 
} else { 
$this->getLayout()->getBlock('head')->addJs('path-to-file/file2.js'); 
} 

Jednak niezależnie od ustawień, żaden z plików nie jest załadowany. Próbowałem nawet wyeliminować warunek i jawnie załadować tylko jeden plik, ale nadal nie działa. Co tutaj zrobiłem źle?

+1

Czy instrukcja warunkowa działa na proste echo/drukowanie? –

+0

Dziękuję Alanowi za odpowiedź. Tak, warunkowe daje 0 lub 1, jeśli wykonam echo. Jednak starałem się wyeliminować całe linie poza jedną linią: $ this-> getLayout() -> getBlock ('head') -> addJs ('path-to-file/file1.js'); Ale nadal nie działa. Ścieżka jest po katalogu głównym js. – user1576748

+1

Z jakiego pliku szablonu bloku wchodzisz? –

Odpowiedz

18

Problem jest prawdopodobnie jednym z rzędu przetwarzania. Domyślam się, że twój kod PHP jest oceniany po wyrenderowaniu bloku głównego. Podczas gdy twój kod pomyślnie aktualizuje instancję klasy bloków czołowych, dzieje się to po wygenerowaniu danych wyjściowych z tej instancji.

Lepszym rozwiązaniem będzie dodanie wywołań addJs() w układzie XML, tak aby były przetwarzane przed renderowaniem. Byłoby miło, gdyby był atrybut ifnotconfig, ale na razie możesz użyć pomocnika.

Utwórz klasę pomocniczą za pomocą metody, która zwraca ścieżkę skryptu w oparciu o ustawienia konfiguracji, a następnie użyj jej jako argumentu powrotu.

<?php 
class My_Module_Helper_Class extends Mage_Core_Helper_Abstract 
{ 
    public function getJsBasedOnConfig() 
    { 
     if (Mage::getStoreConfigFlag('mymodule/settings/enable')) { 
      return 'path-to-file/file1.js'; 
     } 
     else { 
      return 'path-to-file/file2.js'; 
     } 
    } 
} 

Następnie w układzie XML:

<?xml version="1.0"?> 
<layout> 
    <default> 
     <reference name="head"> 
      <action method="addJs"> 
       <file helper="classgroup/class/getJsBasedOnConfig" /> 
       <!-- i.e. Mage::helper('module/helper')->getJsBasedOnConfig() --> 
      </action> 
     </reference> 
    </default> 
</layout> 
+0

Świetnie! ! Działa, z wyjątkiem błędu literowego w kodzie na linii "Jeśli" Nie ma niepotrzebnego zamkniętego wspornika przed nawinięciem zwiniętym W każdym razie, bardzo dziękuję – user1576748

+1

Niebezpieczeństwa związane z (1) nie testowaniem i (2) kodowanie podczas jet-lagged. Poprawiono :-) – benmarks

3
$this->getLayout()->getBlock('head')->addJs('path'); 

To właściwy kod, wyszukaj, czy Twoja ścieżka jest właściwa.

+0

Dziękuję za odpowiedź. Tak, ścieżka jest właściwa. Jest to względne w stosunku do folderu głównego js. Próbowałem nawet skopiować mój plik js do tego katalogu głównego js (bez podfolderu) i uzyskać do niego bezpośredni dostęp, podobnie jak to addJs ('file1.js'); – user1576748

+0

Spróbuj wpisać kod: getJsUrl(); ?> jsFile.js "i zobacz jaki kod pisze .xml addjs jest taki sam. – Guerra

+1

Co jeśli chcesz dodać przykład ścieżki bezwzględnej http://somedomain.com/js/some.js – awavi

1

Znam ten został poproszony dawno temu, ale w przypadku ktoś szuka tego, chciałbym zaproponować, aby to wykorzystać w swojej local.xml:

<layout> 
    <default> 
     <reference name="head"> 
      <action ifconfig="path/to/config" method="addJs"> 
       <script>pathto/file.js</script> 
      </action> 
     </reference> 
    </default> 
</layout> 

Oczywiście dotyczy to plików JS znajdujących się w katalogu/js /. Użyj odpowiedniej metody, jeśli chcesz dodać skin_js lub skin_css.

PS. Przetestowano na CE 1.9

Powiązane problemy