如何处理TYPO3中的内联字段等TCA多选?

时间:2016-03-31 11:18:37

标签: typo3

也许我的问题听起来有点奇怪。所以这里有详细信息:

我创建了两个类“Position”和“Step”。此外,每一步都可以包含职位。我的表格和相关字段如下所示:

/**
     * functionDescList is your array list of DeviceFunctionModel class type
     *
     */

    Intent intent=new Intent(mContext,DeviceOptions.class);
    Bundle bundle= new Bundle();
    bundle.putParcelableArrayList("DeviceFunctionModel", functionDescList);
    intent.putExtras(bundle);
    mContext.startActivity(intent);

    //in calling class just get the parcelable arraylist
    Bundle bundle=getIntent().getExtras();
    ArrayList<DeviceFunctionModel>functionDescList=bundle.getParcelableArrayList("DeviceFunctionModel");

我认为这是一个正常的1:n关系,因为每个步骤都可以存储n个位置,每个位置只能是一个步骤的一部分。

我的课程和相关属性如下所示:

CREATE TABLE tx_foxexample_domain_model_step (
    ...
    positions int(11) unsigned DEFAULT '0' NOT NULL,
    ...
);

CREATE TABLE tx_foxexample_domain_model_position (
   ...
   step int(11) unsigned DEFAULT '0' NOT NULL,
   ...
);

该步骤将n位置存储在对象存储属性中,该位置只将相关步骤存储在步骤属性中。

到目前为止,我已经通过内联字段直接内联创建了一个位置或一些位置,我的步骤的TCA如下:

class Step extends AbstractEntity
{
    ...
    /**
     * Positions
     *
     * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Fox\FoxExample\Domain\Model\Position>
     * @cascade remove
     */
     protected $positions = null;
     ...
}

class Position extends AbstractEntity
{
   ...
   /**
    * Stores the relation to step
    *
    * @var \Fox\FoxExample\Domain\Model\Step
    */
    protected $step = null;
   ...
}

因此,位置和步骤关系被正确保存到数据库中,但由于某些原因,我已经改变很多,并且不再需要在步骤内创建位置,因为位置已经存在且用户必须选择位置这是必要的。所以我将内联类型更改为多选字段:

...
'positions' => array(
    'exclude' => 1,
    'label' => '...',
    'config' => array(
        'type' => 'inline',
         'foreign_table' => 'tx_foxexample_domain_model_position',
         'foreign_field' => 'step',
         'maxitems' => 50,
         'appearance' => array(
             'collapseAll' => 1,
             'levelLinksPosition' => 'top',
             'showSynchronizationLink' => 1,
             'showPossibleLocalizationRecords' => 1,
             'showAllLocalizationLink' => 1
         ),
    ),
),
...

通过此更改,用户可以为每个步骤选择相关位置,但是如果我查看数据库表,我可以看到我的位置表的步骤字段始终为0,并且我的步骤表的位置字段保持不变现在的位置uid。

所以我遇到了一些麻烦,因为我无法为多选字段定义'foreign_field',因此与位置表的关系消失了。此外,我只能添加一个位置,因为只保存一个位置,其他选定位置将被忽略,因为只存储一个uid。

保存前: enter image description here

保存后: enter image description here

总之,我想保留多选字段的内联字段行为。如何保持多选字段的内联字段行为?

1 个答案:

答案 0 :(得分:0)

您可能需要一个MM-Table,因为一个步骤可以有多个位置,一个位置可以分多步分配。我建议引入一个表tx_foxexample_step_position_mm

CREATE TABLE tx_foxexample_step_position_mm (
  uid_local int(11) DEFAULT '0' NOT NULL,
  uid_foreign int(11) DEFAULT '0' NOT NULL,
  sorting int(11) DEFAULT '0' NOT NULL,

  KEY uid_local (uid_local),
  KEY uid_foreign (uid_foreign)
);

你告诉你的TCA使用它(休息保持不变):

'positions' => array(
    'config' => array(
         'MM' => 'tx_foxexample_step_position_mm'
    ),
 ),

现在您需要将现有数据迁移到新结构。我建议编写一个CommandController,用当前关系填充MM表。