【问题标题】:TYPO3: Set more than one storage pid for one extensionTYPO3:为一个扩展设置多个存储 pid
【发布时间】:2023-03-15 07:42:01
【问题描述】:

我构建了一个扩展,它有一个“详细信息”表,其中包含包含在另一个对象中的标题和描述的详细信息。现在新的详细信息存储在与对象相同的 pid 中,但我想更改它。

this questionMerec 回答,并且在 cmets 中他指出了一个解决方案(将“pid”列添加到您的模型中,这是模型查看的第一个),但被要求为其制定一个单独的问题...

我接受了他的建议,但无法让它发挥作用,所以这是单独的问题,另外我想知道如何从配置中获取一个值以用作 pid这个。

更新: René Pflamm 指出我应该强调我正在尝试将这个 Pid 设置为 保存在后端,而不是在前端......我后来基本认出了这个目的地

我的常量.ts:

plugin.tx_myext {
  persistence {
    # cat=plugin.tx_myext/storage/a; type=string; label=Default storage PID
    defaultStoragePid =
    # cat=plugin.tx_myext/storage/a; type=string; label=Details storage PID
    detailsStoragePid =
  }
}

我的 setup.ts

plugin.tx_myext {
  persistence {
    storagePid = {$plugin.tx_myext.persistence.defaultStoragePid}
    detailPid = {$plugin.tx_myext.persistence.detailsStoragePid}
  }
}

【问题讨论】:

    标签: typo3 extbase typo3-7.6.x


    【解决方案1】:

    我不确定我是否正确理解了您,但您可以告诉 extbase 在多个 pid 中查找您的记录,并为每条记录的存储状态:

    plugin.tx_myext {
      persistence {
        storagePid = {$plugin.tx_myext.persistence.defaultStoragePid},{$plugin.tx_myext.persistence.detailStoragePid}
        classes {
          Vendor\MyExt\Domain\Model\Detail {
            newRecordStoragePid = {$plugin.tx_myext.persistence.detailStoragePid}
          }
        }
      }
    }
    

    【讨论】:

    • 看起来刚刚好,还有其他指针如何调试?我无法让它工作...... tx_myext 最初由构建器命名为 tx_myext_objects 但更改它并没有影响其他设置(我试图将它设置回来而没有结果 newRecordStoragePid),你给的 sn-p 是setup.ts 不是吗?
    • 如果我使用 config.或模块。而不是插件。 ?仍在努力让它工作
    • 保存在后端怎么样?
    【解决方案2】:

    模型继承自TYPO3\CMS\Extbase\DomainObject\AbstractDomainObject,它具有$pid 的getter 和setter。如果您设置字段,则不会使用设置字段的所有自动化(即打字稿中的 newRecordStoragePid)。

    有了这个,你可以设置你想要的所有存储位置。

    $myModel = $this->objectManager->create('Vendor\\Namespace\\Domain\\Model\\MyModel');
    $myModel->setPid(4321);
    

    来自TYPO3\CMS\Extbase\DomainObject\AbstractDomainObject

    /**
     * @var int The id of the page the record is "stored".
     */
    protected $pid;
    
    /**
     * Setter for the pid.
     *
     * @param int|NULL $pid
     * @return void
     */
    public function setPid($pid)
    {
        if ($pid === null) {
            $this->pid = null;
        } else {
            $this->pid = (int)$pid;
        }
    }
    
    /**
     * Getter for the pid.
     *
     * @return int The pid or NULL if none set yet.
     */
    public function getPid()
    {
        if ($this->pid === null) {
            return null;
        } else {
            return (int)$this->pid;
        }
    }
    

    【讨论】:

    • 我应该在哪里设置它?应该存储在单独 pid 中的详细信息表不是聚合根,扩展生成器的标准我只有这个表的模型......(对不起,我对 php 类和typo3还不是很方便)
    • 扩展构建器中的“聚合根”选项仅指定是否在保存时生成控制器和存储库。您可以为每个模型手动创建一个存储库类。从另一个聚合根目录复制并粘贴它(如果有一组)或查看 extbase 文档。
    • $myModel = $this->objectManager->create('Vendor\\Namespace\\Domain\\Model\\MyModel'); $myModel->setPid(4321); 应该添加到 DetailsRepository.php 中?,也许是非常愚蠢的问题,但我不认识这种语法
    【解决方案3】:

    您可以在扩展程序中创建元素时,说出应该使用哪个 pid 的模型。

    在您的 TS 中:

    plugin.tx_myext.settings {
      detailPid = {$plugin.tx_myext.persistence.detailsStoragePid}
    }
    

    在您上面的代码中,它可能如下所示:

    public function createDetailsAction(Detail $detail) {
      $detail->setPid($this->settings['detailPid']);
      $this->detailRepository->add($detail);
    }
    

    【讨论】:

    • 我会将这个 sn-p 放在哪个班级? Details 不是聚合根,我只有一个模型 Details.php ...
    • 在您创建详细信息的控制器中。
    • 谢谢 4 的注意,如果您使用扩展构建器构建,则没有控制器也没有存储库的详细信息,因此不需要创建,我确实创建了它们,但我没有得到任何结果......
    • 它看起来好像应该在控制器中,这不仅影响前端动作吗?
    • 没错。对于后端,我不知道如何解决它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-15
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 2019-07-18
    相关资源
    最近更新 更多