2016-12-07 76 views
1

我按照https://www.silverstripe.org/learn/lessons/working-with-data-relationships-has-many?ref=hub上的教程创建了一些我的主页的特色项目。但不知何故,我错过了一块,因为我得到这个错误has_many和has_one关系SilverStripe

[错误]未捕获的异常:没有HAS_ONE阶级“HomePageFeatured”发现,从“主页”,以“HomePageFeatured”的的has_many关系需要在“HomePageFeatured”

一个HAS_ONE

HomePage.php

<?php 
/** 
* Defines the HomePage page type 
*/ 

class HomePage extends Page { 
    // private static $db = array(
    //); 
    // private static $has_one = array(
    //); 

    private static $has_many = array (
     'Featured' => 'HomePageFeatured' 
    ); 

    public function getCMSFields() { 
      $fields = parent::getCMSFields(); 
      $fields->addFieldToTab('Root.Featured', GridField::create(
       'Featured', 
       'Hervorgehobene Produkte', 
       $this->Featured(), 
       GridFieldConfig_RecordEditor::create() 
      )); 

      return $fields; 
     } 

    private static $icon = "themes/hstheme/images/treeicons/home"; 
} 

class HomePage_Controller extends Page_Controller { 

} 

HomePageFeatured.php

<?php 
/** 
* Holds the featured items from the Homepage 
*/ 

class HomePageFeatured extends DataObject { 
    private static $db = array(
     'Title' => 'Varchar', 
     'Description' => 'Text' 
    ); 
    private static $has_one = array(
     'Photo' => 'Image', 
     'HomePageFeatured' => 'HomePageFeatured' 
    ); 

    public function getCMSFields() { 
     $fields = FieldList::create(
      TextField::create('Title'), 
      TextareaField::create('Description'), 
      $uploader = UploadField::create('Photo') 
     ); 

     $uploader->setFolderName('featured-photos'); 
     $uploader->getValidator()->setAllowedExtensions(array('png','gif','jpeg','jpg')); 

     return $fields; 
    } 

} 

据我所知,这个问题是由公司首页的$ HAS_ONE eFeatured.php。但它有一个来自HomePageFeatured的参考。

回答

1

HomePageFeatured需要 '主页'

class HomePageFeatured extends DataObject { 
    private static $has_one = array(
     'Photo' => 'Image', 
     'Parent' => 'HomePage', 
    ); 
} 
+0

许多感谢的HAS_ONE!教程中有一个“暗示”:“通常情况下,相互之间的这种情况只能以父类命名。”不知道是否有关键字Parent。 – suntrop

+2

@suntrop在这种情况下,'Parent''就是你的'HomePageFeatured'和你的'HomePage'之间的关系的名字。这个关系名称可以是任何东西。我建议你小心使用'Parent'作为关系的名字,因为这已经是所有'页面'上的一个关系,引用它是站点树层次结构中的父项。因此,如果您的'HomePageFeatured'扩展了'Page'而不是'DataObject',那么您可能会以'Parent''作为关系名称获得意想不到的后果。本教程建议您这样做:'private static $ has_one = ['HomePage'=>'HomePage']'。 –