Значение элемента меню без линка со свойством объека

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

Модератор: immortal

Аватара пользователя
Bagir
Сообщения: 1614
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

Значение элемента меню без линка со свойством объека

Сообщение Bagir » Вт дек 23, 2014 2:19 pm

Предлагаю обсудить целесообразность получения и изменения значения элемента меню без линка со свойством объекта. Сразу небольшой пример. Есть два разных скрипта и один радио переключатель с двумя кнопками. Задача: при нажатии кнопки 1 запустить скрипт А, при нажатии кнопки 2 запустить скрипт Б. После запуска скрипта нужно отжать кнопку радио переключателя, чтобы не было вообще ничего нажато.
Эта задача решается очень просто, если слинковать свойство радио переключателя с каким нибудь объектом. Но вот в чем дело. Этого объекта у нас нет. Конечно можно создать новое свойство например у объекта ThisComputer. Но по условию задачи больше свойство этого радио переключателя нам нигде не понадобится. Нужно просто запустить скрипт (или Объект.Метод) и на этом все.
В настройках элемента радио переключатель есть поле КОД. Если там прописать небольшое условие, то от туда можно вполне удобно запустить нужный скрипт. Но как там получить значение нажатой кнопки радио переключателя?
Вопрос знатокам: Есть ли способ получения свойства элемента в поле КОД? Если нет, то имеет ли смысл дернуть его из базы данных?
Изображение
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Значение элемента меню без линка со свойством объека

Сообщение sergejey » Вт дек 23, 2014 2:26 pm

в коде можно использовать $params['VALUE'] -- оно будет хранить текущее значение переключателя
За это сообщение автора sergejey поблагодарил:
Bagir (Вт дек 23, 2014 2:46 pm)
Рейтинг: 1.16%

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Аватара пользователя
Bagir
Сообщения: 1614
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

Re: Значение элемента меню без линка со свойством объека

Сообщение Bagir » Вт дек 23, 2014 2:27 pm

Клёва! Сейчас попробую, Спасибо!
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
Bagir
Сообщения: 1614
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

Re: Значение элемента меню без линка со свойством объека

Сообщение Bagir » Вт дек 23, 2014 2:34 pm

Получилось! добыть значение переключателя $params['VALUE'].
Но изменить его не могу. Хочется в этом же коде прописать его сброс по таймеру, чтобы кнопка отжалась. Есть простой способ? а то я уже к таблице commands клинья начал подбивать ))
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Значение элемента меню без линка со свойством объека

Сообщение sergejey » Вт дек 23, 2014 2:39 pm

Bagir писал(а):Получилось! добыть значение переключателя $params['VALUE'].
Но изменить его не могу. Хочется в этом же коде прописать его сброс по таймеру, чтобы кнопка отжалась. Есть простой способ? а то я уже к таблице commands клинья начал подбивать ))
Простого боюсь, что нет. Можно поменять значение на самом деле через commands таким кодом:

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

SQLExec("UPDATE commands SET CUR_VALUE=1 WHERE ID=12345"); 
вместо 1 нужное значение, вместо 12345 значение поле ID таблицы commands.
За это сообщение автора sergejey поблагодарил:
Bagir (Вт дек 23, 2014 2:46 pm)
Рейтинг: 1.16%

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Аватара пользователя
Bagir
Сообщения: 1614
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

Re: Значение элемента меню без линка со свойством объека

Сообщение Bagir » Вт дек 23, 2014 2:46 pm

Спасибо Серёж! Так то SQLExec уже совсем не пугает. Не страшнее CSS )) Тем более ID мы видим сразу вверху и даже в phpmyadmin лезть не придется.
Просто я часто лазаю через окно не видя двери, вот и поинтересовался. В любом случае $params['VALUE'] очень хорошая находка для меня. Не всегда же нужно кнопки отжимать.
Хочу таким способом сэкономить немного места в меню для терминала, объединив кнопки родственных действий в один радио переключатель.
-----------------
Все отлично получилось!

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

// По значению свойства кнопки открывать нужную дверь
switch ($params['VALUE']) {
case 1: callMethod('RelayFrontDoorOpen.click'); break;
case 2: callMethod('RelayBlackDoorOpen.click'); break;
}
// Сбросить свойство на NULL
SQLExec("UPDATE commands SET CUR_VALUE=NULL WHERE ID=172");
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
Bagir
Сообщения: 1614
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

Re: Значение элемента меню без линка со свойством объека

Сообщение Bagir » Вс янв 11, 2015 1:38 am

sergejey писал(а):в коде можно использовать $params['VALUE'] -- оно будет хранить текущее значение переключателя
Ну вот. Мне еще раз пригодилась эта фишка. Допустим есть радио переключатель Выкл-Авто-Вкл. В положении Авто реле принимает решения в зависимости от других событий в системе. Но!

Допустим для сравнения у нас есть еще вот такая простая схема с обычным элементом "выключатель". К ней привязана логика, например, датчика движения. Челочек идет, свет включается, потом счет гаснет. В то же время, мы можем и сами включить или раньше выключить свет в меню. Но в этом варианте все равно он будет в автоматическом режиме. Мы просто влияем на его работу.

