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

Search the Community

Showing results for tags 'sugarcrm'.



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 25 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. Version 1.0.0

    48 downloads

    Пакетная загрузка файлов в субнанель документы для SuiteCRM/SugarCRM dragndropuploaddocuments - это дополнение к CRM-системе на базе SugarCRM/SuiteCRM, которое позволяет быстро и удобно добавлять файлы в субпанели документы, просто перетягивая их из папки в поле для загрузки. Поддерживает загрузку нескольких файлов одновременно. Вот смотрите, на примере модуля Контрагенты: для установки необходимо : 1 скачать файл дополнения 2 перейти в CRM систему Администрирование -> Загрузчик модулей 3 выбрать файл дополнения 4 После того , как модуль окажется в списке загруженных нажать кнопку установить 5 В появившемся окне ознакомиться с условиями лицензионного соглашения и нажать кнопку переместить переключатель в положение принимаю и нажать кнопку вперед 6 дождитесь окончания установки. Модуль готов к использованию
  3. Version 1.0.0

    14 downloads

    TechnicalSupport - это дополнительный модуль к CRM-системе на базе SugarCRM/SuiteCRM, который позволяет обращаться к службе технической поддержки CRMHosting.ru для согласовывания и последующего выполнения Ваших пожеланий по доработке Вашей CRM-системы. Примерный перечень возможных работ и их стоимость можно посмотреть на сайте.
  4. 50 downloads

    Тут находятся два мануала на английском языке, которые помогут вам при изучении внутреннего устройства CRM-систем SugarCRM и SuiteCRM.
  5. 48 downloads

    В данном файле вы можете найди схему базы данных CRM-ситемы SugarCRM: перечень используемых таблиц, набор полей в каждой таблице и связи, организованные между таблицами. Copyright © 2004-2010 SugarCRM Inc. This document is subject to change without notice. License This work is licensed under the Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 License (“License”). To view a copy of this license, visit http://www.creativecommons.org/licenses/by-nc-nd/3.0/ or send a letter to Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA. Disclaimer Your Warranty, Limitations of liability and Indemnity are expressly stated in the Agreement. Please refer to the Agreement for the specific language governing these rights and limitations under the Agreement Your Warranty, Limitations of liability and Indemnity are expressly stated in the License. Please refer to the License for the specific language governing these rights and limitations. Trademarks All SugarCRM logos in this document are registered trademarks of SugarCRM Inc. See the SugarCRM trademark policies at http://www.sugarcrm.com/crm/open-source/trademark-information.html for more information on how SugarCRM trademarks can be used.
  6. Version 1.0.0

    22 downloads

    Данный документ представляет собой перевод оригинального руководства пользователя SugarCRM CE 6.2. По большей части документ будет актуален и для более поздних версий SugarCRM CE (6.3 -6.5). Перевод является заключительным для SugarCRM CE, поскольку данный продукт более не обновляется разработчиком. Для пользователей SuiteCRM (форк SugarCRM CE) доступен обновлённый перевод по адресу: https://github.com/likhobory/SuiteCRM7RU В данном руководстве используется та же терминология, что и в языковом пакете «RUSSIAN RAPIRA Language Pack». Замечания и пожелания относительно данного перевода можно публиковать на этом форуме: https://suitecrm.com/forum/international-language-support/59
  7. Один из клиентов попросил переименовать и поменять местами первую дефолтную влкадку на главной странице SuiteCRM. В русской локализации она называется "Основная страница". Для теста я добавил еще одну страницу, назвал ее "Другая страница", и добавил на нее какой то произвольный дашлет: Наша задача: Переименовать "Основная страница" в "Разное" Сделать вкладку "Другая страница" первой в списке вкладок. Решение: Чтобы переименовать первую вкладку, найдите позицию локализации (в файле include/language/ru_RU.lang.php) $app_strings['LBL_SUITE_DASHBOARD'] = 'Основная страница'; и переименуйте ее по своему усмотрению. В нашем случае это будет: $app_strings['LBL_SUITE_DASHBOARD'] = 'Разное'; Только я призываю вас не делать это в основных файлах системы. Для всякого рода переименований и прочей кастомизации в CRM-системе предусмотрен специальный механизм. Просто добавьте эту новую строку в файл custom/include/language/ru_RU.lang.php. Если такого файла еще пока нет в вашей системе, то создайте его. Это позволит вам делать в дальнейшем более простые обновления вашей CRM-системы до последней версии. У меня на моей новой тестовой системе я добавил новый файл custom/include/language/ru_RU.lang.php такого содержания: <?php $app_strings['LBL_SUITE_DASHBOARD'] = 'Разное'; Если у вас включен режим разработчика, то новое название вкладки вы увидите сразу после загрузки главной страницы. Если же режим разработчика выключен, то чтобы увидеть результат переименования владки вам надо зайти в Администрирование -> Восстановление -> Быстрое восстановление. После этого вы также должны увидеть новое название у вкладки: Смена последовательности у вкладок: У каждого пользователя SugarCRM/SuiteCRM свой набор вкладок и дашлетов на них. Набор этих вкладок хранится в таблице `user_preferences`. Эта таблица вообще в целом содержит персональные настройки пользователей. Разные. Для нашей задачи нам нужна запись, где поле `assigned_user_id` = 'ID пользователя', а `category` = 'Home' SELECT `contents` FROM `user_preferences` WHERE `assigned_user_id` = '1' AND `category` = 'Home' Если вы выполните этот запрос, то получите строку типа такой: YToyOntzOjg6ImRhc2hsZXRzIjthOjEwOntzOjM2OiI2M2E4NDdlMy1kYWZiLTZjYjEtYzg3Mi01ODUzODdlZmRiNWEiO2E6NDp7czo5OiJjbGFzc05hbWUiO3M6MTY6IlN1Z2FyRmVlZERhc2hsZXQiO3M6NjoibW9kdWxlIjtzOjk6IlN1Z2FyRmVlZCI7czoxMToiZm9yY2VDb2x1bW4iO2k6MTtzOjEyOiJmaWxlTG9jYXRpb24iO3M6NjQ6Im1vZHVsZXMvU3VnYXJGZWVkL0Rhc2hsZXRzL1N1Z2FyRmVlZERhc2hsZXQvU3VnYXJGZWVkRGFzaGxldC5waHAiO31zOjM2OiI2M2MzMWRiMC00MDQzLTlh ... она длинная, и я ее всю приводить не стал. Это не что иное как массив с настройками, обернутый сначало функцией serialize(), а потом функцией base64_encode. Чтобы получить сам массив нам надо сделать обратное действие: сначало строку засунуть в функцию base64_decode(), а потом полученный результат отдать в функцию unserialize(). На выходе мы получим массив с настройками панелей и дашлетов на них для текущего пользователя: Здесь мы видим, что конфигурационный массив состоит из двух основных блоков: dashlets и pages. В блоке dashlets идет перечисление списком всех дашлетов на всех страницах: тут есть ID дашлета, название класса дашлета и класса записей, которые представлены на дашлете, где находится класс дашлета (по какому пути файл лежит), настройки фильтров и колонок в дашлете. В блоке pages мы видим уже настройки вкладок: какие влкдаки есть, сколько в них колонок, какие именно дашлеты какой ширины должны находиться в той или иной колонке. Для решения нашей задачи нас интересует порядок следования элементов массива pages: нам нужно будет поменять местами 0 и 1 элементы массива. Тем самым мы добьемся того, что поменяются местами вкладки с дашлетами на главной странице. Так же хочу обратить внимание на параметры pageTitle и pageTitleLabel. В первом случае этот параметр явно задает название панели. Во втором случае указан ключ локализации, который будет преобразован в значение при отображении панели в зависимости от того, какой язык пользователь выбрал при авторизации в системе. Итак, нам надо: Прочитать конфигурационную переменную для пользователя из таблицы `user_preferences`; Сделать преобразование хранимого строкового значения в массив при помощи base64_decode и unserialize; Поменять местами первый и второй элементы массива pages; Записать обратно в таблицу полученное значение предварительно запаковав его в serialize и base64_encode. Вот что у меня получилось: Файл reverseHomeTabs.php, который надо положить в главную директорию с файлами CRM-системы: <?php if (!defined('sugarEntry')) define('sugarEntry', true); require_once('include/entryPoint.php'); global $db; // Получаем настройки пользователя с ID = 1 $user_id = '1'; $sql = "SELECT * FROM `user_preferences` WHERE `category` = 'Home' AND `assigned_user_id` = '{$user_id}' AND `deleted` = 0"; $result = $db->query($sql, true); while ($row = $db->fetchByAssoc($result)) { // Пробегаемся по найденным записям // но по идее она должна быть одна $arr = unserialize(base64_decode($row['contents'])); $pages = $arr['pages']; // Меняем местами первую и вторую вкладки $arr['pages'][] = $pages[1]; $arr['pages'][1] = $pages[]; // Запаковываем обратно массив $str_new = base64_encode(serialize($arr)); // Обновляем настройки $sql = "UPDATE `user_preferences` SET `contents` = '{$str_new}' WHERE `id` = '".$row['id']."'"; $db->query($sql, true); } После вызова скрипта по адресу: http://url-вашей-crm-системы/reverseHomeTabs.php у пользователя с ID=1 (администратор) в его конфиге поменяется местами первая и вторая вкладки.
  8. В этом видео я показываю как можно снять ограничение в 6 колонок при настройках дашлетов на главной странице в SuiteCRM/SugarCRM.
  9. Здравствуйте. Только приступил к изучению suitcrm, сейчас у меня такая задача: - создать связь one-to-many для модуля accounts и projects; - сделать чтобы после создания проекта (project) его имя добавлялось в поле описание (Description) в accounts. С первой половиной в принципе все просто, вошел в студию и создал в связях, в accounts, с projects. А вот со второй половиной сложнее, не могу найти как это приписать. Помогите, пожалуйста, разобраться. Заранее спасибо.
  10. Буквально только что столкнулся с задачкой: для одного рейтингового агентства необходимо было добавить поле "Страна по ОКСМ" в несколько модулей (Контрагенты, Ценные бумаги и так далее). По сути это список стран с указанием буквенного их обозначения. Погуглив немного нашел этот список: http://mvf.klerk.ru/spr/spr63.htm, но он в виде таблицы на странице. Таблица большая, руками не вставить 100%. Поискал еще немного, и нашел такой же список в XLS. Здорово! Таблица есть. Теперь осталось ее только вставить в CRM-систему. А вставить ее надо в виде комбобокса в файл к другим комбобоксам по адресу: custom/include/language/ru_ru.lang.php. Если это сделать, то тогда список можно будет использовать при создании нового поля типа Enum (выпадающий список). Осталась маааленькая проблемка: как перегнать строки их Excel в массив в PHP? На выручку пришли средства, которые уже заложены в SugarCRM/SuiteCRM! Вы наверное в курсе, что чистая CRM-система идет без файла config.php? Именно отсутствие этого файла сигнализирует системе о том, что она еще не установлена, и позволяет пройти процедуру установки. Так вот после установки файл config.php появляется в системе! И правильно! он содержит массив на PHP! То есть CRM-система умеет брать массив, и записывать его в PHP-файл так, что подключив его через require_once мы получим этот массив! В общем поискав где это делается в системе была найдена замечательная функция write_array_to_file(), которая позволяет на входе получить название массива как он будет называться в файле, затем исходный массив для занесения его в файл и путь до файла, который будет содержать сгенеренный PHP-код. Нам осталось лишь подать в эту функцию массив. У нас есть XLS-файл. Мы его сохраняем в CSV-файл. Далее у нас есть файл include/parsecsv.lib.php, который умеет парсить CSV-файлы. Осталось все это скомпоновать вместе: <?php if (!defined('sugarEntry')) define('sugarEntry', true); /** * Created by PhpStorm. * User: CRMHosting.ru * Date: 08.11.16 * Time: 12:31 */ require_once('include/entryPoint.php'); require_once('include/parsecsv.lib.php'); print_array("*** test_oksm.php ***"); // Парсинг файла $csv = new parseCSV(); $csv->delimiter = ';'; $csv->output_delimiter = ';'; $csv->convert_encoding = true; $csv->input_encoding = 'windows-1251'; $csv->output_encoding = 'utf-8'; $csv->parse('cache/oksm.csv'); $return_array = array(); foreach ($csv->data as $data) { $return_array[$data['a2']] = $data['name']; } print_array($return_array); write_array_to_file('oksm', $return_array, 'cache/oksm.php'); После выполнения этого кода будет создан файл cache/oksm.php, содержащий нужный нам массив: <?php // created: 2016-11-08 12:37:56 $oksm = array ( '' => '', 'AF' => 'АФГАНИСТАН', 'AL' => 'АЛБАНИЯ', 'AQ' => 'АНТАРКТИДА', 'DZ' => 'АЛЖИР', 'AS' => 'АМЕРИКАНСКОЕ САМОА', 'AD' => 'АНДОРРА', 'AO' => 'АНГОЛА', 'AG' => 'АНТИГУА И БАРБУДА', 'AZ' => 'АЗЕРБАЙДЖАН', 'AR' => 'АРГЕНТИНА', 'AU' => 'АВСТРАЛИЯ', 'AT' => 'АВСТРИЯ', 'BS' => 'БАГАМЫ', 'BH' => 'БАХРЕЙН', 'BD' => 'БАНГЛАДЕШ', 'AM' => 'АРМЕНИЯ', 'BB' => 'БАРБАДОС', 'BE' => 'БЕЛЬГИЯ', 'BM' => 'БЕРМУДЫ', 'BT' => 'БУТАН', 'BO' => 'БОЛИВИЯ, МНОГОНАЦИОНАЛЬНОЕ ГОСУДАРСТВО', 'BA' => 'БОСНИЯ И ГЕРЦЕГОВИНА', 'BW' => 'БОТСВАНА', 'BV' => 'ОСТРОВ БУВЕ', 'BR' => 'БРАЗИЛИЯ', 'BZ' => 'БЕЛИЗ', 'IO' => 'БРИТАНСКАЯ ТЕРРИТОРИЯ В ИНДИЙСКОМ ОКЕАНЕ', 'SB' => 'СОЛОМОНОВЫ ОСТРОВА', 'VG' => 'ВИРГИНСКИЕ ОСТРОВА, БРИТАНСКИЕ', 'BN' => 'БРУНЕЙ-ДАРУССАЛАМ', 'BG' => 'БОЛГАРИЯ', 'MM' => 'МЬЯНМА', 'BI' => 'БУРУНДИ', 'BY' => 'БЕЛАРУСЬ', 'KH' => 'КАМБОДЖА', 'CM' => 'КАМЕРУН', 'CA' => 'КАНАДА', 'CV' => 'КАБО-ВЕРДЕ', 'KY' => 'ОСТРОВА КАЙМАН', 'CF' => 'ЦЕНТРАЛЬНО-АФРИКАНСКАЯ РЕСПУБЛИКА', 'LK' => 'ШРИ-ЛАНКА', 'TD' => 'ЧАД', 'CL' => 'ЧИЛИ', 'CN' => 'КИТАЙ', 'TW' => 'ТАЙВАНЬ (КИТАЙ)', 'CX' => 'ОСТРОВ РОЖДЕСТВА', 'CC' => 'КОКОСОВЫЕ (КИЛИНГ) ОСТРОВА', 'CO' => 'КОЛУМБИЯ', 'KM' => 'КОМОРЫ', 'YT' => 'МАЙОТТА', 'CG' => 'КОНГО', 'CD' => 'КОНГО, ДЕМОКРАТИЧЕСКАЯ РЕСПУБЛИКА', 'CK' => 'ОСТРОВА КУКА', 'CR' => 'КОСТА-РИКА', 'HR' => 'ХОРВАТИЯ', 'CU' => 'КУБА', 'CY' => 'КИПР', 'CZ' => 'ЧЕШСКАЯ РЕСПУБЛИКА', 'BJ' => 'БЕНИН', 'DK' => 'ДАНИЯ', 'DM' => 'ДОМИНИКА', 'DO' => 'ДОМИНИКАНСКАЯ РЕСПУБЛИКА', 'EC' => 'ЭКВАДОР', 'SV' => 'ЭЛЬ-САЛЬВАДОР', 'GQ' => 'ЭКВАТОРИАЛЬНАЯ ГВИНЕЯ', 'ET' => 'ЭФИОПИЯ', 'ER' => 'ЭРИТРЕЯ', 'EE' => 'ЭСТОНИЯ', 'FO' => 'ФАРЕРСКИЕ ОСТРОВА', 'FK' => 'ФОЛКЛЕНДСКИЕ ОСТРОВА (МАЛЬВИНСКИЕ)', 'GS' => 'ЮЖНАЯ ДЖОРДЖИЯ И ЮЖНЫЕ САНДВИЧЕВЫ ОСТРОВА', 'FJ' => 'ФИДЖИ', 'FI' => 'ФИНЛЯНДИЯ', 'АХ' => 'ЭЛАНДСКИЕ ОСТРОВА', 'FR' => 'ФРАНЦИЯ', 'GF' => 'ФРАНЦУЗСКАЯ ГВИАНА', 'PF' => 'ФРАНЦУЗСКАЯ ПОЛИНЕЗИЯ', 'TF' => 'ФРАНЦУЗСКИЕ ЮЖНЫЕ ТЕРРИТОРИИ', 'DJ' => 'ДЖИБУТИ', 'GA' => 'ГАБОН', 'GE' => 'ГРУЗИЯ', 'GM' => 'ГАМБИЯ', 'PS' => 'ПАЛЕСТИНСКАЯ ТЕРРИТОРИЯ, ОККУПИРОВАННАЯ', 'DE' => 'ГЕРМАНИЯ', 'GH' => 'ГАНА', 'GI' => 'ГИБРАЛТАР', 'KI' => 'КИРИБАТИ', 'GR' => 'ГРЕЦИЯ', 'GL' => 'ГРЕНЛАНДИЯ', 'GD' => 'ГРЕНАДА', 'GP' => 'ГВАДЕЛУПА', 'GU' => 'ГУАМ', 'GT' => 'ГВАТЕМАЛА', 'GN' => 'ГВИНЕЯ', 'GY' => 'ГАЙАНА', 'HT' => 'ГАИТИ', 'HM' => 'ОСТРОВ ХЕРД И ОСТРОВА МАКДОНАЛЬД', 'VA' => 'ПАПСКИЙ ПРЕСТОЛ (ГОСУДАРСТВО - ГОРОД ВАТИКАН)', 'HN' => 'ГОНДУРАС', 'HK' => 'ГОНКОНГ', 'HU' => 'ВЕНГРИЯ', 'IS' => 'ИСЛАНДИЯ', 'IN' => 'ИНДИЯ', 'ID' => 'ИНДОНЕЗИЯ', 'IR' => 'ИРАН, ИСЛАМСКАЯ РЕСПУБЛИКА', 'IQ' => 'ИРАК', 'IE' => 'ИРЛАНДИЯ', 'IL' => 'ИЗРАИЛЬ', 'IT' => 'ИТАЛИЯ', 'CI' => 'КОТ Д\'ИВУАР', 'JM' => 'ЯМАЙКА', 'JP' => 'ЯПОНИЯ', 'KZ' => 'КАЗАХСТАН', 'JO' => 'ИОРДАНИЯ', 'KE' => 'КЕНИЯ', 'KP' => 'КОРЕЯ, НАРОДНО-ДЕМОКРАТИЧЕСКАЯ РЕСПУБЛИКА', 'KR' => 'КОРЕЯ, РЕСПУБЛИКА', 'KW' => 'КУВЕЙТ', 'KG' => 'КИРГИЗИЯ', 'LA' => 'ЛАОССКАЯ НАРОДНО-ДЕМОКРАТИЧЕСКАЯ РЕСПУБЛИКА', 'LB' => 'ЛИВАН', 'LS' => 'ЛЕСОТО', 'LV' => 'ЛАТВИЯ', 'LR' => 'ЛИБЕРИЯ', 'LY' => 'ЛИВИЙСКАЯ АРАБСКАЯ ДЖАМАХИРИЯ', 'LI' => 'ЛИХТЕНШТЕЙН', 'LT' => 'ЛИТВА', 'LU' => 'ЛЮКСЕМБУРГ', 'MO' => 'МАКАО', 'MG' => 'МАДАГАСКАР', 'MW' => 'МАЛАВИ', 'MY' => 'МАЛАЙЗИЯ', 'MV' => 'МАЛЬДИВЫ', 'ML' => 'МАЛИ', 'MT' => 'МАЛЬТА', 'MQ' => 'МАРТИНИКА', 'MR' => 'МАВРИТАНИЯ', 'MU' => 'МАВРИКИЙ', 'MX' => 'МЕКСИКА', 'MC' => 'МОНАКО', 'MN' => 'МОНГОЛИЯ', 'MD' => 'МОЛДОВА, РЕСПУБЛИКА', 'ME' => 'ЧЕРНОГОРИЯ', 'MS' => 'МОНТСЕРРАТ', 'MA' => 'МАРОККО', 'MZ' => 'МОЗАМБИК', 'OM' => 'ОМАН', 'NA' => 'НАМИБИЯ', 'NR' => 'НАУРУ', 'NP' => 'НЕПАЛ', 'NL' => 'НИДЕРЛАНДЫ', 'CW' => 'КЮРАСАО', 'AW' => 'АРУБА', 'SX' => 'СЕН-МАРТЕН (нидерландская часть)', 'BQ' => 'БОНЭЙР, СИНТ-ЭСТАТИУС И САБА', 'NC' => 'НОВАЯ КАЛЕДОНИЯ', 'VU' => 'ВАНУАТУ', 'NZ' => 'НОВАЯ ЗЕЛАНДИЯ', 'NI' => 'НИКАРАГУА', 'NE' => 'НИГЕР', 'NG' => 'НИГЕРИЯ', 'NU' => 'НИУЭ', 'NF' => 'ОСТРОВ НОРФОЛК', 'NO' => 'НОРВЕГИЯ', 'MP' => 'СЕВЕРНЫЕ МАРИАНСКИЕ ОСТРОВА', 'UM' => 'МАЛЫЕ ТИХООКЕАНСКИЕ ОТДАЛЕННЫЕ ОСТРОВА СОЕДИНЕННЫХ ШТАТОВ', 'FM' => 'МИКРОНЕЗИЯ, ФЕДЕРАТИВНЫЕ ШТАТЫ', 'MH' => 'МАРШАЛЛОВЫ ОСТРОВА', 'PW' => 'ПАЛАУ', 'PK' => 'ПАКИСТАН', 'PA' => 'ПАНАМА', 'PG' => 'ПАПУА-НОВАЯ ГВИНЕЯ', 'PY' => 'ПАРАГВАЙ', 'PE' => 'ПЕРУ', 'PH' => 'ФИЛИППИНЫ', 'PN' => 'ПИТКЕРН', 'PL' => 'ПОЛЬША', 'PT' => 'ПОРТУГАЛИЯ', 'GW' => 'ГВИНЕЯ-БИСАУ', 'TL' => 'ТИМОР-ЛЕСТЕ', 'PR' => 'ПУЭРТО-РИКО', 'QA' => 'КАТАР', 'RE' => 'РЕЮНЬОН', 'RO' => 'РУМЫНИЯ', 'RU' => 'РОССИЯ', 'RW' => 'РУАНДА', 'BL' => 'СЕН-БАРТЕЛЕМИ', 'SH' => 'СВЯТАЯ ЕЛЕНА, ОСТРОВ ВОЗНЕСЕНИЯ, ТРИСТАН-ДА-КУНЬЯ', 'KN' => 'СЕНТ-КИТС И НЕВИС', 'AI' => 'АНГИЛЬЯ', 'LC' => 'СЕНТ-ЛЮСИЯ', 'MF' => 'СЕН-МАРТЕН', 'PM' => 'СЕН-ПЬЕР И МИКЕЛОН', 'VC' => 'СЕНТ-ВИНСЕНТ И ГРЕНАДИНЫ', 'SM' => 'САН-МАРИНО', 'ST' => 'САН-ТОМЕ И ПРИНСИПИ', 'SA' => 'САУДОВСКАЯ АРАВИЯ', 'SN' => 'СЕНЕГАЛ', 'RS' => 'СЕРБИЯ', 'SC' => 'СЕЙШЕЛЫ', 'SL' => 'СЬЕРРА-ЛЕОНЕ', 'SG' => 'СИНГАПУР', 'SK' => 'СЛОВАКИЯ', 'VN' => 'ВЬЕТНАМ', 'SI' => 'СЛОВЕНИЯ', 'SO' => 'СОМАЛИ', 'ZA' => 'ЮЖНАЯ АФРИКА', 'ZW' => 'ЗИМБАБВЕ', 'ES' => 'ИСПАНИЯ', 'EH' => 'ЗАПАДНАЯ САХАРА', 'SD' => 'СУДАН', 'SR' => 'СУРИНАМ', 'SJ' => 'ШПИЦБЕРГЕН И ЯН МАЙЕН', 'SZ' => 'СВАЗИЛЕНД', 'SE' => 'ШВЕЦИЯ', 'CH' => 'ШВЕЙЦАРИЯ', 'SY' => 'СИРИЙСКАЯ АРАБСКАЯ РЕСПУБЛИКА', 'TJ' => 'ТАДЖИКИСТАН', 'TH' => 'ТАИЛАНД', 'TG' => 'ТОГО', 'TK' => 'ТОКЕЛАУ', 'TO' => 'ТОНГА', 'TT' => 'ТРИНИДАД И ТОБАГО', 'AE' => 'ОБЪЕДИНЕННЫЕ АРАБСКИЕ ЭМИРАТЫ', 'TN' => 'ТУНИС', 'TR' => 'ТУРЦИЯ', 'TM' => 'ТУРКМЕНИЯ', 'TC' => 'ОСТРОВА ТЕРКС И КАЙКОС', 'TV' => 'ТУВАЛУ', 'UG' => 'УГАНДА', 'UA' => 'УКРАИНА', 'MK' => 'РЕСПУБЛИКА МАКЕДОНИЯ', 'EG' => 'ЕГИПЕТ', 'GB' => 'СОЕДИНЕННОЕ КОРОЛЕВСТВО', 'GG' => 'ГЕРНСИ', 'JE' => 'ДЖЕРСИ', 'IM' => 'ОСТРОВ МЭН', 'TZ' => 'ТАНЗАНИЯ, ОБЪЕДИНЕННАЯ РЕСПУБЛИКА', 'US' => 'СОЕДИНЕННЫЕ ШТАТЫ', 'VI' => 'ВИРГИНСКИЕ ОСТРОВА, США', 'BF' => 'БУРКИНА-ФАСО', 'UY' => 'УРУГВАЙ', 'UZ' => 'УЗБЕКИСТАН', 'VE' => 'ВЕНЕСУЭЛА БОЛИВАРИАНСКАЯ РЕСПУБЛИКА', 'WF' => 'УОЛЛИС И ФУТУНА', 'WS' => 'САМОА', 'YE' => 'ЙЕМЕН', 'ZM' => 'ЗАМБИЯ', 'AB' => 'АБХАЗИЯ', 'OS' => 'ЮЖНАЯ ОСЕТИЯ', ); Ну а дальше вставляйте его в custom/include/language/ru_ru.lang.php (например $GLOBALS['app_list_strings']['oksm_a2_list']), и используйте по назначению.
  11. Version 1.0.0

    38 downloads

    multiSelect - это дополнение к CRM-системе на базе SugarCRM/SuiteCRM, которое позволяет отображать выпадающие списки при поиске записей модулей в более компактном виде. Вот смотрите, на примере модуля Контрагенты: Здесь поля "Тип", "Отрасль" и "Ответственный" - это списки. В них можно выбрать одно или несколько значений, и CRM-система будет искать Контрагентов в соответствии с выбранными значениями. Когда списков на странице мало - их компактное отображение не является какой-либо важной задачей. Но вот если списков много, то внешний вид становится достаточно ужасным. Или, например, на одной строке поиска располагаются поля в виде строки и в виде мульти-списка. Разная высота полей просто убивает весь внешний вид поиска, делая его просто свалкой каких то полей. С этим очень не удобно работать. В итоге я сделал небольшое дополнение, которое позволяет поля типа "список" делать однострочными не теряя при этом возможности выбрать несколько значений из списка. Выделил это дополнение в виде расширения и предоставляю его вам, может кому и пригодится.... Ставится расширение в стандартный Установщик модулей. Для этого идем в Администрирование -> Загрузчик модулей: Далее выбираем ранее скачанный вами файл с раширением и нажимаем кнопку "Загрузить": Модуль должен появиться в списке расширений, готовых к установке. Нажимаем кнопку "Установить": Далее система вам покажет мои условия распространения этого модуля: я ни за что не отвечаю, и если что то там пойдет не так - я не виноват. Если такие условия использования модуля вам подходят - выберите пункт "Принимаю" и жмите кнопку "Вперед". Если не подходят - жмите кнопку "Отказаться", или просто прекратите установку модуля, удалите его из списка модулей и не используйте как-либо еще в вашей CRM-системе: Если условия использования расширения были вами приняты, то система произведет установку модуля multiSelect в вашу CRM-систему, о чем сообщит по окончании процесса установки 100% полоской и кучей информации технического характера типа вот такого: Если вы перемотаете страницу в самый низ, то увидите там кнопку "Возврат на страницу загрузки модулей". Нажимите ее для возврата: Как вы можете увидеть модуль multiSelect был перемещен в блок установленных модулей: Теперь все выпадающие списки, которые используются при поиске записей в модулях, будут иметь однострочный вид: Если кликнуть на поле со списком, то откроется список всех возможных значений, в котором вы сможете выбрать одно или несколько значений. Чтобы убрать список всех значений приведя обратно однострочный вид - нужно кликнуть мышкой вне поля. Если было выбрано одно значение, то в поле отобразится это выбранное значение. Если было выбрано несколько значений, то отобразится указание кол-ва выбранных значений: И еще одна маленькая подсказка по настройке: когда вы кликаете по такому полю, то появляется список высотой из 6 строк. Это кол-во строк по умолчанию. Это не совсем удобно для длинных списков: их приходится прокручивать. Но вы можете переопределить кол-во строк для того или иного списка. Правда сделать это можно только немного подправив код проекта. Через админку или еще как-либо без доступа к исходникам - не получится. Откройте файл searchdefs.php для того модуля, где вы хотите подправить кол-во строк. Например для Контрагентов это modules/Accounts/metadata/searchdefs.php (или custom/modules/Accounts/metadata/searchdefs.php, если есть). Там ищете нужное название поля, и добавляете в его описание блок: 'displayParams' => array( 'size' => 11, ), Таким образом, например, описание поля "Тип" в Контрагентах примет вид: 'account_type' => array ( 'name' => 'account_type', 'default' => true, 'width' => '10%', 'displayParams' => array( 'size' => 11, ), ), Тем самым я указал, что высота списка должна быть 11 строк. Это как раз размер списка с типами контрагентов. После этого в некоторых случаях требуется запустить "Быстрое восстановление" в Администрирование -> Восстановление. В результате после перезагрузки страницы с списком Контрагентов при клике на поле "Тип" у вас должен появиться список со всеми возможными значениями без прокрутки: Дополнительная информация: Посмотреть исходные коды расширения и поучавствовать в развитии вы можете в проекте на Bitbucket
  12. Version 1.0.0

    21 downloads

    Хочу предложить вам очередную небольшую, но полезную доработку, выполненную на SuiteCRM - быстрый переход на ранее сохраненные списки поиска. Наверное не все знают, что при посещении того или иного модуля вы можете сами настроить какие колонки должны быть отображены. Так же вы можете указать что должно находиться в фильтрах. И все эти настойки сохранить под каким то названием, чтобы потом быстро вызвать их. Делается это в Расширенном поиске - раскрывается блок "Настройка отображения результатов поиска" (не просто найти, правда?): Работает это следующим образом: Указываете какие колонки и в какой последовательности должны быть отображены используя блоки "Отображаемые колонки" и "Скрытые колонки" Указываете по какой колонке в каком направлении сортировать в "Сортировать по колонке" и "Сортировка" Заполняете все фильтры значениями Задаете название этому списку в поле "Сохранить условия поиска" и нажимаете кнопку "Сохранить" После этого все ваши настройки будут сохранены, и вы сможете вызвать это представление списка в любое время выбрав его в списке "Сохранённые условия поиска". Я для примера указал последовательность колонок, а в поле "Город" указал значение "St. Petersburg". И сохранил это представление под названием "St. Petersburg": Теперь чтобы быстро перейти к этому виду списка мне достаточно выбрать его в Сохранённых условиях поиска, и CRM-система применит нужные фильтры и покажет нужные колонки. Все вроде здорово, но вот лично мне не удобно вызывать виды при помощи этого списка. Я привык, что все переходы между модулями и работа внутри модуля происходит в меню. Там я могу перейти в другой модуль, перейти на создание новой записи или попасть на стандартный список записей, экспорт, импорт, какие то не стандартные пункты меню - все они в меню, а именно в верхней и левой части экрана. Идти куда то в расширенный поиск чтобы в каком то списке что то выбрать - это много кликов и не комильфо. Чтобы максимально упростить процесс получения нужного мне вида списка я названия списков вынес в панель с меню модуля: Теперь просто кликнув на ссылке в блоке "Сохранённые списки" вы получите то представление списка, какое вам нужно. Установка модуля стандартная: Из под администратора переходите в "Администрирование" и там нажимаете пункт "Загрузчик модулей": На странице загрузчика выбираете файл с расширением и нажимаете кнопку "Загрузить": После этого CRM-система загружает архив с расширением и подгатавливает его к установке. Для начала установки надо нажать кнопку "Установить": Далее CRM-система вам покажет мои условия распространения этого модуля: я ни за что не отвечаю, и если что то там пойдет не так - я не виноват. Если такие условия использования модуля вам подходят - выберите пункт "Принимаю" и жмите кнопку "Вперед". Если не подходят - жмите кнопку "Отказаться", или просто прекратите установку модуля, удалите его из списка модулей и не используйте как-либо еще в вашей CRM-системе: Если вы приняли лицензионное соглашение, то CRM-система начнет установку расширения. Длится она несколько секунд. По окончанию установки будет отображена полоска установки с 100% и куча технической информации: Если прокрутить страницу вниз, то вы увидите кнопку "Возврат на страницу загрузки модулей". Нажмите ее для завершения процесса установки: Дополнительная информация: Посмотреть исходные коды расширения и поучавствовать в развитии вы можете в проекте на Bitbucket
  13. Максим: Добрый день 11:25:26 Евгений: 11:25:41 добрый! У меня такой вопрос, например у нас IT компания. Нужно чтобы клиенты ставили задачи исполнителям и сами могли менять статус задачи, например "Не выполнена" если они недовольны решением исполнителя 11:27:29 возможно такое? 11:27:35 11:28:22 для этого надо или клиентов пускать в CRM в виде пользователей 11:28:35 или писать на сайте личный кабинет, интегрированный с CRM 11:28:53 ну или просто интегрировать личный кабинет, если он уже написан и там есть такой функционал нет, писать что то лишнее и тратить на это время не хотелось бы. А возможность разделения ролей или создание своих присутствует? 11:29:53 11:30:11 да, есть разделение по ролям 11:30:31 в рамках роли можно либо разрешить править все записи в модуле, либо только свои, либо не править вовсе 11:30:59 с видимостью записей тоже самое 11:31:03 чтобы не видел чужие 11:31:29 только тут вот особенность. под "Своей" подразумевается задача, за которую ответственный текущий пользователь 11:31:51 если клиент назначил кому то задачу, то он сделал ответственным другого пользователя, и сам теряет доступ к этой задаче и не может отслеживать ее статус? 11:32:13 11:32:28 можно хотя немного "допилить" систему, чтобы под "своей" записью подразумевалось кто поставил задачу и кто ответственный за нее 11:33:06 не, статус может отслеживать 11:33:15 например можно сделать, что видит все заявки 11:33:19 но править может только свои 11:33:31 но тогда будет видеть и все заявки других клиентов вот смотрите, я - недовольный клиент, мне не нравится как меня обслужили. Я являясь пользователем этой crm ставлю задачу исполнителю - доделать такой то глюк и назначаю на него. Исполнитель сделал и ставит статус - "Сделано", но я как заказчик недоволен исходом этой правки и опять этой же задаче хочу поставить статус "Не сделано". Возможен такой сценарий? 11:35:57 11:36:42 да 11:36:48 и причем кучей разных способов 11:37:08 от бесплатных но менее удобных до более удобных и доработанных в коде 11:37:37 например когда клиент не доволен и делаю заявку я сразу назначаю исполнителя 11:37:45 у исполнителя в его задачах эта появляется 11:38:02 он по ней отрабатывает и пишет что все. и ответственным за задачу ставит того, кто создал задачу 11:38:13 она возвращается постановщику. он за нее ответственный и видит ее 11:38:16 ему не нравится 11:38:30 он пишет комментарий и опять делает ответственным исполнителя 11:38:40 исполнителю опять эта задача прилетает 11:38:53 и так они могут футболить задачу пока не достигнут дзена 11:39:12 а как все- постановщик ее закрывает и задача улетает в архив вот, то что нужно) 11:39:26 и еще вопрос, последний 11:39:45 например нужны роли 1. Супер Админ, который все может 2. Заявитель 3 Исполнитель. С этими тремя понятно. Но нужен 4ый - менеджер, который просто следит за процессом и смотрит, как исполнитель обслуживает его(менеджера) клиентов, наверное ему должны быть доступны все заявки, может быть даже их редактирование, но согласитесь права супер админа ему давать тоже не дело. 11:42:41 11:43:05 да, можно 11:43:15 сделать роль, которая будет видеть все, но ничего не удалять и не править 11:43:18 без супер-прав 11:44:16 смотрите: роль позволяет для каждого модуля настроить действия: создание/редактирование + просмотр карточки + просмотр в списчке + удаление + импорт + экспорт + массовое обновление 11:44:47 каждое из этих действий можно настроить чтобы был к ним доступ: 1 - к любым записям 2 - вообще не было доступа 3 - к "своим" записям 11:44:53 ну и еще по группам Тоесть можно создавать свои любые роли и гибко настраивать их возможности? 11:45:04 подождите, а модуль - что за сущность? 11:45:17 11:45:24 ну на сколько гибко это конечно понятие относительное... 11:45:33 зачастую гибкости не хватает 11:45:39 но пока из услышанного да, можно 11:45:48 Задачи - это модуль 11:45:55 содержит список записей с задачами а - понятно 11:45:59 тоесть все это можно сделать при помощи стандартных средств - верно? пусть и не крайне удобно, но зато ничего не допиливая 11:46:38 11:46:43 ну по сути пока да ну, все, что я перечислил 11:47:00 пока нам нужно только это, но я думаю мы будем в дальнейшем работать с этой crm. А вы я так понимаю специализируетесь и предлагаете услуги по доработке под дополнительные нужды? 11:48:05 11:48:19 да 11:48:45 SugarCRM/SuiteCRM по сути просто основа с некоторым функционалом, который можно заточить под любой вид деятельности 11:48:52 там только базовые основы и нет как правило специфики 11:48:57 ее я и дописываю понятно, я буду иметь вас в виду. Может быть где то есть прайс? 11:49:47 или каждый раз цена обсуждается в зависимости от задачи 11:50:02 11:50:11 каждый раз обсуждается 11:50:26 это же не товар с фиксированной стоимостью и сроком изготовления... 11:50:35 фиксирована только цена моих услуг = 1500 рублей час согласен 11:50:35 11:50:39 от нее и пляшу понятно, спасибо Евгений 11:51:24 кстати не подскажете какой нибудь гайд по работе? 11:51:50 лучше всего с постановкой задач 11:51:58 даже приемущественно 11:52:11 11:52:44 нет, не подскажу к сожалению 11:53:05 в планах его создать... но это пока планы... времени не хватает понятно, спасибо, всего доброго 11:54:15 11:54:53 спасибо! хорошего дня! нашел мануал, может быть в качестве ликбеза вам будет удобно раздавать своим клиентам http://www.call-center.su/call-center/crm/SugarCRM_manual.pdf 11:58:51 11:59:17 да, был такой 11:59:29 это они дернули из SugarCRM 11:59:39 он не актуальный, но в целом основные вещи отражает 11:59:41 спасибо что, сильно не актуальный?) своё то я там найду? 12:00:13 12:00:22 да, найдете!
  14. Кирилл: Добрый день! Искал на форуме информацию о том - как создать свой вид для отображения карточки редактирования, так и не нашел . Вообще такое возможно ? 11:51:07 Евгений: 11:51:27 Добрый день! для стандартного action=EditView 11:51:56 11:52:32 как правило работа с картами ограничена регулированием состава и месторасположения тех или иных полей и кнопок логика просто нужна такая - в зависимости от выбранного Селекта, показывать или прятать другие поля для редактирования в карте 11:53:11 11:53:37 в базовом функционале SuiteCRM этого нет 11:53:44 подобное есть в SugarCRM Pro 11:53:50 но оно не бесплатно Т.е. лучше создать свои отдельные экшены и там их кастомизировать ?! 11:53:57 11:54:35 лично мой опыт подобного - это подключается к странице javascript, который при помощи jquery отображает/скрывает те или иные поля 11:55:56 ну тоесть настраиваем $('#айдиполясселектом').change(function(){ а тут отображаем или скрываем другие поля}); с этим нет проблем. Просто поля будут местами скрыты и получаются пробелы ) а хочется чтобы они взаимно подтягивались к верху, но так как там таблица, а не бутстраповские grid блоки (к примеру) организовать такую структуру сложнее 11:56:46 вот и хотелось изменить шаблон вывода полей на свой 11:56:56 11:57:00 ну тогда видимо нужно использовать какую то кастомную вьюху вот ))) 11:57:05 можно ли кастомную вьюху создать для стандартного Экшена Редактирования карты ? 11:57:18 переопределить каким то образом ? 11:57:31 12:04:17 да 12:04:19 смотрите 12:04:59 в /custom/modules/Модуль/controller.php можно задавать свои собствннные контроллеры для модуля 12:05:16 В нужном вам модуле добавляете такой файл и в него: 12:05:47 <?php require_once('include/MVC/Controller/SugarController.php'); class МодульController extends SugarController { function action_EditViewCustom() { $this->view = "editcustom"; } } ?> 12:06:00 не, не так 12:06:02 так: 12:06:13 <?php require_once('include/MVC/Controller/SugarController.php'); class МодульController extends SugarController { function action_EditView() { $this->view = "editcustom"; } } ?> 12:06:33 таким образом вы определили свою новую вьюху для стандартного действия EditView 12:06:39 и назвали ее editcustom другие действия. как я понимаю, изменение не затронет ни коим образом?! ) 12:07:00 12:07:03 теперь создаем файл: /custom/modules/Модуль/views/view.editcustom.php 12:07:27 и в нем будет: да этот момент я помню из Ваших видео, довольно смышленая идея так разделить файлы 12:07:30 12:07:45 <?php if (!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); class МодульViewEditCustom extends МодульObjectsViewEdit { } ?> 12:08:16 ну а в нутри уже по образу и подобию того, что есть в /custom/modules/Модуль/views/view.edit.php class AccountsViewDetail extends ViewDetail 12:08:31 только название своего модуля 12:08:43 12:09:00 ViewDetail не путать только с ViewEdit 12:09:10 а так по такому принципу и делать везде это само собой, но там суть видна из названий 12:09:13 12:09:22 и изменения будут касаться только того модуля, где это все определено и того экшена для которого Переопределено 12:09:33 12:09:36 ну да верно ? 12:09:36 12:09:43 для EditView в данном случае ок - попробую сейчас 12:09:44 классы у меня получилось сделать - добился контроля над ситуацией, но остается один вопрос - как подключить теперь файл TPL шаблона и как в него переменне передать ? 13:02:16 13:05:42 через $this->view_object_map['tpl'] 13:06:04 один из вариантов 13:06:05 public function display() { $tpl = $this->view_object_map['tpl']; $sugarSmarty = new Sugar_Smarty(); $sugarSmarty->assign('CALENDAR_FORMAT', $GLOBALS['timedate']->get_cal_date_format()); $sugarSmarty->assign('CALENDAR_FDOW', $GLOBALS['current_user']->get_first_day_of_week()); $sugarSmarty->assign("tpl", $this->view_object_map['tpl']); $sugarSmarty->display($tpl['template']); } 13:06:34 или 13:06:35 global $current_user; $tpl['date_format'] = $current_user->getPreference('date_format'); $tpl['template'] = 'custom/modules/nra_Contracts/tpls/Prolongation.tpl'; $tpl['prolongation_statuses'] = $GLOBALS['app_list_strings']['prolongation_statuses']; $tpl['find_prolongation_statuses'] = $GLOBALS['app_list_strings']['prolongation_statuses']; unset($tpl['find_prolongation_statuses']['']); $tpl['contract_statuses_list'] = $GLOBALS['app_list_strings']['contract_statuses_list']; $tpl['refusal_prolongation_reasons'] = $GLOBALS['app_list_strings']['refusal_prolongation_reasons']; $this->view = "default"; $this->view_object_map['tpl'] = $tpl;
  15. Кирилл: добрый день! Просмотрел ваши видео о SuiteCRM, очень все толково и прекрасно. Больше подобного материала на русском практически нет. Огромное спасибо за труды 12:05:51 Евгений: 12:06:17 добрый! 12:06:19 спасибо! Хотел уточнить, если такое возможно, где можно найти конфигурацию комбобоксов? они в базе все-таки сидят или так же как и поля редактируются в php файле? 12:06:33 12:07:36 Базовые комбобоксы, которые изначально были в системе, лежат в файле /include/language/ru_ru.lang.php а если я свои создаю через конструктор модуля ? 12:07:46 во время создания новых полей 12:07:52 12:08:04 если вы добавляете свои или редактируете базовые, то они лежат в /custom/include/language/ru_ru.lang.php 12:08:25 $GLOBALS['app_list_strings'] - переменная, доступная в системе и содержит все комбобоксы 12:09:26 базовые комбобоксы лучше не редактировать в файле, чтобы оставлять возможность апгрейда системы, и все правки делать в /custom/include/language/ru_ru.lang.php 12:10:06 можно и старые модифицировать, просто новую версию старого комбобокса указывать в /custom/include/language/ru_ru.lang.php да, я так и сделал ) старые не трогая, добавляю новые при создании полей. Ок вопрос. а тогда куда нужно скопировать из файла /custom/include/language/ru_ru.lang.php конфигурацию комбобокса, чтобы его можно было увидеть в Студии, в редакторе комбобоксов ? 12:10:50 12:10:55 никуда 12:11:12 это их нормальное местоположение и студия должна корректно с ними работать без дополнительных действий хм, странно. 12:11:12 12:12:53 вот например у меня есть комбобокс 12:12:54 $GLOBALS['app_list_strings']['nra_sentreports_status_list'] = array( 'new' => 'Сформирован', 'send' => 'Отправлен', ); 12:13:08 и он виден если зайти Администрирование - Редактор комбобоксов а если я его не в коде создавал а через конструтор модулей. Создал новоей поле DropDown и нажал Добавить (в плане добавить новый комбобокс) открылась вкладка, все сделал, сохранил, и где мне найти конфигурацию потом этого комбобокса? Конфигурацию поля я копирую оттуда, как Вы в видео показывали /custom/modulebuilder/packages/ realtor/modules/created_fields_module/vardefs.php в файл /custom/Extension/modules/myModule/Ext/Vardefs/customFields.php 12:15:50 12:17:27 Когда комбобокс создается в конструкторе, он находится в третьем местоположении 12:17:47 поищите его в /custom/Extension/application/Ext/Language 12:17:51 там файлы языковые 12:17:54 для разных модулей 12:17:58 он скорее всего там 12:18:07 но я стараюсь так не делать 12:18:24 я обычно сначало создаю комбобокс в /custom/include/language/ru_ru.lang.php 12:18:36 а потом уже в конструкторе модуля при добавлении поля указываю его Понял суть )) сначала создать Комбобокс, а потом уже при конструировании его привязывать 12:18:43 12:18:47 да Спасибо большое ) разобрался 12:18:58 12:19:03 пожалуйста 12:19:04 удачи Я еще заметил что система работает в основном через Ajax, и создается вопрос, для клиентской части целесообразно использовать фреймворк по типу Angular JS? 12:20:08 12:21:31 и работает она через Ajax кривенько прекривенько 12:21:41 я его обычно для модулей сразу отключаю 12:21:49 хорошо что такая возможность присутствует 12:22:02 наверное можно использовать все, что вам будет удобно 12:22:20 но считаю что лучше стараться в систему не привносить какие то новые технологии 12:22:30 а стараться разобраться с существующими 12:22:49 jquery например с YUI там за глаза хватает 12:23:18 а то будет кладбище разных технологий, которое закостылит весь проект, и после вас там никто разобраться ни с чем не сможет ))) 12:23:21 ка кто так ... Понял. Спасибо за проффессиональный взгляд. И полностью согласен. Система большая и много чего реализовано уже на старте
  16. Виктор: Евгений, добрый день 13:23:04 Евгений: 13:23:18 Добрый! Хотел у Вас поинтересоваться по поводу интеграции CRM. 13:24:04 Выбрать хостинг. Узнать стоимость ваших услуг 13:24:36 13:25:36 если хотите платный хостинг, берите чтобы стоил не менее 500 рублей в месяц 13:25:40 лучше 1000 или две 13:25:47 за эти деньги вам продадут более менее нормальный 13:25:57 это если не вдаваться в технические характеристики 13:26:03 мои услуги стоят 1500 рублей час Вы интегрируете CRM с эластиксом?? Там астерикс с freePBX 13:27:16 13:27:47 подобного опыта нет 13:28:02 но есть большой опыт работы с CRM Мне нужно чтобы оператор работая с CRM мог производить звонки из CRM, у vTiger вроде такая функция есть 13:29:24 И на эластиксе 4 я видел модуль под сахар 13:29:58 13:30:22 в теории я могу разобраться и настроить все это 13:30:33 я видел есть модули для интеграции с астериской 13:30:59 и мог бы или их попробовать поставить и допилить под вас, если такая необходимость будет 13:31:10 но готового предложения у меня нет 13:31:20 я не знаю сколько это будет стоить по поводу хостинга: 13:31:42 https://hosting.reg.ru/hosting/plan/Host-1-1209 13:31:55 такой подойдет 13:32:02 13:32:15 думаю вам будет проще обратиться в компанию, у которой есть опыт подобных интеграций... они хотя бы смогут сказать точную сумму 13:33:46 Объем выделяемой памяти: 256 Мб для каждого скрипта; 13:33:50 я обычно ставлю 512 13:33:55 Максимальный размер выделяемой памяти на процесс: 1 Гб; 13:34:03 не знаю что они под этим подразумевают 13:34:16 я с хостингами давно не имел дел 13:34:34 но если говорить про сервер, то надо чтобы было доступно не менее 2 гигабайт оперативы 13:34:43 это один из основных показателей нужных 13:34:47 можно и на 1 гигабайте 13:35:14 но периодически все будет подвисать. сложные выборки и какие то задачи крона будут или не работать или работать криво Что мне нужно. 3 оператора 3 исполнителя 1 админ постановка задач и ведение клиентской базы для сервисного центра 13:35:25 13:37:18 разместите у меня бесплатно )) Бессплатно- только сыр в мышеловке. Можем у вас произвести настройку проработку, а потом перекинуть??? 13:38:38 13:38:58 да, я как раз на днях добавил возможность скачать всю систему себе с моего хостинга 13:39:15 ну тоесть вы можете зарегистрироваться, получить црм-ку, настроить ее там по своему усмотрению 13:39:27 и в любой момент скачать ее полностью с базой данных и где то там у себя установить уже Вы за оплату сможте ее настоить для нас на своём хостинге, а потом перенести на мой??? 13:40:52 13:41:29 смотрите: установка црм-ки (или нескольких) делаете вы сами просто зарегистрируюясь на этом сайте в админке 13:41:37 вы там можете что хотите с ней делать 13:41:39 в интерфейсе 13:41:44 вам дается админ-доступ к црм 13:41:52 а потом вы также бесплатно можете ее скачать 13:42:02 если будет нужна моя помощь именно как специалиста 13:42:07 или нужно будет как то доделать црм 13:42:11 или помочь вам в чем то 13:42:18 я все смогу для вас сделать за доп.плату 13:42:22 мои услуги стоят 1500 рублей час Может у вас есть готовые решения для сервисного центра??? 13:42:45 13:44:06 нет, у меня нет готовых предложений каких либо бизнесов. хотя у меня и есть куча наработок в тех или иных областях, но у каждого из клиентов слишком все разное, чтобы я мог выделить какую то версию и продавать ее для того или иного вида бизнеса. да и я один работаю. у меня на это просто нет времени Спасибо Вам.
  17. Роман: Здравствуйте! Помогите пожалуйста. Перестали сохраняться данные в созданных мною полях в модуле "Контакты". Что это может быть? 13:59:43 в suitecrm 14:00:07 Евгений: 14:02:33 добрый день! 14:02:41 возможно вы установили себе модуль какой нибудь 14:02:46 который некорректно встал 14:02:58 или у вас расхождения в полях с базой данных 14:03:09 сделайте себе быстрое восстановление 14:03:26 Администрирование - Восстановление - самая верхняя ссылка Быстрое восстановление спасибо огромное, буду пробовать! 14:03:29 14:03:38 там внизу потом сформируются sql-запросы 14:03:43 возможно 14:03:51 если будут - их надо будет тоже выполнить хорошо, спасибо большое
  18. Кирилл: Здравствуйте) Вопрос не стандартный) Так уж вышло что я решил сделать диплом в котором происходит внедрение SugarCRM в компанию. У Вас случайно дипломами не занимаются? ) 12:13:06 Евгений: 12:13:36 Добрый день! 12:13:57 напрямую нет 12:14:11 но я с удовольствием могу поделиться своими знаниями 12:14:36 час моего времени стоит 1500 рублей 12:14:46 за несколько часов я могу из вас сделать неплохого специалиста по шугару 12:14:57 если будете внимательно слушать и стараться разобраться 12:15:08 а потом еще и на работу возьму ))) Дело в том, что диплом у меня практически есть. Точнее есть, но что то мне в нем не устраивает. Вот хотел поинтересоваться на доработку диплома. 12:16:39 Мне нужны блок схемы бизнес процессов. И блок схемы аппаратной части (железо). Настройка sugar CRM и внедрение. Так как у меня специальность электронщик, то нужно больше по железу. как то так 12:20:39 12:23:58 я больше по практическому применению шугара 12:24:02 а не по теории 12:24:07 у меня нет блоксхем 12:24:27 зато есть знания как разворачивать и какие характеристики железа желаемы 12:24:30 и вообще что нужно 12:24:54 а сможет ли вы эту информацию у меня получить и оформить в виде графиков и схем - уже к вам вопрос ))) Понял. Связаться с Вами в сл раз тут же? 12:29:00 12:29:12 да, я обычно онлайн ок! спасибо 12:29:19 12:29:21 ну или пишите на admin@crmhosting.ru хорошо
  19. Михаил: Добрый день! 12:38:45 Евгений: 12:39:02 Добрый! Делаю запрос в SeachFields. 12:39:33 SELECT buildings.`id` FROM buildings LEFT OUTER JOIN realty ON realty.`building_id` = buildings.id WHERE buildings.deleted<>1 AND realty.`deleted`<>1 AND realty.`square` = 12:39:34 В crm находит одно количество записей, а в обычном sql запросе - другое. 12:40:37 База данных одна и та же. Значения одни и те же. 12:41:08 В CRM записей появляется больше. 12:41:18 12:41:58 Посмотрите финальный запрос, который формирует CRM-система после всевозможных преобразований 12:42:11 находится он в файле data/SugarBean.php 12:42:24 function create_new_list_query 12:42:46 if($singleSelect) { unset($ret_array['secondary_where']); unset($ret_array['secondary_from']); unset($ret_array['secondary_select']); } print_r($ret_array['select'] . $ret_array['from'] . $ret_array['where'] . $ret_array['order_by']); if($return_array) { return $ret_array; } return $ret_array['select'] . $ret_array['from'] . $ret_array['where']. $ret_array['order_by']; 12:43:04 вот в конце надо вставить отображение результирующего sql-запроса 12:43:07 print_r($ret_array['select'] . $ret_array['from'] . $ret_array['where'] . $ret_array['order_by']); 12:43:19 и посмотреть что в конечном счете CRM сформировал 12:43:23 может станет понятнее... Спасибо, буду пробовать. 12:43:38 Евгений, вставить после return $ret_array['select'] . $ret_array['from'] . $ret_array['where']. $ret_array['order_by']; 12:50:37 ? 12:50:41 12:51:17 после return код в функции не выполняется 12:51:20 до return Я понял - в конце функции function create_new_list_query 12:52:26 12:52:32 да Первое что заметил это realty.`square` = '200%' Хотя в форме четко указываю 200 12:58:52 13:02:04 знак % подставляется при поиске тектовых значений 13:02:18 чтобы искало не точное соответствие а вхождение подстроки с начало строки 13:02:41 Ну тоесть если ищем слово "сталь", чтобы нашлось "Электросталь" 13:02:58 какой тип у поля square? 13:03:06 varchar? int(11) 13:03:48 Это в sql 13:04:08 13:04:20 а в шугаре? В searchdefs? 13:04:38 13:04:50 в vardef 13:06:22 можно в студии глянуть Кажется, что у меня там вообще ничего нет. 13:06:22 Поле добавил кастомно. Изменения только в SearchFields и в searchdefs 13:08:41 13:09:13 в студии в модуле надо найти это поле и посмотреть какой там тип указан 13:09:26 это Администрирование - Студия - Модуль - Поля 13:09:31 и там в таблице список полей будет 13:09:37 найти его в этом списке 13:09:43 там же должен быть указан тип 13:09:56 он скорее всего Integer будет, но на всякий... Не нахожу такого поля в студии. 13:10:49 Видимо не делал восстановение быстрое. 13:11:07 13:11:23 в модуле realty? 13:11:26 ищите 13:12:10 Integer 13:12:13 Все верно - Integer 14:07:15 14:16:02 Ну вообще такого поведения быть не должно у поля Integer 14:16:18 вот сейчас попробовал с полем типа Integer у себя 14:16:23 SELECT accounts.id ,accounts_cstm.id_custom_c,accounts_cstm.type_c, accounts.name , accounts.phone_office , jt0.user_name assigned_user_name , jt0.created_by assigned_user_name_owner , 'Users' assigned_user_name_mod, accounts.date_entered , accounts.assigned_user_id FROM accounts LEFT JOIN accounts_cstm ON accounts.id = accounts_cstm.id_c LEFT JOIN users jt0 ON accounts.assigned_user_id=jt0.id AND jt0.deleted=0 AND jt0.deleted=0 where ((accounts_cstm.id_custom_c = 5)) AND accounts.deleted=0 ORDER BY accounts.date_entered DESC 14:16:34 id_custom_c = 5 14:16:45 как ввел в фильтре 5 так оно и вывелось 14:17:14 возможно у subquery, если поиск идет по нему, в этом плане не доделаны возможности 14:17:29 я так понимаю оно не проверяет тип поля когда подключает второстепенный запрос 14:18:15 я думаю тут нужно переделывать немного механизм поиска подключаемых запросов - добавлять возможность поиска по прямому запросу без добавления % 14:18:57 возможно в SearchFields.php нужно будет добавить какой то параметр, который будет определять что должно искаться точное соответствие без : 14:18:59 % С этим ясно. Убираю знак % - результат тот же. 14:31:02 Убрал все лишнее из запроса, который у меня отображается в crm 14:31:20 Получилось - 14:31:27 SELECT buildings.id FROM buildings WHERE buildings.id IN (SELECT * FROM ( SELECT buildings.`id` FROM buildings LEFT OUTER JOIN realty ON realty.`building_id` = buildings.id WHERE buildings.deleted<>1 AND realty.`deleted`<>1 AND realty.`square` = '120') square_realty_derived) 14:31:28 Выдает 63 записи. 14:31:49 SELECT buildings.id FROM buildings LEFT OUTER JOIN realty ON realty.`building_id` = buildings.id WHERE buildings.deleted<>1 AND realty.`deleted`<>1 AND realty.`square` = '120' 14:31:51 Выдает 71 14:32:00 14:33:43 а если SELECT DISTINCT buildings.id FROM buildings LEFT OUTER JOIN realty ON realty.`building_id` = buildings.id WHERE buildings.deleted<>1 AND realty.`deleted`<>1 AND realty.`square` = '120' 14:33:44 ? 14:33:52 сколько записей? 63 14:34:15 14:34:30 потому что там или повторяющиеся или NULL 14:34:46 SELECT buildings.id FROM buildings WHERE buildings.id IN (SELECT * FROM ( SELECT buildings.`id` FROM buildings LEFT OUTER JOIN realty ON realty.`building_id` = buildings.id WHERE buildings.deleted<>1 AND realty.`deleted`<>1 AND realty.`square` = '120') square_realty_derived) 14:34:54 какой то слишком навороченный запрос Такой выдается в CRM 14:35:06 Это я его упростил. 14:35:19 SELECT buildings.id , buildings.building_id_for_site , buildings.name , LTRIM(RTRIM(CONCAT(IFNULL(jt0.first_name,''),' ',IFNULL(jt0.last_name,'')))) assigned_user_name , jt0.created_by assigned_user_name_owner , 'Users' assigned_user_name_mod, buildings.date_entered , buildings.assigned_user_id FROM buildings LEFT JOIN buildings_cstm ON buildings.id = buildings_cstm.id_c LEFT JOIN users jt0 ON buildings.assigned_user_id=jt0.id AND jt0.deleted=0 AND jt0.deleted=0 where ((buildings.id IN (select * from (SELECT buildings.`id` FROM buildings LEFT OUTER JOIN realty ON realty.`building_id` = buildings.id WHERE buildings.deleted<>1 AND realty.`deleted`<>1 AND realty.`square` = '120%') square_realty_derived))) AND buildings.deleted=0 ORDER BY buildings.building_id_for_site ASC 14:35:37 Вообще такой. 14:35:43 14:36:18 попробуейт из LEFT OUTER JOIN убрать OUTER 14:36:43 это же ведь ваша вставка в общий запрос? Да. 14:36:53 Ничего не меняет. 14:37:14 14:38:06 SELECT buildings.`id` FROM buildings 14:38:13 заменить на SELECT DISTINCT buildings.`id` FROM buildings 14:38:29 в подставляемом запросе SELECT DISTINCT buildings.id FROM buildings LEFT JOIN realty ON realty.`building_id` = buildings.id WHERE buildings.deleted<>1 AND realty.`deleted`<>1 AND realty.`square` = '120' Выводит 63 записи. 14:40:37 Столько же выводит запрос из crm без distinct, так и с ним. 14:41:15 14:41:42 ну значит не нужны 71 запись 14:41:47 там или лишние или вообще null Я так и понял. Это как-то в этом навороченном запросе обрабатывается, как я понял. 14:42:23 14:42:51 ну потому что ищет id среди того, что нашел select 14:43:01 если селект найдет null, то такого id в базе то нет 14:43:06 и эта запись не учитывается 14:43:17 а если находит нормальное значение - то засчитывается Спасибо!)ъ
  20. Михаил: В шуге поиск в одном модуле по данным из связного можно сделать через студию? 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 А через студию это не делается
  21. Version 1.0.1

    56 downloads

    Модуль предоставляет возможность приклеить виртуальную заметку в виде стикера в CRM-системе в любом месте экрана. Это может быть удобно, когда хочется в процессе работы что то записать, и чтобы это было на виду: какую то задачу себе, или какие то данные или еще что то, что может вам потребоваться в ближайшее время или что вы хотели бы обработать, но чуть попозже, когда завершите текущую работу. Стикеры будут видны только у того пользователя, который их создал. Чужие стикеры не подсмотреть, а также ваши не увидят другие пользователи.
  22. В этом видео я в карточку Задачи добавляю сверху кнопки, при нажатии на которые Задача переходит в соответствующий статус.
  23. В этом видео я расширяю размер поля с названием проектной задачи до поля типа text (многострочное текстовое поле).
×
×
  • Create New...