Страница 4 из 5
Re: Web интерфейс
Добавлено: Вт окт 30, 2012 5:17 pm
Urbas81
sergejey писал(а):По элементам меню -- на каждый можно повесить либо скрипт либо метод объекта, который будет вызываться при изменении значения. В самом скрипте можно использовать $params['VALUE'] чтобы получить установленное значение.
Второй момент -- если на элемент указать связанное свойство в формате Имя объекта . Название свойства (там есть спец. поле в настройках элемента меню), то происходит две вещи:
1) Если использовать контрол (выключатель, ползунок и т.п.), то значение из контрола будет автоматически присвоено свазанному свойству
2) Если каким-то образом меняется значение связанного свойства объекта, то контрол будет отображать это значение. А если контролу разрешить автоматическое обновление, то даже без перезагрузки страницы будут перещёлкиваться переключатели.
Т.е. получается такая двухсторонняя связь.
Спасибо, попробую разобраться, еслиб пример посмотреть!
Re: Web интерфейс
Добавлено: Вт окт 30, 2012 6:39 pm
sergejey
Вот в этом сценарии используется похожее что-то:
http://smartliving.ru/Main/DevIpPower9223
В частности вот настройка элемента управления со связанным объектом (и свойство и метод):

Re: Web интерфейс
Добавлено: Вт окт 30, 2012 7:20 pm
Urbas81
Еще раз спасибо, как доберусь до системы начну пробовать.
Re: Web интерфейс
Добавлено: Ср янв 16, 2013 11:56 am
anemcov
Нарисовалась проблема - порекомендуйте, как решить.
Вот интерфейс:
Click for large view -
Uploaded with Skitch
Слайдеры все одинаково привязаны к свойствам и выполняют подобные методы:
Click for large view -
Uploaded with Skitch
Код метода пока самый примитивный:
Код: Выделить всё
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");
}
В интерфейсе для слайдеров выставлено обновление в 5 сек.
Так вот как только я выставлю какие-либо значения у слайдеров, а потом нажму кнопку, то получаю задвоенные события.
Click for large view -
Uploaded with Skitch
То есть сначала срабатывает вызов метода onlightLevelChanged из сценария, а потом этот метод снова вызывается при обновлении интерфейса.
Внимание вопрос

Как исключить повторный вызов (или каким-то образом в самом скрипте отловить, что свойство объекта не изменилось).
Re: Web интерфейс
Добавлено: Ср янв 16, 2013 12:20 pm
sergejey
Как вариант, в код метода добавить в начало такие строчки, чтобы исключить повторное срабатывание в течении определённого времени:
Код: Выделить всё
$lastCalled=$this->getProperty('lastCalled');
$passed=time()-$lastCalled; // считаем время с последнего вызова метода
if (!$this->getProperty('lightLevel') && ($passed<=5)) { //если значение = 0 и прошло менее 5 секунд
return; // выходим из метода без продолжения
}
// иначе...
$this->setProperty("lastCalled",time()); // сохраняем в новом свойстве объекта время вызова
//... дальше идёт тот код что сейчас (say и т.п.)
Re: Web интерфейс
Добавлено: Ср янв 16, 2013 2:01 pm
anemcov
sergejey писал(а):Как вариант, в код метода добавить в начало такие строчки, чтобы исключить повторное срабатывание в течении определённого времени:
Код: Выделить всё
$lastCalled=$this->getProperty('lastCalled');
$passed=time()-$lastCalled; // считаем время с последнего вызова метода
if (!$this->getProperty('lightLevel') && ($passed<=5)) { //если значение = 0 и прошло менее 5 секунд
return; // выходим из метода без продолжения
}
// иначе...
$this->setProperty("lastCalled",time()); // сохраняем в новом свойстве объекта время вызова
//... дальше идёт тот код что сейчас (say и т.п.)
а можно ли каким-нибудь способом отменить выполнение метода объекта при выполнении метода родительского класса?
Вариант выставить в родительском методе значение объекту - такой вариант уже рассмотрел.
Хочется все-таки что-то типа если родительский метод завершается return false; то метод дочернего объекта автоматически не выполняется.
Re: Web интерфейс
Добавлено: Пт янв 18, 2013 11:18 pm
sergejey
anemcov писал(а):а можно ли каким-нибудь способом отменить выполнение метода объекта при выполнении метода родительского класса?
Вариант выставить в родительском методе значение объекту - такой вариант уже рассмотрел.
Хочется все-таки что-то типа если родительский метод завершается return false; то метод дочернего объекта автоматически не выполняется.
Если только это встроить в ядро системы, но что-то мне кажется, что это поведение не совсем логично. Я понимаю практическую пользу в определённых частных случаях, но в общем и целом это может лишь запутать логику работы. Это просто как-то не принято, что сам факт запуска метода зависит от результата запуска родительского. Так что, вариант с дополнительным свойством вполне нормальный обходной путь для таких случаев.
Re: Web интерфейс
Добавлено: Сб янв 19, 2013 12:14 am
anemcov
sergejey писал(а):Так что, вариант с дополнительным свойством вполне нормальный обходной путь для таких случаев.
Я хотел в родительском методе делать сравнение OLD_VALUE и VALUE, и в случае их павенства просто не выполнять метод объекта. Установка свойства объекта все равно влекло написание одинаковых кусков кода с проверкой свойства, да еще и добавление самого своства хоть капельку, но усложняло систему.
Поэтому обошелся написанием одинаковых кусков кода по сравнению OLD_VALUE и VALUE в методах объектов, не используя родительские методы вообще
Re: Web интерфейс
Добавлено: Сб янв 19, 2013 12:25 pm
sergejey
anemcov писал(а):sergejey писал(а):Так что, вариант с дополнительным свойством вполне нормальный обходной путь для таких случаев.
Я хотел в родительском методе делать сравнение OLD_VALUE и VALUE, и в случае их павенства просто не выполнять метод объекта. Установка свойства объекта все равно влекло написание одинаковых кусков кода с проверкой свойства, да еще и добавление самого своства хоть капельку, но усложняло систему.
Поэтому обошелся написанием одинаковых кусков кода по сравнению OLD_VALUE и VALUE в методах объектов, не используя родительские методы вообще
Вот как можно обойтись без одинаковых кусков. Может на будущее пригодится.
Считаем, что стоит галочка "вызывать родительский метод до выполнения дочернего".
В родительском методе используем такой код:
Код: Выделить всё
// ... в начале всё что нам нужно
if (/*тут какое-то условие*/) {
$this->setProperty("BlockRunning",1); //используем дополнительное свойство как "флаг"
} else {
$this->setProperty("BlockRunning",0);
}
Потом в дочернем методе делаем так:
Код: Выделить всё
if ($this->getProperty("BlockRunning")) return; // это проверка флага, выставленного в родительском методе
//... дальше идёт любой код который должен выполняться
Re: Web интерфейс
Добавлено: Сб янв 19, 2013 3:33 pm
anemcov
sergejey писал(а):
Потом в дочернем методе делаем так:
Код: Выделить всё
if ($this->getProperty("BlockRunning")) return; // это проверка флага, выставленного в родительском методе
//... дальше идёт любой код который должен выполняться
Но ведь в конечном итоге все равно у
каждого объекта в методе надо прописывать условие

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