Форум русской поддержки Joomla!® CMS
06.12.2016, 22:02:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1]   Вниз
  Добавить закладку  |  Печать  
Автор

Проверить, подключен ли скрипт

 (Прочитано 1553 раз)
0 Пользователей и 1 Гость смотрят эту тему.
AlekVolsk
Профи
********

Репутация: +316/-3
Offline Offline

Пол: Мужской
Сообщений: 6457



« : 01.09.2014, 20:04:25 »

уже обсуждалось, знаю, но не смог найти топик.
В разработке несколько модулей, где будет подключаться скрипт, используемый во всех этих модулях. Если подключать скрипт во всех модулях, будет конфликт.
Как проверить, подключался ли данный скрипт уже или нет?
Записан
SmokerMan
Профи
********

Репутация: +694/-25
Offline Offline

Пол: Мужской
Сообщений: 5225



« Ответ #1 : 01.09.2014, 20:12:47 »

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

Репутация: +168/-3
Offline Offline

Пол: Мужской
Сообщений: 1538


« Ответ #2 : 01.09.2014, 20:13:20 »

http://php.net/manual/ru/function.require-once.php
Записан
AlekVolsk
Профи
********

Репутация: +316/-3
Offline Offline

Пол: Мужской
Сообщений: 6457



« Ответ #3 : 01.09.2014, 20:22:06 »

Это для php-скриптов, а у меня js

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

Репутация: +694/-25
Offline Offline

Пол: Мужской
Сообщений: 5225



« Ответ #4 : 01.09.2014, 20:33:19 »

Про константы не догнал
что там догонять?
проверяем определена или нет константа
если не определена, то задаем ее и подключаем скрипт
если определена, то ничего не делаем

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

Репутация: +316/-3
Offline Offline

Пол: Мужской
Сообщений: 6457



« Ответ #5 : 01.09.2014, 21:16:32 »

Решил подключить 1 раз в шаблоне. Не самый верный вариант, но все модули под конкретный сайт с конкретным шаблоном, в частном случае прокатит.
Более универсализированное решение еще потестирую позже.
Записан
capricorn
Живу я здесь
******

Репутация: +86/-0
Offline Offline

Сообщений: 1413


« Ответ #6 : 01.09.2014, 21:49:31 »

http://stackoverflow.com/questions/4545878/how-to-know-if-php-script-is-called-via-require-once
Записан
AlekVolsk
Профи
********

Репутация: +316/-3
Offline Offline

Пол: Мужской
Сообщений: 6457



« Ответ #7 : 01.09.2014, 22:10:27 »

Вспомнил, что все подключенные скрипты находятся в JFactory::getDocument()->_scripts :
Показать текстовый блок
По сути, просто проверить, включен ли скрип в массив, если нет - подключаем.
Вот только в массиве хранятся относительные или полные пути, а мне надо только имя файла проверить, in_array() сработает или полный перебор массива делать придется? или array_search()?
Записан
capricorn
Живу я здесь
******

Репутация: +86/-0
Offline Offline

Сообщений: 1413


« Ответ #8 : 01.09.2014, 22:30:13 »

как вы собираетесь проверить на стороне сервера, загрузку клиентского java скрипта? Извините, если я что-то не понял.

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

Репутация: +168/-3
Offline Offline

Пол: Мужской
Сообщений: 1538


« Ответ #9 : 01.09.2014, 22:35:02 »

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

Репутация: +316/-3
Offline Offline

Пол: Мужской
Сообщений: 6457



« Ответ #10 : 01.09.2014, 22:39:14 »

как вы собираетесь проверить на стороне сервера, загрузку клиентского java скрипта? Извините, если я что-то не понял.

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

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

Репутация: +316/-3
Offline Offline

Пол: Мужской
Сообщений: 6457



« Ответ #11 : 01.09.2014, 22:40:46 »

Уже проверил, что и in_arra() и array_search() не ищут по подстроке, а еще они не ищут в массиве массивов, что имеет место быть. Остается только прямой перебор.
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #12 : 01.09.2014, 22:59:57 »

Уже проверил, что и in_arra() и array_search() не ищут по подстроке, а еще они не ищут в массиве массивов, что имеет место быть. Остается только прямой перебор.
Вообще то есть поиск по ключам ещё... http://php.net//manual/ru/function.array-key-exists.php
Записан
capricorn
Живу я здесь
******

Репутация: +86/-0
Offline Offline

