Jump to content
SpravkaCRM.ru - Ваш справочник по CRM

Search the Community

Showing results for tags 'поиск'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Categories

  • Перевод официального мануала SuiteCRM
  • Обучающие статьи о SuiteCRM
    • Для программиста
  • Доводим напильником SuiteCRM
  • Расширения для SuiteCRM
    • Патчи с исправлениями ошибок в SuiteCRM
  • Программист за работой
  • Диалоги о SuiteCRM

Categories

  • Records
  • CRM-система для застройщика
    • Manual
  • CRM-система для кредитного брокера
  • CRM for Programmer
  • CRM-система для салонов красоты
    • Руководство

Forums

  • SugarCRM/SuiteCRM
    • Все вопросы пока сюда
    • Заметки по ходу разработки
    • Нам пишут
    • Работа
  • CRMHosting.io
    • SuiteCRM последней версии
    • CRM для продажи пиццы/суши/ролл
    • CRM для Застройщика
    • CRM для Кредитного брокера
    • CRM для Салонов красоты
    • CRM для Разработчика ПО / Веб-студии
  • Другие CRM-системы
    • AmoCRM
    • Bitrix24
    • BPM Online
    • Прочие CRM
  • Всего по немногу
    • Программисту
    • Arduino
    • Без систематики

Categories

  • Модули SuiteCRM/SuiteCRM
  • Manuals

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


About Me

