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

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
уже обсуждалось, знаю, но не смог найти топик.
В разработке несколько модулей, где будет подключаться скрипт, используемый во всех этих модулях. Если подключать скрипт во всех модулях, будет конфликт.
Как проверить, подключался ли данный скрипт уже или нет?
*

SmokerMan

  • Гуру
  • 5293
  • 720 / 26
Re: Проверить, подключен ли скрипт
« Ответ #1 : 01.09.2014, 20:12:47 »
можно подключить через
Код
JFactory::getDocument()->addScript($url)
тогда он будет подключаться один раз
или тупо через константу можно
Код
if (!defined('LOAD_SCRIPT')) {
    define('LOAD_SCRIPT', true);
    //подключаем скрипт
}
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
интернет-блог: http://websiteprog.ru
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: Проверить, подключен ли скрипт
« Ответ #3 : 01.09.2014, 20:22:06 »
http://php.net/manual/ru/function.require-once.php
Это для php-скриптов, а у меня js

можно подключить через
Код
JFactory::getDocument()->addScript($url)
тогда он будет подключаться один раз
или тупо через константу можно
Код
if (!defined('LOAD_SCRIPT')) {
    define('LOAD_SCRIPT', true);
    //подключаем скрипт
}
addScript($url) в каждом модуле подключает несколько копий скрипта.
Про константы не догнал
*

SmokerMan

  • Гуру
  • 5293
  • 720 / 26
Re: Проверить, подключен ли скрипт
« Ответ #4 : 01.09.2014, 20:33:19 »
Про константы не догнал
что там догонять?
проверяем определена или нет константа
если не определена, то задаем ее и подключаем скрипт
если определена, то ничего не делаем

а по поводу addScript($url), то не должен он по идее подключать одинаковые файлы
« Последнее редактирование: 01.09.2014, 20:42:44 от SmokerMan »
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: Проверить, подключен ли скрипт
« Ответ #5 : 01.09.2014, 21:16:32 »
Решил подключить 1 раз в шаблоне. Не самый верный вариант, но все модули под конкретный сайт с конкретным шаблоном, в частном случае прокатит.
Более универсализированное решение еще потестирую позже.
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: Проверить, подключен ли скрипт
« Ответ #7 : 01.09.2014, 22:10:27 »
Вспомнил, что все подключенные скрипты находятся в JFactory::getDocument()->_scripts :
Спойлер
[свернуть]
По сути, просто проверить, включен ли скрип в массив, если нет - подключаем.
Вот только в массиве хранятся относительные или полные пути, а мне надо только имя файла проверить, in_array() сработает или полный перебор массива делать придется? или array_search()?
*

capricorn

  • Завсегдатай
  • 1949
  • 118 / 3
Re: Проверить, подключен ли скрипт
« Ответ #8 : 01.09.2014, 22:30:13 »
как вы собираетесь проверить на стороне сервера, загрузку клиентского java скрипта? Извините, если я что-то не понял.

может вам использовать cookie для проверки загрузки?
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Re: Проверить, подключен ли скрипт
« Ответ #9 : 01.09.2014, 22:35:02 »
Ну вобще проверять то надо ключи, поэтому вам эти функции не подойдут. А еще модули вроде бы испольняются после исполнения кода шаблона, так что если проверять подключение скрипта в шаблоне вполне возможно его там на тот момент еще не будет.
интернет-блог: http://websiteprog.ru
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: Проверить, подключен ли скрипт
« Ответ #10 : 01.09.2014, 22:39:14 »
как вы собираетесь проверить на стороне сервера, загрузку клиентского java скрипта? Извините, если я что-то не понял.

может вам использовать cookie для проверки загрузки?
А откуда грузятся скрипты, если не с сервера? Выполняются они на стороне клиента, но их список формируется на сервере.

