Добавить поле one2many подпанели в suitecrm

Я новичок в SuiteCRM, я хотел бы добавить отношение one2many между Campaigns и Products

В форме subpanel, насколько я знаю, я должен изменить

suitecrm/modules/Campaigns/metadata/subpaneldefs.php

File, но я не понимаю, какое из этих отношений взять за пример.

Может ли кто-нибудь направить меня в правильном направлении?


person NeoVe    schedule 20.02.2017    source источник
comment
Я считаю, что вы можете сделать это довольно легко в Студии › Кампании › Отношения, добавив один ко многим Продуктам -> Кампании. Возможно, вам придется отредактировать некоторые экраны, чтобы определить, какие продукты относятся к кампаниям, или выбрать продукты при создании/редактировании кампаний. Тем не менее, должно быть выполнимо. Похоже, что вы, возможно, ищете отношения многие ко многим (многие продукты принадлежат многим кампаниям) - в противном случае в кампании был бы только один продукт, но, возможно, вы это подразумеваете.   -  person Jacob S    schedule 20.02.2017
comment
Привет, Джейкоб, если я попробую это из Кампаний -> Продукты, я смогу добавить только один к одному, я не знаю, как наоборот, нужно попробовать   -  person NeoVe    schedule 20.02.2017
comment
Да, но это не решает мою проблему, мне нужно это из Кампаний в -> Продукты и Кампании -> События   -  person NeoVe    schedule 21.02.2017
comment
А не наоборот :(   -  person NeoVe    schedule 21.02.2017


Ответы (1)


Здравствуйте, я отвечаю на этот вопрос в соответствии с сахаром, вы должны сделать то же самое в костюме.

Я проверил, что в модуле кампании существует только отношение один к одному.

Итак, попробуйте создать пользовательскую подпанель с отношением один ко многим

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

Это должно войти в custom/modules//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, детали которого описаны здесь. Что вам по существу нужно сделать, так это расширить этот запрос любым соединением/фильтрами, которые вы хотите добавить. Это делается во внутреннем соединении, которое я указал.

Примечание. Внутреннее соединение может быть очень сложным, поэтому, если вам нужен реальный рабочий пример, ознакомьтесь с модулями проверки /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 ";
  }

<сильный>2. Добавьте новую запись 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' => '',
);

<сильный>3. Добавьте новую ссылку в качестве подпанели

This goes under 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',
  ),
);

<сильный>4. Добавьте ярлык

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

<?php
$mod_strings['LBL_ACTIVE_OTHER_INVITES'] = 'Your New Link';

<сильный>5. Быстрый ремонт и восстановление

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

Это референсная ссылка

person Amitesh Kumar    schedule 23.02.2017
comment
Привет, большое спасибо, да, теперь я буду искать документацию по сахару! - person NeoVe; 23.02.2017