Дополнительное поле на подзагрузке, аjax [MODX]

TV поле в админке по ajax запросу, список
22 Августа 2024
php

Представим себе дополнительное поле tags, это дополнительное поле выводит ресурсы, например для формирования тегов к новости.

Так вот, стандартное дополнительное поле список (множественный выбор) выведет в код страницы все ресурсы, а не только выбранные, таким образом загрузка страницы существенно увеличиться.

Для решения таких проблем есть пакет SuperBoxSelect

Он подгружает необходимые ресурсы только тогда когда мы обращаемся к самому дополнительному полю.

Но в и в нём есть некоторая проблема:

Если у вас дополнительное поле, которое выводит не ресурсы, а пользователей и вы захотите искать не по полю username, а по полю fullname, то следующее решение для вас:

  1. Будем править прям код самого пакета, по этому при первом обновлении вся наша работа удалится :)

    Переходим по пути

    core\components\superboxselect\processors\types\users\getlist.class.php
    
  2. Присоединяем таблицу modUserProfile к modUser и добавляем в выдачу 2 поля internalKey и fullname.

    До:

    $c->select($this->modx->getSelectColumns($this->classKey, $this->classKey, '', ['id', 'username']));
    

    добавляем:

    $c->leftJoin('modUserProfile', 'modUserProfile', ['modUserProfile.internalKey = modUser.id']);
    $c->select($this->modx->getSelectColumns('modUserProfile', 'modUserProfile', '', ['internalKey','fullname']));
    
  3. Добавляем поиск не только по полю username, но и по полю fullname.

    После:

    $c->where([
    	'username:LIKE' => '%' . $query . '%'
    ]);
    

    добавляем:

    $c->where([
    	'OR:modUserProfile.fullname:LIKE' => '%' . $query . '%'
    ]);
    
  4. Меняем в выдаче результат

    Заменяем:

    $titleTpl = $this->getProperty('userTitleTpl', '@INLINE [[+username]]');
    

    на:

    $titleTpl = $this->getProperty('userTitleTpl', '@INLINE [[+fullname]]');
    

Таким образом можно добавить и другие поля, например email, телефон и прочие.