Модель данных:
XML:
<field id="system_id" xsi:type="AttributeExternalKey">
<sql>system_id</sql>
<target_class>System</target_class>
<is_null_allowed>false</is_null_allowed>
<on_target_delete>DEL_MANUAL</on_target_delete>
</field>
<field id="system_name" xsi:type="AttributeExternalField">
<extkey_attcode>system_id</extkey_attcode>
<target_attcode>name</target_attcode>
</field>
<field id="groupb_list" xsi:type="AttributeLinkedSetIndirect">
<linked_class>lnkGroupbToDigital</linked_class>
<ext_key_to_me>digital_id</ext_key_to_me>
<ext_key_to_remote>groupb_id</ext_key_to_remote>
<duplicates/>
<display_style>property</display_style>
<filter><![CDATA[SELECT Groupb AS G JOIN lnkSystemToGroupb AS lnkSTG ON lnkSTG.groupb_id = G.id WHERE system_id = :this->system_id]]></filter>
<dependencies>
<attribute id="system_id"/>
</dependencies>
</field>
<field id="typeb_list" xsi:type="AttributeLinkedSetIndirect">
<linked_class>lnkTypebToDigital</linked_class>
<ext_key_to_me>digital_id</ext_key_to_me>
<ext_key_to_remote>typeb_id</ext_key_to_remote>
<duplicates/>
<display_style>property</display_style>
<filter><![CDATA[SELECT Typeb WHERE groupb_id IN (:this->groupb_list)]]></filter>
<dependencies>
<attribute id="groupb_list"/>
</dependencies>
</field>
Вывод:
Фильтр для поля typeb_list ОЖИДАЕМО не работает. Т.к. там нужна строка типа /a, b, c/ , а прилетает объект.
Таким образом необходимо реализовать фильтр в методе, но перед этим получить список выбранных пользователем групп в поле goupb_list.
Методы:
<method id="SetCalculateValues">
<static>false</static>
<access>public</access>
<code><![CDATA[public function SetCalculateValues()
{
$sAttCode = 'groupb_list';
$oSet = $this->Get($sAttCode);
IssueLog::Info('Объект: '.$sAttCode.' ==== '.print_r($oSet, true));
IssueLog::Info('Лист изменений ====> '.print_r($this->ListChanges(), true));
}]]></code>
</method>
<method id="Get" _delta="define">
<static>false</static>
<access>public</access>
<type>Overload-DBObject</type>
<code><![CDATA[public function Get($sAttCode)
{
IssueLog::Info('Вызван метод Get для поля '.$sAttCode);
if ($sAttCode === 'typeb_list')
{
$this->SetCalculateValues();
}
return parent::Get($sAttCode);
}]]></code>
</method>
<method id="OnInsert">
<static>false</static>
<access>public</access>
<type>Overload-DBObject</type>
<code><![CDATA[public function OnInsert()
{
parent::OnInsert();
$this->SetCalculateValues();
}]]></code>
</method>
Пояснение к методам:
вывод в лог результата метода OnInsert:
2025-05-23 10:37:57 | Info | 1 | Объект: groupb_list ==== ormLinkSet Object
(
[sHostClass:protected] => Digital
[sAttCode:protected] => groupb_list
[sClass:protected] => lnkGroupbToDigital
[oOriginalSet:protected] => DBObjectSet Object
(
***
[aAdded:protected] => Array
(
[-1] => lnkGroupbToDigital Object
(
[m_iFormId:protected] =>
[sDisplayMode:protected] => view
[aFieldsMap:protected] =>
[bAllowWrite:protected] =>
[bAllowDelete:protected] =>
[aAttributesFlags:protected] =>
[aInitialAttributesFlags:protected] =>
[m_datCreated:protected] =>
[m_datUpdated:protected] =>
[m_bIsInDB:protected] =>
[m_iKey:protected] => -1
[m_aCurrValues:DBObject:private] => Array
(
[digital_id] => 0
[digital_name] =>
[groupb_id] => 3
[groupb_name] =>
[friendlyname] =>
[digital_id_friendlyname] =>
[groupb_id_friendlyname] =>
)
***
[-2] => lnkGroupbToDigital Object
(
[m_iFormId:protected] =>
[sDisplayMode:protected] => view
[aFieldsMap:protected] =>
[bAllowWrite:protected] =>
[bAllowDelete:protected] =>
[aAttributesFlags:protected] =>
[aInitialAttributesFlags:protected] =>
[m_datCreated:protected] =>
[m_datUpdated:protected] =>
[m_bIsInDB:protected] =>
[m_iKey:protected] => -2
[m_aCurrValues:DBObject:private] => Array
(
[digital_id] => 0
[digital_name] =>
[groupb_id] => 5
[groupb_name] =>
[friendlyname] =>
[digital_id_friendlyname] =>
[groupb_id_friendlyname] =>
)
***
)
| IssueLog |||
2025-05-23 10:37:57 | Info | 1 | Лист изменений ====> Array
(
[name] => Имя
[system_id] => 2
[system_name] =>
[groupb_list] => ormLinkSet Object
(
***
[aAdded:protected] => Array
(
[-1] => lnkGroupbToDigital Object
(
[m_iFormId:protected] =>
[sDisplayMode:protected] => view
[aFieldsMap:protected] =>
[bAllowWrite:protected] =>
[bAllowDelete:protected] =>
[aAttributesFlags:protected] =>
[aInitialAttributesFlags:protected] =>
[m_datCreated:protected] =>
[m_datUpdated:protected] =>
[m_bIsInDB:protected] =>
[m_iKey:protected] => -1
[m_aCurrValues:DBObject:private] => Array
(
[digital_id] => 0
[digital_name] =>
[groupb_id] => 3
[groupb_name] =>
[friendlyname] =>
[digital_id_friendlyname] =>
[groupb_id_friendlyname] =>
)
[-2] => lnkGroupbToDigital Object
(
[m_iFormId:protected] =>
[sDisplayMode:protected] => view
[aFieldsMap:protected] =>
[bAllowWrite:protected] =>
[bAllowDelete:protected] =>
[aAttributesFlags:protected] =>
[aInitialAttributesFlags:protected] =>
[m_datCreated:protected] =>
[m_datUpdated:protected] =>
[m_bIsInDB:protected] =>
[m_iKey:protected] => -2
[m_aCurrValues:DBObject:private] => Array
(
[digital_id] => 0
[digital_name] =>
[groupb_id] => 5
[groupb_name] =>
[friendlyname] =>
[digital_id_friendlyname] =>
[groupb_id_friendlyname] =>
)
***
[note] =>
[friendlyname] =>
[system_id_friendlyname] =>
)
| IssueLog |||
Таким образом видно, что OnInsert вызывает SetCalculateValues, в котором используется вывод функций $this->Get($sAttCode) и $this->ListChanges() и обе они дают результат.
Теперь посмотрим результаты вызова метода Get
2025-05-23 10:45:53 | Info | 1 | Вызван метод Get для поля typeb_list | IssueLog |||
2025-05-23 10:45:53 | Info | 1 | Вызван метод Get для поля groupb_list | IssueLog |||
2025-05-23 10:45:53 | Info | 1 | Объект: groupb_list ==== ormLinkSet Object
(
[sHostClass:protected] => Digital
[sAttCode:protected] => groupb_list
[sClass:protected] => lnkGroupbToDigital
[oOriginalSet:protected] => DBObjectSet Object
(
***
[aAdded:protected] => Array
(
[-2] => lnkGroupbToDigital Object
(
[m_iFormId:protected] =>
[sDisplayMode:protected] => view
[aFieldsMap:protected] =>
[bAllowWrite:protected] =>
[bAllowDelete:protected] =>
[aAttributesFlags:protected] =>
[aInitialAttributesFlags:protected] =>
[m_datCreated:protected] =>
[m_datUpdated:protected] =>
[m_bIsInDB:protected] =>
[m_iKey:protected] => -2
[m_aCurrValues:DBObject:private] => Array
(
[digital_id] => 0
[digital_name] =>
[groupb_id] => 0
[groupb_name] =>
[friendlyname] =>
[digital_id_friendlyname] =>
[groupb_id_friendlyname] =>
)
***
| IssueLog |||
2025-05-23 10:45:53 | Info | 1 | Лист изменений ====> Array
(
[name] => Имечко
[system_id] => 2
[system_name] => Класс 2
[groupb_list] => ormLinkSet Object
(
***
[aAdded:protected] => Array
(
[-2] => lnkGroupbToDigital Object
(
[m_iFormId:protected] =>
[sDisplayMode:protected] => view
[aFieldsMap:protected] =>
[bAllowWrite:protected] =>
[bAllowDelete:protected] =>
[aAttributesFlags:protected] =>
[aInitialAttributesFlags:protected] =>
[m_datCreated:protected] =>
[m_datUpdated:protected] =>
[m_bIsInDB:protected] =>
[m_iKey:protected] => -2
[m_aCurrValues:DBObject:private] => Array
(
[digital_id] => 0
[digital_name] =>
[groupb_id] => 0
[groupb_name] =>
[friendlyname] =>
[digital_id_friendlyname] =>
[groupb_id_friendlyname] =>
)
***
[note] =>
[friendlyname] =>
[system_id_friendlyname] => Класс 2
)
| IssueLog |||
Таким образом видно, что Get вызывает SetCalculateValues (то, что использованные в методе SetCalculateValues функции выдают нужный результат, мы убедились ранее), но вот только когда SetCalculateValues вызывается из Get, результаты нулевые.
более того, нет секции
[-1] => lnkGroupbToDigital Object
а сразу идёт
[-2] => lnkGroupbToDigital Object
несмотря на то, что эти поля получены:
[name] => Имечко
[system_id] => 2
[system_name] => Класс 2
[system_id_friendlyname] => Класс 2
Вот что такого вызывает OnInsert, чего не делает Get? Как в процессе редактирования получить результаты выбора пользователя в поле groupb_list?