Користувальницькькі налаштування

Налаштування сайту


stigma

Розбіжності

Тут показані розбіжності між вибраною ревізією та поточною версією сторінки.

Посилання на цей список змін

Наступна ревізія
Попередня ревізія
stigma [2022/09/24 14:39]
127.0.0.1 зовнішнє редагування
stigma [2026/08/14 14:42] (поточний)
nightfly [Коротко про формат конфігурації]
Рядок 2: Рядок 2:
  
  
-В Ubilling начиная со стабильного релиза 1.2.0 появилась возможность использовать в ваших модулях общую реализацию стигматизации объектов. Собственно стигмы представляют из себя некие состояния каких-то рандомных объектов (items) в рамках какой то рандомной категории (scope). Использование API Stigma ближе всего по духу к [[adcomments|API ADcomments]].+В Ubilling починаючи зі стабільного релізу 1.2.0 з'явилася можливість використовувати у ваших модулях загальну реалізацію стигматизації об'єктів. Власне, стигми являють собою якісь стани якихось рандомних об'єктів (items) у межах якоїсь рандомної категорії (scope). Використання API Stigma найближче за духом до [[adcomments|API ADcomments]].
  
-Проще всего, объяснить работу этого механизма на примере "а давайте сделаем возможность где-нибудь, в каком-то нашем модуле, отмечать купил ли пользователь у нас роутер или он жадная свинья?". Конфигурация этой стигмы начинается с написания конфигурационного файла, который будет храниться в **config/stigma/**, пускай это будет **userbuyrouter.ini** в силу планируемого нами SCOPE "USERBUYROUTER". Да, имя файлика конфигурации стигмы для конкретного scope-а по-умолчанию это этот же scope в lowercase с расширением ***.ini**. Собственно он и будет у нас читаться при создании объекта стигмы с соответствующим SCOPE.+Найпростіше пояснити роботу цього механізму на прикладі "а давайте зробимо можливість десь, у якомусь нашому модулі, відзначати, чи купив користувач у нас роутер, чи він жадібна свиня?". Конфігурація цієї стигми починається з написання конфігураційного файлу, який зберігатиметься в **config/stigma/**, нехай це буде **userbuyrouter.ini** через запланований нами SCOPE "USERBUYROUTER". Так, ім'я файлика конфігурації стигми для конкретного scope-а за замовчуванням - це цей самий scope у lowercase із розширенням ***.ini**. Власне він і буде у нас читатися при створенні об'єкта стигми з відповідним SCOPE.
  
 <code ini userbuyrouter.ini> <code ini userbuyrouter.ini>
 [stigmasettings] [stigmasettings]
 TYPE=radiolist TYPE=radiolist
 +CANCELABLE=0
 +BASECLASS=dashtask
 ACTIVECLASS=todaysig ACTIVECLASS=todaysig
 ANIMATION=1 ANIMATION=1
 +RENDERER=iconic
  
 [buy] [buy]
Рядок 25: Рядок 28:
  
  
-===== Коротко о формате конфига =====+===== Коротко про формат конфігурації =====
    
-Секция "stigmasettings" является служебной и обязательной. Она указывает на базовое поведение контролов в конкретном скоупе. Возможные типы (TYPE) на даный момент "radiolist" (выбирушка одного из всех) или "checklist" (множественная выбирушка). ANIMATION просто указывает, обновлять ли с сопуствующей анимацией контейнер стигматы при изменении состояния или делать это "тихо и незаметно". Так как состояние "купил у нас роутер" не может быть одновременно и "купил" и "не купил" мы используем тип "radiolist". Опция ACTIVECLASS указывает просто, каким CSS-классом будут подсвечиваться активные/выбранные состояния объектов в рамках данного scope.+Секція "stigmasettings" є службовою та обов'язковою. Вона вказує на базову поведінку контролів у конкретному скоупі. Можливі типи (TYPE) на даний момент "radiolist" (вибір одного з усіх) або "checklist" (множинна вибірка). ANIMATION просто вказує, чи оновлювати з супутньою анімацією контейнер стигмати під час зміни стану, чи робити це "тихо і непомітно". Оскільки стан "купив у нас роутер" не може бути одночасно і "купив", і "не купив", ми використовуємо тип "radiolist". Для типу radiolist також можливо вказувати опцію CANCELABLE, яка дозволяє зняти раніше встановлену мітку.
  
-Дальше все секции, не являющиеся stigmasettings описывают конкретные состояния объектов (items) в рамках конкретного SCOPE. Их может быть сколько угодно. Имя секции собственно будет идентификатором состояния сохраняемым в БД и должно быть по возможности коротким и уникальным. Базовыми характеристиками состояния кроме его идентификатора являются NAME (имя) и ICON (вы не поверите! иконка). Иконки состояний по-умолчанию храняться в **skins/stigma/** с расширением ***.png**.+Опція  Опція ACTIVECLASS вказує просто, яким CSS-класом будуть підсвічуватися активні/вибрані стани об'єктів у межах цього scope. Також можна опційно вказувати і BASECLASS, який буде використовуватись для всіх контролів за замовчуванням. Так, це теж ім'я CSS класу.
  
-Кроме всего этого, реализована механика подгрузки кастомных файлов конфигурации и иконок, на случай если пользователи сами захотят расширить набор состояний, либо заменить иконки на какие-то свои, и чтобы это все переживало обновления. Кастомные файлы конфигурации и иконки, имеющие приоритет над умолчательными храняться в **content/documents/mystigma** в сабдиректориях **confs** и **icons**. +Далі всі секції, які не є stigmasettings, описують конкретні стани об'єктів (items) у межах конкретного SCOPE. Їх може бути скільки завгодно. Ім'я секції власне буде ідентифікатором стану, що зберігається в БД, і має бути якомога коротшим та унікальним. Базовими характеристиками стану крім його ідентифікатора є NAME (ім'я) і ICON (ви не повірите! іконка). Іконки станів за замовчуванням зберігаються в **skins/stigma/** з розширенням ***.png**.
  
 +Крім усього цього, реалізовано механіку підвантаження кастомних файлів конфігурації та іконок, на випадок якщо користувачі самі захочуть розширити набір станів, або замінити іконки на якісь свої, і щоб це все пережило оновлення. Кастомні файли конфігурації та іконки, що мають пріоритет над замовчуваними, зберігатимуться в **content/documents/mystigma** у сабдиректоріях **confs** і **icons**
  
-===== Практическое использование в коде ===== 
  
-Возвращаясь к изначальной задаче, мы хотим ловить GET параметром логин какого-то пользователя и выставлять ему состояние.+===== Практичне використання в коді ===== 
 + 
 +Повертаючись до початкової задачі, ми хочемо ловити GET параметром логін якогось користувача і виставляти йому стан.
  
 <code php> <code php>
Рядок 42: Рядок 47:
         $userLogin = ubRouting::get('username');         $userLogin = ubRouting::get('username');
                  
-        //создаем инстанс с нужным нам scope-ом.+        //створюємо інстанс із потрібним нам scope-ом.
         $userRouter = new Stigma('USERBUYROUTER');         $userRouter = new Stigma('USERBUYROUTER');
-        //зовем обработчик фоновых коллбеков на случай если у нас измениться состояние+        //викличемо обробник фонових коллбеків на випадок, якщо у нас зміниться стан
         $userRouter->stigmaController();         $userRouter->stigmaController();
-        //показываем интерфейс изменения состояния для нашего конкретного пользователя+        //показуємо інтерфейс зміни стану для нашого конкретного користувача
         show_window(__('User bought a router'), $userRouter->render($userLogin));         show_window(__('User bought a router'), $userRouter->render($userLogin));
     }     }
Рядок 52: Рядок 57:
  
  
-Ну и собственно сразу получаем результат в виде панели управления состояниями пользователя.+Ну і власне одразу отримуємо результат у вигляді панелі управління станами користувача.
  
 {{:stigma1.png|}} {{:stigma1.png|}}
  
-А может хотим панельку поменьше? +А може хочемо меншу панельку?
  
 <code php> <code php>
Рядок 62: Рядок 67:
 </code> </code>
  
-типа такой?+типу такої?
  
 {{:stigma2.png|}} {{:stigma2.png|}}
  
-А может хотим read-only панельку для администраторов без какого-то права, но нормально работающую для администраторов наделенных этими правами? Тогда как-то так+А може хочемо read-only панельку для адміністраторів без якогось права, але яка нормально працює для адміністраторів, наділених цими правами? Тоді якось так
  
 <code php> <code php>
Рядок 82: Рядок 87:
 </code> </code>
  
-А если мы хотим поросто где-то в другом месте показать тупо список существующих состояний этого пользователя?+А якщо ми хочемо просто десь в іншому місці показати тупо список наявних станів цього користувача?
  
 <code php>  <code php> 
Рядок 88: Рядок 93:
 </code> </code>
  
-типа так+типу так
  
 {{::stigma3.png|}} {{::stigma3.png|}}
  
-или вообще тупо проверить есть ли какие-то установленные состояния и получить их в виде массива для наших дальнейших дофига концептуальных бизнес-приложений?+чи взагалі тупо перевірити чи є якісь встановлені стани й отримати їх у вигляді масиву для наших подальших дофіга концептуальних бізнес-додатків?
  
 <code php> <code php>
Рядок 100: Рядок 105:
 </code> </code>
  
-А еще мы можем получить все возможные для скоупа состояния с их текстовыми описаниями вот как-то так+А ще ми можемо отримати всі можливі для скоупа стани з їхніми текстовими описами ось якось так
 <code php> <code php>
 $userRouter = new Stigma('USERBUYROUTER'); $userRouter = new Stigma('USERBUYROUTER');
Рядок 108: Рядок 113:
 </code> </code>
  
-Короче все настолько прямолинейно и брутально, насколько это возможно. А вообще [[https://ubilling.net.ua/api_doc/classes/Stigma.xhtml|посмотреть]] на публичные методы и чего у них в параметрах будет намного продуктивнее и понятнее.+Коротше все настільки прямолінійно і брутально, наскільки це можливо. А взагалі [[https://ubilling.net.ua/api_doc/classes/Stigma.xhtml|поглянути]] на публічні методи і що у них у параметрах буде набагато продуктивніше і зрозуміліше.
  
  
-===== О оптимизации быстродействия =====+===== Про оптимізацію швидкодії =====
  
-В примере выше, мы создавали инстанс стигмы как +У прикладі вище, ми створювали інстанс стигми як 
  
 <code php> <code php>
Рядок 119: Рядок 124:
 </code> </code>
  
-Что в свою очередь загружало из базы все состояния всех айтемов в этом scop-е. Это может быть полезно, когда мы одним и тем же инстансом пытаемся работать с разными айтемами одним инстансом. Например читая/проверяя наличие состояний для разных айтемов одним и тем же инстансом. Типа как+Що зі свого боку завантажувало з бази всі стани всіх айтемів у цьому scop-і. Це може бути корисно, коли ми одним і тим самим інстансом намагаємося працювати з різними айтемами одним інстансом. Наприклад читаючи/перевіряючи наявність станів для різних айтемів одним і тим же інстансом. Типу як
  
 <code php> <code php>
Рядок 143: Рядок 148:
  
  
-но в нашем первом примере, логично было бы загружать из БД только состояние одного конкретного, интересующего нас айтема, а точнее, конкретного пользователя, которого мы поймали в GET-параметре username. В таком случае создание нашего инстанса должно бы выглядеть так:+але в нашому першому прикладі, логічно було б завантажувати з БД тільки стан одного конкретного, що цікавить нас айтема, а точніше, конкретного користувача, якого ми зловили в GET-параметрі username. У такому разі створення нашого інстансу мало б виглядати так:
  
 <code php> <code php>
Рядок 149: Рядок 154:
 </code> </code>
  
-что приведет к загрузке данных о состояниях только для айтема $userLogin в рамках scop-а USERBUYROUTER в процесе создания инстанса, и вполне себе позволит нам с ними работать. Но только вот для этого конкретного $userLogin. +що призведе до завантаження даних про стани тільки для айтема $userLogin у межах scop-а USERBUYROUTER у процесі створення інстансу, і цілком собі дасть нам змогу з ними працювати. Але тільки ось для цього конкретного $userLogin.  
 + 
 + 
 +===== Логування змін станів ===== 
 + 
 +Базово, підтримується три різноманітні режими логування змін станів, якщо вам це необхідно: TASKMAN, SYSTEM, CUSTOM. 
 + 
 +  * TASKMAN:[стан] - запис до логу "Планування робіт". 
 +  * SYSTEM:[стан] - запис до системного журналу подій. 
 +  * CUSTOM:[таблиця] - запис до довільної таблиці в БД. 
 + 
 +Для логування до довільної таблиці, її структура має мати наступний формат: 
 + 
 +<code sql> 
 +CREATE TABLE IF NOT EXISTS `somecustomlog` ( 
 +  `id` INT(11) NOT NULL AUTO_INCREMENT, 
 +  `date` datetime NOT NULL, 
 +  `admin` VARCHAR(64) DEFAULT NULL, 
 +  `scope` VARCHAR(64) DEFAULT NULL, 
 +  `itemid` VARCHAR(128) NOT NULL, 
 +  `action` VARCHAR(32) DEFAULT NULL, 
 +  `state` VARCHAR(255) DEFAULT NULL, 
 +   PRIMARY KEY (`id`), 
 +   KEY `scope` (`scope`), 
 +   KEY `itemid` (`itemid`) 
 +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; 
 +</code> 
 + 
 + 
 +Логування TASKMAN: ви не використовуватимете з ймовірністю 99%, з логуванням SYSTEM:[стан] який ви можете ввімкнути при виклику обробника коллбеків, наступним чином: 
 + 
 +<code php> 
 +   $leadSource->stigmaController('SYSTEM:якийсь_стан'); 
 +</code> 
 + 
 +в системному лозі з'являтимуться записи наступного вигляду 
 + 
 +<code> 
 +STIGMA [поточний_SCOPE] CHANGE [ідентифікатор_айтема] `[якийсь_стан]` ON `[ідентифікатор_стану]` 
 +</code> 
 + 
 +Чим буде заповнюватись табличка somecustomlog при логуванні CUSTOM:somecustomlog викликаному отак: 
 + 
 +<code php> 
 +   $leadSource->stigmaController('CUSTOM:somecustomlog'); 
 +</code> 
 + 
 +теж доволі зрозуміло з іменування її полів. 
 + 
 +===== Типи рендерингу ===== 
 + 
 +Починаючи з Ubilling 1.4.1 в секції конфігурації [stigmasettings] також можна опційно встановити опцію **RENDERER**, яка прямо вказує на тип відображення контролів конкретної стигми. 
 + 
 +Можливі значення опції на даний момент: 
 + 
 +  * iconic  - рендерер, за замовчуванням у вигляді "натискаємих іконок". Він же використовується у випадку якщо опція RENDERER відсутня. 
 +  * selector - просто стандартний селектор у вигляді "вибирушки". Працює тільки з TYPE=radiolist, що доволі очевидно. 
 +  * textlink - зображає всі наявні стани в скоупі у вигляді простих текстових посилань. 
 +  * imagelink - зображає всі наявні стани в скоупі у вигляді простих текстових посилань з маленькими іконками станів. 
 + 
stigma.1664019551.txt.gz · Востаннє змінено: 2022/09/24 14:39 повз 127.0.0.1