TYPO3扩展开发:当主记录为

时间:2018-01-30 08:06:26

标签: typo3

所以目前我正在使用一个TYPO3扩展,使用一个Relation(1:n)扩展到一个为主类提供对象的特定类。让我更详细地解释一下:我有一个类,它在普通属性旁边,与一个为某种清单提供对象的类有关系。这个想法是FE用户应该能够添加新的清单条目,这就是我使用这种概念的原因。最初它对于编辑动作看起来像这样([x]表示它只是一个核对表):

  • 主要班级
    • 类型为boolean [x]
    • 的主类的属性
    • 带有字符串和布尔属性[x]
    • 的附加对象
    • 带有字符串和布尔属性[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?

0 个答案:

没有答案