Спасибо, попробую разобраться, еслиб пример посмотреть!sergejey писал(а):По элементам меню -- на каждый можно повесить либо скрипт либо метод объекта, который будет вызываться при изменении значения. В самом скрипте можно использовать $params['VALUE'] чтобы получить установленное значение.
Второй момент -- если на элемент указать связанное свойство в формате Имя объекта . Название свойства (там есть спец. поле в настройках элемента меню), то происходит две вещи:
1) Если использовать контрол (выключатель, ползунок и т.п.), то значение из контрола будет автоматически присвоено свазанному свойству
2) Если каким-то образом меняется значение связанного свойства объекта, то контрол будет отображать это значение. А если контролу разрешить автоматическое обновление, то даже без перезагрузки страницы будут перещёлкиваться переключатели.
Т.е. получается такая двухсторонняя связь.
Web интерфейс
Модератор: immortal
-
- Сообщения: 289
- Зарегистрирован: Вс сен 16, 2012 9:39 am
- Благодарил (а): 0
- Поблагодарили: 1 раз
Re: Web интерфейс
- sergejey
- Site Admin
- Сообщения: 4286
- Зарегистрирован: Пн сен 05, 2011 6:48 pm
- Откуда: Минск, Беларусь
- Благодарил (а): 76 раз
- Поблагодарили: 1559 раз
- Контактная информация:
Re: Web интерфейс
Вот в этом сценарии используется похожее что-то: http://smartliving.ru/Main/DevIpPower9223
В частности вот настройка элемента управления со связанным объектом (и свойство и метод):

В частности вот настройка элемента управления со связанным объектом (и свойство и метод):

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
-
- Сообщения: 211
- Зарегистрирован: Вт янв 08, 2013 11:50 pm
- Откуда: Санкт-Петербург
- Благодарил (а): 0
- Поблагодарили: 6 раз
Re: Web интерфейс
Нарисовалась проблема - порекомендуйте, как решить.
Вот интерфейс:
Click for large view - Uploaded with Skitch
Слайдеры все одинаково привязаны к свойствам и выполняют подобные методы:
Click for large view - Uploaded with Skitch
Код метода пока самый примитивный:
Кнопка "Откл. все" выполняет сценарий:
В интерфейсе для слайдеров выставлено обновление в 5 сек.
Так вот как только я выставлю какие-либо значения у слайдеров, а потом нажму кнопку, то получаю задвоенные события.
Click for large view - Uploaded with Skitch
То есть сначала срабатывает вызов метода onlightLevelChanged из сценария, а потом этот метод снова вызывается при обновлении интерфейса.
Внимание вопрос
Как исключить повторный вызов (или каким-то образом в самом скрипте отловить, что свойство объекта не изменилось).
Вот интерфейс:

Слайдеры все одинаково привязаны к свойствам и выполняют подобные методы:

Код метода пока самый примитивный:
Код: Выделить всё
say("Свет в коридоре: ".gg('Coridor.lightLevel'));
Код: Выделить всё
$res=getObjectsByClass("Room");
$total=count($res);
for($i=0;$i<$total;$i++) {
$title = $res[$i]['TITLE'];
sg($title.'.lightLevel',0);
callMethod($title.".onlightLevelChanged");
}
Так вот как только я выставлю какие-либо значения у слайдеров, а потом нажму кнопку, то получаю задвоенные события.

То есть сначала срабатывает вызов метода onlightLevelChanged из сценария, а потом этот метод снова вызывается при обновлении интерфейса.
Внимание вопрос

