2016-10-25 5 views
0

Я хочу «пустой» ObjectStorage при обновлении объекта:TYPO3 Extbase как опустошить 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 я не получаю сообщение об ошибке, но старые значения по-прежнему поддерживать :(

Любую идею?

Спасибо

Christian

ответ

1

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

/** @var \Tx_Extbase_Persistence_ObjectStorage $organisationPartners */ 
$organisationPartners = $organisation->getPartner(); 
foreach ($organisationPartners as $partner) { 
    $organisationPartners->detach($partner); 
} 
+0

Спасибо @Wolfgang! Я должен был добавить новый ответ, потому что это было долго для комментария;) –

0

Спасибо @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); 

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

Смежные вопросы