2016-12-07 4 views
1

Я следовал за учебником по https://www.silverstripe.org/learn/lessons/working-with-data-relationships-has-many?ref=hub, чтобы создать несколько элементов для моей домашней страницы. Но как-то я пропустил один кусок, потому что я получаю эту ошибкуhas_many и has_one relationship SilverStripe

[Error] Uncaught Исключение: Нет has_one найти на классе «HomePageFeatured», то has_many отношение от «HomePage» до «HomePageFeatured» требует HAS_ONE на «HomePageFeatured»

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 от HomePag eFeatured.php. Но у него есть ссылка от HomePageFeatured.

ответ

1

HomePageFeatured нуждается в HAS_ONE из 'HomePage'

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']'. –

Смежные вопросы