Как получить имя скрипта (сценария)? - Хранение скриптов в файлах

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

Ответить
Аватара пользователя
S_Nick
Сообщения: 67
Зарегистрирован: Сб сен 30, 2017 7:44 pm
Откуда: Минск
Благодарил (а): 9 раз
Поблагодарили: 55 раз
Контактная информация:

Как получить имя скрипта (сценария)? - Хранение скриптов в файлах

Сообщение S_Nick » Пт янв 03, 2020 1:21 pm

Подскажите как получить имя (название) исполняемого скрипта (сценарии) в самом скрипте (сценарии)?

Код: Выделить всё

print_r($this->object_title); 
ничего не возвращает. Это глюк или я что-то делаю не так?

Код: Выделить всё

print_r($this);
возвращает

Код: Выделить всё

scripts Object ( [name] => scripts [data] => [instance] => [template] => [result] => [owner] => [config] => [title] => <#LANG_MODULE_SCRIPTS#> [module_category] => <#LANG_SECTION_OBJECTS#> )
object_title в $this даже нет.

Это вообще возможно сделать средствами mjdm?

Нашел в БЗ:
При вызове любого метода (но не сценария!) доступны переменные:
$prevRun -- время последнего вызова (в формате timestamp)
$prevRunPassed -- сколько секунд прошло с последнего вызова
$this -- Указатель на себя. Используется в методах классов. Например:
Так понимаю, что $this не работает в сценариях? Если да, то почему? Как так, почему работает в методах, но не работает в сценариях?
Считаю недоработкой. Прошу sergejey обратить на это внимание!
Если бы переменная $this работала в сценариях не пришлось бы создавать костыль описаный ниже.

И изначальный вопрос, как тогда вытянуть имя? Может обходные способы?

Вариант передать в параметре при вызове через rs("test", "name_stript" => "test") - это не решение :)

Через $_SERVER также не решение. Так нельзя достать имя сценария, разве что через $_SERVER[REQUEST_URI] в некоторых случаях (если вызывать выполнение вручную из админки) можно вытянуть его ID из

Код: Выделить всё

[REQUEST_URI] => /admin.php?pd=c2NyaXB0czp7aW5zdGFuY2U9YWRtfQ%3D%3Dpz_cGFuZWw6e2FjdGlvbj1zY3JpcHRzfQ%3D%3Dpz_&md=scripts&inst=adm&view_mode=run_script&id=85
но это не то что нужно и вообще полная ерунда.

UPD / Сам спросил, сам ответил.
Нашел решение:

Код: Выделить всё

$arr = get_defined_vars();
$script_title = $arr['rec']['TITLE'];
print_r($script_title);
Не уверен пока на счет универсальности. Ещё тестирую...

Для чего мне это понадобилось?
Я предпочитаю хранить сценарии в виде файла на диске, а не в виде записи в БД, надежность которой оставляет желать лучшего.
Были случаи потери данных из-за ошибок БД при внезапном отключении электроэнергии.
Теперь, код каждого сценария сохраняем в виде файла по адресу "./my/scripts/ИМЯ_СЦЕНАРИЯ.php", а в тело каждого сценария в админке Мажордомо помещаем универсальный код:

Код: Выделить всё

$arr = get_defined_vars();
$script_title = $arr['rec']['TITLE'];
$script_file = "./my/scripts/" . $script_title . ".php";
if (is_file($script_file)) {
	include_once($script_file);
} else {
	say("Системная ошибка, не найден сценарий " . $script_title . "!", 2);
}
Хранение скриптов в виде файлов, кроме надежности, дает преимущество редактирования в любой удобной для вас IDE.

А если бы в админке в разделе
Код Использовать для программирования:
PHP Blockly Устройства
был бы реализован выбор "Из файла сценария" и этот выбор подставлял бы код представленный выше, было бы вообще супер. Предложение для разработчика.
Аватара пользователя
xor
Сообщения: 2039
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 286 раз
Поблагодарили: 629 раз

Re: Как получить имя скрипта (сценария)? - Хранение скриптов в файлах

Сообщение xor » Пт янв 03, 2020 6:04 pm

S_Nick писал(а):Подскажите как получить имя (название) исполняемого скрипта (сценарии) в самом скрипте (сценарии)?

Код: Выделить всё

print_r($this->object_title); 
ничего не возвращает. Это глюк или я что-то делаю не так?

Код: Выделить всё

print_r($this);
возвращает

Код: Выделить всё

