Apa perbedaan antara JHtml: script () dan $ doc-> addScript?

10

Saya mengembangkan modul baru-baru ini yang membutuhkan file JS dan CSS tertentu untuk disuntikkan ke dalam <head>setiap halaman. Awalnya, saya menggunakan:

$doc =& JFactory::getDocument();
$doc->addScript(JURI::base(true).'/modules/mod_x/js/mod_x.js');

Namun, saya perhatikan bahwa ketika caching diaktifkan, situs memuat versi cached dari /cachedan versi non-cache /modules/mod_x/js/, yang menyebabkan kesalahan JS.

Ketika saya mengubah ini menjadi:

JHtml::script(Juri::base().'modules/mod_x/js/mod_x.js');

Script dimuat hanya sekali, dari cache, menyelesaikan kesalahan ini.

Saya membaca dalam dokumen bahwa addScriptmetode ini lebih 'rendah' ​​daripada JHtml:scriptmetode, tetapi lebih dari mengatakan bahwa ...

Tentu saja, Anda juga perlu kode secara manual beberapa langkah [bahwa script JHtml: lakukan untuk Anda] yang akan dilakukan secara otomatis menggunakan [JHtml: metode script] di atas [jika Anda menggunakan addScript].

... tidak ada detail lebih lanjut yang diberikan.

Jadi apa bedanya? Saya berasumsi JHtml:scriptakhirnya memanggil addScriptobjek dokumen di beberapa titik, tetapi apakah langkah perantara lain diambil terlebih dahulu?

tangan coding
sumber
4
Saya telah menulis ulang sedikit dokumen joomla untuk mencoba dan memperbaruinya - lihat apakah itu lebih masuk akal sekarang?
George Wilson
1
@ GeorgeWilson Dokumen Joomla benar-benar meningkat baru-baru ini. Terima kasih :)
TryHarder
Pertanyaan terkait tentang stylesheet: joomla.stackexchange.com/q/10062/5239
Flimm

Jawaban:

8

JHtml::scriptmemiliki logika tambahan yang disertakan. Lihat http://api.joomla.org/cms-3/classes/JHtml.html#method_script untuk referensi API

Secara default akan mendeteksi pengaturan debug dan browser yang digunakan dan memuat skrip yang cocok. Misalnya ketika debug diaktifkan, ia akan memuat versi file yang tidak terkompresi jika ada.

Ada pengaturan opsional yang memungkinkan untuk mengganti file pada level template dan hal-hal lain.

Michael Babker menulis panduan yang baik cara menggunakan JHtml::script()untuk memungkinkan penggantian: http://www.babdev.com/blog/139-use-the-media-folder-allow-overridable-media

Berfungsi dalam repo untuk referensi: https://github.com/joomla/joomla-cms/blob/staging/libraries/cms/html/html.php#L659

Halaman dokumen resmi yang sekarang diperbarui oleh George: http://docs.joomla.org/J3.3:Adding_JavaScript_and_CSS_to_the_page

Bakual
sumber
2
Terima kasih atas jawabannya. Referensi API cukup singkat - apakah ada penjelasan yang lebih komprehensif tentang efek detect_browser dan detect_debug, dan ketika Anda mengatakan 'pengaturan opsional' dan 'hal-hal lain' apakah ini didokumentasikan di mana saja?
kode tangan
Saya telah menambahkan tautan ke artikel oleh Michael yang menjelaskan bagian override. Adapun bagian debug dan browser, saya tidak berpikir ada dokumentasi. Anda harus membaca kode untuk itu.
Bakual
1
Jadi jika ada file js terkompresi dan terkompresi misalnya dan debug aktif maka akan memuat nama file-uncompressed.js dan hanya nama file.js ketika debug dimatikan. Untuk peramban saat debug off, ia mencari nama file-browser.js, lalu nama file-browser-browserversion.js, dll.
George Wilson
2
Ini adalah jawaban yang retak - terima kasih @Bakual dan @GeorgeWilson!
coding tangan
1
Jangan lupa bahwa JHtml juga dapat menambahkan MD5sum dari skrip atau stylesheet ke cache-bust.
Flimm
4

dalam dua kata:

  • JHtml::script() - memungkinkan Anda untuk mengganti skrip tertentu (kecuali yang sudah dilampirkan pada JDocument), tergantung dari beberapa faktor (lihat jawaban @Bakual);
  • $doc->addScript() - melampirkan skrip langsung ke dokumen, tanpa memeriksa penggantian;

Jika Anda adalah pengembang ekstensi, maka sangat disarankan digunakan JHtml::script()saat Anda menambahkan skrip. Ini akan memungkinkan pengguna Anda menimpa beberapa skrip tertentu, tergantung dari apa yang mereka inginkan.
Juga ada metode serupa untuk css.

Fedik
sumber