Радио переключатель Выкл-Авто-Вкл. позволяет явно задать нам варианты работы реле. В положении Выкл реле никогда не включится, какие бы события не происходили. Это будет полезно если мы захотим поменять лампочку или поработать с проводкой. В положении Вкл реле будет всегда замкнуто. Это тоже весьма полезно в некоторых случаях, когда в этой комнате не нужно длительное время выключать свет. В положении Авто реле подчиняется логике. Все бы хорошо, но мы потеряли возможность повлиять на работу реле. Как же нам, будучи в режиме Авто, например включить или выключить свет до наступления будущих логических событий? Да очень просто! Жать на кнопку Авто несколько раз. Каждое следующее нажатие будет инвертировать состояние реле, но не изменит выбранный режим работы (т.е. Авто).
Суть в том, что даже если у нас уже выбрано какое то положение радио переключателя, то повторное нажатие на эту кнопку все равно создает событие, и запускает все указанные действия. Да, стандартные варианты тут не помогут. Но у нас же есть код! И есть $params['VALUE'], в которой содержится текущее значение переключателя. Значит нам нужно перед присвоением этого значения свойству объекта, просто с начало сравнить его с ним, а потом уже присваивать.
Надеюсь, что я донес до Вас зерно этой идеи )) Вот код моего радио переключателя. Если я смог правильно объяснить идею, то код тоже будет понятен. Имена объектов тут совершенно не важны. Главное только последовательность действий.

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

if (gg('RelayProjectorsDriveway.modeSwitch') == $params['VALUE']) {
  $ws = 'меню';
} else { $ws = NULL; }

sg('RelayProjectorsDriveway.modeSwitch', $params['VALUE']);
cm('RelayProjectorsDriveway.sendMessage', array('whosent'=>$ws));
СкринПоказать
Изображение
Тут вся фишка в том, что при нажатии на кнопку радио переключателя, до присвоения его значения свойству объекта, мы сравниваем его с этим свойством. Это позволяет нам видеть, было ли это переключение, либо повторное нажатие на уже нажатую кнопку. Ну и дальше трали-вали ... :D

Вообщем я добавил эту фишку во все свои такие переключатели освещения. А новая доработка выделения кнопки цветом при включенном реле пришлась тут как нельзя к стати! Еще раз огромное спасибо Сергею за реализацию этих двух дополнений!
За это сообщение автора Bagir поблагодарил:
zelevova (Вс янв 11, 2015 11:20 am)
Рейтинг: 1.16%
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
zelevova
Сообщения: 291
Зарегистрирован: Вт ноя 18, 2014 11:43 pm
Откуда: Краснодарский край
Благодарил (а): 32 раза
Поблагодарили: 68 раз

Re: Значение элемента меню без линка со свойством объека

Сообщение zelevova » Вс янв 11, 2015 11:28 am

Отличная фишка. Только что у себя реализовал.
Только код не писал в элементе. Я указал метод который нужно вызывать у объекта, а в нем уже анализировал $params['VALUE'] и и реализовывал остальную логику.
За это сообщение автора zelevova поблагодарил:
Bagir (Вс янв 11, 2015 12:36 pm)
Рейтинг: 1.16%
Majordomo (GitHub) на cubietruck + MegaD + 1-wire
CONNECT: http://connect.smartliving.ru/profile/311
Аватара пользователя
Bagir
Сообщения: 1614
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

Re: Значение элемента меню без линка со свойством объека

Сообщение Bagir » Вс янв 11, 2015 12:37 pm

Ответное спасибо! Тоже попробую. Конечно, когда код логики работы реле находится в одном месте это большой плюс.
----------------------
Вот еще вариант чтобы не создавать у объекта реле вспомогательное свойство:
В коде переключателя пишем

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

cm('RelayHallLight2.sendMessage', array('whosent'=>'меню','modeSwitch'=>$params['VALUE']) );
В методе sendMessage у меня вся логика работы реле.
modeSwitch - режим работы радио переключателя.
'whosent'=>'меню' - идентификатор, что метод sendMessage был вызван из меню

А в методе sendMessage вот этот код обрабатывает присланное сообщение

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

switch ($params['whosent']) {
case 'меню': // вызывает Меню при нажатии на радио переключатель
  //Если повторное нажатие на кнопку
  if ($params['modeSwitch'] == $this->getProperty("modeSwitch")) {
    // Если режим Авто 
    if ($params['modeSwitch'] == 1) {
      //Инвертируем текущий статус реле
      $f = !($this->getProperty("status"));
    } 
  } else {
    //Присвоить новый режим свойству
    $this->setProperty("modeSwitch", $params['modeSwitch']);
  } 
  break;
...
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
zelevova
Сообщения: 291
Зарегистрирован: Вт ноя 18, 2014 11:43 pm
Откуда: Краснодарский край
Благодарил (а): 32 раза
Поблагодарили: 68 раз

Re: Значение элемента меню без линка со свойством объека

Сообщение zelevova » Вт янв 13, 2015 11:57 am

zelevova писал(а):Я указал метод который нужно вызывать у объекта, а в нем уже анализировал $params['VALUE']
Вот тут косяк потому как в методе значение $params['VALUE'] уже совпадает с со связанным свойством. А если не указать свойство то при изменении статуса не из меню тут не обновиться.
Блин...
Majordomo (GitHub) на cubietruck + MegaD + 1-wire
CONNECT: http://connect.smartliving.ru/profile/311
Ответить