Ну вобще проверять то надо ключи, поэтому вам эти функции не подойдут. А еще модули вроде бы испольняются после исполнения кода шаблона, так что если проверять подключение скрипта в шаблоне вполне возможно его там на тот момент еще не будет.
Нет, такую проверку хочу сделать в каждом модуле, ибо модулей на 1 странице минимум 2 планируется.
Да, шаблон грузится раньше модулей, вышеприведенный список скриптов получен в модуле до момента загрузки скриптов, значит они подгружены вместе с шаблоном.
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: Проверить, подключен ли скрипт
« Ответ #11 : 01.09.2014, 22:40:46 »
Уже проверил, что и in_arra() и array_search() не ищут по подстроке, а еще они не ищут в массиве массивов, что имеет место быть. Остается только прямой перебор.
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Re: Проверить, подключен ли скрипт
« Ответ #12 : 01.09.2014, 22:59:57 »
Уже проверил, что и in_arra() и array_search() не ищут по подстроке, а еще они не ищут в массиве массивов, что имеет место быть. Остается только прямой перебор.
Вообще то есть поиск по ключам ещё... http://php.net//manual/ru/function.array-key-exists.php
*

capricorn

  • Завсегдатай
  • 1949
  • 118 / 3
Re: Проверить, подключен ли скрипт
« Ответ #13 : 01.09.2014, 23:02:04 »
Цитировать
А откуда грузятся скрипты, если не с сервера? Выполняются они на стороне клиента, но их список формируется на сервере.

Да, но вам ничего не даст эта проверка на предмет загрузки скрипта клиенту.

Цитировать
Вот только в массиве хранятся относительные или полные пути, а мне надо только имя файла проверить

Вы только имя php скрипта можете проверить, который расположен на сервере, средствами php.

У вас задача какая-то странная. Посмотрите, как осуществляется загрузка скриптов разработчиками шаблонов. Вряд-ли у вас что-то новое.

Даже если вопрос как перебрать массив - у вас там что 100000 элементов? Вам не все равно как его перебрать7
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: Проверить, подключен ли скрипт
« Ответ #14 : 01.09.2014, 23:12:46 »
isset($search_array['caption.js'])) - возвращает false, поскольку ищем только имя файла, а не весь путь.
array_key_exists('caption.js', $doc->_scripts) - тоже false.
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Re: Проверить, подключен ли скрипт
« Ответ #15 : 01.09.2014, 23:14:21 »
У вас задача какая-то странная. Посмотрите, как осуществляется загрузка скриптов разработчиками шаблонов. Вряд-ли у вас что-то новое.
Ничего странного нет просто вы не поняли задачу..
могу вам объяснить на пальцах:
есть например два модуля mod_slider и mod_news, у каждого модуля в папке лежит скрипт например slider.js
в модуле mod_slider подрубаем скрип JFactory::getDocument()->addScript('/modules/mod_slider/slider.js')
и в модуле mod_news подрубаем скрип JFactory::getDocument()->addScript('/modules/mod_news/slider.js')

в итоге в <head> видим подключенный /modules/mod_slider/slider.js и /modules/mod_news/slider.js скрипты абсолютно одинаковы, и могут пойти косяки..

Единственный вариант в модуле при каждом подрублении скриптов сделать перебор массива и если там нет скрипт slider.js то подрубать...
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Re: Проверить, подключен ли скрипт
« Ответ #16 : 01.09.2014, 23:15:48 »
isset($search_array['caption.js'])) - возвращает false, поскольку ищем только имя файла, а не весь путь.
array_key_exists('caption.js', $doc->_scripts) - тоже false.
Да ищет полный путь, нужно выполнить полный перебор всех ключей массива
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: Проверить, подключен ли скрипт
« Ответ #17 : 01.09.2014, 23:18:36 »
Единственный вариант в модуле при каждом подрублении скриптов сделать перебор массива и если там нет скрипт slider.js то подрубать...
Вот в этом-то сейчас и проблема...

