Одна из самых востребованных функций списка (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
Содержимое файла:
<?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 соответственно вызовем нашу функцию
<?php require_once('custom/custom_script/list_view_where.php'); limit_list($this, 'Opportunities'); ?>
Таким образом, вы можете модифицировать функцию под любые ваши нужды и подключать ее в необходимых модулях. К сожалению, этот метод имеет один недостаток: если вы правите listviewdefs через sugar studio, то при сохранении макета подключение пользовательской функции исчезнет, и вам надо будет снова подключать вашу функцию. Именно поэтому я рекомендую выносить всю вашу логику для listview в отдельный файл.
P.S. Новая статья на данную тему доступна здесь
Высказать своё мнение о статье Вы можете в комментариях, если Вас интересуют какие либо вопросы или дополнения, то обсуждение по данной теме доступно на нашем форуме.
Здравствуйте, у меня такая ситуация:
В модуле «Встерчи» мне нужно добавить чекбокс ответственный за важность встречи (его я создал в студии, он занесся в таблицу «meeting_cstm», название поля «not_importent_c»), то есть при назначении новой встречи, при галочке на чекбоксе видеть должен её только он.
Я делаю таким образом в файле custom/custom_script/list_view_meeting.php
и подключаю её в listviewdefs.php v /custom.../metadata и в modules/.../metadata собственно по гайду)
Спасибо большое!
Необходимо делать как здесь: условие в listview
Условие
Меняете на свое:
Примерно так.
Спасибо огромное!!!!!!!!!
Правда я сделал 1-ым способом, изменил чуть запрос и все заработало. Кому интересно:
сделал все действия, которые описаны в статье (добавил новую функцию именно в list_view_where.php , не знаю почему, но не работало через отдельный файл...)