Found 6 results

  1. Иногда возникает ситуация когда необходимо отключить "сохранение" данных в полях фильтра (в полях поиска). Т.е., например, в модуле Leads отфильтровали по полю name и теперь возвращаясь этот модуль, поле name в фильтре будет заполнено значением, которое искали, иногда это бывает неудобно. Чтоб отключить данный функционал идём в файл: modules/MySettings/StoreQuery.php и в самом конце файла находим метод getStoredQueryForUser. public static function getStoredQueryForUser($module) { global $current_user; return $current_user->getPreference($module . 'Q'); } Меняем на: public static function getStoredQueryForUser($module) { global $current_user; // return $current_user->getPreference($module.'Q'); return array(); } В данном случае я закоментировал возврат получаемых данных из таблицы user_preferences, которые отвечают за то что отобразится в фильтре и вместо этого возвращаю пустой массив, т.к. исходные данные возвращаются в виде массива. При таких изменениях коде: Пока мы находимся на странице модуля, то фильтр будет хранить выбранные варианты, т.е. будет работать пагинация и не сбрасывать значения фильтров, так же обновление страницы по нажатию клавиши F5 не сбрасывает значения фильтров. При этом, если покинуть страницу с текущим модулем, перейдя на другую, а потом вернуться, то ранее введённые в фильтр данные сбросятся.
  2. Стояла задача организовать поиск(фильтрацию на карточке списка) обращений по email связанных c ним Контактов , так же необходимо , что бы искались записи по частичному вхождению адреса, например почта pupok@mail.ru должна находиться при запросе: "pup" добавили поле mail_contact_init типа non-db выводим его в карточку расширенного поиска custom/modules/Cases/metadata/searchdefs.php или через студию, добавляем запрос по которому будит производиться поиск записи Обращения (в запросе нужно получить Id записи модуля по необходимым нам условиям) в файле custom/modules/Cases/metadata/SearchFields.php в моем случае это: 'mail_contact_init' => //Наименование поля array ( 'query_type' => 'format', // Тип запроса, важно указать format 'operator' => 'subquery', 'subquery' => 'SELECT cases.id FROM cases INNER JOIN contacts_cases ON cases.id IN (SELECT contacts_cases.case_id FROM contacts_cases WHERE contacts_cases.deleted = 0 AND contacts_cases.contact_id IN (SELECT email_addr_bean_rel.bean_id FROM email_addr_bean_rel WHERE email_addr_bean_rel.deleted = 0 AND email_addr_bean_rel.bean_module = \'Contacts\' AND email_addr_bean_rel.email_address_id IN (SELECT email_addresses.id FROM email_addresses WHERE email_addresses.deleted = 0 AND email_addresses.email_address LIKE "%{0}%" ) ) )', // вместо {0} suitecrm подставляет введенный запрос в данном поле 'db_field' => // Выборка записей основного модуля (обращения) идет по id array ( 0 => 'id', ), 'vname' => 'LBL_MAIL_CONTACT_INIT', ),
  3. Всем привет! Хочу поделиться методом, который позволяет добавлять фильтры в список записей модуля, когда надо найти все записи, у которых есть связи с определенной записью из другого модуля. Сразу оговорюсь, что SuiteCRM позволяет выполнять подобный поиск стандартным способом, когда ищем в связке один-ко-многим. Например, должны найти все Контакты, принадлежащие определенному Контрагенту. Подобные связи можно видеть в настройках шаблона поиска в студии, и настраиваются они без вмешательства программиста путем работы с интерфейсом. Мы же с вами поговорим о ситуациях, когда надо найти все записи модуля, который связан с другим модулем произвольным образом (возможно связью многие-ко-многим, а возможно вообще какими то сложными логическими схемами, главное чтобы эту связь можно было уместить в одном SQL-запросе). Чтобы было понятней давайте рассмотрим пример: Допустим, нам надо в модуль "Документы" в списке записей добавить фильтр, в котором мы сможем найти все документы, у которых за контрагента отвечает определенный пользователь. Таким образом: Мы находимся в модуле Документы Нам надо отфильтровать Документы по пользователю (модуль Users) У каждого Документа есть связь с Контрагентами многие-ко-многим (в карточке Документа сабпанель Контрагенты) В Контрагенте есть связь с Пользователем через поле assigned_user_id Нам надо получить список Документов по фильтру Стандартным способом без программирования мы сможем реализовать подобную задачу только используя модуль "Отчёты". Да. Так тоже можно. Но не удобно. Хочется находиться в модуле Документы, а не "шарится" по другим модулям/отчётам. Далее я тезисно опишу что нам понадобиться сделать, а потом покажу, как это будет выглядеть в файлах. Итак: Хотя механизм формирования фильтров и позволяет в них добавлять разную самописную отсебятину, но наиболее удобным средством, по результатам многочисленных опытов, стало добавление фильтра в виде поля модуля. То есть мы добавляем поле в модуль Documents, которое будет собой представлять как бы ссылку на модуль Users. А чтобы это поле не вносило изменения в структуру таблицы с документами, ему (этому полю) необходимо указать характеристику 'source' => 'non-db'. После выполнения быстрого восстановления с вновь добавленным полем модуля можно работать как с обычным полем: заходим в студию, и в модуле Документы помещаем его в макет поиска туда, куда удобно (имеет смысл работать только с макетом поиска, в других макетах это поле не будет работать, потому что не хранит данные в базе). В настройках поиска вручную задаем SQL-запрос, который должен будет выполниться, если мы введем какое то значение в фильтре в нашем поле. Ну а теперь по конкретике: Создаем файл с описанием добавляемого поля: custom/Extension/modules/Documents/Ext/Vardefs/account_assigned_user.php: <?php $dictionary['Document']['fields']['account_assigned_user'] = array ( 'required' => false, 'source' => 'non-db', 'name' => 'account_assigned_user', 'vname' => 'LBL_ACCOUNT_ASSIGNED_USER', 'type' => 'relate', 'massupdate' => 0, 'no_default' => false, 'comments' => '', 'help' => '', 'importable' => 'true', 'duplicate_merge' => 'disabled', 'duplicate_merge_dom_value' => '0', 'audited' => false, 'inline_edit' => true, 'reportable' => true, 'unified_search' => false, 'merge_filter' => 'disabled', 'len' => '255', 'size' => '20', 'id_name' => 'id', 'ext2' => 'Users', 'module' => 'Users', 'rname' => 'name', 'quicksearch' => 'enabled', 'studio' => 'visible', ); Хотел бы обратить ваше внимание на следующу строку: 'id_name' => 'id', Вообще подобное поле положено создавать в паре с полем, которое будет хранить непосредственно id связанной записи в базе данных. Это когда мы хотим добавить связь один-ко-многим. И в параметре 'id_name' нужно было бы указать название подобного поля. Но в нашем случае в таблице с документами нам не надо ничего хранить. Все необходимые данные мы будем получать из других таблиц. По этому в параметре 'id_name' мы указываем значение 'id' (если не вдаваться сильно в детали, то неуказать ничего мы тоже не можем, потому что этот параметр потом будет учавствовать в SQL-запросе в виде `documents`.`<id_name>`, и если ничего не указать, то будет SQL-ошибка). Создаем файл с локализацией создаваемого поля: custom/Extension/modules/Documents/Ext/Language/ru_RU.account_assigned_user.php <?php $mod_strings['LBL_ACCOUNT_ASSIGNED_USER'] = 'Ответственный за Контрагента'; Выполняем быстрое восстановление. После этого можно идти в Студию и настраивать внешний вид поиска: Переходим в модуль "Документы, и видим, что поле появилось в списке фильтров (верстка кривая, но сейчас не о этом): Нам необходимо немного модернизировать отображение этого поля. Дело в том, что если мы выбор пользователя оставим в текущем виде, то в наш SQL-запрос будет попадать имя пользователя. А это немного не то, что надо. Нам надо, чтобы в SQL-запрос попадал ID выбранного поля. Для этого мы поле переделываем в выпадающий список: открываем файл custom/modules/Documents/metadata/searchdefs.php, находим в нем секцию account_assigned_user, и меняем ее на 'account_assigned_user' => array ( 'type' => 'enum', 'studio' => 'visible', 'label' => 'LBL_ACCOUNT_ASSIGNED_USER', 'id' => 'ID', 'link' => true, 'width' => '10%', 'default' => true, 'name' => 'account_assigned_user', 'function' => array ( 'name' => 'get_user_array', 'params' => array ( 0 => false, ), ), ), После данной манипуляции фильтр по пользователю должен выглядеть как список пользователей (там опять кривая верстка, но мы опять не про нее): Если сейчас выбрать в этом поле пользователя, и нажать кнопку "Найти" в поиске, то мы ничего не получим, потому что еще не настроили механизм поиска нужных нам записей. А для этого переходим к файлу custom/modules/Documents/metadata/SearchFields.php (он как раз должен был создастся после манипуляций в студии), и вставляем в него блок такого содержания: 'account_assigned_user' => array ( 'query_type' => 'format', 'operator' => 'subquery', 'subquery' => ' SELECT `documents`.`id` FROM `documents` INNER JOIN `documents_accounts` ON `documents_accounts`.`document_id` = `documents`.`id` AND `documents_accounts`.`deleted` = 0 INNER JOIN `accounts` ON `accounts`.`id` = `documents_accounts`.`account_id` AND `accounts`.`deleted` = 0 WHERE `documents`.`deleted` = 0 AND `accounts`.`assigned_user_id` = "{0}" ', 'db_field' => array ( 0 => 'documents.id', ), ), Как видно (надеюсь), данный код ищет все id в таблице documents, которые связаны с контрагентом, у которого в assigned_user_id указано выбранное нами значение. А вот такой SQL-запрос соберется в итоге при попытке воспользоваться данным фильтром (указаю юзера с айди = 1 - админ): SELECT documents.id , documents.assigned_user_id , documents.id , documents.document_name , documents.document_revision_id , documents.doc_id , documents.doc_type , documents.doc_url , documents.category_id , documents.subcategory_id , documents.exp_date , jt0.user_name assigned_user_name , jt0.created_by assigned_user_name_owner , 'Users' assigned_user_name_mod, documents.date_entered , LTRIM(RTRIM(CONCAT(IFNULL(jt1.first_name,''),' ',IFNULL(jt1.last_name,'')))) account_assigned_user , documents.created_by FROM documents LEFT JOIN users jt0 ON documents.assigned_user_id=jt0.id AND jt0.deleted=0 AND jt0.deleted=0 LEFT JOIN users jt1 ON documents.id = jt1.id AND jt1.deleted=0 where ((documents.id IN ( SELECT `documents`.`id` FROM `documents` INNER JOIN `documents_accounts` ON `documents_accounts`.`document_id` = `documents`.`id` AND `documents_accounts`.`deleted` = 0 INNER JOIN `accounts` ON `accounts`.`id` = `documents_accounts`.`account_id` AND `accounts`.`deleted` = 0 WHERE `documents`.`deleted` = 0 AND `accounts`.`assigned_user_id` = "1" ))) AND documents.deleted=0 ORDER BY documents.document_name ASC Подобным образом можно заложить любую логику поиска нужной записи. Пользуйтесь )))
  4. Поиск является жизненно важной составляющей любой CRM-системы, так как позволяет быстро находить то, что вы хотите увидеть. Как правило CRM-системы имеют весьма большие массивы информации. И очень важно иметь возможность уточнять критерии поиска. Далее в данной статье мы разберем основные возможности, которые предоставляет SuiteCRM для поиска той или иной информации. Глобальный поиск Вы можете осуществлять поиск любых записей в CRM-системе используя глобальный поиск по всей CRM-системе. Чтобы воспользоваться глобальный поиском достаточно ввести искомый запрос в поле в верхнем правом углу страницы. Некоторые темы сразу отображают строку для поиска: В некоторых темах для большей компактности строка поиска по умолчанию скрыта, и нужно предварительно нажать на иконку лупы, чтобы появилась строка для ввода поискового запроса: После ввода поискового запроса нажмите клавишу Enter для осуществления поиска. CRM-система покажет вам результаты поиска, разбитые по модулям: Модули, которые будут учавствовать в глобальном поиске, могут быть добавлены Системным Администратором. Полнотекстовый поиск SuiteCRM предоставляет возможность включить или отключить полнотекстовый поиск. Полнотекстовый поиск работает при помощи технологии Zend Lucene. Полнотекстовый поиск очень похож на стандартный глобальный поиск, но предоставляет расширенные возможности поиска в документах и прочих файлах, в отличии от глобального поиска, который ищет только в записях базы данных. Полнотекстовый поиск возвращает результаты немного отличными от глобального поиска. Результаты возвращаются отсортированными по признаку наибольшего соответствия найденной строки результату запроса. Соответствие запросу оцениваются поисковым механизмом в диапазоне от 0 до 100. Наиболее совпадающие по версии поисковика записи находятся выше в результатах выдачи поиска. Базовый поиск Базовый поиск присутствует практически во всех модулях CRM-системы. По-умолчанию для поиска в базовом поиске предоставляется возможность поиска записей по их названию: Базовый поиск так же позволяет пользователям выбрать такием параметры, как "Мои записи" и "Избранное". В первом случае будет произведен поиск среди записей, где вы указаны ответственным за запись. Во втором случае поиск будет произведен среди записей, которые вы указали как Избранная запись отметим их предварительно звездочкой. Каждый раз, когда вы производите поиск в том или ином модуле, условия этого поиска будут для вас сохранены CRM-системой. Данная возможность позвоялет вам свободно уходить в другие модули со страницы поиска. При возвращении обратно в модуль вы вернетесь результатам последнего поиска в модуле и сможете или продолжить анализ найденных записей, или каким либо образом скорректировать поисковый запрос. Чтобы сбросить все условия поиск вам достаточно нажать кнопку "Очистить". Расширенный поиск Расширенный поиск присутствует практически во всех модулях SuiteCRM. Он предоставляет более расширенные возможности поиска по сравнению с Базовым поиском. Как правило по умолчанию в модулях уже есть некоторый набор полей, присутствующих в Расширенном поиске: Вы можете настроить результаты отображения поиска по своему усмотрению добавив или убрав те или иные поля. Для этого раскройте блок "Настройка отображения результатов поиска": Выбирая мышкой те или иные поля и нажимая кнопки перемещения между окнами "Отображаемые колонки" и "Скрытые колонки" вы можете добиться желаемого вам порядка и состава отображаемых колонок. Это удобно, когда стандартный набор колонок не отображает всех данных, необходимых вам для работы с записями текущего модуля. SuiteCRM предоставляет возможность сохранить настройки текущего поиска: что было введено в формы поиска и какие колонки вы указали для отображения результатов поиска. Эти настройки можно сохранить под каким нибудь названием, чтобы в дальнейшем можно было быстро обратиться к этому сохраненному названию условий поиска не вбивая все заново. Для этого нужно ввести название ваших текущий критерий поиска в поле "Сохранить условия поиска" и нажать кнопку "Сохранить": После этого в выпадающем списке "Сохраненные условия писка" добавится новый пункт "Поиск по странам", выбрав который вы сможете быстро воссоздать все настройки поиска и колонок, установленных вами во время сохранения этих условий: Модернизация от SpravkaCRM.ru Предлагаю вашему вниманию некоторые доработки, которые мы делали для CRM-системе на базе SuiteCRM, и которые касаются работы с поиском: saveSearchList - Свои списки записей в SugarCRM/SuiteCRM. Данная доработка позволит вам видеть все ваши сохраненные условия поиске не только в выпадающем списке в Расширенном поиске, но и всплывающей левой панели дополнительно меню, там где находятся текущие действия в модуле и список последних просмотров и избранных записей. Это удобно, так как нужно совершить значительно меньше кликов для получения того или иного сегмента записей модуля. Доработка предоставляется бесплатно. На ее странице есть описание установки и использования. multiSelect - компактный вид справочников. На мой взгляд очень классная доработка, которая позволяет сделать Расширенный поиск намного удобней в эксплуатации. Суть доработки в том, что любые поля с типом "Выпадающий список" очень громоздко смотрятся на странице поиска. multiSelect позволяет такие поля отображать в компактном однострочном виде с возможностью раскрытия всего списка при выборе в нем значений. В общем рекомендую данную доработку, если в вашей CRM-системе дело уже дошло до "бантиков" и внешний вид играет не последнюю роль при работе с CRM-системой.
  5. Version 1.0.0

    21 downloads

    Хочу предложить вам очередную небольшую, но полезную доработку, выполненную на SuiteCRM - быстрый переход на ранее сохраненные списки поиска. Наверное не все знают, что при посещении того или иного модуля вы можете сами настроить какие колонки должны быть отображены. Так же вы можете указать что должно находиться в фильтрах. И все эти настойки сохранить под каким то названием, чтобы потом быстро вызвать их. Делается это в Расширенном поиске - раскрывается блок "Настройка отображения результатов поиска" (не просто найти, правда?): Работает это следующим образом: Указываете какие колонки и в какой последовательности должны быть отображены используя блоки "Отображаемые колонки" и "Скрытые колонки" Указываете по какой колонке в каком направлении сортировать в "Сортировать по колонке" и "Сортировка" Заполняете все фильтры значениями Задаете название этому списку в поле "Сохранить условия поиска" и нажимаете кнопку "Сохранить" После этого все ваши настройки будут сохранены, и вы сможете вызвать это представление списка в любое время выбрав его в списке "Сохранённые условия поиска". Я для примера указал последовательность колонок, а в поле "Город" указал значение "St. Petersburg". И сохранил это представление под названием "St. Petersburg": Теперь чтобы быстро перейти к этому виду списка мне достаточно выбрать его в Сохранённых условиях поиска, и CRM-система применит нужные фильтры и покажет нужные колонки. Все вроде здорово, но вот лично мне не удобно вызывать виды при помощи этого списка. Я привык, что все переходы между модулями и работа внутри модуля происходит в меню. Там я могу перейти в другой модуль, перейти на создание новой записи или попасть на стандартный список записей, экспорт, импорт, какие то не стандартные пункты меню - все они в меню, а именно в верхней и левой части экрана. Идти куда то в расширенный поиск чтобы в каком то списке что то выбрать - это много кликов и не комильфо. Чтобы максимально упростить процесс получения нужного мне вида списка я названия списков вынес в панель с меню модуля: Теперь просто кликнув на ссылке в блоке "Сохранённые списки" вы получите то представление списка, какое вам нужно. Установка модуля стандартная: Из под администратора переходите в "Администрирование" и там нажимаете пункт "Загрузчик модулей": На странице загрузчика выбираете файл с расширением и нажимаете кнопку "Загрузить": После этого CRM-система загружает архив с расширением и подгатавливает его к установке. Для начала установки надо нажать кнопку "Установить": Далее CRM-система вам покажет мои условия распространения этого модуля: я ни за что не отвечаю, и если что то там пойдет не так - я не виноват. Если такие условия использования модуля вам подходят - выберите пункт "Принимаю" и жмите кнопку "Вперед". Если не подходят - жмите кнопку "Отказаться", или просто прекратите установку модуля, удалите его из списка модулей и не используйте как-либо еще в вашей CRM-системе: Если вы приняли лицензионное соглашение, то CRM-система начнет установку расширения. Длится она несколько секунд. По окончанию установки будет отображена полоска установки с 100% и куча технической информации: Если прокрутить страницу вниз, то вы увидите кнопку "Возврат на страницу загрузки модулей". Нажмите ее для завершения процесса установки: Дополнительная информация: Посмотреть исходные коды расширения и поучавствовать в развитии вы можете в проекте на Bitbucket
  6. Михаил: В шуге поиск в одном модуле по данным из связного можно сделать через студию? 13:51:34 Евгений: 13:51:54 Добрый день! 13:52:50 да, там предусмотрен механизм такой. как искать по тем или иным полям определяется в файле modules/Модуль/metadata/SearchFields.php 13:53:05 Могжно глянуть на примере Accounts: 13:53:14 'email' => array ( 'query_type' => 'default', 'operator' => 'subquery', 'subquery' => 'SELECT eabr.bean_id FROM email_addr_bean_rel eabr JOIN email_addresses ea ON (ea.id = eabr.email_address_id) WHERE eabr.deleted=0 AND ea.email_address LIKE', 'db_field' => array ( 0 => 'id', ), 'vname' => 'LBL_ANY_EMAIL', ), 13:53:48 здесь будет поиск среди записей контрагентов, чей айдишник указан в запросе в виде eabr.bean_id 13:54:02 при этом ea.email_address LIKE - часть общего подзапроса 13:54:06 и будет подставлен емайл 13:54:19 вот по образу и подобию можно делать 13:55:19 вот буквально сегодня делал, чтобы при поиске названия контрагента искались все контрагенты, у которых или имя совпадает с искомой строкой, или в связанной с контрагентом записи из другого модуля название также совпадало с искомой строкой 13:55:32 'name' => array ( 'query_type' => 'default', 'operator' => 'subquery', 'subquery' => array( 'SELECT `id` FROM `accounts` WHERE `deleted` = 0 AND `name` LIKE', 'OR' => 'SELECT `nra_prevnames`.`parent_id` FROM `nra_prevnames` WHERE `nra_prevnames`.`deleted`=0 AND `nra_prevnames`.`name` LIKE', ), 'db_field' => array( 0 => 'id', ), ), 13:56:06 у модуля nra_PrevNames связь с аккаунтами через parent_id 13:57:12 subquery - тут массив. первая строка - чтобы искало по названию в самом модуле с контрагентами, вторая строка - чтобы искало по названию в модуле nra_PrevNames. ключ 'OR' говорит какая связь должна быть (по умолчанию AND) У меня вот такое поле. То есть значение задается, а потом еще и границы указываются. 14:01:15 К нему можно такой способ применить? 14:01:24 14:02:10 ну видимо нужно будет вместо`nra_prevnames`.`name` LIKE указать какое поле будет чему равно 14:02:28 например `realty`.`square` = 14:03:02 ну сам принцип: после этого выражения в финальном sql будет подставлено значение, пришедшее из формы Я понял, спасибо! Буду пробовать! 14:03:36 14:03:37 include/SearchForm/SearchForm2.php 14:03:46 вот в этом файле все это правится 14:04:05 у меня это 992 строка 14:04:06 switch(strtolower($operator)) { 14:04:08 примерно тут 14:04:18 public function generateSearchWhere($add_custom_fields = false, $module='') { 14:04:25 в этой функции 14:04:35 можно посмотреть что там и как генерится О, вот это вообще здорово!) 14:04:51 14:05:21 )) 14:05:44 А через студию это не делается
×
×
  • Create New...