如何在 Extbase 中更新 1:1 关系
How to update 1:1 relations in Extbase
我有以下2个型号
class Communication extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity {
/**
* @var Filter
*/
protected $filter;
}
class Filter extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity {
/**
* @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\TYPO3\CMS\Extbase\Domain\Model\FrontendUserGroup>
*/
protected $usergroup;
}
模板如下
<f:form class="form-horizontal" name="communication" action="update" object="{communication}">
<div class="form-group">
<label class="col-xs-3 col-md-2 control-label" for="bodytext">{f:translate(key: 'text.usergroup')}</label>
<div class="col-xs-9 col-md-10">
<f:for each="{usergroups}" as="group">
<label class="checkbox-inline">
<f:form.checkbox property="filter.usergroup" value="{group.uid}" /> {group.title}
</label>
</f:for>
</div>
</div>
<div class="form-group">
<div class="col-xs-9 col-md-10 col-xs-offset-3 col-md-offset-2">
<button type="submit" class="btn btn-primary">{f:translate(key: 'button.update')}</button>
</div>
</div>
</f:form>
当我尝试用 $this->communicationRepository->update($communication)
更新通信时,它总是创建一个新的过滤器而不是更新它自己的过滤器。这是为什么?
这是因为与已经存在的过滤器没有关系。为了保留过滤器,您需要说出它的 ID。我发现它适用于 __identity 字段:
编辑:最好用 if 条件包装字段,以防没有过滤器集
<f:if condition="{communication.filter.uid}">
<f:form.hidden name="communication[filter][__identity]" value="{communication.filter.uid}" />
</f:if>
不确定,但可能也适用于 uid 属性 字段:
<f:form.hidden property="filter.uid" />
我有以下2个型号
class Communication extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity {
/**
* @var Filter
*/
protected $filter;
}
class Filter extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity {
/**
* @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\TYPO3\CMS\Extbase\Domain\Model\FrontendUserGroup>
*/
protected $usergroup;
}
模板如下
<f:form class="form-horizontal" name="communication" action="update" object="{communication}">
<div class="form-group">
<label class="col-xs-3 col-md-2 control-label" for="bodytext">{f:translate(key: 'text.usergroup')}</label>
<div class="col-xs-9 col-md-10">
<f:for each="{usergroups}" as="group">
<label class="checkbox-inline">
<f:form.checkbox property="filter.usergroup" value="{group.uid}" /> {group.title}
</label>
</f:for>
</div>
</div>
<div class="form-group">
<div class="col-xs-9 col-md-10 col-xs-offset-3 col-md-offset-2">
<button type="submit" class="btn btn-primary">{f:translate(key: 'button.update')}</button>
</div>
</div>
</f:form>
当我尝试用 $this->communicationRepository->update($communication)
更新通信时,它总是创建一个新的过滤器而不是更新它自己的过滤器。这是为什么?
这是因为与已经存在的过滤器没有关系。为了保留过滤器,您需要说出它的 ID。我发现它适用于 __identity 字段:
编辑:最好用 if 条件包装字段,以防没有过滤器集
<f:if condition="{communication.filter.uid}">
<f:form.hidden name="communication[filter][__identity]" value="{communication.filter.uid}" />
</f:if>
不确定,但可能也适用于 uid 属性 字段:
<f:form.hidden property="filter.uid" />