Подпанель группы безопасности не существует для модулей котировок, договоров, счетов и событий.

Я использую suiteCRM 7.7.4 (версия Sugar 6.5.24), и мне нужно использовать подпанель группы безопасности в модулях котировок, контрактов, счетов и событий, но по некоторым причинам я не могу ее найти! Я провел некоторые исследования и обнаружил, что эта подпанель не отображается по умолчанию для пользовательских модулей. Некоторые разработчики рекомендуют не использовать студию для построения такого рода отношений, потому что это просто не сработает! для платной версии сахара CRM они говорят, что был инструмент под названием «инструмент подключения», который создает отношения для вас ... но поскольку я использую бесплатную версию, я не могу ее использовать!

Есть ли у вас какие-либо идеи ?

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


person Hachim IDRISSI    schedule 12.10.2016    source источник


Ответы (2)


Наконец я нахожу решение:

Добавьте эти несколько строк в «modules/AOS_Contracts/metadata/subpaneldefs.php»:

'securitygroups' => array(
        'top_buttons' => array(array('widget_class' => 'SubPanelTopSelectButton', 'popup_module' => 'SecurityGroups', 'mode' => 'MultiSelect'),),
        'order' => 900,
        'sort_by' => 'name',
        'sort_order' => 'asc',
        'module' => 'SecurityGroups',
        'refresh_page' => 1,
        'subpanel_name' => 'default',
        'get_subpanel_data' => 'SecurityGroups',
        'add_subpanel_data' => 'securitygroup_id',
        'title_key' => 'LBL_SECURITYGROUPS_SUBPANEL_TITLE',
    ),
  • QRR
  • Проверка разрешений.
person Hachim IDRISSI    schedule 13.10.2016

выполните следующие действия:

1. Перейдите к Admin
2. Перейдите к studio
3. Выберите нужный модуль, subpanel как "invoices"
4. Перейдите к relationship
5. Добавьте связь 1 ко многим с модулем Security group.
6. Теперь восстановите, перестройте вас найдет субапнель в модуле invoice.

Когда вы создаете отношение 1 ко многим с любым модулем, он создает подпанель.

ЕСЛИ это не работает, перейдите на пользовательскую подпанель.

Перейдите по этой ссылке. Я разместил код по той же ссылке, что и у меня.

Мы надеемся, что это руководство поможет вам создать новую подпанель в модуле «Контакты» в Sugar, используя пользовательский класс ссылок и управляемый новым API SugarCRM 7 SugarQuery.

  1. Создайте новый класс ссылок

Это должно войти в custom/modules/<YourModule>/YourNewLink.php, и этот класс будет действовать как пользовательская функциональность, которая создаст вашу связь между двумя записями.

<?php

/**
 * Custom filtered link
 */
class YourNewLink extends Link2
{
    /**
     * DB
     *
     * @var DBManager
     */
    protected $db;

    public function __construct($linkName, $bean, $linkDef = false)
    {
        $this->focus = $bean;
        $this->name = $linkName;
        $this->db = DBManagerFactory::getInstance();
        if (empty($linkDef)) {
            $this->def = $bean->field_defs[$linkName];
        } else {
            $this->def = $linkDef;
        }
    }

    /**
     * Returns false if no relationship was found for this link
     *
     * @return bool
     */
    public function loadedSuccesfully()
    {
        // this link always loads successfully
        return true;
    }

    /**
     * @see Link2::getRelatedModuleName()
     */
    public function getRelatedModuleName()
    {
        return '<Your_Module>';
    }

    /**
     *
     * @see Link2::buildJoinSugarQuery()
     */
    public function buildJoinSugarQuery($sugar_query, $options = array())
    {
        $joinParams = array('joinType' => isset($options['joinType']) ? $options['joinType'] : 'INNER');
        $jta = 'active_other_invites';
        if (!empty($options['joinTableAlias'])) {
            $jta = $joinParams['alias'] = $options['joinTableAlias'];
        }

        $sugar_query->joinRaw($this->getCustomJoin($options), $joinParams);
        return $sugar_query->join[$jta];
    }

    /**
     * Builds main join subpanel
     * @param string $params
     * @return string JOIN clause
     */
    protected function getCustomJoin($params = array())
    {
        $bean_id = $this->db->quoted($this->focus->id);
        $sql = " INNER JOIN(";
        $sql .= "SELECT id FROM accounts WHERE id={$bean_id}"; // This is essentially a select statement that will return a set of ids that you can match with the existing sugar_query
        $sql .= ") accounts_result ON accounts_result.id = sugar_query_table.id";
        return $sql;
    }
}

Аргумент $sugar_query — это новый SugarQuery object, детали которого описаны здесь. Что вам по существу нужно сделать, так это расширить этот запрос любым соединением/фильтрами, которые вы хотите добавить. Это делается во внутреннем соединении, которое я указал.

Примечание. Внутреннее соединение может быть очень сложным, поэтому, если вам нужен реальный рабочий пример, ознакомьтесь с modules/Emails/ArchivedEmailsLink.php и узнайте, как его использует основная команда по сахару. Однако я могу подтвердить, что это работает с пользовательскими соединениями.

Вот getEmailsJoin, чтобы помочь вам понять, что вы на самом деле можете создать с помощью этого пользовательского соединения.

 /**
   * Builds main join for archived emails
   * @param string $params
   * @return string JOIN clause
   */
  protected function getEmailsJoin($params = array())
  {
      $bean_id = $this->db->quoted($this->focus->id);
      if (!empty($params['join_table_alias'])) {
          $table_name = $params['join_table_alias'];
      } else {
          $table_name = 'emails';
      }

      return "INNER JOIN (\n".
              // directly assigned emails
          "select eb.email_id, 'direct' source FROM emails_beans eb where eb.bean_module = '{$this->focus->module_dir}'
              AND eb.bean_id = $bean_id AND eb.deleted=0\n" .
" UNION ".
      // Related by directly by email
          "select DISTINCT eear.email_id, 'relate' source  from emails_email_addr_rel eear INNER JOIN email_addr_bean_rel eabr
          ON eabr.bean_id = $bean_id AND eabr.bean_module = '{$this->focus->module_dir}' AND
          eabr.email_address_id = eear.email_address_id and eabr.deleted=0 where eear.deleted=0\n" .
           ") email_ids ON $table_name.id=email_ids.email_id ";
  }
  1. Добавьте новую запись vardef для поля ссылки.

В этом примере я собираюсь создать пользовательскую ссылку в модуле контактов. Так что этот код идет в custom/Extension/modules/Contacts/Ext/Vardefs/your_field_name.php

<?php
$dictionary["Contact"]["fields"]["your_field_name"] = array(
    'name' => 'active_other_invites',
    'type' => 'link',
    'link_file' => 'custom/modules/<YourModule>/YourNewLink.php',
    'link_class' => 'YourNewLink',
    'source' => 'non-db',
    'vname' => 'LBL_NEW_LINK',
    'module' => '<YourModule>',
    'link_type' => 'many',
    'relationship' => '',
);
  1. Добавьте новую ссылку в качестве подпанели

Это идет под custom/Extension/modules/Contacts/Ext/clients/base/layouts/subpanels/your_subpanel_name.php

<?php
$viewdefs['Contacts']['base']['layout']['subpanels']['components'][] = array (
  'layout' => 'subpanel',
  'label' => 'LBL_NEW_LINK',
  'context' =>
  array (
    'link' => 'your_field_name',
  ),
);
  1. Добавьте ярлык

Под

custom/Extension/modules/Contacts/Ext/Language/en_us.new_link.php

<?php
$mod_strings['LBL_ACTIVE_OTHER_INVITES'] = 'Your New Link';
  1. Быстрый ремонт и восстановление

Надеюсь, это поможет вам начать. Следите за журналами сахара, пока отлаживаете свои запросы. Я также обнаружил, что использование функции xdebug и SugarQueries compileSql неоценимо для выяснения того, что мне нужно сделать, чтобы получить рабочий оператор INNER JOIN.

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

person Amitesh Kumar    schedule 13.10.2016
comment
Еще раз спасибо, Амитеш. Я уже знаю это решение, используя студию, у вас будет подпанель, но наследование групп безопасности не будет применено, и это как раз проблема. Построение отношений с другими простыми модулями, такими как контакты, цитаты, .. будет работать, но с группой безопасности есть проблема с наследованием .. - person Hachim IDRISSI; 13.10.2016
comment
затем попробуйте использовать пользовательскую подпанель. - person Amitesh Kumar; 13.10.2016
comment
Хорошо, большое спасибо за все подробности, Амитеш. Я использую сахар 6.5, но решение, которое вы предоставляете, работает только в сахаре 7, вы думаете, что оно может быть полезно и для старых версий? - person Hachim IDRISSI; 13.10.2016
comment
ЕСЛИ вы найдете решение, это хорошо, я даю решения для 7, а не 6 - person Amitesh Kumar; 14.10.2016