Сообщений: 1413


« Ответ #13 : 01.09.2014, 23:02:04 »

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

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

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

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

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

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

Репутация: +316/-3
Offline Offline

Пол: Мужской
Сообщений: 6457



« Ответ #14 : 01.09.2014, 23:12:46 »

isset($search_array['caption.js'])) - возвращает false, поскольку ищем только имя файла, а не весь путь.
array_key_exists('caption.js', $doc->_scripts) - тоже false.
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #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
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #16 : 01.09.2014, 23:15:48 »

isset($search_array['caption.js'])) - возвращает false, поскольку ищем только имя файла, а не весь путь.
array_key_exists('caption.js', $doc->_scripts) - тоже false.
Да ищет полный путь, нужно выполнить полный перебор всех ключей массива
Записан
AlekVolsk
Профи
********

Репутация: +316/-3
Offline Offline

Пол: Мужской
Сообщений: 6457



« Ответ #17 : 01.09.2014, 23:18:36 »

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

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

Репутация: +86/-0
Offline Offline

Сообщений: 1413


« Ответ #18 : 01.09.2014, 23:20:01 »

Вы идете по неправильному пути, как разработчик. На этом разговор предлагаю окончить.

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

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

Репутация: +316/-3
Offline Offline

Пол: Мужской
Сообщений: 6457



« Ответ #19 : 01.09.2014, 23:21:51 »

Код
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
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #20 : 01.09.2014, 23:34:18 »

Это детский сад. Не смешно?
Простите но вы ведете себя точно как в детском саду, очень часто есть случаи что в нескольких модулях используется одинаковый абсолютно скрипт, делать перелинковку из одного модуля в другой не вариант, ибо в любой момент пользователь может удалить неиспользуемый модуль!
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #21 : 01.09.2014, 23:34:56 »

Код
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;

Код
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
Профи
********

Репутация: +316/-3
Offline Offline

Пол: Мужской
Сообщений: 6457



« Ответ #22 : 01.09.2014, 23:42:36 »

if (strpos($key, $findme)!= false) return true;
Блин, я их постоянно местами путаю, $key и $value Azn Работает:
Код
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
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #23 : 01.09.2014, 23:48:59 »

Решено.
Я бы сделал так:
Код
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
Профи
********

Репутация: +316/-3
Offline Offline

Пол: Мужской
Сообщений: 6457



« Ответ #24 : 01.09.2014, 23:57:00 »

Можно и так, эффективно, когда много скриптов, но когда проверки требует всего 1, делать проверку на все уже не эффективно, имхо. Да, ничего не значащие ms, но все же.
Вообще у меня встал вопрос с подключением jquery.validate.min.js, модули грузятся через {loadmodule ... } в материалах и их от 2 до 5, и все - заказы различные... Бред, но шеф сказал: надо! вот и [далее межнациональная емкая лексика].
Записан
Fedor Vlasenko
Профи
********

Репутация: +696/-5
Offline Offline

Пол: Мужской
Сообщений: 3820


Все начинается с Value


« Ответ #25 : 02.09.2014, 01:02:06 »

AlekVolsk, на самом то деле ничего страшного не произойдет если вы подключите скрипт еще раз. Он возьмется из кеша и перезагрузит функционал.
SmokerMan, вам предложил оптимальные решения.
Еще есть одно когда вы самим js проверяете наличие какой либо функции и ли переменной и при ее значении undefined загружаете скрипт
Пример
Код
    <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/
« Последнее редактирование: 02.09.2014, 01:20:26 от Fedor Vlasenko » Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #26 : 02.09.2014, 01:37:02 »

Можно и так, эффективно, когда много скриптов, но когда проверки требует всего 1, делать проверку на все уже не эффективно, имхо.
Вообще то это тоже самое что у вас, только меньше кода и универсальнее..
Записан
almika
Осваиваюсь на форуме
***

Репутация: +11/-0
Offline Offline

Пол: Женский
Сообщений: 188



« Ответ #27 : 20.03.2015, 09: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.
Подскажите, как лучше сделать - оставить дубли скриптов или добавить параметр в модуль - типа "тонкая настройка для продвинутых", при котором будет запускаться анализ (как сейчас работает), а если что-то у пользователя не пойдёт, то он сможет просто выключить её и тогда будут дубли скриптов, или попробовать что-то ещё?
Прошу ваших советов.
Записан
Страниц: [1]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet