выполните следующие действия:
1. Перейдите к Admin
2. Перейдите к studio
3. Выберите нужный модуль, subpanel
как "invoices"
4. Перейдите к relationship
5. Добавьте связь 1 ко многим с модулем Security group
.
6. Теперь восстановите, перестройте вас найдет субапнель в модуле invoice
.
Когда вы создаете отношение 1 ко многим с любым модулем, он создает подпанель.
ЕСЛИ это не работает, перейдите на пользовательскую подпанель.
Перейдите по этой ссылке. Я разместил код по той же ссылке, что и у меня.
Мы надеемся, что это руководство поможет вам создать новую подпанель в модуле «Контакты» в Sugar, используя пользовательский класс ссылок и управляемый новым API SugarCRM 7 SugarQuery.
- Создайте новый класс ссылок
Это должно войти в 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 ";
}
- Добавьте новую запись 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' => '',
);
- Добавьте новую ссылку в качестве подпанели
Это идет под 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',
),
);
- Добавьте ярлык
Под
custom/Extension/modules/Contacts/Ext/Language/en_us.new_link.php
<?php
$mod_strings['LBL_ACTIVE_OTHER_INVITES'] = 'Your New Link';
- Быстрый ремонт и восстановление
Надеюсь, это поможет вам начать. Следите за журналами сахара, пока отлаживаете свои запросы. Я также обнаружил, что использование функции xdebug и SugarQueries compileSql неоценимо для выяснения того, что мне нужно сделать, чтобы получить рабочий оператор INNER JOIN
.
Я обнаружил, что это удивительно мощное решение, оно означает, что если вам нужно отобразить информацию, связанную с модулем, который может быть в нескольких соединениях, это позволяет вам создавать ссылки вручную без необходимости создавать бессмысленные связанные поля в между двумя.
person
Amitesh Kumar
schedule
13.10.2016