Załaduj js w stopce w Magento

12
<reference name="footer">
    <action method="addItem">
        <type>skin_js</type>
        <file>js/fabric/tool/controller_tool.js</file>
    </action>
</reference>

Użyłem powyższego kodu, aby załadować js w stopce. Ale Magento rzuca błąd Like

Niepoprawna metoda Mage_Page_Block_Html_Footer :: addItem (Array ([0] => skin_js [1] => js / fabric / tool / controller_tool.js))

Muszę załadować js w stopce. Jak rozwiązać ten problem.

Vivek Aasaithambi
źródło

Odpowiedzi:

8

Obecnie blok stopki Magento nie został zaprojektowany do dodawania skryptów javascript.

Próbowałem jakiś czas temu refaktoryzując Magento i blok stopki, aby załadować każdy JS w stopce zamiast nagłówka, ale sposób, w jaki wywołanie JS jest wywoływane w szablonach, bardzo utrudnia to działanie.

Moją propozycją rozwiązania problemu jest zaktualizowanie układu w następujący sposób:

<reference name="before_body_end">
    <block type="core/template" name="controller_tool_javascript" template="fabric/tool/controller_tool_js.phtml"/>
</reference>

Utwórz fabric/tool/controller_tool_js.phtmlplik w folderze szablonów z następującym kodem:

<script type="text/javascript" src="<?php echo $this->getSkinUrl('js/fabric/tool/controller_tool.js') ?>"></script>

Daj mi znać, czy działa.

Raphael at Digital Pianism
źródło
11

Stopka nie ma tych funkcji, tylko headrobi, ponieważ ten blok jest typu, page/html_headktóry przechowuje te metody.

Możesz to osiągnąć, umieszczając <script src=...></script>znacznik JS w szablonie ( .phtmlpliku) i dołączając go jako core/templateblok:

<reference name="footer">
    <block type="core/template" name="fabric_controller_tool_js" template="fabric/controller_tool_js.phtml" />
</reference>

Możesz także dodać go przez core/textblok:

<reference name="footer">
    <block type="core/text" name="fabric_controller_tool_js">
         <action method="setText">
             <text><![CDATA[<script src="/js/fabric/tool/controller_tool.js"></script>]]></text>
         </action>
    </block>
</reference>
7ochem
źródło
2

Chcę tylko powiedzieć, dlaczego addItemnie pracowaćreference name="footer"

Kiedy użyjesz reference name="footer", wywoła ten blok

<block type="page/html_footer" name="footer" as="footer" template="page/html/footer.phtml"> 

które znajdziesz page.xmlw swoim motywie.

oznacza to, że sprawdzi addItemmetodę / funkcję w tej klasie bloków lub w ich klasie nadrzędnej, ale tej funkcji nie ma, dlatego nie będzie działać i wygeneruje wyjątek.

Murtuza Zabuawala
źródło
2

<reference name="footer">w moim przypadku nie działa. Znalazłem bardziej odpowiedni blok dla js o nazwie js:

<reference name="js">
    <block type="core/text" name="fabric_controller_tool_js">
        <action method="setText">
            <text><![CDATA[<script src="/js/fabric/tool/controller_tool.js"></script>]]></text>
        </action>
    </block>
</reference>

Lub za pomocą oddzielnego szablonu. ścieżka: design / adminhtml / default / default / template / sales / order / js.phtml:

<reference name="js">
    <block type="core/template" name="fabric_controller_tool_js" template="sales/order/js.phtml" />
</reference>
Ruslan Mavlyanov
źródło
1

Użyłem innej metody, aby osiągnąć to, co możesz osiągnąć. Zamiast przekręcać ramię magento, po prostu DOMContentLoadedładuję skrypt do głowy, ale ustawiam detektor zdarzeń (nie obsługiwany w ie8), który wykonuje moje zadania.

app / design / frontend / base / default / layout / namespace_module.xml

<?xml version="1.0" encoding="UTF-8"?>
<layout version="0.0.1">
  <default>
    <reference name="head">
      <action method="addJs">
        <script>NameSpace/Module/entry.js</script>
      </action>
    </reference>
  </default>
</layout>

app / code / community / NameSpace / Module / etc / config.xml

<?xml version="1.0" encoding="UTF-8"?>
<config>
  <modules>
    <NameSpace_Module>
      <version>0.0.1</version>
    </NameSpace_Module>
  </modules>
  <frontend>
    <layout>
      <updates>
        <module>
          <file>namespace_module.xml</file>
        </module>
      </updates>
    </layout>
  </frontend>
</config>

js / NameSpace / Module / entry.js

document.addEventListener("DOMContentLoaded", function(event) {
  // do something
});
Benny Powers
źródło
1

Możesz dodać nowy blok w page.xml

<block type="core/text_list" name="before_body_end" as="before_body_end" translate="label">
    <block type="page/html_head" name="footerjscss" as="footerjscss" after="-" template="page/html/footerjscss.phtml"/>
</block>

następnie dodaj pliki JS i CSS w dowolnym pliku layout.xml

<reference name="footerjscss">
    <action method="addItem"><type>skin_js</type><name>js/slideshow.js</name></action>
    <action method="addItem"><type>skin_css</type><name>css/madisonisland.css</name><params/><if/></action>
</reference>

Utwórz plik .phtml na stronie / html / footerjscss.phtml i dodaj następujące

<?php echo $this->getCssJsHtml() ?>

Teraz wywołaj blok w szablonie strony „3columns.phtml” itd., Musisz wyprowadzić ten blok przed tagiem:

<?php echo $this->getChildHtml('before_body_end') ?>

Sprawdź kod tutaj: http://blog.rahuldadhich.com/magento-load-css-js-footer/

Rahul Dadhich
źródło