所以目前我正在使用一个TYPO3扩展,使用一个Relation(1:n)扩展到一个为主类提供对象的特定类。让我更详细地解释一下:我有一个类,它在普通属性旁边,与一个为某种清单提供对象的类有关系。这个想法是FE用户应该能够添加新的清单条目,这就是我使用这种概念的原因。最初它对于编辑动作看起来像这样([x]表示它只是一个核对表):
FE用户应该能够编辑记录,因此他应该将清单设置为true或false,但即使出现清单条目,即使是附加对象的条目,它们也不会保留,只有属性当FE用户编辑FE中的记录时,主类的持久化。
这是我的代码:
主类的域模型(仅指定与“提供”对象的类的关系的行)。请记住,当创建主类的记录时,相关类的少数对象附加到主类,特定代码不在主classe的控制器中...
/**
* zugewCheckobject
*
* @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\...\Kundentermine\Domain\Model\Checkobject>
* @cascade remove
*/
protected $zugewCheckobject = null;
public function __construct()
{
$this->zugewCheckobject = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage();
}
/**
* Initializes all ObjectStorage properties
* Do not modify this method!
* It will be rewritten on each save in the extension builder
* You may modify the constructor of this class instead
*
* @return void
*/
protected function initStorageObjects()
{
$this->zugewCheckobject = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage();
}
/**
* Adds a Checkobject
*
* @param \...\Kundentermine\Domain\Model\Checkobject $zugewCheckobject
* @return void
*/
public function addZugewCheckobject(\...\Kundentermine\Domain\Model\Checkobject $zugewCheckobject)
{
$this->zugewCheckobject->attach($zugewCheckobject);
}
/**
* Removes a Checkobject
*
* @param \...\Kundentermine\Domain\Model\Checkobject $zugewCheckobjectToRemove The Checkobject to be removed
* @return void
*/
public function removeZugewCheckobject(\...\Kundentermine\Domain\Model\Checkobject $zugewCheckobjectToRemove)
{
$this->zugewCheckobject->detach($zugewCheckobjectToRemove);
}
/**
* Returns the zugewCheckobject
*
* @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\...\Kundentermine\Domain\Model\Checkobject> $zugewCheckobject
*/
public function getZugewCheckobject()
{
return $this->zugewCheckobject;
}
/**
* Sets the zugewCheckobject
*
* @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Unilab\Kundentermine\Domain\Model\Checkobject> $zugewCheckobject
* @return void
*/
public function setZugewCheckobject(\TYPO3\CMS\Extbase\Persistence\ObjectStorage $zugewCheckobject)
{
$this->zugewCheckobject = $zugewCheckobject;
}
主类控制器中的编辑和更新操作......
public function editAction(\...\Kundentermine\Domain\Model\Kaufmnnisch $kaufmnnisch)
{
$this->view->assign('kaufmnnisch', $kaufmnnisch);
}
/**
* action update
*
* @param \...\Kundentermine\Domain\Model\Kaufmnnisch $kaufmnnisch
* @return void
*/
public function updateAction(\...\Kundentermine\Domain\Model\Kaufmnnisch $kaufmnnisch)
{
$objectManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\CMS\Extbase\Object\ObjectManager');
$checkobjectRepository = $objectManager->get(\...\Kundentermine\Domain\Repository\CheckobjectRepository::class);
foreach($kaufmnnisch->getZugewCheckobject() as $chk){
$checkobjectRepository->update($chk);
}
$this->kaufmnnischRepository->update($kaufmnnisch);
$this->redirect('list');
}
“编辑”模板的一部分。我将对象“kaufmnnisch”作为参数传递给Chekobject类的一部分(因为它附加了该类的对象),当然还有Kaufmnnisch类的一部分......
<f:section name="main">
<h1>Edit Kaufmnnisch</h1>
<f:flashMessages />
<f:render partial="FormErrors" arguments="{object:Kaufmnnisch}" />
<f:form action="update" name="kaufmnnisch" object="{kaufmnnisch}" >
<f:render partial="Checkobject/FormFields" arguments="{kaufmnnisch:kaufmnnisch}" />
<f:render partial="Kaufmnnisch/FormFields" arguments="{kaufmnnisch:kaufmnnisch}" />
<f:form.submit value="Save" />
</f:form>
</f:section>
再次:问题是只有主类的属性被编辑而不是相关对象的属性。我的假设是编辑模板或部分未正确设置。
编辑:这是Checkobject类的部分代码,它将对象Kaufmnnisch作为参数传递。
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:for each="{kaufmnnisch.zugewcheckobject}" as="chk" >
<f:form.checkbox property="checked" value="0" /><br />
</f:for>
</html>
所以基本上“zugewcheckobject”是我的对象存储。每个复选框都在Edit模板中呈现(感谢每个viewhelper),但是如果用户单击“save”按钮,则不会保留每个Checkobject对象的布尔属性的值。
Edit2:updateAction中的var_dump(在foreach循环中)显示每个Checkobject对象的“Checked”属性没有改变,所以它不仅没有被保留,而且改变的值不会从Edit传递updateAction的模板。
Edit3:通过编辑模板中类“Kaufmnnisch”的传递对象的对象存储“zugewcheckobject”访问每个Checkobject对象(此处:$ chk)是可能的,但我无法更改Checkobject对象的特定属性,因为只是将Kaufmnnisch对象传递回特定控制器的updateAction,而不是对象存储的每个Checkobject(“zugewcheckobject”)。
据我所知,对象存储只包含对应对象的引用,而不包含对象本身,否定视图中对它们所做的任何更改。
简而言之:我怎么能一次性将相应的objectstorage对象传递给updateAction,以便它们被保留?
Edit4:它似乎也无法使用该解决方案...
<f:form action="update" name="kaufmnnisch" object="{kaufmnnisch}" >
<f:for each="{kaufmnnisch.zugewCheckobject}" as="chk" key="chkIndex" >
<f:form.hidden property="zugewCheckobject.{chkIndex}.__identity" value="{chk.uid}" />
<f:form.checkbox property="zugewCheckobject.{chkIndex}.checked" value="{chk.checked}" /><br />
</f:for>
<f:render partial="Kaufmnnisch/FormFields" arguments="{kaufmnnisch:kaufmnnisch}" />
<f:form.submit value="Save" />
</f:form>
问题在这里解决了:TYPO3 extension thought experiment: Editing a news entry and the comment entries in one go?