Skip to main content

This site requires you to update your browser. Your browsing experience maybe affected by not having the most up to date version.

We've moved the forum!

Please use forum.silverstripe.org for any new questions (announcement).
The forum archive will stick around, but will be read only.

You can also use our Slack channel or StackOverflow to ask for help.
Check out our community overview for more options to contribute.

General Questions /

General questions about getting started with SilverStripe that don't fit in any of the categories above.

Moderators: martimiz, Sean, Ed, biapar, Willr, Ingo, swaiba

Error When Creating page with DataObject


Go to End


9 Posts   2072 Views

Avatar
MagicUK

Community Member, 60 Posts

20 July 2011 at 1:18am

Hi.

Small problem i was hoping you guys could help.

I am creating a page that lists the speakers of a specific event. I created a dataobject to hold the speakers here:

mysite/code/Speakers.php

<?php
class Speakers extends DataObject {

	static $db = array(
        'FirstName' => 'Text',
        'LastName' => 'Text',
        'Position' => 'Text',
        'Company' => 'Text',
        
        
    );
    public static $has_one = array(
	
		'SpeakerImage' => 'Image',		
   		
	);
 
    function getCMSFields_forPopup() {
        $fields = new FieldSet();
         
        $fields->push( new TextField( 'FirstName', 'First Name' ) );
        $fields->push( new TextField( 'LastName' ) );
        $fields->push( new TextField( 'Position' ) );
        $fields->push( new TextField( 'Company' ) );
        $fields->push( new ImageField('SpeakerImage') );
         
        return $fields;
    }
	

}
class Speakers_Controller extends ContentController {

	
	public static $allowed_actions = array (
	);

	public function init() {
		parent::init();

	}
}

And I want to manage the Speakers for the event here:

themes/templates/SpeakersPage.php

<?php
class SpeakersPage extends SiteTree {

	public static $db = array(
     	'RightContent' => 'HTMLText',
	
	);

	public static $has_one = array(
   		'MySpeakers' => 'Speakers',
	);
	
	    function getCMSFields() {
        $fields = parent::getCMSFields();
        
        
        $tablefield = new HasManyComplexTableField(
            $this,
            'MySpeakers',
            'Speakers',
            array(
                'FirstName' => 'First Name',
                'LastName' => 'Family Name',
                'Position' => 'Position',
                'Company' => 'Company',
                'SpeakerImage' => 'Speaker Image',
            ),
            'getCMSFields_forPopup'
        );
      
        $tablefield->setParentClass('Speakers');
        $fields->addFieldToTab( 'Root.Content.Speakers', $tablefield );
        
  
         
        $fields->addFieldToTab("Root.Content.Main", new HtmlEditorField('RightContent', 'Right Content'));
         
        return $fields;
    }
	

}
class SpeakersPage_Controller extends ContentController {

	
	public static $allowed_actions = array (
	);

	public function init() {
		parent::init();

		Requirements::themedCSS('reset');
		Requirements::themedCSS('960'); 
		Requirements::themedCSS('layout'); 
		Requirements::themedCSS('typography'); 
		Requirements::themedCSS('form');
		Requirements::javascript("js/jquery-1.6.1.min.js");
		Requirements::javascript("js/jquery.nivo.slider.pack.js");
		Requirements::javascript("js/slideshow.js");
	}
}

I get the following error when Creating the page in Dev mode:

<br />
<b>Notice</b>:  Debug::log_error_if_necessary() and Debug::log_errors_to() are deprecated. Please use SS_Log instead.
			See the class documentation in SS_Log.php for more information. in <b>/var/www/vhosts/oilcouncil.com/httpdocs/event/sapphire/dev/Debug.php</b> on line <b>486</b><br />
ERROR [User Warning]: Can't find a has_one relationship from 'Speakers' to 'SpeakersPage'
IN POST /event/admin/getitem?ID=17&ajax=1
Line 56 in /var/www/vhosts/oilcouncil.com/httpdocs/event/sapphire/forms/HasManyComplexTableField.php

