2017-03-29 9 views
2

DataObjectの2 TreeDropdownFieldsを作成中に非常に奇妙な問題に遭遇しました。何らかの理由で、SilverStripe管理者に2 TreeDropdownFieldsの1つだけが正しく表示されます。他は全くTreeDropdownFieldとしてレンダリングされませんが、ラベルと同じように:SilverStripe - TreeDropdownFieldsを2つ追加すると、1つだけが動作します

enter image description here

ここではコードです:

:ここ

class HomeBanner extends DataObject { 

    public static $db = array(
     'SortOrder' => 'Int', 
     'Title' => 'Varchar' 
    ); 

    public static $has_one = array(
     'Image' => 'Image', 
     'SecondaryImage' => 'Image', 
     'FirstLink' => 'SiteTree', 
     'SecondLink' => 'SiteTree' 
    ); 

    public function getCMSFields() { 
     $fields = parent::getCMSFields(); 
     $fields->removeFieldFromTab('Root.Main', 'PageID'); 
     $fields->removeFieldFromTab('Root.Main', 'SortOrder'); 

     $fields->addFieldToTab('Root.Main', new TreeDropdownField('FirstLinkID', 'First Link', 'SiteTree')); 
     $fields->addFieldToTab('Root.Main', new TreeDropdownField('SecondLinkID', 'Second Link', 'SiteTree')); 

     return $fields; 
    } 

    public static $summary_fields = array(
     'ID' => 'ID', 
     'Title' => 'Title', 
     'Thumbnail' => 'Thumbnail' 
    ); 

    public function getThumbnail() { 
     return $this->Image()->CMSThumbnail(); 
    } 
} 

は、私がこれまで試してみましたものです

  • 実行中dev/build/?flush=true
  • ?flush=allおよび?flush=1
  • ログアウトし、バックdev/build +は、別のブラウザ(私は一般的にChromeを使用しますが、 は、Firefoxにこのサイトの管理者にログインし、同じ問題を見て)
  • エラーで管理者にログイン
  • をフラッシュした後にログインログには何も報告しない - 彼らは明らかだ
  • 第三TreeDropdownFieldを追加するChromeの開発ツールのコンソールにエラー
  • はありませんが2最初が正しく をレンダリングできるようになりますが、3つ目はちょうど代わりにラベルが表示されますa TreeDropdownField
  • この形式は機能しますが、選択されたものは保存しません。ページを終了するとすぐに選択内容が消去されます。また、削除しない限り、既に管理者に保存されているものはすべて削除されます。変更を加えることはできません。保存されたアイテムは削除されます。):

    $ fields-> addFieldToTab( 'Root.Main'、新しいTreeDropdownField( 'SecondLink'、 'SiteTree'、 'ID ')));

これはどうして起こっているのでしょうか? TreeDropdownFieldsを複数持つことはできません。

+2

「HomeBanner」という名前は、HomePageなどを指し示すhas_oneも存在する必要があることを示唆していますか?この原因はSilverStripeがhas_oneリレーションシップの1つをバナーが属するページを指すように自動的に設定しようとしているためです。 – kinglozzer

+0

クラップス...それは実際に私が行方不明だったものです。私はそれを前に気付かなかったとは信じられない!私は数ヶ月間シルバーストライプから出て何かを忘れていたからだと思う。ありがとう! –

答えて

3

再ポストこれが答えであることが判明したとして:

名「HomeBanner」もホームページに戻る指しhas_oneのまたは類似があるべきであることを私に示唆?この原因はSilverStripeがhas_oneリレーションシップの1つをバナーが属するページを指すように自動的に設定しようとしているためです。

class Page extends SiteTree { 
    private static $has_many = [ 
     'Banners' => 'Banner' 
    ]; 
} 

class Banner extends DataObject { 
    private static $has_one = [ 
     'Page' => 'Page', 
     'LinkedPage' => 'Page' 
    ]; 
} 

SilverStripeが、それは自動移入has_many関係(GridField意志の側ににPageIDLinkedPageIDを使用する必要があるかどうか分かりませんのでこのようなコードを使用している場合

同様の競合も発生する可能性があります正しいhas_one IDを自動的に割り当てるようにしてください)。

これらの場合は、ドット表記を使用して区別できます。$has_many = ['Banners' => 'Banner.Page'];に変更します。詳細については、https://docs.silverstripe.org/en/3/developer_guides/model/relations/#has-manyを参照してください。

関連する問題