Программно инициализировать метод

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

Модератор: immortal

Аватара пользователя
Gelezako
Сообщения: 963
Зарегистрирован: Чт июн 02, 2016 9:33 pm
Благодарил (а): 205 раз
Поблагодарили: 106 раз
Контактная информация:

Программно инициализировать метод

Сообщение Gelezako » Пт дек 01, 2017 6:01 pm

Всем привет, пишу модуль, нужно вставить готовый код в метод класса. Нашёл только метод injectObjectMethodCode, но он вставляет сразу в объект класса.
И второй вопрос, как программно сделать аналог ручного выбора метода из разделе "Запускать метод при изменении"?
фанат Мажордомо
тематический блог http://blog.gelezako.com
плейлист про Мажордомо на ютубе https://www.youtube.com/playlist?list=P ... EdBGtX084E
skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1753 раза
Контактная информация:

Re: Программно инициализировать метод

Сообщение skysilver » Пт дек 01, 2017 8:20 pm

Имхо, неверным путём пошёл. Надо сделать также как в модулях сяоми, броадлинк и др., где у каждого девайса своя табличка с параметрами девайса, и к этим параметрам пользователь сам привязывает нужный ему метод или свойство объекта, либо вообще простое устройство.
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
Аватара пользователя
Gelezako
Сообщения: 963
Зарегистрирован: Чт июн 02, 2016 9:33 pm
Благодарил (а): 205 раз
Поблагодарили: 106 раз
Контактная информация:

Re: Программно инициализировать метод

Сообщение Gelezako » Пт дек 01, 2017 8:26 pm

ага, легко сказать, это первое что мне пришло в голову. Я скопировал модуль сяоми и начал разбираться в коде, но там для меня полный космос. Поэтому пока делаю что умею.
Вопрос открытый.
Последний раз редактировалось Gelezako Сб дек 02, 2017 1:21 am, всего редактировалось 1 раз.
фанат Мажордомо
тематический блог http://blog.gelezako.com
плейлист про Мажордомо на ютубе https://www.youtube.com/playlist?list=P ... EdBGtX084E
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: Программно инициализировать метод

Сообщение nick7zmail » Пт дек 01, 2017 8:44 pm

Запускать метод при изменении - просто привязка в табличке (не помню имя, properties вроде)...код класса, в принципе тоже...да вообще весь МД это по сути поля в sql =D. Работайте с sql напрямую. Либо ещё раз поизучайте модули...сяоми наверное неподъемный, как, собственно, к примеру, бродлинк...можете глянуть на что нить простенькое...blynk к примеру...вроде то что вам нужно...как раз работа с таблицей устройств, и таблицей данных, а так же запуск кода при изменении свойства. Там всё вроде просто...возникнут вопросы - отвечу.
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Аватара пользователя
Gelezako
Сообщения: 963
Зарегистрирован: Чт июн 02, 2016 9:33 pm
Благодарил (а): 205 раз
Поблагодарили: 106 раз
Контактная информация:

Re: Программно инициализировать метод

Сообщение Gelezako » Сб дек 02, 2017 1:27 am

да я понимаю что всё храниться в базе, но опыта работы с базой у меня ещё меньше чем в пхп :)
Сергей достаточно много написал стандартных обёрток что бы не использовать SQL напрямую. Я почти уверен что есть специальный метод для инициализации метода (наполнение его нужным кодом) по типу injectObjectMethodCode.

nick7zmail, если вы знаете как добавить наполнение кодом моего метода, то подскажите плиз. Ну или SQL команду, которая это сделает, или линку где это описано. Доку изучить не проблема, проблема найти где это описано.
фанат Мажордомо
тематический блог http://blog.gelezako.com
плейлист про Мажордомо на ютубе https://www.youtube.com/playlist?list=P ... EdBGtX084E
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: Программно инициализировать метод

Сообщение nick7zmail » Сб дек 02, 2017 10:02 am

Ну видимо недостаточно)))
https://majordomo.smartliving.ru/Main/P ... ngDatabase
вот тут все функции работы с базой...

И в написанных оболочках я не находил некоторого функционала, и приходилось всё равно через базу делать...
Например не нашел, вроде как объект добавлять, или описание к нему...короче приходилось в базу напрямую лезть
примерПоказать

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

 $className = 'ya_traffic';
 $objectName = array('yt_settings', 'yt_info');
 $objDescription = array('Настройки', 'Информация о пробках');
 /*$updCode = ;*/
 $rec = SQLSelectOne("SELECT ID FROM classes WHERE TITLE LIKE '" . DBSafe($className) . "'");
    if (!$rec['ID']) {
        $rec = array();
        $rec['TITLE'] = $className;
        $rec['DESCRIPTION'] = 'Пробки от Яндекс';
        $rec['ID'] = SQLInsert('classes', $rec);
    }
        for ($i = 0; $i < count($objectName); $i++) {
        $obj_rec = SQLSelectOne("SELECT ID FROM objects WHERE CLASS_ID='" . $rec['ID'] . "' AND TITLE LIKE '" . DBSafe($objectName[$i]) . "'");
        if (!$obj_rec['ID']) {
            $obj_rec = array();
            $obj_rec['CLASS_ID'] = $rec['ID'];
            $obj_rec['TITLE'] = $objectName[$i];
            $obj_rec['DESCRIPTION'] = $objDescription[$i];
            $obj_rec['ID'] = SQLInsert('objects', $obj_rec);
        }
    }