Source
======
  47:  	protected $relationAutoSetting = false;
  48:  	
  49:  	function __construct($controller, $name, $sourceClass, $fieldList = null, $detailFormFields = null,
       $sourceFilter = "", $sourceSort = "", $sourceJoin = "") {
  50:  		parent::__construct($controller, $name, $sourceClass, $fieldList, $detailFormFields,
       $sourceFilter, $sourceSort, $sourceJoin);
  51:  		
  52:  		$this->Markable = true;
  53:  
  54:  		if($controllerClass = $this->controllerClass()) {
  55:  			$this->joinField = $this->getParentIdName($controllerClass, $this->sourceClass);
* 56:  			if(!$this->joinField) user_error("Can't find a has_one relationship from '$this->sourceClass' to
       '$controllerClass'", E_USER_WARNING);
  57:  		} else {
  58:  			user_error("Can't figure out the data class of $controller", E_USER_WARNING);
  59:  		}
  60:  		
  61:  	}
  62:  	

Trace
=====
<ul>user_error(Can't find a has_one relationship from 'Speakers' to 'SpeakersPage',512)
line 56 of HasManyComplexTableField.php

HasManyComplexTableField->__construct(SpeakersPage,MySpeakers,Speakers,Array,getCMSFields_forPopup)
line 29 of SpeakersPage.php

SpeakersPage->getCMSFields(CMSMain)
line 441 of CMSMain.php

CMSMain->getEditForm(17)
line 1039 of LeftAndMain.php

LeftAndMain->EditForm()
line 389 of LeftAndMain.php

LeftAndMain->getitem(SS_HTTPRequest)
line 193 of Controller.php

Controller->handleAction(SS_HTTPRequest)
line 143 of RequestHandler.php

RequestHandler->handleRequest(SS_HTTPRequest)
line 147 of Controller.php

Controller->handleRequest(SS_HTTPRequest)
line 282 of Director.php

Director::handleRequest(SS_HTTPRequest,Session)
line 125 of Director.php

Director::direct(/admin/getitem)
line 127 of main.php

</ul>

Any help would be appreciated!

Avatar
tv

Community Member, 44 Posts

20 July 2011 at 1:24am

Hey, I'm sorta new to SS, but I don't think DataObjects have a Controller, only Pages. Maybe that will get you started.

Avatar
MagicUK

Community Member, 60 Posts

20 July 2011 at 1:29am

Thanks tv. I deleted the controller but it still getting the same error. Looks like the important point in the error message is "Can't find a has_one relationship from 'Speakers' to 'SpeakersPage'"

Looks ok to me though. Am I missing something fundamental?

Avatar
MagicUK

Community Member, 60 Posts

20 July 2011 at 2:11am

OK. I think I'm on the right track here. What I need is to be able to add loads of Speakers to the Speakers Page. So Thats why I had the 'HasManyComplexTableField'

I realise now that the corresponding code in the speakersPage can't be

public static $has_one = array( 
      'MySpeakers' => 'Speakers', 
   ); 

I tried:

public static $has_many = array( 
      'MySpeakers' => 'Speakers', 
   ); 

But I still got an error? Little help?

Avatar
tv

Community Member, 44 Posts

20 July 2011 at 2:14am

Do you need to create a has_many relationship on Speakers? Or maybe reverse the relationship and have the has_one relationship to SpeakersPage on Speakers, so each Speaker has one SpeakerPage? Just a thought...

Avatar
swaiba

Forum Moderator, 1899 Posts

20 July 2011 at 2:15am

You need to reciprocate the relationship with a has_many on the Page. so...

Speakers has_one SpeakersPage
SpeakersPage has_many Speakers

(and the controller is a very valid part of a dataobject)

Avatar
MagicUK

Community Member, 60 Posts

20 July 2011 at 2:28am

Great thanks swabia. Sorry for you hasving to spoon feed me here but I tried it but I wasn't exactly sure of the syntax to refer to the speakers page in the has_one function "Speakers has_one SpeakersPage"

I tried in Speakers dataobject:

    public static $has_one = array(
		'MySpeakers' => 'Speakers',
	
);

But didn't work. Thanks, appreciate the help.

Avatar
swaiba

Forum Moderator, 1899 Posts

20 July 2011 at 2:35am

Go to Top