scripts Object ( [name] => scripts [data] => [instance] => [template] => [result] => [owner] => [config] => [title] => <#LANG_MODULE_SCRIPTS#> [module_category] => <#LANG_SECTION_OBJECTS#> )
object_title в $this даже нет.

Это вообще возможно сделать средствами mjdm?

Нашел в БЗ:
При вызове любого метода (но не сценария!) доступны переменные:
$prevRun -- время последнего вызова (в формате timestamp)
$prevRunPassed -- сколько секунд прошло с последнего вызова
$this -- Указатель на себя. Используется в методах классов. Например:
Так понимаю, что $this не работает в сценариях? Если да, то почему? Как так, почему работает в методах, но не работает в сценариях?
Считаю недоработкой. Прошу sergejey обратить на это внимание!
Если бы переменная $this работала в сценариях не пришлось бы создавать костыль описаный ниже.

И изначальный вопрос, как тогда вытянуть имя? Может обходные способы?

Вариант передать в параметре при вызове через rs("test", "name_stript" => "test") - это не решение :)

Через $_SERVER также не решение. Так нельзя достать имя сценария, разве что через $_SERVER[REQUEST_URI] в некоторых случаях (если вызывать выполнение вручную из админки) можно вытянуть его ID из

Код: Выделить всё

[REQUEST_URI] => /admin.php?pd=c2NyaXB0czp7aW5zdGFuY2U9YWRtfQ%3D%3Dpz_cGFuZWw6e2FjdGlvbj1zY3JpcHRzfQ%3D%3Dpz_&md=scripts&inst=adm&view_mode=run_script&id=85
но это не то что нужно и вообще полная ерунда.

UPD / Сам спросил, сам ответил.
Нашел решение:

Код: Выделить всё

$arr = get_defined_vars();
$script_title = $arr['rec']['TITLE'];
print_r($script_title);
Не уверен пока на счет универсальности. Ещё тестирую...

Для чего мне это понадобилось?
Я предпочитаю хранить сценарии в виде файла на диске, а не в виде записи в БД, надежность которой оставляет желать лучшего.
Были случаи потери данных из-за ошибок БД при внезапном отключении электроэнергии.
Теперь, код каждого сценария сохраняем в виде файла по адресу "./my/scripts/ИМЯ_СЦЕНАРИЯ.php", а в тело каждого сценария в админке Мажордомо помещаем универсальный код:

Код: Выделить всё

$arr = get_defined_vars();
$script_title = $arr['rec']['TITLE'];
$script_file = "./my/scripts/" . $script_title . ".php";
if (is_file($script_file)) {
	include_once($script_file);
} else {
	say("Системная ошибка, не найден сценарий " . $script_title . "!", 2);
}
Хранение скриптов в виде файлов, кроме надежности, дает преимущество редактирования в любой удобной для вас IDE.

А если бы в админке в разделе
Код Использовать для программирования:
PHP Blockly Устройства
был бы реализован выбор "Из файла сценария" и этот выбор подставлял бы код представленный выше, было бы вообще супер. Предложение для разработчика.
Тогда вызов скрипта, который вызывает скрипт из файла, всё равно хранится в базе и подвержен тем же рискам. Дополнительное условие, что имена скриптов связаны через имя и не запоминается, а вычисляется, спорно.
Такой способ использования скриптов "сбоку" уже применяется в МДМ до ПУ. Это не позволяет, например, пользоваться штатным поиском по контексту в панели управления.
Имхо

Отправлено с моего Redmi 4X через Tapatalk

Аватара пользователя
S_Nick
Сообщения: 67
Зарегистрирован: Сб сен 30, 2017 7:44 pm
Откуда: Минск
Благодарил (а): 9 раз
Поблагодарили: 55 раз
Контактная информация:

Re: Как получить имя скрипта (сценария)? - Хранение скриптов в файлах

Сообщение S_Nick » Пт янв 03, 2020 8:18 pm

Тогда вызов скрипта, который вызывает скрипт из файла, всё равно хранится в базе и подвержен тем же рискам.
Это не большая беда, если он даже и повредится, он универсален.
Кстати, вы натолкнули на идею и его перенести в фал "./my/scripts/_getScript.php"
Теперь в каждом теле скрипта в админке можно оставить всего одну универсальную строку:

Код: Выделить всё

require "./my/scripts/_getScript.php";
Это не позволяет, например, пользоваться штатным поиском по контексту в панели управления.
Это минус конечно. Теряются Related (ссылки на сущности, которые тем или иным способом могут быть связаны с открытым элементом). Но для меня плюсов больше, чем этот минус.
Ответить