Да ищет полный путь, нужно выполнить полный перебор всех ключей массива
Не знаю, как. Пробовал различные варианты, не получилось.
*

capricorn

  • Завсегдатай
  • 1949
  • 118 / 3
Re: Проверить, подключен ли скрипт
« Ответ #18 : 01.09.2014, 23:20:01 »
Вы идете по неправильному пути, как разработчик. На этом разговор предлагаю окончить.

Цитировать
у каждого модуля в папке лежит скрипт например slider.js

Это детский сад. Не смешно?
« Последнее редактирование: 01.09.2014, 23:23:57 от capricorn »
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: Проверить, подключен ли скрипт
« Ответ #19 : 01.09.2014, 23:21:51 »
Код: php
function IsInArray($array, $findme) {
  foreach ($array as $key=>$value) {
    print_r($value.'<br />');
    if (strpos($value, $findme)!= false) return true;
  }
  return false;
}
print_r выводит только 7 строчек Array и все
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Re: Проверить, подключен ли скрипт
« Ответ #20 : 01.09.2014, 23:34:18 »
Это детский сад. Не смешно?
Простите но вы ведете себя точно как в детском саду, очень часто есть случаи что в нескольких модулях используется одинаковый абсолютно скрипт, делать перелинковку из одного модуля в другой не вариант, ибо в любой момент пользователь может удалить неиспользуемый модуль!
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Re: Проверить, подключен ли скрипт
« Ответ #21 : 01.09.2014, 23:34:56 »
Код: php
function IsInArray($array, $findme) {
  foreach ($array as $key=>$value) {
    print_r($value.'<br />');
    if (strpos($value, $findme)!= false) return true;
  }
  return false;
}
if (strpos($key, $findme)!= false) return true;

Код: php
function checkInArray( $checkKey )
{
$script = JFactory::getDocument()->_scripts;
foreach ( $script as $key => $script ) {
if ( strpos( $key, $checkKey )!== false ) return true;
}
return false;
}

var_dump( checkInArray( 'jquery' ) );
« Последнее редактирование: 01.09.2014, 23:42:24 от Istaan »
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: Проверить, подключен ли скрипт
« Ответ #22 : 01.09.2014, 23:42:36 »
if (strpos($key, $findme)!= false) return true;
Блин, я их постоянно местами путаю, $key и $value :) Работает:
Код: php
function IsInArray($array, $findme) {
  foreach ($array as $key=>$value) {
    if (strpos($key, $findme)!= false) return true;
  }
  return false;
}

$scriptname = 'script.js';
if (!IsInArray($doc->_scripts, $scriptname))
  $doc->addScript('/media/'.$module_name.'/js/'.$scriptname);
Решено.
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Re: Проверить, подключен ли скрипт
« Ответ #23 : 01.09.2014, 23:48:59 »
Решено.
Я бы сделал так:
Код: php
function appendScript( $scriptPath )
{
$scripts = JFactory::getDocument()->_scripts;
foreach ( $scripts as $key => $script ) {
if ( strpos( $key, basename( $scriptPath ) )!== false ) return;
}
JFactory::getDocument()->addScript( $scriptPath );
}

appendScript( '/test/my_script.js' );
appendScript( '/tes3t/my_script.js' );
appendScript( '/test/my_script.js' );
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: Проверить, подключен ли скрипт
« Ответ #24 : 01.09.2014, 23:57:00 »
Можно и так, эффективно, когда много скриптов, но когда проверки требует всего 1, делать проверку на все уже не эффективно, имхо. Да, ничего не значащие ms, но все же.
Вообще у меня встал вопрос с подключением jquery.validate.min.js, модули грузятся через {loadmodule ... } в материалах и их от 2 до 5, и все - заказы различные... Бред, но шеф сказал: надо! вот и [далее межнациональная емкая лексика].
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Re: Проверить, подключен ли скрипт
« Ответ #25 : 02.09.2014, 01:02:06 »
AlekVolsk, на самом то деле ничего страшного не произойдет если вы подключите скрипт еще раз. Он возьмется из кеша и перезагрузит функционал.
SmokerMan, вам предложил оптимальные решения.
Еще есть одно когда вы самим js проверяете наличие какой либо функции и ли переменной и при ее значении undefined загружаете скрипт
Пример
Код: javascript
    <script>
      if (typeof foo !== "function") {
        //if (window.perem ==  undefined){
        var script = document.createElement("script");
        script.src = 'http://code.jquery.com/jquery-1.9.1.js';
        document.head.appendChild(script);
      }
    </script>
