Робота зі своєю таблицею в modx

Давно не було нових уроків. Почнемо нову серію експериментів пов'язаних тепер уже з додатковими об'єктами в MODX. Це досить часто використовується, особливо, якщо ви хочете зберігати в базі даних якусь додаткову інформацію. Наприклад, компонент Redirector зберігає всі редіректи в окремій таблиці. І ми навчимося робити так само)

Якщо ви хочете зберігати додаткові дані в додатковій таблиці, вам потрібно створити своє доповнення. У MODX доповнення називаються компонентами або пакетами.

Почнемо ми з простенького:

На сайті є сторінка з картою Росії. На цій карті треба вивести мітки в тих містах, де є філії нашої організації. Карту зроблено картинкою, мітки мають абсолютне позиціонування. Все б нічого, але організація бурхливими темпами розвивається, постійно з'являються нові філії, і добре б спростити додавання міток на мапі.

Будемо вважати, що MODX ви вже встановили))) Ставимо додаток Console. щоб зручніше було експериментувати, і CMPGenerator. який допоможе нам розповісти MODX'у про нашу додаткової таблиці.

Координати міток будемо зберігати в окремій таблиці, так що, заходимо в phpMyAdmin і створюємо нову таблицю modx_map_item з наступними полями:

  • id - INT (10), AUTO_INCREMENT
  • title - VARCHAR (250), utf8_general_ci, NULL - так, По замовчуванням - NULL
  • coord_x - INT (10), NULL - так, По замовчуванням - NULL
  • coord_y - INT (10), NULL - так, По замовчуванням - NULL

Після цього заходимо в адмінку, компоненти-> CMPGenerator. Натискаємо Create package. Заповнюємо поля: Package Name - Map Database Name - залишаємо порожнім (або пишемо ім'я вашої бази даних) Tables - modx_map_item Prefix - modx_ Build Schema - Так Build Package - Так

і зберігаємо. Все, модель згенерована, всі дані про нашу таблиці у MODX'а є. Можете подивитися в папці / core / components / Map /

Відкриваємо Компонети-> Console і пробуємо створити об'єкт: Упс:

Could not load class: MapItem from mysql.mapitem.
Fatal error: Call to a member function save () on a non-object in / home /. /public_html/core/components/console/processors/exec.class.php(19). eval () 'd code on line 3

Дані у MODX'a-то є, але він не знає, що вони у нього є))

Переходимо в налаштування системи і створюємо новий параметр (якщо його ще немає) extension_packages. Заповнюємо тільки "Ключ" (extension_packages) і "Значення":

Якщо у вас в цьому параметрі вже щось записано, вам треба дописати цей код в кінець через кому, ось так:

інакше зламаються інші компоненти)))

Можна робити це не руками, а надати право MODX'у самому. Для цього треба в Console виконати наступний код: і системний параметр буде прописаний правильно.

Тепер пробуємо знову створити об'єкт. Помилки немає. Йдемо в phpMyAdmin і бачимо, що з'явився новий рядок. Вітаю, тепер ви можете працювати з цим новим об'єктом за допомогою xPDO, як з будь-яким іншим об'єктом MODX.

← Частина 5. Створення та видалення об'єктів

Додавання, редагування та видалення кастомних об. →

Створення своєї таблиці просто ідеально підходить для вирішення моєї завдання. Але коли я створив в базі пару таблиць: «modx_order_item» і «modex_product_item», після описав як «Order» і «Product» відповідно, c префіксом «modx_», і нарешті додав шлях до них в extension_packages, подивився, яке найменування об'єкта в схемою: По-ідеї все мало запрацювати вірно, але при спробі виконання
Вилазить помилка:
«Could not load class: ProductItem from mysql.productitem.»
версія МОДЕКС «MODX Revolution 2.2.12-pl»
Як же мені переконати modx прийняти свої таблиці?

Дякую за статтю!
З'ясувалося, що при генерації пакетів компонентом CMPGenerator префікси таблиць, відмінних від 'modx_', не працюють: чи не виходять дані з бази і не зберігаються.
xPDO в будь-якому випадку використовує префікс 'modx_'.

Тобто, наприклад, є у мене таблиця mecha_robot_makers, я в майстра створення (в CMPGenerator) вводжу ім'я таблиці mecha_robot_makers і префікс mecha_. У сніпеті перевіряю ім'я використовуваної в класі таблиці:

$ MyRow = $ modx-> newObject ( 'RobotMakers');
echo $ myRow -> _ table;

