Новости Joomla

0 Пользователей и 1 Гость просматривают эту тему.
  • 14 Ответов
  • 4136 Просмотров
*

Danxil

  • Осваиваюсь на форуме
  • 22
  • 0 / 0
На сайте есть два модуля, у них файлах входа добавляется script в head следующим способом
1 модуль:
Код
$doc =& JFactory::getDocument();
$doc->addScriptDeclaration('
{{Содержимое1}}
');
2 модуль:
Код
$doc =& JFactory::getDocument();
$doc->addScriptDeclaration('
{{Содержимое2}}
');
Когда из этих модулей включен только один, то все ок. Скрипт добавляется в голову и все работает. Но если включены оба модуля, то содержимое addScriptDeclaration('{{содержимое}}'); обоих модулей добавляется в один и тот же тег <script>, те в HTML получается вот такое:
Код
<script type="text/javascript">

{{Содержимое1}}

{{Содержимое2}}

  </script>
И при этом работает только один из модулей. Я так понимаю происходит это из-за того, что как только было добавлено и отработано содержимое из первого модуля,  скрипт считается отработаным и добавление содержимого из второго модуля его уже не волнует. Вопрос - как добавлять в голову, из точек входа модулей скрипты так, что бы они добавлялись раздельными тегами ? Только не пишите про element.appendChild(script) и т.д. интересует как это сделать правильно.
« Последнее редактирование: 27.01.2014, 22:53:30 от Danxil »
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
скриптам без разницы поместите вы их в один тег или в сотню разных!
У вас ошибка в логике скрипта, что бы понять что у вас не так нужно видеть скрипты или сайт..
и вы неправильно понимаете принцип работы! Все что вы добавляете в addScriptDeclaration собирается при рендеренге шаблона, можете считать что они одновременно выводятся в <script>
« Последнее редактирование: 27.01.2014, 23:54:49 от Istaan »
*

Danxil

  • Осваиваюсь на форуме
  • 22
  • 0 / 0
скриптам без разницы поместите вы их в один тег или в сотню разных!
У вас ошибка в логике скрипта, что бы понять что у вас не так нужно видеть скрипты или сайт..
и вы неправильно понимаете принцип работы! Все что вы добавляете в addScriptDeclaration собирается при рендеренге шаблона, можете считать что они одновременно выводятся в <script>

Вот содержимое первого скрипта:
Код
$doc =& JFactory::getDocument();
$doc->addScriptDeclaration('
jQuery(document).ready(function($)
{
if (!$(document).bxSlider)
{
var script = document.createElement("script");

script.type = "text/javascript";

script.onload = function()
{
$("#slider__list_' . $id_sfx . '").bxSlider(
{
mode: "fade",
responsive: true,
useCSS: false,
nextText: "",
prevText: "",
pager: false,
auto: true,
autoHover: true,
pause: 5000,
randomStart: true,
});
};

script.src = "' . JURI::root(). 'modules/mod_danxil-slider/js/jquery.bxSlider.min.js";

$("head")[0].appendChild(script);
}
});
');

Второго скрипта:
Код
$doc =& JFactory::getDocument();
$doc->addScriptDeclaration('
jQuery(document).ready(function($)
{
if (!$(document).bxSlider)
{
var script = document.createElement("script");

script.type = "text/javascript";

script.src = "' . JURI::root(). '/modules/mod_ext_jshopping_slider_products/assets/js/jquery.bxSlider.min.js";

$("head").append(script);
}

$("#slider__list_' . $id_sfx . '").bxSlider(
{
responsive: true,
useCSS: false,
nextText: "",
prevText: "",
pager: false,
auto: true,
autoHover: true,
pause: 5000,
randomStart: true,
});
});
');

Вот сайт - http://danxil.bget.ru/

Причем если скрипты добовлять не в голову через addScriptDeclaration(); а просто вывести их в представлении вместе с контентом модуля - все работает.
*

Danxil

  • Осваиваюсь на форуме
  • 22
  • 0 / 0
Эврика! Заменил во втором скрипте $("head").append(script); на $("head")[0].appendChild(script); и добавил $("#slider__list_' . $id_sfx . '").bxSlider(); в обработчик script.onload, в общем как и в первом скрипте, и все заработало! Интересно почему так, вообще один чел писал, что при append-е скрипта jquery создает синхронный аякс-запрос, возможно из-за этого конфликт с джумловскими процессами ...
*

Danxil

  • Осваиваюсь на форуме
  • 22
  • 0 / 0
Задам еще один вопрос. Сейчас
Код
script.src = "' . JURI::root(). '/modules/mod_ext_jshopping_slider_products/assets/js/jquery.bxSlider.min.js";

$("head").append(script);

выполняются асинхронно в обоих модулях и из-за этого нивелируется проверка if (!$(document).bxSlider) т.к. даже если плагин bxSlider был загружен из первого модуля - он не успевает загрузится, поэтому этого срабатывает условие if (!$(document).bxSlider) и во втором модуле и оттуда снова загружается этот плагин плагин, в итоге загружены два одинаковых файла, как можно избежать этого ?
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Danxil, ты не вкурил, про асинхронные запросы
Когда вставляешь скрипт через $doc->addScriptDeclaration(''); экранируй \$
и чего не решился параметры через data инициализировать
Код: javascript
script.async = 1;
script.src = "http://твой сайт/modules/mod_ext_jshopping_slider_products/assets/js/jquery.bxSlider.min.js";
window.document.body.appendChild(script);
*

Danxil

  • Осваиваюсь на форуме
  • 22
  • 0 / 0
Danxil, ты не вкурил, про асинхронные запросы
Когда вставляешь скрипт через $doc->addScriptDeclaration(''); экранируй \$
и чего не решился параметры через data инициализировать
Код: javascript
script.async = 1;
script.src = "http://твой сайт/modules/mod_ext_jshopping_slider_products/assets/js/jquery.bxSlider.min.js";
window.document.body.appendChild(script);

Разве скрипт вставленный после загрузки страницы, по умолчанию не асинхронно загружается ? Параметры через data не передаю т.к. если будет 10 модулей, то для каждого цикл будет по 10 раз крутится, в итоге 100 итераций, и плюс нужно для каждого элемента проверять создан ли в нем уже слайдер. Что где экранировать? Покажи на примере
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
какой цикл о чем ты это оптимальная инициализация множества параметров, посмотри на Bootstrap
скрипт вставленный после загрузки страницы где ты после загрузки вставлял, ты вставлял в head,
я же привел код, чтобы вставлять перед </body>
Цитировать
плюс нужно для каждого элемента проверять создан ли в нем уже слайдер
это о чем, слайдер ты к разметке цепляешь
Код: javascript
$doc->addScriptDeclaration("
jQuery(document).ready(function(\$)
{
if (!\$(document).bxSlider)
с экранироованием проглядел, нужно если код в " таких кавычках
это пример из gk4 проверяет подключен ли уже скрипт
Код: php-brief
$doc = JFactory::getDocument();
// generate keys of script section
$headData = $doc->getHeadData();
$headData_keys = array_keys($headData["scripts"]);
// set variable for false
$engine_founded = false;
// searching phrase mootools in scripts paths
if(array_search('https://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js', $headData_keys) > 0) {
$engine_founded = true;
}
*

Danxil

  • Осваиваюсь на форуме
  • 22
  • 0 / 0
Цитировать
это пример из gk4 проверяет подключен ли уже скрипт
Код: php-brief
$doc = JFactory::getDocument();
// generate keys of script section
$headData = $doc->getHeadData();
$headData_keys = array_keys($headData["scripts"]);
// set variable for false
$engine_founded = false;
// searching phrase mootools in scripts paths
if(array_search('https://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js', $headData_keys) > 0) {
$engine_founded = true;
}

Сработало бы если бы я подключал плагин с внешнего репозитория, а так я могу проверить только - сайт/modules/модуль1/assets/js/jquery.bxSlider.min.js а если там уже есть сайт/modules/модуль2/assets/js/jquery.bxSlider.min.js я из модуля 1 ничего об этом не узнаю. Или можно как то искть любые значения оканчивающиеся на /jquery.bxSlider.min.js ?

Цитировать
скрипт вставленный после загрузки страницы где ты после загрузки вставлял, ты вставлял в head,
я же привел код, чтобы вставлять перед </body>

вставлял то я в хеад, но вставлял то в jQuery(document).ready(function($) {
Код
jQuery(document).ready(function($)
{
if (!$(document).bxSlider)
{
var script = document.createElement("script");

script.type = "text/javascript";

script.src = "' . JURI::root(). '/modules/mod_ext_jshopping_slider_products/assets/js/jquery.bxSlider.min.js";

$("head").append(script);

Зачем его вставлять перед </body> ? Я же его специально хеад вставляю, скрипты ведь должне быть в хеаде

Цитировать
какой цикл о чем ты это оптимальная инициализация множества параметров, посмотри на Bootstrap

Ок, допустим есть 3 <ul> с data-id="{{id модуля или рандомное значение из js}}", по онлоаду документа должен выполняется выше приведенный скрипт, который должен создать создать слайдер в соответствующей ему ul. Т.е. что то типа

Модуль 1:
Код
$("{{селектор ul-ки1}}").bxSlider(inputData1);

Модуль 2:
Код
$("{{селектор ul-ки2}}").bxSlider(inputData2);

Модуль 3:
Код
$("{{селектор ul-ки3}}").bxSlider(inputData3);

Что должно быть в {{селектор ul-ки}} ??
« Последнее редактирование: 28.01.2014, 02:51:47 от Danxil »
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
делаем один модуль и многократно его используем
когда в админке ты создаешь модуль то используешь уже готовый модуль, при этом файлы не копируются, в базу заносятся только параметры модуля. Поэтому откуда возьмется модуль2
вот как выглядит подключение твоего скрипта
Код: php-brief
$doc = JFactory::getDocument();
$headData = $doc->getHeadData();
$jspath = JURI::root().'modules/mod_ext_jshopping_slider_products/assets/js/jquery.bxSlider.min.js'
$headData_keys = array_keys($headData["scripts"]);
$loadjs = false;
if(array_search($jspath, $headData_keys)!= false) $loadjs = true;
if(!$loadjs) $doc->addScript($jspath);
<ul class="slider" data-id="modid" data-param1="1">
$("ul.slider") в котором ты прочитаешь атрибуты дата и инициализируешь параметры
*

Danxil

  • Осваиваюсь на форуме
  • 22
  • 0 / 0
$("ul.slider") в котором ты прочитаешь атрибуты дата и инициализируешь параметры

Если так то к моменту выполнения $("ul.slider").bxSlider(); У меня в документе будут три ul с классом slider т.е. такой код $("ul.slider") вернет массив всех этих ul с классом slider, а мне нужно что бы он обратился к конкретной ul

делаем один модуль и многократно его используем
когда в админке ты создаешь модуль то используешь уже готовый модуль, при этом файлы не копируются, в базу заносятся только параметры модуля. Поэтому откуда возьмется модуль2
вот как выглядит подключение твоего скрипта
Код: php-brief
$doc = JFactory::getDocument();
$headData = $doc->getHeadData();
$jspath = JURI::root().'modules/mod_ext_jshopping_slider_products/assets/js/jquery.bxSlider.min.js'
модуль2 это может быть вообще другой модуль, например виджет социальной сети, в котором использовался jquery.bxSlider.min.js
« Последнее редактирование: 28.01.2014, 10:58:14 от Danxil »
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
а мне нужно что бы он обратился к конкретной ul  в цикле это будет this тебе это уже показывал
http://learn.javascript.ru/play/Sgpguc
Цитировать
модуль2 это может быть вообще другой модуль
то есть ты хочешь своим модулем запретить другому скрипт использовать, а он еще одну букву в имени файла может поменять и получит тот же функционал и еще повторный вызов $doc->addScript($jspath); подключит только один раз скрипт, так что проверка не нужна
*

Danxil

  • Осваиваюсь на форуме
  • 22
  • 0 / 0
а мне нужно что бы он обратился к конкретной ul  в цикле это будет this тебе это уже показывал
Ну вот то очем я и писал еще на том форуме - у меня есть 3 экземпляра модуля, 3 <ul> на странице, в каждом экземпляре будет срабатывать
Код
$('selector').each(function(){ 
  $(this).bxSlider();
})
т.е. по 3 итерации цикла в каждом экземпляре модуля, всего выходит 9 итераций - 9 обращений к dom-дереву. Вопрос зачем нужны эти циклы, если можно обратится напрямую $("#slider__list_' . $id_sfx . '").bxSlider(); ??

то есть ты хочешь своим модулем запретить другому скрипт использовать, а он еще одну букву в имени файла может поменять и получит тот же функционал и еще повторный вызов $doc->addScript($jspath); подключит только один раз скрипт, так что проверка не нужна

Нет, я хочу запретить своему модулю загружать скрипт, если этот скрипт уже загружен из других модулей.
*

Danxil

  • Осваиваюсь на форуме
  • 22
  • 0 / 0
Попробовал создать 3 модуля с добавлением скрипта через #doc->addscript() b и правда добавляет только 1 экземпляр скрипта без проверки ...
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
так и не понял, тебе нужен один скрипт который будет обрабатывать все ul.slider
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Вставка кода вызова модуля в тело шаблона другого модуля

Автор Dorfman

Ответов: 15
Просмотров: 1747
Последний ответ 19.11.2018, 21:45:54
от beliyadm
Проблема с модулем после переноса с локалки на хостинг

Автор master-smeta

Ответов: 8
Просмотров: 2239
Последний ответ 15.11.2018, 16:34:46
от master-smeta
Как выполнить 2 разных скрипта в одном ajax-запросе?

Автор fbr

Ответов: 16
Просмотров: 1275
Последний ответ 02.03.2018, 00:08:04
от robert
Нужна помощь в доработке модуля под Joomla 3

Автор kik84

Ответов: 5
Просмотров: 2278
Последний ответ 30.01.2018, 22:40:30
от Елeна
Соединить два скрипта

Автор vipiusss

Ответов: 2
Просмотров: 875
Последний ответ 22.10.2016, 11:28:45
от vipiusss