Тут показані розбіжності між вибраною ревізією та поточною версією сторінки.
| Порівняння попередніх версій Попередня ревізія | Попередня ревізія | ||
|
nyanorm [2019/08/05 11:59] |
nyanorm [2023/06/16 13:46] (поточний) nightfly [Що ще?] |
||
|---|---|---|---|
| Рядок 1: | Рядок 1: | ||
| + | ====== Рівень абстракції NyanORM ====== | ||
| + | |||
| + | ===== Навіщо це все? ===== | ||
| + | {{: | ||
| + | |||
| + | Робить НЯКУ з вашою базою. І надає дуже зручні засоби, | ||
| + | |||
| + | ===== Особливості ===== | ||
| + | |||
| + | | ||
| + | |||
| + | * Не накладає жодних обмежень на іменування табличок БД. | ||
| + | * Не диктує жодних умов щодо полів і вмісту цих табличок. | ||
| + | * Дозволяє без проблем працювати з уже наявними структурами даних. | ||
| + | * Дозволяє міксувати код як з його використанням так і в старому стилі. | ||
| + | * Не вимагає довгого і клопіткого опису моделей, | ||
| + | * Ідеальний для надшвидкого прототипування бізнес-логіки прикладних модулів. | ||
| + | * Доступний у будь-який момент і завжди з будь-якого вашого модулю. | ||
| + | * Написаний у наскільки це можливо мінімалістичному стилі з максимальним використанням наявних механік Ubilling. | ||
| + | * Мінімізує оверхеди за пам' | ||
| + | * Дозволяє наслідуванням модифікувати як завгодно будь-яку модель і методи роботи з нею, взагалі ніяк себе не обмежуючи. | ||
| + | * Не виставляє жодних вимог і засобів щодо фільтрації даних. Ви можете використовувати взагалі що захочете. | ||
| + | * Працює однаково відмінно на PHP5 і PHP7 та на PHP8. Легасі так. | ||
| + | * Максимально очевидний синтаксис і механіки вимагають для свого розуміння мінімального рівня IQ. | ||
| + | * Зашкалюючий рівень каваю. | ||
| + | |||
| + | На жаль, ми не знайшли жодного наявного рішення, | ||
| + | \\ | ||
| + | \\ | ||
| + | Якщо вам буде так спокійніше, | ||
| + | ===== Це обов' | ||
| + | |||
| + | **Ні! ** Ніхто вас ні в чому не обмежує і не примушує використовувати будь-що таке специфічне у вашому новому коді, і тим паче навіть не натякає, | ||
| + | |||
| + | |||
| + | ===== З чого почати? | ||
| + | |||
| + | Для прикладу, | ||
| + | |||
| + | <code php> | ||
| + | $query = " | ||
| + | $all = simple_queryall($query); | ||
| + | $rawPayments = array(); | ||
| + | if (!empty($all)) { | ||
| + | foreach ($all as $io => $each) { | ||
| + | $rawPayments[$each[' | ||
| + | } | ||
| + | } | ||
| + | |||
| + | debarr($rawPayments); | ||
| + | </ | ||
| + | |||
| + | Правда знайома конструкція? | ||
| + | |||
| + | <code php> | ||
| + | class payments extends NyanORM {} | ||
| + | $payments = new payments(); | ||
| + | </ | ||
| + | |||
| + | або робимо те саме з використанням < | ||
| + | |||
| + | <code php> | ||
| + | $payments = new nya_payments(); | ||
| + | </ | ||
| + | |||
| + | Так, усе після префіксу **nya_** буде розгорнуто в ім' | ||
| + | |||
| + | отримуємо всі записи | ||
| + | <code php> | ||
| + | $allPayments=$payments-> | ||
| + | </ | ||
| + | |||
| + | Так. Це типу моделька для таблички payments у ловеркейсі. Також ви можете максимально прямолінійно виставити ім' | ||
| + | |||
| + | <code php> | ||
| + | $bablo=new NyanORM(' | ||
| + | debarr($bablo-> | ||
| + | </ | ||
| + | |||
| + | Ми щось відволіклися. Коротше модель у нас є. Що там із нашим початковим планом щодо вибірки цілком конкретних платежів? | ||
| + | |||
| + | <code php> | ||
| + | class payments extends NyanORM { } // створюємо модель наслідуванням, | ||
| + | $payments = new payments(); // створюємо об' | ||
| + | $payments-> | ||
| + | $payments-> | ||
| + | $payments-> | ||
| + | $rawPayments = $payments-> | ||
| + | debarr($rawPayments); | ||
| + | </ | ||
| + | |||
| + | Давайте ще раз, на прикладі, | ||
| + | <code php> | ||
| + | $switches = new nya_switches(); | ||
| + | $allSwitches = $switches-> | ||
| + | </ | ||
| + | |||
| + | ну або якось так без чорної магії, в лоб: | ||
| + | <code php> | ||
| + | $switches = new NyanORM(' | ||
| + | $allSwitches = $switches-> | ||
| + | </ | ||
| + | |||
| + | Куди вже простіше? | ||
| + | |||
| + | ===== Про параметри моделей ===== | ||
| + | |||
| + | Як можна було помітити, | ||
| + | |||
| + | <code php> | ||
| + | $payments-> | ||
| + | $payments-> | ||
| + | </ | ||
| + | |||
| + | Також якщо нам дуже захочеться пописати шматочки запитів руками, | ||
| + | |||
| + | <code php> | ||
| + | $payments = new nya_payments(); | ||
| + | $payments-> | ||
| + | $rawPayments = $payments-> | ||
| + | debarr($rawPayments); | ||
| + | </ | ||
| + | |||
| + | Що дасть нам цілком собі ідентичний результат. Але не красиво ж, правда? | ||
| + | ===== Про очищення параметрів ===== | ||
| + | |||
| + | Слід, до речі, зауважити, | ||
| + | |||
| + | \\ | ||
| + | Якщо з якоїсь причини, | ||
| + | \\ | ||
| + | Також у будь-який момент ви можете самостійно очистити стан будь-яких параметрів конкретної моделі, | ||
| + | |||
| + | <code php> | ||
| + | $payments-> | ||
| + | $payments-> | ||
| + | $payments-> | ||
| + | $payments-> | ||
| + | $payments-> | ||
| + | </ | ||
| + | |||
| + | Помітили, | ||
| + | |||
| + | ===== Видалення даних ===== | ||
| + | |||
| + | Ви не повірите. Усе настільки ж лінійно і просто. Давайте будемо видаляти запис із таблички abstractdevices з id 666? | ||
| + | |||
| + | <code php> | ||
| + | $devices = new nya_abstractdevices(); | ||
| + | $devices-> | ||
| + | $devices-> | ||
| + | </ | ||
| + | |||
| + | ===== Кумулятивна структура data() ===== | ||
| + | |||
| + | Кумулятивна структура **data** призначена для зберігання даних, які будуть надалі використані під час виклику методів **create()** або **save()**. Власне має вона лише два параметри, | ||
| + | |||
| + | <code php> | ||
| + | $object-> | ||
| + | $object-> | ||
| + | </ | ||
| + | |||
| + | ===== Створення та зміна записів ===== | ||
| + | |||
| + | Пам' | ||
| + | |||
| + | <code sql> | ||
| + | CREATE TABLE IF NOT EXISTS `someobjects` ( | ||
| + | `id` int(11) NOT NULL AUTO_INCREMENT, | ||
| + | `name` varchar(255) NOT NULL, | ||
| + | `text` text, | ||
| + | PRIMARY KEY (`id`) | ||
| + | ) ENGINE=MyISAM | ||
| + | </ | ||
| + | |||
| + | Усе дуже прямолінійно. | ||
| + | |||
| + | <code php> | ||
| + | $object = new nya_someobjects(); | ||
| + | $object-> | ||
| + | $object-> | ||
| + | $object-> | ||
| + | </ | ||
| + | |||
| + | Зауважте, | ||
| + | \\ | ||
| + | \\ | ||
| + | Окей, запис створити ми створили, | ||
| + | Ось як це працює: | ||
| + | |||
| + | <code php> | ||
| + | deb($object-> | ||
| + | </ | ||
| + | |||
| + | Окей, припустимо, | ||
| + | |||
| + | <code php> | ||
| + | $idToModify=$object-> | ||
| + | $object-> | ||
| + | $object-> | ||
| + | $object-> | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Увімкнення режиму відлагодження ===== | ||
| + | |||
| + | Ми знаємо. Ви звикли використовувати для налагодження ваших модулів усілякі print_r/ | ||
| + | |||
| + | <code php> | ||
| + | $model-> | ||
| + | </ | ||
| + | |||
| + | Усе, тепер усі запити до БД виводитимуться прямо у ваш стандартний в'ю, а також записуватимуться разом із часом у дебаг-лог, | ||
| + | |||
| + | <code bash> | ||
| + | $ tail -F exports/ | ||
| + | </ | ||
| + | |||
| + | Також вам може захотітися врубити режим глибокого відлагодження. Тоді в цей же лог, буде дампитися також стан всієї моделі цілком на кожен пчих. Робиться це так: | ||
| + | <code php> | ||
| + | $model-> | ||
| + | </ | ||
| + | |||
| + | ===== Про виключення ===== | ||
| + | |||
| + | Якщо ви зовсім знахабнієте від вседозволеності NyanORM вам в обличчя можуть бути викинуті такі винятки: | ||
| + | |||
| + | * **MEOW_WHERE_STRUCT_EMPTY** - кумулятивна структура where порожня. А вона потрібна. Дуже. | ||
| + | * **MEOW_DATA_STRUCT_EMPTY** - кумулятивна структура data порожня. І вона теж комусь дуже потрібна. | ||
| + | * **MEOW_JOIN_WRONG_TYPE** - неправильний тип JOIN. Допустимі тільки INNER, LEFT, RIGHT. | ||
| + | * **MEOW_NO_FIELD_NAME** - не встановлено обов' | ||
| + | |||
| + | ===== Принципова схема ===== | ||
| + | |||
| + | Це десь ось настільки високорівнева штука. | ||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | Тож так, у модулях, | ||
| + | ===== Що ще? ===== | ||
| + | |||
| + | Коротше ось поки що вам практичні приклади використання цього у вигляді хеллоуворлда. Але оскільки я хеллоуворлди писати не вмію, ось вам тудушка. Як кажуть розумні люди - не вмієш писати хеллоуворлди - пиши тудушки. | ||
| + | |||
| + | |||
| + | Працювати наш TODO-list буде на наступній табличці в БД: | ||
| + | |||
| + | <code sql> | ||
| + | CREATE TABLE IF NOT EXISTS `todo` ( | ||
| + | `id` int(11) NOT NULL AUTO_INCREMENT, | ||
| + | `text` text, | ||
| + | PRIMARY KEY (`id`) | ||
| + | ) ENGINE=MyISAM | ||
| + | </ | ||
| + | |||
| + | А ось і весь код нашого модуля: | ||
| + | <code php> | ||
| + | |||
| + | $todo = new nya_todo(); // | ||
| + | // | ||
| + | |||
| + | $moduleBaseUrl = '? | ||
| + | $messages = new UbillingMessageHelper(); | ||
| + | $result = ''; | ||
| + | |||
| + | // | ||
| + | $inputs = wf_TextInput(' | ||
| + | $inputs .= wf_Submit(__(' | ||
| + | $creationForm = wf_Form('', | ||
| + | show_window(__(' | ||
| + | |||
| + | // | ||
| + | if (ubRouting:: | ||
| + | // | ||
| + | $todo-> | ||
| + | $todo-> | ||
| + | ubRouting:: | ||
| + | } | ||
| + | |||
| + | // | ||
| + | if (ubRouting:: | ||
| + | // | ||
| + | $todo-> | ||
| + | $todo-> | ||
| + | ubRouting:: | ||
| + | } | ||
| + | |||
| + | // | ||
| + | if (ubRouting:: | ||
| + | //Далі ж усе очевидно, | ||
| + | $todo-> | ||
| + | $todo-> | ||
| + | $todo-> | ||
| + | ubRouting:: | ||
| + | } | ||
| + | |||
| + | // | ||
| + | $todo-> | ||
| + | $allTodos = $todo-> | ||
| + | |||
| + | if (!empty($allTodos)) { | ||
| + | $cells = wf_TableCell(__(' | ||
| + | $cells .= wf_TableCell(__(' | ||
| + | $rows = wf_TableRow($cells, | ||
| + | foreach ($allTodos as $io => $each) { | ||
| + | $cells = wf_TableCell($each[' | ||
| + | $actControls = wf_JSAlert($moduleBaseUrl . '& | ||
| + | // | ||
| + | $editInputs = wf_HiddenInput(' | ||
| + | $editInputs .= wf_TextInput(' | ||
| + | $editInputs .= wf_Submit(__(' | ||
| + | $editForm = wf_Form('', | ||
| + | $actControls .= wf_modalAuto(web_edit_icon(), | ||
| + | //Фу так робити. | ||
| + | $cells .= wf_TableCell($actControls); | ||
| + | $rows .= wf_TableRow($cells, | ||
| + | } | ||
| + | $result .= wf_TableBody($rows, | ||
| + | } else { | ||
| + | $result .= $messages-> | ||
| + | } | ||
| + | show_window(__(' | ||
| + | </ | ||