Web интерфейс

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

Модератор: immortal

Urbas81
Сообщения: 289
Зарегистрирован: Вс сен 16, 2012 9:39 am
Благодарил (а): 0
Поблагодарили: 1 раз

Re: Web интерфейс

Сообщение Urbas81 » Вт окт 30, 2012 5:17 pm

sergejey писал(а):По элементам меню -- на каждый можно повесить либо скрипт либо метод объекта, который будет вызываться при изменении значения. В самом скрипте можно использовать $params['VALUE'] чтобы получить установленное значение.

Второй момент -- если на элемент указать связанное свойство в формате Имя объекта . Название свойства (там есть спец. поле в настройках элемента меню), то происходит две вещи:
1) Если использовать контрол (выключатель, ползунок и т.п.), то значение из контрола будет автоматически присвоено свазанному свойству
2) Если каким-то образом меняется значение связанного свойства объекта, то контрол будет отображать это значение. А если контролу разрешить автоматическое обновление, то даже без перезагрузки страницы будут перещёлкиваться переключатели.

Т.е. получается такая двухсторонняя связь.
Спасибо, попробую разобраться, еслиб пример посмотреть!
Аватара пользователя
sergejey
Site Admin
Сообщения: 4286
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 76 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Web интерфейс

Сообщение sergejey » Вт окт 30, 2012 6:39 pm

Вот в этом сценарии используется похожее что-то: http://smartliving.ru/Main/DevIpPower9223

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

Изображение

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Urbas81
Сообщения: 289
Зарегистрирован: Вс сен 16, 2012 9:39 am
Благодарил (а): 0
Поблагодарили: 1 раз

Re: Web интерфейс

Сообщение Urbas81 » Вт окт 30, 2012 7:20 pm

Еще раз спасибо, как доберусь до системы начну пробовать.
anemcov
Сообщения: 211
Зарегистрирован: Вт янв 08, 2013 11:50 pm
Откуда: Санкт-Петербург
Благодарил (а): 0
Поблагодарили: 6 раз

Re: Web интерфейс

Сообщение anemcov » Ср янв 16, 2013 11:56 am

Нарисовалась проблема - порекомендуйте, как решить.
Вот интерфейс:
Изображение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 из сценария, а потом этот метод снова вызывается при обновлении интерфейса.

Внимание вопрос :)
Как исключить повторный вызов (или каким-то образом в самом скрипте отловить, что свойство объекта не изменилось).
Аватара пользователя
sergejey
Site Admin
Сообщения: 4286
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 76 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Web интерфейс

Сообщение sergejey » Ср янв 16, 2013 12:20 pm

Как вариант, в код метода добавить в начало такие строчки, чтобы исключить повторное срабатывание в течении определённого времени:

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

$lastCalled=$this->getProperty('lastCalled');
$passed=time()-$lastCalled; // считаем время с последнего вызова метода
if (!$this->getProperty('lightLevel') && ($passed<=5)) { //если значение = 0 и прошло менее 5 секунд
 return; // выходим из метода без продолжения
}
// иначе...
$this->setProperty("lastCalled",time()); // сохраняем в новом свойстве объекта время вызова
//... дальше идёт тот код что сейчас (say и т.п.)

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
anemcov
Сообщения: 211
Зарегистрирован: Вт янв 08, 2013 11:50 pm
Откуда: Санкт-Петербург
Благодарил (а): 0
Поблагодарили: 6 раз

Re: Web интерфейс

Сообщение anemcov » Ср янв 16, 2013 2:01 pm

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 интерфейс

Сообщение sergejey » Пт янв 18, 2013 11:18 pm

anemcov писал(а):а можно ли каким-нибудь способом отменить выполнение метода объекта при выполнении метода родительского класса?
Вариант выставить в родительском методе значение объекту - такой вариант уже рассмотрел.
Хочется все-таки что-то типа если родительский метод завершается return false; то метод дочернего объекта автоматически не выполняется.
Если только это встроить в ядро системы, но что-то мне кажется, что это поведение не совсем логично. Я понимаю практическую пользу в определённых частных случаях, но в общем и целом это может лишь запутать логику работы. Это просто как-то не принято, что сам факт запуска метода зависит от результата запуска родительского. Так что, вариант с дополнительным свойством вполне нормальный обходной путь для таких случаев.

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
anemcov
Сообщения: 211
Зарегистрирован: Вт янв 08, 2013 11:50 pm
Откуда: Санкт-Петербург
Благодарил (а): 0
Поблагодарили: 6 раз

Re: Web интерфейс

Сообщение anemcov » Сб янв 19, 2013 12:14 am

sergejey писал(а):Так что, вариант с дополнительным свойством вполне нормальный обходной путь для таких случаев.
Я хотел в родительском методе делать сравнение OLD_VALUE и VALUE, и в случае их павенства просто не выполнять метод объекта. Установка свойства объекта все равно влекло написание одинаковых кусков кода с проверкой свойства, да еще и добавление самого своства хоть капельку, но усложняло систему.
Поэтому обошелся написанием одинаковых кусков кода по сравнению OLD_VALUE и VALUE в методах объектов, не используя родительские методы вообще
Аватара пользователя
sergejey
Site Admin
Сообщения: 4286
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 76 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Web интерфейс

Сообщение sergejey » Сб янв 19, 2013 12:25 pm

anemcov писал(а):
sergejey писал(а):Так что, вариант с дополнительным свойством вполне нормальный обходной путь для таких случаев.
Я хотел в родительском методе делать сравнение OLD_VALUE и VALUE, и в случае их павенства просто не выполнять метод объекта. Установка свойства объекта все равно влекло написание одинаковых кусков кода с проверкой свойства, да еще и добавление самого своства хоть капельку, но усложняло систему.
Поэтому обошелся написанием одинаковых кусков кода по сравнению OLD_VALUE и VALUE в методах объектов, не используя родительские методы вообще
Вот как можно обойтись без одинаковых кусков. Может на будущее пригодится.
Считаем, что стоит галочка "вызывать родительский метод до выполнения дочернего".
В родительском методе используем такой код:

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

// ... в начале всё что нам нужно
if (/*тут какое-то условие*/) {
 $this->setProperty("BlockRunning",1); //используем дополнительное свойство как "флаг"
} else {
 $this->setProperty("BlockRunning",0);
}
Потом в дочернем методе делаем так:

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

if ($this->getProperty("BlockRunning")) return; // это проверка флага, выставленного в родительском методе
//... дальше идёт любой код который должен выполняться

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
anemcov
Сообщения: 211
Зарегистрирован: Вт янв 08, 2013 11:50 pm
Откуда: Санкт-Петербург
Благодарил (а): 0
Поблагодарили: 6 раз

Re: Web интерфейс

Сообщение anemcov » Сб янв 19, 2013 3:33 pm

sergejey писал(а):
Потом в дочернем методе делаем так:

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

if ($this->getProperty("BlockRunning")) return; // это проверка флага, выставленного в родительском методе
//... дальше идёт любой код который должен выполняться
Но ведь в конечном итоге все равно у каждого объекта в методе надо прописывать условие :)
Ладно, этот вопрос считаю закрытым. Если возможности в систему не заложено - будеим обходными путями решать :)
Ответить