【问题标题】:TYPO3 TCA selectCheckBox not working with extension femanagerTYPO3 TCA selectCheckBox 不能与扩展 femanager 一起使用
【发布时间】:2021-09-21 13:44:05
【问题描述】:

我在 TYPO3 中创建了一个 selectCheckBox,如下所示:

'region' => [
    'exclude' => true,
    'label' => 'LLL:EXT:myext/Resources/Private/Language/locallang_db.xlf:tx_myext_domain_model_catalog.region',
    'config' => [
        'type' => 'select',
        'renderType' => 'selectCheckBox',
        'items' => [
            ['LLL:EXT:myext/Resources/Private/Language/locallang_db.xlf:tx_myext_domain_model_catalog.region.1', 1],
            ['LLL:EXT:myext/Resources/Private/Language/locallang_db.xlf:tx_myext_domain_model_catalog.region.2', 2],
            ['LLL:EXT:myext/Resources/Private/Language/locallang_db.xlf:tx_myext_domain_model_catalog.region.3', 3],
            ['LLL:EXT:myext/Resources/Private/Language/locallang_db.xlf:tx_myext_domain_model_catalog.region.4', 4],
        ],
    ],
],

当我保存它时,数据库有逗号分隔的 ID 作为值:

1,3,4

现在我想通过femanager扩展获取前端的值。

我已经为它创建了这个配置:

/**
 * region
 *
 * @var array
 */
protected $region = [];

/**
 * Returns the region
 *
 * @return array $region
 */
public function getRegion()
{
    return $this->region;
}

/**
 * Sets the region
 *
 * @param array $region
 * @return void
 */
public function setRegion($region)
{
    $this->region = $region;
}

数据库配置:

region varchar(255) DEFAULT '' NOT NULL,

但是当我尝试像这样调试输出时:

<f:debug>{catalog.region}</f:debug>

它只是这样说:

array(empty)

所以我的getRegion 功能不起作用。有人可以给我一个提示,为什么它没有得到值。

【问题讨论】:

  • 如果您调试 {catalog} 变量,是否存在区域键?
  • @AristeidisKaravas 不,不是
  • 您是否在扩展任何其他域模型? fe_users 还是……?
  • 我的目录控制器扩展了 \TYPO3\CMS\Extbase\Mvc\Controller\ActionController

标签: typo3 typoscript fluid extbase typo3-9.x


【解决方案1】:

$region 被声明为array 并且您的设置器setRegion() 期望array 作为参数。但是数据库中存储的值是varchar。因此,对于此属性,您的模型上的数据库记录的映射将失败。


这适用于您的 TCA:

/**
 * @var string
 */
protected string $region = '';

/**
 * @return array
 */
public function getRegion(): array
{
    return GeneralUtility::intExplode(',', $this->region, true);
}

/**
 * @param mixed $region
 */
public function setRegion($region): void
{
    $this->region = (is_array($region) ? implode(',', array_filter($region, 'is_int')) : $region);
}

【讨论】:

  • 所以我的设置器应该是“字符串”?
  • 这取决于... 最简单的方法是将其作为字符串处理(逗号分隔列表)并在 getter 中拆分字符串。如果您的区域不仅仅是一个标题/标签,那么也许一个自己的模型和使用 objectStorage 会更有用(奥利弗的一篇德语博客文章:oliver-weiss.com/blog/einzelansicht/article/…
  • Ty,对字符串的更改只有在我更新我的 tca 时才会起作用,因此后端也会像字符串一样处理它。但是我对后端视图很好,只想更改前端的 getter/setter 有没有办法在不影响后端视图/tca 的情况下更改它?
  • 您无需更改 TCA,只需更改您的模型。您的模型当前需要一个数组,但您的 TCA 正在保存一个字符串。将字符串传递给数组属性不起作用 - 除非您的 setter 处理此问题。设置器应该有@param string $region$this->region = explode(',', $region);
  • 但是当我将它设置为字符串时它仍然没有,但是当我将 tca 从“选择”更改为“字符串”时它可以工作......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-24
  • 1970-01-01
  • 1970-01-01
  • 2018-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多