і на сторінці виводиться 'modx_robot_makers'.

Можливо, я неправильно зрозумів сенс префіксів або того, що саме потрібно вводити в поля при генерації пакета.
Перейменував таблицю (зробив префікс modx_), і все запрацювало.

Яка то помилка з префіксом в CMP Generatorе

У назві таблиць повинен бути такий же префікс, як і у всіх інших таблиць. Наприклад, якщо всі таблиці в базі починаються на modx_. то і кастомними таблиця повинна начінатсья на modx_. Префікс потрібен, наскільки я розумію, якщо використовується кілька кастомних таблиць. але тоді префікс повинен бути modx_fgrx_

Ось ще глюк. Спочатку зробив префікс fgrx потім помітив і поміняв на fgrx_

У першому випадку просто поміняв назву таблиці на fgrx_map_item, але це ж не правильно. Потрібно десь в настройках міняти. В налаштуваннях генератора поміняв назад на fgrx, ніяких змін, та ж помилка з подвійним підкресленням.
joxi.ru/j1A59nQu8991AE
Назва таблиці нормальне, звідки бере «нижнє підкреслення» зайве.

Доброго времени суток, Ілля! Вибачте, що піднімаю стару тему.
Намагаюся повторити вашу інструкцію, створюю таблицю, роблю пакет в CMPGenerator. Схема робиться, папка з'являється. Потім в консолі роблю $ modx-> addPackage ( 'Map', $ modx-> getOption ( 'core_path'). 'Components / Map / model /', 'modx_map_');

Але коли намагаюся викликати $ item = $ modx-> newObject ( 'MapItem');
$ Item-> save (); в консолі, то отримую
Could not load class: MapItem from mysql.mapitem.

Це я роблю щось не так, або з часів написання статті щось змінилося?

Начебто, нічого не змінювалося ... Так важко зрозуміти, в чому помилка ... Треба відкривати ці створені папки, точно звіряти шляху, звертати увагу - де велика літера, де рядкова. Взагалі, цей файл mysql.mapitem - він існує? У ньому як об'єкт називається? Ще можливо, у вас в базі префікс НЕ modx_. тоді треба його вказати в addPackage. Причин може бути безліч

Ілля, добрий вечір. Спасибо большое за ваші статті. Я вже другий день мучуся з cm generator. Створюю в phpmyadmin табличку з вашої інструкції вище. Запускаю generator. Папки, шляхи і все таке Map створюється. І далі ні тпру ні ну. До об'єкту не звертається. В логах пише:
===
(ERROR @ /papka/assets/components/cmpgenerator/connector.php) Schema /home/u111/site.ru/www/papka/core/components/Map/model/Map/Map.mysql.schema.xml contains no valid object elements.
===
Куди копати, в чому причини? Допоможіть будь ласка. Хочу зазначити, що site.ru/www/papka саме так. Modx встановлений в піддиректорію papka. А файли самого сайту (іншого) лежать в папці site.ru/www.
Дякуємо.

Прошу вибачення за неуважність. Треба було таблицю прописувати повністю! MODX_map_item. Незважаючи на те, що нижче пишеться префікс modx. Дякую ще раз. Рухаюся далі.

Ілля, здрастуйте, дуже хороші статейки у Вас, перечитав ще не все, але я в процесі)). Зіткнувся з завданням за рішенням якої не можу нічого знайти в мережі (може погано шукав, або просто не туди копав) ... Суть завдання така - мені потрібно синхронізувати 2 різних сайту на MODX revo (зокрема треба синхронізувати 2 властивості у товару, що б при зміні властивостей на одному сайті вони мінялися і на іншому), сайти обидва робочі ... можете підказати хоч в який бік рити, буду щиро вдячний

Ну по ідеї, не потрібно каталог зберігати в обох базах - треба на основному сайті, з каталогом, створити сторінку, на якій виводити усі товари, наприклад, у вигляді JSON. А на другому сайті висновок каталогу писати самостійно - із запитом даних від першого сайту, розкодуванням JSON і оформленням відповідно до дизайну.

Але якщо ви вже зробили два каталогу, доведеться писати плагін, який при збереженні товарів буде відправляти запит на інший сайт, а інший сайт повинен на цей запит зреагувати - змінити відповідні поля. Це складніше, так як доведеться думати ще й над безпекою, щоб не можна було з іншого сайту або вручну відправити такий запит і все на сайтах поламати.

Схожі статті