ИМХО - уже подсказали, что у вас путь не правильный выбран...весь код должен быть в файлах вашего модуля, а инфа в таблицах...в объекты-свойства выкидывать только статусы лампочек, и другие нужные для управления параметры. Я уже привел простейший модуль (blynk) где помимо нужных вам функций практически ничего больше и нет...Я готов всячески помочь написать правильный модуль, подсказать по таблицам и тп...а вот когда делают неправильно - считаю своим долгом предупредить, и изменить мнение, если это возможно...если ваш код покоцает пользователь в методах - не будет ничего работать, а разбираться потом Вам))

Ну и так...для сведения

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

addClassMethod('ya_traffic', 'update', 'include_once(DIR_MODULES."app_yatraffic/app_yatraffic.class.php");
$app_yatraffic=new app_yatraffic();
$app_yatraffic->get_traffic(gg("yt_settings.reg_id"));');
В том же модуле =D...но тут опять же, как можно заметить, ссылка на основной код в модуле...
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Аватара пользователя
Gelezako
Сообщения: 963
Зарегистрирован: Чт июн 02, 2016 9:33 pm
Благодарил (а): 205 раз
Поблагодарили: 106 раз
Контактная информация:

Re: Программно инициализировать метод

Сообщение Gelezako » Сб дек 02, 2017 3:11 pm

nick7zmail писал(а): ИМХО - уже подсказали, что у вас путь не правильный выбран...весь код должен быть в файлах вашего модуля, а инфа в таблицах...в объекты-свойства выкидывать только статусы лампочек, и другие нужные для управления параметры. Я уже привел простейший модуль (blynk) где помимо нужных вам функций практически ничего больше и нет...Я готов всячески помочь написать правильный модуль, подсказать по таблицам и тп...а вот когда делают неправильно - считаю своим долгом предупредить, и изменить мнение, если это возможно...если ваш код покоцает пользователь в методах - не будет ничего работать, а разбираться потом Вам))

Ну и так...для сведения

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

addClassMethod('ya_traffic', 'update', 'include_once(DIR_MODULES."app_yatraffic/app_yatraffic.class.php");
$app_yatraffic=new app_yatraffic();
$app_yatraffic->get_traffic(gg("yt_settings.reg_id"));');
В том же модуле =D...но тут опять же, как можно заметить, ссылка на основной код в модуле...
я согласен что есть риск если пользователь начнёт менять код, то он может всё поломать, но на сколько я понял у Сергея в его новейшем модуле "Простые устройства" применяется похожая концепция. Хотя немного более защищённая если так можно выразится. Если через Простые устройства" добавить к примеру датчик движения, перейти в раздел "Объекты", найти этот датчик и посмотреть содержимое метода "motionDetected", то там есть вставка

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

require(DIR_MODULES.'devices/SMotions_motionDetected.php');
т.е. вставки в методы он делает, просто содержимое метода выносит в отдельный файл, верно?
Вот я хочу сделать тоже самое. Сейчас копаюсь в коде модуля "Простые устройства" что бы понять как сделать такую вставку.

попробовал передавать в метод addClassMethod() качестве третье параметра нужный мне исходный код. Сам метод создаётся, но почему-то пустой. В чём может быть проблема?
---
В общем выяснил я в чём проблема. Оказывается если сначала создать метод и передать только 2 параметра: имя класса и название метода, то он создаётся. Но если потом пробовать создать метод с таким же именем, но уже передавать 3й параметр - исходный код, то он дописываться не будет. Получается если в обновление это дописать, то метод не перезапишется. В общем это победил, осталось понять как сделать аналог ручного выбора метода из разделе "Запускать метод при изменении.
фанат Мажордомо
тематический блог http://blog.gelezako.com
плейлист про Мажордомо на ютубе https://www.youtube.com/playlist?list=P ... EdBGtX084E
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: Программно инициализировать метод

Сообщение nick7zmail » Пн дек 04, 2017 3:48 pm

Тут скорее всего только в sql залезать прямо...я не видел встроенных команд для этого...
А в модуле простые устройства каждый раз при обновлении формируется дерево взаимосвязей объектов (вся классовая структура целиком), методов, и тп...и даже если код затронут - он восстановится при очередном обновлении, так что у него там не всё так просто))
А для создания класса есть отдельная команда

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

addClass($name); 
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Аватара пользователя
Gelezako
Сообщения: 963
Зарегистрирован: Чт июн 02, 2016 9:33 pm
Благодарил (а): 205 раз
Поблагодарили: 106 раз
Контактная информация:

Re: Программно инициализировать метод

Сообщение Gelezako » Пн дек 04, 2017 7:05 pm

nick7zmail писал(а):Тут скорее всего только в sql залезать прямо...я не видел встроенных команд для этого...
я разобрался, есть специальный метод, вот

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

addClassMethod('Yeelight', 'set_rgb',"require(DIR_MODULES.'Yeelight/Yeelight_set_rgb.php');"); 
где Yeelight - имя коасса
set_rgb - метод.
А вот уже в файл Yeelight_set_rgb.php добавляем свою нужную нам логику. Протестил работает. :)
фанат Мажордомо
тематический блог http://blog.gelezako.com
плейлист про Мажордомо на ютубе https://www.youtube.com/playlist?list=P ... EdBGtX084E
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: Программно инициализировать метод

Сообщение nick7zmail » Пн дек 04, 2017 7:24 pm

Ну этот пример я 3 сообщения назад показывал...
И ты вроде сказал, что понял...про sql я говорю о связывании свойства и метода...а вообще не совсем верно связывать свойство и метод из модуля...связывайте лучше свойство с модулем вашим, а из модуля вызывайте метод (и зачем из модуля, на самом деле, вызывать метод, если можно напрямую вызывать ваш файл)))...
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Ответить