Тут показані розбіжності між вибраною ревізією та поточною версією сторінки.
Порівняння попередніх версій Попередня ревізія | Попередня ревізія Остання ревізія По сторонах наступні версії | ||
nyanorm [2019/08/05 11:59] |
nyanorm [2023/06/16 13:42] 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(__(' | ||
+ | </ | ||