Одна из самых востребованных функций списка (listview) в sugarcrm — это возможность фильтрации данных в зависимости от пользовательского условия. И почему-то ни в каких мануалах я не нашел простого изящного решения, неизменного при обновлении системы (в документации на английском – так называемый Upgrade Save). Многие начинают модифицировать bean класс sugarcrm, в частности, метод get_list_view_data,а, соответственно, можно применить только для пользовательских модулей, при обновлении sugarcrm любые изменения bean классов в родных модулях будут потеряны.
Предлагаю простой метод , как задавать условия в listview. Открываем файл listviewdefs.php в папке metadata модуля, и в самом конце добавляем строчку:
$this ->where = "" ; |
Где внутри задаем пользовательское условие к БД.
Например, в списке сделок нам не надо показывать уже закрытые сделки, тогда добавляем следующее условие:
$this ->where = "sales_stage <> 'Closed Won' AND sales_stage <> 'Closed Lost'" ; |
sales_stage – это поле в БД, которое хранит статус сделки.
Не забывайте, чтобы файл не изменился при обновлении системы, необходимо изменить его в custom директории. Например, для модуля Сделки – это будет следующий путь: custom/modules/Opportunities/metadata/listviewdefs.php
Если у вас не будет любой из папок в этом пути, создайте ее вручную. Если вы не модифицировали список через студию sugarcrm, то скорей всего, у вас не будет по этому пути и файла listviewdefs.php. Если это так, то просто скопируйте его из папки modules/Opportunities/metadata или же просто зайдите в студию -> модуль сделки -> макеты -> форма списка -> сохранить и установить. После этого он сам появится по данному пути. Изменять необходимо именно файл по этому пути.
Усложним предыдущий пример и модифицируем так, чтобы это условие работало только для обычных пользователей sugarcrm. А, например, администраторы видели все записи.
Вынесем наше условие в отдельную функцию (или класс), которую можно будет потом модифицировать под любые наши нужды, для этого сделаем файл в custom директории. У меня он находится по пути custom/custom_script/list_view_where.php
Содержимое файла:
01
02
03
04
05
06
07
08
09
10
|
<?php function limit_list(& $view , $module_name ) { global $current_user ; if ( $module_name == 'Opportunities' and !is_admin( $current_user )) { $view ->where = "sales_stage <> 'Closed Won' AND sales_stage <> 'Closed Lost'" ; } } ?> |
В listviewdefs.php соответственно вызовем нашу функцию
1
2
3
4
|
<?php require_once ( 'custom/custom_script/list_view_where.php' ); limit_list( $this , 'Opportunities' ); ?> |
Таким образом, вы можете модифицировать функцию под любые ваши нужды и подключать ее в необходимых модулях. К сожалению, этот метод имеет один недостаток: если вы правите listviewdefs через sugar studio, то при сохранении макета подключение пользовательской функции исчезнет, и вам надо будет снова подключать вашу функцию. Именно поэтому я рекомендую выносить всю вашу логику для listview в отдельный файл.
P.S. Новая статья на данную тему доступна здесь
Высказать своё мнение о статье Вы можете в комментариях, если Вас интересуют какие либо вопросы или дополнения, то обсуждение по данной теме доступно на нашем форуме.