Кейс gtsAPI. CRUD пользователей на фронте

gtsAPI и PVTables специально предназначены для быстрого программирования CRUD в MODX. Сейчас, покажу как их использовать для быстрого создания интерфейса редактирования пользователей.




Ставим gtsAPI с модсторе gtsapi. Пакет предназначен для MODX2. На MODX3 работа дополнения не гарантируется. $modx->loadClass обещают убрать в MODX 3.3. Тогда в MODX3 пакет перестанет работать.

В админке заходим в Пакеты->gtsAPI. Во вкладке «Пакеты MODX» создаем запись modx. Во вкладке «Таблицы АПИ» заводим описание таблицы к которой нужно получить доступ по API.
Нужные поля:
Пакет: modx
Имя таблицы: modUser2
Класс таблицы: modUser
Ограничение только для групп пользователей (имена груп через запятую): Administrator
Класс таблицы — это имя класса MODX описывающего таблицу в базе. Если в Имя таблицы сразу прописать этот класс, то в Класс таблицы можно ничего не писать.
Ограничение только для групп пользователей — какие группы пользователей будут иметь доступ к АПИ. Пропишите нужную вам группу. Вместо группы можно использовать Разрешения MODX.

Во вкладке properties выбираем Тип таблицы: Таблица
В поле Свойства вставляем JSON
{
        "actions": {
            "read": [],
            "create": [],
            "update": [],
    	    "delete": []
        },
	"query":{
		"class":"modUser",
		"leftJoin":{
			"modUserProfile":{
				"class":"modUserProfile",
				"on":"modUserProfile.internalKey = modUser.id"
			}
		},
		"select":{
			"modUser":"modUser.id",
			"modUserProfile":"modUserProfile.fullname,modUserProfile.email,modUserProfile.phone"
		},
		"where":{
			"modUser.primary_group":3,
			"modUser.active":1
		},
		"sortby":{
			"modUser.id":"DESC"
		}
	},
	"class_link":{
		"modUserProfile":{
			"internalKey":"id"
		}
	},
        "fields": {
            "id": {
                "type": "view",
                "class": "modUser"
            },
            "fullname": {
                "label": "ФИО",
                "type": "text",
                "class": "modUserProfile"
            },
    	    "email": {
                "label": "email",
                "type": "text",
                "class": "modUserProfile"
            },
            "phone": {
                "label": "Телефон",
                "type": "text",
                "class": "modUserProfile"
            }
        }
}
actions — описыват какие операции разрешены. В них можно указать группы и разрешения MODX, которым эта операция разрешена. Например:
"delete": {
    "groups":"Administrator,hr"
}
В fields для поля должно быть указано имя самого поля, type и class. class нужен, чтобы можно было редактировать сразу несколько таблиц. Здесь, например, при создании пользователя в таблице modUser сразу создастся запись в таблице modUserProfile. Инструкция class_link сообщяет как искать запись в таблице modUserProfile.
"class_link":{
		"modUserProfile":{
			"internalKey":"id"
		}
	},
Для записи полей с классом modUserProfile в базу ищется запись в таблице modUserProfile, где internalKey равно полю id основного класса modUser.

query — описыват mySQL запрос в базу для чтения данных в формате pdoFetch.

И, наконец, на любую страницу MODX помещаем сниппет:
{'!PVTable' | snippet : [
   'table'=>'modUser2'
]}
И на этой странице мы уже можем редактировать пользователей :-). Стандартный CRUD делаестя через gtsAPI за 10-30 минут

PS. Забыл плагин.
<?php
switch ($modx->event->name) {
    case 'gtsAPIRunTriggers':
        
        if($class == 'modUser' and $type == 'before' and $method == 'create' and $object){
            // $modx->log(1,'gtsAPIRunTriggers $object_new'.print_r($object_new,1));
            $object->set('username',$object_new['email']);
            $object->set('password',md5(date('d.m.Y H:i:s')));
            // $modx->log(1,'gtsAPIRunTriggers '.print_r($object->toArray(),1));
            
            $modx->event->returnedValues['object'] = $object;
        }
        if($class == 'modUser' and $type == 'after' and $method == 'create' and $object){
            $object->joinGroup(3);
            $object->save();
        }
    break;
}
В дальнейшем планирую заметки на темы:
1) PVExtra
2) Триггеры и handleRequest
3) subtables
4) Таблица JSON
5) Синтаксис АПИ.
Напишите плиз как вам интересны эти темы? Мне сейчас не очень понятно стоит ли все расписывать :-).

Создал телеграм канал: Канал для обсуждения и помощи с компонентом gtsAPI (MODX). Можно обсуждать и другие вопросы: MODX, PVTables, getTables, UserTest и т.д. https://t.me/gtsapi
Александр Туниеков
24 ноября 2024, 09:01
modx.pro
231
+2
Поблагодарить автора Отправить деньги

Комментарии: 3

Stepan
24 ноября 2024, 13:55
0
ну тогда groupby и having
+ подгрузка не родных пакетов
есть?

еще я правильно понимаю что фильтрация и сортировка по умолчанию по всем полям?

$object->set('password',md5(date('d.m.Y H:i:s')));
как потом этим пользоваться?
    Александр Туниеков
    25 ноября 2024, 08:00
    0
    ну тогда groupby и having
    «query» принимает все параметры pdoFetch и в нем есть и groupby и having. Пример навскидку:
    "query":{
    		"class":"modUser",
    		"leftJoin":{
    			"modUserProfile":{
    				"class":"modUserProfile",
    				"on":"modUserProfile.internalKey = modUser.id"
    			}
    		},
    		"select":{
    			"modUser":"modUser.id",
    			"modUserProfile":"modUserProfile.fullname,modUserProfile.email,modUserProfile.phone"
    		},
    		"where":{
    			"modUser.active":1
    		},
                    "groupby":"modUser.primary_group",
                    "having":{
                        "count(*)  > 3"
                    },
    		"sortby":{
    			"modUser.id":"DESC"
    		}
    	}
    Вроде такой запрос должен работать. «count(*) > 3» не уверен, что правильно составил.
    + подгрузка не родных пакетов
    «loadModels»
    {
            "actions": {
                "read": [],
                "create": [],
                "update": [],
        	    "delete": []
            },
            "loadModels" :"modextra,gtsshop",
    ...
    еще я правильно понимаю что фильтрация и сортировка по умолчанию по всем полям?
    Да правильно.

    $object->set('password',md5(date('d.m.Y H:i:s')));
    как потом этим пользоваться?
    Хм. взял пример из Создание CRUD интерфейса вне админки. Не знаю зачем там случайный пароль ставили. Просто повторил на gtsAPI. Можно добавить поле password в таблицу и можно будет ставить пароль. Но прочитать его нельзя. MODX кеш пароля выдаст.
    У нас пароли юзеров храняться в текстовом файле у меня. Так нам удобнее и я думал сделать интерфейс отделу кадров, чтоб они могли поставить и прочитать пароль. То есть сохранить его плагином в extended (Лучше редактировать extended, а password менять плагином). Но пока не до этого и директору может не понравиться.
    Кстати extended, то есть JSON поле gtsAPI уже может редактировать.
    "fields":{
            "extended.pass":{
                "label":"Пароль",
                "type":"text"
            }
        }
    Но типа поля password еще нет. Он мне еще не нужен был.
    Как использовать плагины, наверно, не очень понятно. Надо описать триггеры. Думал попозже сделать.
    W.H.I.T.E
    28 ноября 2024, 12:28
    +1
    Интересно, продолжайте.
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      3