SpravkaCRM.ru

Administrators
  • Content count

    149
  • Joined

  • Last visited

 Content Type 

  • All Activity

Profiles

  • Status Updates
  • Status Replies

SuiteCRM

  • Records
  • Record Comments

Forums

  • Topics
  • Posts

Downloads

  • Files
  • File Comments

Everything posted by SpravkaCRM.ru

  1. В SuiteCRM содержит в себе предустановленные модули с открытым исходным кодом: Advanced OpenSales Advanced OpenSales (AOS) - результат непрерывной пятилетней работы. Этот набор модулей и функционалов является, пожалуй, наиболее значимым вкладом в развитие SugarCRM Community Edition. Использование вами этих модулей позволит вам также активно пользоваться Отчётами (Reporting) и Документооборотом (Workflow). Новый модуль с Категориями Продуктов В модуле Контракты списки товаров и услуг В списки товаров и услуг добавлены описания продуктов В списки товаро и услуг добавлены артикулы товаров, и теперь продукты можно искать по артикулу наравне с поиском по названию продукта Добавлена возможность указания скидок Стала доступна активация/деактивация PDF-шаблонов Новая панель администрирования: Включение/отключение группировки списков товаров и услуг Возможность задать стартовый порядковый номер для Предложений и Счетов Список возможностей AOS весьма большой, и увеличивается с каждым релизом SuiteCRM. AOS подходит для безопасного обновления, так как онполностью совместим с архитектурой SugarCRM в части механизма обновлений системы. Основные модули, входящие в AOS: Модуль Предложений Модуль с Товарами Модуль с Договорами Модуль с Счетами PDF-шаблоны Advanced OpenWorkflow Advanced OpenWorkflow(AOW) - это комплекс измодулей длянастройки и автоматизации бизнес-процессов в SuiteCRM.AOWраспространяется с полностью открытым исходным кодом (GPL3). AOW очень понятно сделан. Новые пользователи, которые совсем недавно познакомились с SuiteCRM, способны разобраться в функционале настройки Процессов за считанные минуты, и смогут весьма быстро начать производить настройки бизнес-процессов. AOW распространяется с открытым исходным кодом. Вы можете скачивать эти модули, изменять их и распространять по своему усмотрению. AOW проработанный. В течении 3-х месяцев его проверяли и тестировали на SugarCRM. В AOW хороший функционал. В этом комплексе есть все основные возможности, которые могут вам потребоваться для выполнения настройки бизнес-процессов в вашей CRM-системе. Advanced OpenWorkflow по своей внутренней структуре кода похожа на структуру SugarCRM. Это позволяет программистам из SugarCRMлегко переносить в AOW наработки и легко разбираться в коде самого AOW дополняя его необхоимым функционалом. Advanced OpenReports Advanced OpenReports (AOR) комплексмодулей для построения отчётов в SugarCRM версий 5.x и 6.x с полностью открытым исходным кодом (GPL3). Интуитивно понятный интерфейс позволит быстро разобраться с особенностями построения модулей даже неопытным пользователям. ИспользуяAdvanced OpenReports вы сможете быстро получать необходимые вам срезы данных в виде таблиц, графиков или диаграмм. Данные вы сможете как просматривать прямо на страницах CRM-системы и в виде дашлетов на главной, так и выгружать их в виде CSV, HTML или PDF. ОсобенностиAdvanced OpenReports: Мощные и интуитивно понятные отчёты Большое количество используемых функций для получения и обработки данных Возможность запускать отчёты по расписанию Advanced OpenPortal Данный комплекс модулей позволяет подключить к вашей CRM-системе веб-портал, развернутый на Joomla. Интеграция достигается за счет компонента, устанавливаемого на портале и испльзующегоSugarCRM REST API. CRM-система со своей стороны получает возможность принимать обращения с сайта и определенным образом обрабатывать их отдавая нужные ответы. Таким образом вы можете получить CRM-систему в виде хранилища данных о вашем бизнесе (клиенты, сделки, договора и так далее) и возложить на нее какие-либо сложные обработки этих данных (формирование отчетов, маркетинговые рассылки и так далее), а при помощи сайта (портала) на Joomla получить "красивый" интерфейс для работы с этими данными (или, как один из вариантов, предоставить своим клиентам вход в личный кабинет, содержащий в себе данные, находящиеся в CRM-системе). Advanced OpenEvents Advanced OpenPortal представляет собой Менеджер Событий для таких мероприятий, как семинары и вебинары. При помощи этого модуля вы сможете рассылать приглашения посетителям вебинаров через электронную почту, а также отслеживать, получили ли они ваши приглашения, посетили или нет предлагаемые им мероприятия. При помощи модуля События вы сможете: Создавать События Добавлять Участников в Событие используя Списки адресатов, Адресаты, Контакты и Предварительные контакты Создавать и назначать шаблоны писем для использования их в Событиях Рассылать в рамках того или иного События письма, сформированные по заданным шаблонам, в которых могут быть встроены возможности Согласиться или Отказаться от участия в предлагаемом Событии Получатели вашей рассылки могут Согласиться или Отказаться от предлагаемого им участия в Событии Когда предполагаемый Участник вашего События получит приглашение, согласится с участием в нем или откажется - статус этого приглашения автоматически поменяется в CRM-системе, и вы сможете оперативно это отслеживать Присутствует управление посещаемостью События: посетил мероприятие участник или нет Google Maps В SuiteCRM добавлена поддержка карт Google Maps. Присутствует возможность построения кеша геоданных по Контрагентам: из информации оКонтрагентеизвлекается его адрес, который отправляется на сервера Google Maps. На основании полученных данных от Google SuiteCRM может построить карту с обозначениями где какой контрагент находится. Присутствует возможность поиска Контрагентов по выделенным областям на карте и прочие гео-возможности. SecuritySuite В SuiteCRM добавлена возможность работы в командах: можно базу клиентов разбить на сегменты, и предоставлять доступ тем или иным сотрудникам только к определенным сегментам (например, по типу клиентов, или по их географическому расположению). Также были расширены стандартные возможности разграничения прав доступа пользователей. Advanced OpenTheme Специально для SuiteCRM была разработана тема оформления, которая совместима с SugarCRM 6.5.x Разработанная тема поддерживает следующие возможности: Cleaner UI Меню на AJAX/CSS3 с действиями для модулей и списком последних просмотров Меню быстрого создания записей Возможность перейти на редактирование недавно просмотренной записи в один клик
  2. Модули

    Скидки указываются при создании предложения или счета. там при указании продуктов подставляются их цены, и к ним можно применить скидку: в процентах или в цифрах. это не модуль отдельный, а просто возможность при работе с набором продуктов.
  3. Задача: название создаваемой записи в модуле Проекты приобретало вид согласно шаблону. Пример 83-lptsystem.ru-Разработка сайта НОМЕР-КОНТРАГЕНТ-НАЗВАНИЕ ПРОКТА
  4. Как при логине посмотреть группу пользователя и его роль

    Уровень прав доступа - это что? Администратор/не администратор? если да, то определяется это функцией is_admin($current_user) или is_admin($GLOBALS['current_user']) по ролям можно посмотреть в файл: modules/ACLRoles/ACLRole.php: /** * static getUserRoles($user_id) * returns a list of ACLRoles for a given user id * * @param GUID $user_id * @return a list of ACLRole objects */ function getUserRoles($user_id, $getAsNameArray = true){ //if we don't have it loaded then lets check against the db $additional_where = ''; $query = "SELECT acl_roles.* ". "FROM acl_roles ". "INNER JOIN acl_roles_users ON acl_roles_users.user_id = '$user_id' ". "AND acl_roles_users.role_id = acl_roles.id AND acl_roles_users.deleted = 0 ". "WHERE acl_roles.deleted=0 "; $result = $GLOBALS['db']->query($query); $user_roles = array(); while($row = $GLOBALS['db']->fetchByAssoc($result) ){ $role = new ACLRole(); $role->populateFromRow($row); if($getAsNameArray) $user_roles[] = $role->name; else $user_roles[] = $role; } return $user_roles; } /** * static getUserRoleNames($user_id) * returns a list of Role names for a given user id * * @param GUID $user_id * @return a list of ACLRole Names */ function getUserRoleNames($user_id){ $user_roles = sugar_cache_retrieve("RoleMembershipNames_".$user_id); if(!$user_roles){ //if we don't have it loaded then lets check against the db $additional_where = ''; $query = "SELECT acl_roles.* ". "FROM acl_roles ". "INNER JOIN acl_roles_users ON acl_roles_users.user_id = '$user_id' ". "AND acl_roles_users.role_id = acl_roles.id AND acl_roles_users.deleted = 0 ". "WHERE acl_roles.deleted=0 "; $result = $GLOBALS['db']->query($query); $user_roles = array(); while($row = $GLOBALS['db']->fetchByAssoc($result) ){ $user_roles[] = $row['name']; } sugar_cache_put("RoleMembershipNames_".$user_id, $user_roles); } return $user_roles; } /** * static getAllRoles($returnAsArray = false) * * @param boolean $returnAsArray - should it return the results as an array of arrays or as an array of ACLRoles * @return either an array of array representations of acl roles or an array of ACLRoles */ function getAllRoles($returnAsArray = false){ $db = DBManagerFactory::getInstance(); $query = "SELECT acl_roles.* FROM acl_roles WHERE acl_roles.deleted=0 ORDER BY name"; $result = $db->query($query); $roles = array(); while($row = $db->fetchByAssoc($result) ){ $role = new ACLRole(); $role->populateFromRow($row); if($returnAsArray){ $roles[] = $role->toArray(); }else{ $roles[] = $role; } } return $roles; } может эти функции помогут.
    • 2 replies
      • роль
      • права доступа
      • (and 1 more)

        Tagged with:

        • роль
        • права доступа
        • распределение доступа
  5. Назначение задач от Постановщика Исполнителю и обратно

    Максим: Добрый день 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 да, найдете!
  6. Проблемы со связью и relate полем

    Так можно (и нужно) делать для всех модулей. SuiteCRM когда рисует страницу просмотра записи сначало пытается найти файлcustom/modules/Модуль/views/view.detail.php. Если нашла - работает с ним. Если не нашла, то пытается найти по адресуmodules/Модуль/views/view.detail.php
    • 14 replies
  7. Проблемы со связью и relate полем

    Дополнительные данные в карточку просмотра можно запихать массой способов. Один из них (приведу на примере добавления списка Контактов в просмотр карточки Контрагента): Создаем новую переменнуюcontacts_list. Для этого добавляю файлcustom/Extension/modules/Accounts/Ext/Vardefs/sugarfield_contacts_list.php, в который пишу: 'contacts_list', 'vname' => 'LBL_CONTACTS_LIST', 'source' => 'non-db', 'type' => 'text', 'massupdate' => false, 'studio' => 'true', ); ?> Не забываем добавить языковой ключLBL_CONTACTS_LIST в файлcustom/modules/Accounts/language/ru_RU.lang.php 'Контакты Контрагента', ); Далее вcustom/modules/Accounts/metadata/detailviewdefs.php добавляем строку с отображением этого поля (сразу после строки с названием Контрагента): 0 => array ( 0 => array ( 'name' => 'name', 'comment' => 'Name of the Company', 'label' => 'LBL_NAME', ), 1 => array ( 'name' => 'phone_office', 'comment' => 'The office phone number', 'label' => 'LBL_PHONE_OFFICE', ), ), 1 => array ( 0 => array ( 'name' => 'contacts_list', 'label' => 'LBL_CONTACTS_LIST', 'customCode' => '{$CONTACTS_LIST}', ), ), Обращаю внимание на'customCode' => '{$CONTACTS_LIST}'. Тем самым я сообщаю о том, что в строку будет выведено не значение поляcontacts_list, а нужно будет вывести переменную шаблонаCONTACTS_LIST Работу с переменными шаблона удобнее всего делать в view-файлах модуля. В данном случае это надо сделать вcustom/modules/Accounts/views/view.detail.php. Так как такого файла не существовало (у меня новая чистая система), то для начала мы просто копируем в этот файл полностью содержимое файлаmodules/Accounts/views/view.detail.php Далее мы дописываем наш файлcustom/modules/Accounts/views/view.detail.php в функцииfunction display() дописываем внизу строки (прямо перед строкойecho $this->dv->display();): // Определяем список Контактов $this->bean->load_relationship('contacts'); $contact_ids = $this->bean->contacts->getBeans(); // Формируем массив с ссылками на Контакты $contacts_list_array = array(); foreach ($contact_ids as $seedContact) { $contacts_list_array[] = ''. $seedContact->full_name .''; } $this->bean->contacts_list = count($contacts_list_array) > 0 ? 'Контакты:
    ' . implode("
    ", $contacts_list_array) : ''; // Указываем значение шаблонной переменной $this->ss->assign("CONTACTS_LIST", $this->bean->contacts_list); Видите? я тут для переменной CONTACTS_LISTуказал значение. После всего этого необходимо в обязательном порядке сделать быстрое восстановление (чтобы все нужные кеши создались). И все. Все записи из сабпанели с Контактами будут выведены в карточку Контрагента второй строкой. Надеюсь общий смысл удалось показать...
    • 14 replies
  8. Проблемы со связью и relate полем

    Зайти предварительно в модуль Преподаватели и добавить нового преподавателя. Преподаватели не клиенты. Я предполагаю что их добавление не настколько частая задача, чтобы о этом заботиться в первую очередь инагородить кучу кастылей ради непонятного профита. Никогда нигде ничего не читал, потому посоветовать в этом плане мне нечего к сожалению. Но все можно делать "по образу и подобию". Ищите ответы в коде. Их там полно. Например я, когда хочу "по быстренькому" вспомнить или вставить новый хук смотрю на модуль с Обращениями: custom/modules/Cases/logic_hooks.php тут находится список хуков, присутствующих в модуле. before_save - срабатывает ДО выполнения функции save при сохранении объекта (зачастую используется для того, чтобы как то определить или переопределить переменную, которая будет записана в базу данных, например, для названия присвоить очередной номер) after_save - срабатывает сразу ПОСЛЕ выполнения функции save (можно например как то воздействовать на связанные с текущим объектом записи из других модулей, ведь мы уже знаем ID записи сохраненной) after_relationship_add - срабатывает после добавления связи записи модуля с записью другого модуля after_relationship_delete - срабатывает после удаления связи записи модуля и записи другого модуля after_retrieve - срабатывает после того, как объект модуля наполнится данными (после функции retrieve). Можно использовать для добавления каких то данных вычисляемых в объект. для каждого хука определяется файл с классом хука, названием класса и функцией внутри класса Вот например: $hook_array['before_save'][] = Array(1, 'Cases push feed', 'modules/Cases/SugarFeeds/CaseFeed.php','CaseFeed', 'pushFeed'); говорит о том, что перед сохранением очередного объекта модуля Обращения нужно вызвать функцию pushFeedкласса CaseFeed,находящегося в файлеCaseFeed.php Идем в этот файл и находим функцию: function pushFeed($bean, $event, $arguments){ $text = ''; if(empty($bean->fetched_row) && $bean->in_save){ $accountName = $bean->account_name; if(empty($accountName) && $bean->account_id){ $acc = BeanFactory::getBean('Accounts',$bean->account_id); $accountName = $acc->name; } $text = '{SugarFeed.CREATED_CASE} [' . $bean->module_dir . ':' . $bean->id . ':' . $bean->name.'] {SugarFeed.FOR} [Accounts:' . $bean->account_id . ':' . $accountName . ']: '. $bean->description; }else{ if(!empty($bean->fetched_row['status'] ) && $bean->fetched_row['status'] != $bean->status && strpos($bean->status, 'Closed') !== false){ $text = '{SugarFeed.CLOSED_CASE} [' . $bean->module_dir . ':' . $bean->id . ':' . $bean->name. '] {SugarFeed.FOR} [Accounts:' . $bean->account_id . ':' . $bean->account_name . ']'; } } if(!empty($text)){ SugarFeed::pushFeed2($text, $bean); } } Функция для обработки хука как правило принимает 3 параметра: $bean- Объект, который сохраняется. Это как правило ссылка на сам объект (через &) $event- название хука (в текущем случае это = before_save) $arguments- дополнительные параметры. полезные для хуков типаafter_relationship_add, когда приходят данные о том, какие модули и какие ID в модулях связываются связью. Еще отмечу вот эту конструкцию: empty($bean->fetched_row) Таким образом можно однозначно определить, что объект именно СОЗДАЕТСЯ, а не пересохраняется. Хукbefore_save выполняется и для создаваемых и для сохраняемых объетов, по этому этой конструкцией можно понять что именно происходит сейчас: создание или сохранение.
    • 14 replies
  9. Проблемы со связью и relate полем

    Сделать можно. Но я бы не рекомендовал идти именно таким путем. Дело в том, что у вас получаются дублирующие друг друга связи: Есть многие-ко-многим, и тут же еще есть один-ко-многим с теми же модулями. А нужно будет отвязать Преподавателя от Группы? А поменять Преподавателя?Надо будет тогда и в этом случае отвязывать и там и там... Если Преподавателей не сотни, то имхо лучше было бы добавить не поле типа relate, а поле с source = 'non-db', которое в режиме редактирования давало бы выпадающий список с Преподавателями. И добавить хук на сохранение Группы, что если пришло значение этого поля, то добавляем связь текущей Группы с ID выбранного Преподавателя. Таким образом и Препода выбрать можно и лишние данные в DB не пихать, чтобы потом не замучаться их синхронизировать. Ну а по вопросу: Нужно создать hook, который перехватывает процесс создания новой записи в модуле Группы, и проверяет, заполнено ли поле с Преподавателем. И если заполнено, то создает новую связь Группы и Преподавателя. Хуки создаются вcustom/modules/Модуль/logic_hooks.php Нам нужен хук, который будет выполняться ПОСЛЕ сохранения записи: after_save Например так: $hook_array['after_save'][] = Array(1, 'Добавление связи', 'custom/modules/Модуль/LogicHook.php','МодульLogicHook', 'addRelation'); А в файле с хуком в функции addRelation нужно добавить связь: $seedLink = new Link2("Название связи у модулей многие-ко-многим", $bean->id); $seedLink->add(array($bean->поле_с_id_препода)); ну или как то так...
    • 14 replies
  10. Добавление связи Многие-ко-Многим в модулях

    Отключите вывод ошибок в шугаре. Эти ошибки могут быть совсем не критичными и вообще относиться к чему угодно и с ними вполне себе даже можно будет жить. А вот их вывод замусоривает json-парсер в студии и не дает нормально работать... Вот если после отключения вывода ошибок не сработает - можно будет разбираться )))
    • 3 replies
      • связь
      • многие-ко-многим
      • (and 2 more)

        Tagged with:

        • связь
        • многие-ко-многим
        • добавление связи
        • php
  11. Удаление стандартных полей нового модуля в конструкторе

    Ну лучше всего в этом случае просто будет пересоздать модуль с использованием Базового шаблона (в конструкторе модуля при создании модуля укажите Тип = Базовый): это будет проще всего. Если возможности или желания нет, то можно уже созданный модуль привести к Базовому типу: в файлеmodules/Модуль/Модуль_sugar.php смотрите какой указан класс в качестве родительского. Привести к базовому можно что то типа так: class Модуль_sugar extends Basic { var $new_schema = true; var $module_dir = 'Модуль'; var $object_name = 'Модуль'; var $table_name = 'Модуль'; var $importable = false; var $disable_row_level_security = true ; // to ensure that modules created and deployed under CE will continue to function under team security if the instance is upgraded to PRO var $id; Видите, тут Basic?А у вас что-нибудь типаIssue? Если и это не подходит, то можно пойти на отчаянное закостыливание. Например так: custom/Extension/modules/Модуль/Ext/Vardefs/custom_fields.php а в нем: Только потом надо будет сделать быстрое восстановление в админке, чтобы эта строка попала в кеш и применялась...
    • 5 replies
      • модуль
      • конструктор
      • (and 1 more)

        Tagged with:

        • модуль
        • конструктор
        • удаление полей
  12. Удаление стандартных полей нового модуля в конструкторе

    Там при создании нового модуля нужно было выбирать шаблон, на базе которого этот модуль будет создан. Самый минимальный набор полей у базового. Если вы на основании него сделали новый модуль, то из него уже ничего не удалить. Все поля нужны, и без них работать не будет...
    • 5 replies
      • модуль
      • конструктор
      • (and 1 more)

        Tagged with:

        • модуль
        • конструктор
        • удаление полей
  13. добавление кастомного js кода в convertlead

    На основании этих данных я не знаю что у вас происходит. Надо искать ошибку-причину... Не видя систему и по данным вашим это сделать не возможно...
    • 7 replies
      • js
      • convertlead
  14. Как скачать установленную CRM-систему в виде архива с базой данных

      • скачать
      • архив
      • (and 2 more)

        Tagged with:

  15. добавление кастомного js кода в convertlead

    Не, с такой ошибки 500 не вылетит... Попробуйте тогда найти файл с ошибками сервера. Куда там их MAMP пихает? error.log или что то типа этого... И посмотрите что в логи свалится.
    • 7 replies
      • js
      • convertlead
  16. добавление кастомного js кода в convertlead

    Включите отображение ошибок в PHP или посмотрите файл с логом ошибок. Там какой то Fatal error происходит. Надо его пофиксить и все. Ошибки можно включить или в php.ini display_error = true или в шугаре в config_override.php добавьте строку: $sugar_config['stack_trace_errors'] = true; и посмотрим что там выведет (среди кучи отладочной информации ищите Fatal error
    • 7 replies
      • js
      • convertlead
      • suitecrm
      • регистрация
      • (and 2 more)

        Tagged with:

        • suitecrm
        • регистрация
        • crm
        • https://www.youtube.com/watch?v=zol2twlqqy0
  17. добавление кастомного js кода в convertlead

    Да, там эта конструкция почему то не работает... Если именно такое внедрение JS не принципиально, то гляньте на функцию public function display() вmodules/Leads/views/view.convertlead.php там много разного вывода в этот сценарий, и JS разнообразный в том числе. Просто пристройте вызов своего файла где то рядышком... P.S. только если пойдете таким путем предварительно скопируйтеmodules/Leads/views/view.convertlead.php в custom/modules/Leads/views/view.convertlead.php, а уже потом допиливайте этот файл как хотите, чтобы не потерять совместимость с апгрейдами системы.
    • 7 replies
      • js
      • convertlead
  18. Русский язык в SuiteCRM

    ну я имел в виду посмотрите в этих файла туда ли действительно приходит сценарий когда аварийно завершается, и что в тех или иных полях. Почему может такая ошибка возникать? лично я для отладки обычно пользуюсь простенькой функцией, объявленной гденибудь в utils.php if (!function_exists('print_array')) { function print_array($var, $exit = false, $in_file = false) { ob_start(); if (!$in_file) echo '
    '; print_r($var); if (!$in_file) echo '
    '; $content = ob_get_contents(); //ob_flush(); if ($in_file) { $file = fopen("print_array.log", "a+"); fwrite($file, "\n\n******************************\n"); fwrite($file, date("Y-m-d H:i:s") . "\n"); fwrite($file, $content); fclose($file); empty($file); } if ($exit) exit; return $content; } } ей можно скармливать всякие переменные и смотреть что выведет. если вторым параметром указать true - то сценарий тут же завершится (ну на случай отладки разных редиректов и прочих маловидимых переменных. Третий параметр будет писать результат отладки в файл
  19. Русский язык в SuiteCRM

    Version 7.5.2

    72 downloads

    Русский язык для бесплатной CRM-системы SuiteCRM. Содержит перевод всех модулей и функционалов, присутствующих в базовой версии SuiteCRM. Изначально SuiteCRM распространялся с русским языком на борту. Он был встроенным, выбирался на момент установки CRM-системы и было довольно это удобно. Установка на русском, сразу русский есть в системе и можно пользоваться без дополнительных настроек. Начиная примерно с версии SuiteCRM 7.5.1 (или на версию ранее, не помню ее название) разработчики решили исключить русский язык из сборки. Так что теперь установка SuiteCRM происходит только на английском языке. А если хотите русифицировать SuiteCRM, то качаете отдельно локализацию и устанавливаете ее у себя в CRM-системе. Кстати, предлагаемый для скачивания архив на текущий момент идентичен тому, что предлагают на официальном сайте SuiteCRM. Вы с таким же успехом можете его скачать и там. Здесь я его задублирую для того, чтобы русскоязычным пользователям было проще находить себе русификацию SuiteCRM. Инструкция, как установить:
  20. Как создать свой вид для отображения карточки редактирования

    Кирилл: Добрый день! Искал на форуме информацию о том - как создать свой вид для отображения карточки редактирования, так и не нашел . Вообще такое возможно ? 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 view = "editcustom"; } } ?> 12:06:00 не, не так 12:06:02 так: 12:06:13 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 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;
  21. Русский язык в SuiteCRM

    include/upload_file.php public function confirm_upload() { global $sugar_config; if(empty($this->field_name) || !isset($_FILES[$this->field_name])) { return false; } //check to see if there are any errors from upload if($_FILES[$this->field_name]['error'] != UPLOAD_ERR_OK) { if($_FILES[$this->field_name]['error'] != UPLOAD_ERR_NO_FILE) { if($_FILES[$this->field_name]['error'] == UPLOAD_ERR_INI_SIZE) { //log the error, the string produced will read something like: //ERROR: There was an error during upload. Error code: 1 - UPLOAD_ERR_INI_SIZE - The uploaded file exceeds the upload_max_filesize directive in php.ini. upload_maxsize is 16 $errMess = string_format($GLOBALS['app_strings']['UPLOAD_ERROR_TEXT_SIZEINFO'],array($_FILES['filename_file']['error'], self::$filesError[$_FILES['filename_file']['error']],$sugar_config['upload_maxsize'])); $GLOBALS['log']->fatal($errMess); }else{ //log the error, the string produced will read something like: //ERROR: There was an error during upload. Error code: 3 - UPLOAD_ERR_PARTIAL - The uploaded file was only partially uploaded. $errMess = string_format($GLOBALS['app_strings']['UPLOAD_ERROR_TEXT'],array($_FILES['filename_file']['error'], self::$filesError[$_FILES['filename_file']['error']])); $GLOBALS['log']->fatal($errMess); } } return false; } if(!is_uploaded_file($_FILES[$this->field_name]['tmp_name'])) { return false; } elseif($_FILES[$this->field_name]['size'] > $sugar_config['upload_maxsize']) { $GLOBALS['log']->fatal("ERROR: uploaded file was too big: max filesize: {$sugar_config['upload_maxsize']}"); return false; } if(!UploadStream::writable()) { $GLOBALS['log']->fatal("ERROR: cannot write to upload directory"); return false; } $this->mime_type = $this->getMime($_FILES[$this->field_name]); $this->stored_file_name = $this->create_stored_filename(); $this->temp_file_location = $_FILES[$this->field_name]['tmp_name']; $this->uploaded_file_name = $_FILES[$this->field_name]['name']; return true; } что то в этой функции срабатывает в false на ваш архив. а вызывается она вmodules/Administration/UpgradeWizard.php if(!$upload->confirm_upload() || strtolower(pathinfo($upload->get_stored_file_name(), PATHINFO_EXTENSION)) != 'zip' || !$upload->final_move($upload->get_stored_file_name()) ) { unlinkTempFiles(); sugar_die("Invalid Package"); } else { $tempFile = "upload://".$upload->get_stored_file_name(); $perform = true; $base_filename = urldecode( $_REQUEST['upgrade_zip_escaped'] ); } повставляйте отладку и гляньте что не так
  22. Конфигурация комбобоксов

    Кирилл: добрый день! Просмотрел ваши видео о 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 ка кто так ... Понял. Спасибо за проффессиональный взгляд. И полностью согласен. Система большая и много чего реализовано уже на старте
  23. Русский язык в SuiteCRM

    назначение пользователя регулируется в config.php например так: 'default_permissions' => array ( 'dir_mode' => 1528, 'file_mode' => 432, 'user' => 'apache', 'group' => 'apache', ), только проверьте, что в user и group стоят юзер и группа, от которых запускается вебсервер для виртуального хоста для црм
  24. Русский язык в SuiteCRM

    В php.ini в рамках SugarCRM как правило корректируется или временная зона, или размер памяти, отводимой на PHP-скрипты, или максимальный размер закачиваемых файлов. Остальное я и не трогал никогда. Что там может быть связано с zip - хз. У меня на хостинге вот такое в отношении ZIP выдает php_info(): zip Zip enabled Extension Version $Id: c203148334b6f80d27bc5d23fad5ec3ca7dcf444 $ Zip version 1.12.5 Libzip version 0.11.2