Пользовательское условие на вывод данных в listview

Одна из самых востребованных функций списка (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. Новая статья на данную тему доступна здесь

Высказать своё мнение о статье Вы можете в комментариях, если Вас интересуют какие либо вопросы или дополнения, то обсуждение по данной теме доступно на нашем форуме.

Вы можете оставить комментарий, или поставить трэкбек со своего сайта.

Есть 3 коммент. к “Пользовательское условие на вывод данных в listview”

  1. snegg:

    Здравствуйте, у меня такая ситуация:

    В модуле «Встерчи» мне нужно добавить чекбокс ответственный за важность встречи (его я создал в студии, он занесся в таблицу «meeting_cstm», название поля «not_importent_c»), то есть при назначении новой встречи, при галочке на чекбоксе видеть должен её только он.

    Я делаю таким образом в файле custom/custom_script/list_view_meeting.php

    <?php
    }
    function limit_meeting_list(&$view, $module_name)
    {
    	global $current_user;
            var &current_user_id = $current_user->id; //вот тут я не уверен в корректности
    	if($module_name == 'Meetings' and !is_admin($current_user) and $current_user_id! =='created_by') /* вот тут 100% неправильно (мне так кажется...как проверить, создатель ли данной записи текущий юзер? может быть есть функция is_owner($current_user) :?:   )*/
    	{
    		$view->where = "not_importent_c <> 1" //тип чекбокса в базе TINYINT
    	}
    }
    ?>
    

    и подключаю её в listviewdefs.php v /custom.../metadata и в modules/.../metadata собственно по гайду)

    Спасибо большое!

    • Шуга Админ:

      Необходимо делать как здесь: условие в listview

      Условие

      $this->where .= " sales_stage NOT IN ('Closed Won', 'Closed Lost') ";

      Меняете на свое:

      global $current_user; $this->where .= " (meeting_cstm.not_importent_c = 0 OR (meeting_cstm.not_importent_c = 1 AND meeting_cstm.assigned_user_id == $current_user->id)) ";

      Примерно так.

  2. snegg:

    Спасибо огромное!!!!!!!!! :-D

    Правда я сделал 1-ым способом, изменил чуть запрос и все заработало. Кому интересно:

    сделал все действия, которые описаны в статье (добавил новую функцию именно в list_view_where.php , не знаю почему, но не работало через отдельный файл...)

    function limit_meeting_list(&$view, $module_name)
    {
    	global $current_user;
    	if ($module_name == 'Meetings' and !is_admin($current_user))
    	{
    		$view->where = "meetings_cstm.not_importent_c = 0 or (meetings_cstm.not_importent_c = 1 and meetings.assigned_user_id ='".$current_user->id."')";
    
    	}
    }
    

Написать комментарий

Вы должны войти чтобы комментировать.