与Silverstripe Fluent有很多关系的问题

问题描述 投票:1回答:1

我们正在使用Fluent来显示多个翻译/区域设置的Silverstripe项目。

我们想设置一些数据对象,以便可以将记录切换为仅在某些Fluent语言环境中显示。想法是在数据对象上具有一个复选框字段,用户可以在其中选择他们想要在其中显示记录的语言环境。

这里是示例数据对象:

namespace Yard;

use SilverStripe\ORM\DataObject;
use TractorCow\Fluent\Model\Locale;

class Milkshake extends DataObject {
  private static $table_name = 'Milkshake';

  private static $db = [
    'Title' => 'Varchar(255)'
  ]

  private static $belongs_many_many = [
    'ShowInLocale' => 'Locale'
  ];
}

然后我们需要扩展Locale类:

namespace AppExtensions;

use SilverStripe\ORM\DataExtension;

class LocaleExtension extends DataExtension
{
    private static $many_many = [
        'Milkshakes' => 'Yard\Milkshake'
    ];
}

并通过YML应用该扩展名:

TractorCow\Fluent\Model\Locale:
  extensions:
    - 'AppExtensions\LocaleExtension'

目前为止很好-但是当我尝试在管理员中查看“奶昔”时,出现此错误消息:

[[紧急]未捕获LogicException:belongs_many_many关系Yard \ Milkshake.ShowInLocale指向不匹配的语言环境many_many

据我所知,我添加了一个匹配的many_many关系:数据库记录已创建。

对我应该如何解决此问题的任何想法都表示赞赏。

php silverstripe silverstripe-4
1个回答
2
投票

我使用$many_many through functionality通过单独的数据对象进行连接。

奶昔对象从$many_many through(不正确)更改为具有“直通”对象关系的$belongs_many_many

$many_many

这是我创建复选框的方式:

class Milkshake extends DataObject {

  private static $many_many = [
    'ShowInLocale' => [
      'through' => LocaleMilkshake::class,
      'from' => 'Milkshake',
      'to' => 'Locale'
     ]
  ];

并定义了一个单独的数据对象:

$fields = parent::getCMSFields();
$showInLocaleField = CheckboxSetField::create(
  'ShowInLocale',
  'Show in these Locales',
   Locale::get()->map('ID','Title');
 );
 $fields->addFieldToTab('Root.Main', $showInLocaleField);

并将class LocaleMilkshake extends DataObject { private static $table_name = 'LocaleMilkshake'; private static $has_one = [ 'Milkshake' => 'Yard\Milkshake', 'Locale' => 'TractorCow\Fluent\Model\Locale' ]; } 关系更改为Locale

$belongs_many_many
© www.soinside.com 2019 - 2024. All rights reserved.