【问题标题】:TYPO3 foreign_table: How to specify a specific column to a select drop down menu?TYPO3 foreign_table:如何为选择下拉菜单指定特定列?
【发布时间】:2017-10-24 07:01:44
【问题描述】:

我想在 TYPO3 后端添加记录。为此,我做了一个包含 4 个不同类的扩展。在通过后端将一个特定类的记录添加到文件夹时,我想要一个选择,让我从另一个类的列的项目中进行选择。我知道我必须在此代码中使用foreign_table

 'kundeuid' => array(
                   'exclude' => 1,
                   'label' => 'LLL:EXT:icingaconfgen/Resources/Private/Language/locallang_db.xlf:tx_icingaconfgen_domain_model_appliance.kundeuid',
                   'config' => array(
                                   'type' => 'select',
                                   'renderType' => 'selectSingle',
                                   'foreign_table' => 'tx_icingaconfgen_domain_model_kunde',
                                   'foreign_table_where' => 'ORDER BY tx_icingaconfgen_domain_model_kunde.kundeuid asc',
                                   'items' => array(
                                                   array('-- Select Kunde --', 0),
                                   ),
                                   'size' => 1,
                                   'maxitems' => 1
                   ),
           ),

但问题是我无法指定选择应仅包含已确定列的属性。相反,选择下拉菜单似乎使用了第一列的属性。如何指定“kundeuid”属性的列?

编辑:我忘了说,代码是在TCA文件夹中的特定PHP文件中使用的。

【问题讨论】:

  • 您是否只想将所选项目的标签字段或其值更改为外国记录的“uid”以外的值?
  • 我试着更具体一点:“Kunde”类有一个属性“kundeuid”。在后端添加具有相同属性(基本上可以说是外键)的“设备”类的记录时,此属性应由包含所有现有对象的“kundeuid”值的选择下拉菜单设置/ “昆德”班的记录。我想通过在特定 TCA 中为“设备”类使用 foreign_table 来做到这一点。上面的代码甚至加载了“Kunde”记录的属性,但似乎使用了错误的列/属性...
  • 所以'Kunde' 记录有一个 TYPO3 的属性 'uid' 但你想存储另一个名为“kundeuid”的属性?
  • 不,两个类... Kunde 和 Appliance 都有属性 'kundeuid'... 如果我添加一个 Appliance,我想从基于 Kunde 对象的选择中设置它的 kundeuid。基本上每个电器都属于特定的昆德语。这就是为什么 Appliance 有 kundeuid 作为外键的原因。
  • 我刚刚听懂了你昨天的问题:“你只是想将所选项目的标签字段或其值更改为外国记录的“uid”以外的值吗?第二个选项是我想要做的。这可能吗?

标签: select typo3


【解决方案1】:

从另一个表的字段值中创建一个选择

如果你实现了一个提供选择框内容的 PHP 方法,你可以用任何你想要的填充选择。为此,您必须使用itemsProcFunc

可能是这样的:

'kundeuid' => [
     'config' => [
        'type' => 'select',
        'renderType' => 'selectSingle',
        'itemsProcFunc' => 'Vendor\Ext\ItemsProcFunc\KundeUid->fetchItems',
    ],
]

然后,在您的方法中,您可以使用 kunde 表中的值填充 items 数组(自己查看数据库):

/**
 * Add two items to existing ones
 *
 * @param $params
 */
public function fetchItems(&$params)
{
    $params['items'][] = ['customer01 (label)', 'customer01'];
    $params['items'][] = ['customer02 (label)', 'customer02'];
}

注意$params是通过引用传递的,该方法不需要返回任何东西。此外,您在 TCA 配置中写入 items 的任何内容也将在那里。无论您选择什么,该选项的值都将存储在您的数据库字段中。

创建关系

如果您在 TCA conf 中使用'foreign_table',那么您将创建与外部表的关系,这始终意味着您将所选记录的 uid 存储在您的字段中(除非您使用的是 MM 表)。

在 TYPO3 中,每个记录都有一个 uid,它位于数据库中的 auto_increment 上,因此在每个表中都是唯一的。以下 TCA 配置

'kundeuid' => [
     'config' => [
        'type' => 'select',
        'renderType' => 'selectSingle',
        'foreign_table' => 'tx_icingaconfgen_domain_model_kunde',
    ],
]

将让您在选择框中选择您的kunde 记录并将其uid 存储在字段kundeuid 中。所以如果你让属性映射器在你的 PHP 代码中解决这个依赖(或者让 extbase 为你做,如果你使用存储库和域模型),你最终会得到这样的结果:

$appliance = $this->applianceRepository->findBySomething('something');
$kunde = $appliance->getKundeuid();
$kundeuid = $kunde->getKundeuid();

因此,我建议您将 TCA 配置用于类似 client 的字段重命名,以便 PHP 代码变得不那么混乱。

$appliance = $this->applianceRepository->findBySomething('something');
$client = $appliance->getClient();
$kundeuid = $client->getKundeuid();

【讨论】:

  • 有一个误解:假设我在创建 Kunde 类的记录时将 'kundeuid' 设置为值 'customer01' 或其他值。然后我创建了“电器”类的记录。它还有一个名为“kundeuid”的属性,我想通过一个选择来设置它,该选择填充了来自 Kunde 类的所有记录的“kundeuid”。此选择的一个选项是我创建的 Kunde 记录中的“customer01”。我会选择它,创建的设备记录的属性“kundeuid”也应该是“customer01”......这就是我想要做的。
  • 好吧,然后去找一个 itemsProcFunc,我将它添加到答案中
  • 谢谢,帮了大忙。
  • 对不起,我对 stackoverflow 很陌生。但我现在做到了。
【解决方案2】:

当您将属性label 设置为ctrl 部分中Kunde TCA 记录中的Kunde 的名称表字段时,您应该在Appliance 中也看到它。也许其他属性label_* 会对您有用。链接到ctrl 文档:TCA reference

【讨论】:

  • 谢谢...我还没有研究这个...我现在正在检查。
  • 我这边好像有误会。另一位用户问我:“您是否只想将所选项目的标签字段或其值更改为外国记录的“uid”以外的值?这正是我想要做的,我想将 kundeuid 的值分配给外部记录的“uid”以外的值。这可能吗?
  • 我认为您有两个选择。使用数据映射的钩子之一来保存不同的值或使用itemsProcFunc(TCA 选择类型的文档)呈现自定义项目列表
  • 谢谢,我试试这个。
猜你喜欢
  • 2016-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-01
  • 2017-06-19
  • 1970-01-01
  • 2019-02-25
相关资源
最近更新 更多