Или воспользоватся библиотекой Js для автоматической подзагрузки скриптов
К  примеру моей. Попиарюсь  :laugh:
Js для автоматической загрузки CSS и js файлов. А также для подзагрузки чего либо в кеш.
С функцией кеширования.  http://jsfiddle.net/vlasenkofedor/5pDXf/
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Re: Проверить, подключен ли скрипт
« Ответ #26 : 02.09.2014, 01:37:02 »
Можно и так, эффективно, когда много скриптов, но когда проверки требует всего 1, делать проверку на все уже не эффективно, имхо.
Вообще то это тоже самое что у вас, только меньше кода и универсальнее..
*

almika

  • Захожу иногда
  • 325
  • 27 / 0
Re: Проверить, подключен ли скрипт
« Ответ #27 : 20.03.2015, 08:37:29 »
Добрый день!
Тоже встретилась с такой проблемой. Метод
Код
if (!defined('LOAD_SCRIPT')) {
    define('LOAD_SCRIPT', true);
    //подключаем скрипт
}
очень симпатичный, но вот такая проблема:
Размещаю несколько одинаковых модулей в несуществующие позиции, каждый опубликован, показывать - для всех меню.
Вывожу потом в нужной статье через loadposition нужные модули.
На другой странице, где не загружаю эти модули, они всё равно рендерятся, хотя и не отображаются (для проверки - error_log(defined('MYJS_LOADED'), 0); в helper.php модуля). А в том единственном модуле, который выводится в существующей позиции проверка defined даёт 1, и, соответственно, скрипты для него не грузятся.
Думаю, что и методы перебора такое же дадут.
Правильно работает, если задавать для модулей в несуществующих позициях только пункт меню, к которому статья привязана, но это не вариант, если кто-то другой будет использовать модуль.
Методы с динамической подгрузкой JS, насколько я понимаю, все грузят в head? Пока я в параметрах модуля позволяю указать - в head или в body.
Подскажите, как лучше сделать - оставить дубли скриптов или добавить параметр в модуль - типа "тонкая настройка для продвинутых", при котором будет запускаться анализ (как сейчас работает), а если что-то у пользователя не пойдёт, то он сможет просто выключить её и тогда будут дубли скриптов, или попробовать что-то ещё?
Прошу ваших советов.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Не работает JQuery хотя он подключен

Автор dm-krv

Ответов: 3
Просмотров: 639
Последний ответ 05.03.2019, 21:22:13
от dm-krv
Не работает JS скрипт

Автор vitaliybalayan

Ответов: 2
Просмотров: 749
Последний ответ 21.12.2017, 15:49:45
от dmitry_stas
[Решено] Не работает скрипт на странице Joomla 3

Автор Mick_20

Ответов: 5
Просмотров: 1635
Последний ответ 17.11.2016, 17:01:28
от Mesuti
Как на джава скрипте проверить наличие класса?

Автор Sergey2

Ответов: 9
Просмотров: 1054
Последний ответ 15.06.2016, 19:25:26
от Sergey2
Передать ссылку в скрипт

Автор denism300

Ответов: 3
Просмотров: 1062
Последний ответ 27.02.2016, 12:40:03
от Aleks.Denezh