TYPO3 Extbase как очистить ObjectStorage

Я хочу "очистить" ObjectStorage при обновлении объекта:

Это TYPO3 4.6 с расширением Extbase, которое позволяет вам показывать / добавлять / редактировать / удалять наборы данных во внешнем интерфейсе. На первый взгляд все выглядит хорошо.

У меня есть одно поле, ссылающееся на другую таблицу:

TCA:

'partner' => array(
'exclude' => 0,
'label' => 'LLL:EXT:toco3_marketingdb/Resources/Private/Language/locallang_db.xlf:tx_toco3marketingdb_domain_model_firma.partner',
'config' => array(
'type' => 'select',
'size' => 5,
'foreign_table' => 'tx_toco3marketingdb_domain_model_partner',
'foreign_table_where' => 'ORDER BY tx_toco3marketingdb_domain_model_partner.partnerpkey',
'minitems' => 0,
'maxitems' => 20,
),
),

Модель:

/**
* Partner
*
* @var Tx_Extbase_Persistence_ObjectStorage<Tx_Toco3Marketingdb_Domain_Model_Partner>
* @lazy
*/
protected $partner;
/**
* Sets the partner
*
* @param Tx_Extbase_Persistence_ObjectStorage<Tx_Toco3Marketingdb_Domain_Model_Partner> $partner
* @return void
*/
public function setPartner(Tx_Extbase_Persistence_ObjectStorage $partner) {
$this->partner = $partner;
}

Контроллер:

$partner = new Tx_Extbase_Persistence_ObjectStorage();
if (count($partnerarr) > 0){
foreach($partnerarr as $p){
$partner->attach( $this->partnerRepository->findByUid($p));
}
}
$organisation = $this->organisationRepository->findByUid($uid)
$organisation->setPartner($partner);

Это работает, пока в ObjectStorage есть объект. Так что я могу добавлять / удалять / изменять отношения. Но когда $ partnerarr пуст и объекты не присоединяются, назначается пустой Tx_Extbase_Persistence_ObjectStorage, старые значения не «удаляются». Я также пытался присвоить null или "", но возникла ошибка, потому что требуется ObjectStorage. Если я назначу пустой ObjectStorage, я не получу ошибки, но старые значения все равно сохранятся :(

Любая идея?

Спасибо

Христианин


person Christian Ehret    schedule 25.10.2016    source источник


Ответы (2)


Вызовите методы detach или removeAll для удаления некоторых или всех объектов хранилища.

/** @var \Tx_Extbase_Persistence_ObjectStorage $organisationPartners */
$organisationPartners = $organisation->getPartner();
foreach ($organisationPartners as $partner) {
   $organisationPartners->detach($partner);
}
person Wolfgang    schedule 25.10.2016
comment
Спасибо, @Wolfgang! Мне пришлось добавить новый ответ, потому что мне очень хотелось получить комментарий;) - person Christian Ehret; 26.10.2016

Спасибо @Wolfgang за ваше сообщение.

Я добавил в свою модель следующую функцию:

/**
* detach Partner
*
* @param Tx_Toco3Marketingdb_Domain_Model_Partner $partner
* @return void
*/
public function detachPartner($partner) {
   $this->partner->detach($partner);
} 

В контроллере я добавил:

$persistanceManager = t3lib_div::makeInstance('Tx_Extbase_Persistence_Manager');
 $organisation = $this->firmaRepository->findByUid($uid);

$organisationPartners = $organisation->getPartner();
 foreach ($organisationPartners as $organisationPartner) {
     $organisation->detachPartner($organisationPartner);
 }
 $persistanceManager->persistAll();

 $organisation->setPartner($partner);

Перед установкой нового (пустого) значения важно проявить настойчивость ...

person Christian Ehret    schedule 26.10.2016