suntrop
suntrop

Reputation: 785

has_many and has_one relation SilverStripe

I followed the tutorial on https://www.silverstripe.org/learn/lessons/working-with-data-relationships-has-many?ref=hub to create some featured items for my homepage. But somehow I missed one piece, because I get this error

[Error] Uncaught Exception: No has_one found on class 'HomePageFeatured', the has_many relation from 'HomePage' to 'HomePageFeatured' requires a has_one on '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;
    }

}

As I understand, the problem is the $has_one from HomePageFeatured.php. But it has a reference from HomePageFeatured.

Upvotes: 1

Views: 609

Answers (1)

SilbinaryWolf
SilbinaryWolf

Reputation: 521

HomePageFeatured needs a has_one of 'HomePage'

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

Upvotes: 1

Related Questions