GetValuesDef()->GetFilterExpression(), $sWizardHelperJsVarName); $oSetUIBlock->AddJsFileRelPath('js/links/linkset.js'); // Add button behaviour if (LinkSetModel::IsRemoteCreationAllowed($oAttDef) && $oHostDbObject !== null) { $oSetUIBlock->SetHasAddOptionButton(true); $oSetUIBlock->SetAddOptionButtonJsOnClick("iTopLinkSet.CreateLinkedObject('{$sTargetClass}', oWidget{$oSetUIBlock->GetId()} );"); } // Current value $aCurrentValues = LinkSetDataTransformer::Decode($oDbObjectSet, $sTargetClass, $sTargetField); // Some operations can have been done in case of reload after an error $aInitialValues = LinkSetDataTransformer::Decode($oDbObjectSet->GetOriginalSet(), $sTargetClass, $sTargetField); // Initial options data $aInitialOptions = []; LinkSetRepository::LinksDbSetToTargetObjectArray($oDbObjectSet, false, $aInitialOptions, $sTargetClass, $sTargetField); // Register also original values in case of reload after an error. In order to remember the operations, use the "bForce" flag LinkSetRepository::LinksDbSetToTargetObjectArray($oDbObjectSet->GetOriginalSet(), true, $aInitialOptions, $sTargetClass, $sTargetField); if ($aInitialOptions !== null) { $oSetUIBlock->GetDataProvider()->SetOptions(array_values($aInitialOptions)); // Set value $oSetUIBlock->SetValue(json_encode($aCurrentValues)); $oSetUIBlock->SetInitialValue(json_encode(array_merge($aInitialValues, $aCurrentValues))); } else { $oSetUIBlock->SetHasError(true); } return $oSetUIBlock; } /** * Make a link set block for bulk modify. * * @param string $sId Block identifier * @param AttributeLinkedSet $oAttDef Link set attribute definition * @param iDBObjectSetIterator $oDbObjectSet Link set value * @param string $sWizardHelperJsVarName Wizard helper name * @param array $aBulkContext * * @return \Combodo\iTop\Application\UI\Base\Component\Input\Set\Set */ public static function MakeForBulkLinkSet(string $sId, AttributeLinkedSet $oAttDef, iDBObjectSetIterator $oDbObjectSet, string $sWizardHelperJsVarName, array $aBulkContext): Set { $oSetUIBlock = self::MakeForLinkSet($sId, $oAttDef, $oDbObjectSet, $sWizardHelperJsVarName); // Bulk modify specific $oSetUIBlock->GetDataProvider()->SetGroupField('group'); $oSetUIBlock->SetIsMultiValuesSynthesis(true); // Data post processing $aBinderSettings = [ 'bulk_oql' => $aBulkContext['oql'], 'link_class' => LinkSetModel::GetLinkedClass($oAttDef), 'target_field' => LinkSetModel::GetTargetField($oAttDef), 'origin_field' => $oAttDef->GetExtKeyToMe(), ]; // Initial options $aOptions = $oSetUIBlock->GetDataProvider()->GetOptions(); $aOptions = LinksBulkDataPostProcessor::Execute($aOptions, $aBinderSettings); $oSetUIBlock->GetDataProvider()->SetOptions($aOptions); // Data provider post processor /** @var \Combodo\iTop\Application\UI\Base\Component\Input\Set\DataProvider\AjaxDataProvider $oDataProvider */ $oDataProvider = $oSetUIBlock->GetDataProvider(); $oDataProvider->SetPostParam('data_post_processor', [ 'class_name' => addslashes(LinksBulkDataPostProcessor::class), 'settings' => $aBinderSettings, ]); return $oSetUIBlock; } }