has_many和has_one关系SilverStripe
问题描述:
我按照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_ONEHomePage.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的参考。
答
HomePageFeatured需要 '主页'
class HomePageFeatured extends DataObject {
private static $has_one = array(
'Photo' => 'Image',
'Parent' => 'HomePage',
);
}
许多感谢的HAS_ONE!教程中有一个“暗示”:“通常情况下,相互之间的这种情况只能以父类命名。”不知道是否有关键字Parent。 – suntrop
@suntrop在这种情况下,'Parent''就是你的'HomePageFeatured'和你的'HomePage'之间的关系的名字。这个关系名称可以是任何东西。我建议你小心使用'Parent'作为关系的名字,因为这已经是所有'页面'上的一个关系,引用它是站点树层次结构中的父项。因此,如果您的'HomePageFeatured'扩展了'Page'而不是'DataObject',那么您可能会以'Parent''作为关系名称获得意想不到的后果。本教程建议您这样做:'private static $ has_one = ['HomePage'=>'HomePage']'。 –