Как исключить повторный вызов (или каким-то образом в самом скрипте отловить, что свойство объекта не изменилось).
- sergejey
- Site Admin
- Сообщения: 4286
- Зарегистрирован: Пн сен 05, 2011 6:48 pm
- Откуда: Минск, Беларусь
- Благодарил (а): 76 раз
- Поблагодарили: 1559 раз
- Контактная информация:
Re: Web интерфейс
Как вариант, в код метода добавить в начало такие строчки, чтобы исключить повторное срабатывание в течении определённого времени:
Код: Выделить всё
$lastCalled=$this->getProperty('lastCalled');
$passed=time()-$lastCalled; // считаем время с последнего вызова метода
if (!$this->getProperty('lightLevel') && ($passed<=5)) { //если значение = 0 и прошло менее 5 секунд
return; // выходим из метода без продолжения
}
// иначе...
$this->setProperty("lastCalled",time()); // сохраняем в новом свойстве объекта время вызова
//... дальше идёт тот код что сейчас (say и т.п.)
Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
-
- Сообщения: 211
- Зарегистрирован: Вт янв 08, 2013 11:50 pm
- Откуда: Санкт-Петербург
- Благодарил (а): 0
- Поблагодарили: 6 раз
Re: Web интерфейс
а можно ли каким-нибудь способом отменить выполнение метода объекта при выполнении метода родительского класса?sergejey писал(а):Как вариант, в код метода добавить в начало такие строчки, чтобы исключить повторное срабатывание в течении определённого времени:Код: Выделить всё
$lastCalled=$this->getProperty('lastCalled'); $passed=time()-$lastCalled; // считаем время с последнего вызова метода if (!$this->getProperty('lightLevel') && ($passed<=5)) { //если значение = 0 и прошло менее 5 секунд return; // выходим из метода без продолжения } // иначе... $this->setProperty("lastCalled",time()); // сохраняем в новом свойстве объекта время вызова //... дальше идёт тот код что сейчас (say и т.п.)
Вариант выставить в родительском методе значение объекту - такой вариант уже рассмотрел.
Хочется все-таки что-то типа если родительский метод завершается return false; то метод дочернего объекта автоматически не выполняется.
- sergejey
- Site Admin
- Сообщения: 4286
- Зарегистрирован: Пн сен 05, 2011 6:48 pm
- Откуда: Минск, Беларусь
- Благодарил (а): 76 раз
- Поблагодарили: 1559 раз
- Контактная информация:
Re: Web интерфейс
Если только это встроить в ядро системы, но что-то мне кажется, что это поведение не совсем логично. Я понимаю практическую пользу в определённых частных случаях, но в общем и целом это может лишь запутать логику работы. Это просто как-то не принято, что сам факт запуска метода зависит от результата запуска родительского. Так что, вариант с дополнительным свойством вполне нормальный обходной путь для таких случаев.anemcov писал(а):а можно ли каким-нибудь способом отменить выполнение метода объекта при выполнении метода родительского класса?
Вариант выставить в родительском методе значение объекту - такой вариант уже рассмотрел.
Хочется все-таки что-то типа если родительский метод завершается return false; то метод дочернего объекта автоматически не выполняется.
Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
-
- Сообщения: 211
- Зарегистрирован: Вт янв 08, 2013 11:50 pm
- Откуда: Санкт-Петербург
- Благодарил (а): 0
- Поблагодарили: 6 раз
Re: Web интерфейс
Я хотел в родительском методе делать сравнение OLD_VALUE и VALUE, и в случае их павенства просто не выполнять метод объекта. Установка свойства объекта все равно влекло написание одинаковых кусков кода с проверкой свойства, да еще и добавление самого своства хоть капельку, но усложняло систему.sergejey писал(а):Так что, вариант с дополнительным свойством вполне нормальный обходной путь для таких случаев.
Поэтому обошелся написанием одинаковых кусков кода по сравнению OLD_VALUE и VALUE в методах объектов, не используя родительские методы вообще
- sergejey
- Site Admin
- Сообщения: 4286
- Зарегистрирован: Пн сен 05, 2011 6:48 pm
- Откуда: Минск, Беларусь
- Благодарил (а): 76 раз
- Поблагодарили: 1559 раз
- Контактная информация:
Re: Web интерфейс
Вот как можно обойтись без одинаковых кусков. Может на будущее пригодится.anemcov писал(а):Я хотел в родительском методе делать сравнение OLD_VALUE и VALUE, и в случае их павенства просто не выполнять метод объекта. Установка свойства объекта все равно влекло написание одинаковых кусков кода с проверкой свойства, да еще и добавление самого своства хоть капельку, но усложняло систему.sergejey писал(а):Так что, вариант с дополнительным свойством вполне нормальный обходной путь для таких случаев.
Поэтому обошелся написанием одинаковых кусков кода по сравнению OLD_VALUE и VALUE в методах объектов, не используя родительские методы вообще
Считаем, что стоит галочка "вызывать родительский метод до выполнения дочернего".
В родительском методе используем такой код:
Код: Выделить всё
// ... в начале всё что нам нужно
if (/*тут какое-то условие*/) {
$this->setProperty("BlockRunning",1); //используем дополнительное свойство как "флаг"
} else {
$this->setProperty("BlockRunning",0);
}
Код: Выделить всё
if ($this->getProperty("BlockRunning")) return; // это проверка флага, выставленного в родительском методе
//... дальше идёт любой код который должен выполняться
Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
-
- Сообщения: 211
- Зарегистрирован: Вт янв 08, 2013 11:50 pm
- Откуда: Санкт-Петербург
- Благодарил (а): 0
- Поблагодарили: 6 раз
Re: Web интерфейс
Но ведь в конечном итоге все равно у каждого объекта в методе надо прописывать условиеsergejey писал(а):
Потом в дочернем методе делаем так:Код: Выделить всё
if ($this->getProperty("BlockRunning")) return; // это проверка флага, выставленного в родительском методе //... дальше идёт любой код который должен выполняться

Ладно, этот вопрос считаю закрытым. Если возможности в систему не заложено - будеим обходными путями решать
