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.

General Questions /

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

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

Using DataObject method to get a single object


Reply


6 Posts   5775 Views

Avatar
fishe

Community Member, 42 Posts

17 January 2009 at 10:34am

Edited: 17/01/2009 10:41am

I have a form which relates to a PageType called GarmentPage. When the user submits the form it sends the associated ID variable as a URL variable (/blahblah?id=x)

I have a method in my new extended userform class which is supposed to take this ID and return a data object of that particular GarmentPage page - so then on the page which displays the form I can output details from the object's variables.

Here is the code for the method in the userform controller:

class UserDefinedFormGarment_Controller extends UserDefinedForm_Controller {
   function OutputGarmentDetails() {
      $newID = $_GET['id'];
      
      return DataObject::get_one("GarmentPage", "GarmentPage.ID == $newID");
   }
}

This results in a warning "Unknown class passed as parameter". The $newID is correctly set with the ID of the corresponding GarmentPage object.

What am I doing wrong here? Is there a better way to do this?

Also, I'm not quite sure of the best way to output the object's variables in the template corresponding to the form output. I can use something like the following?...

<% control OutputGarmentDetails %>
<p>$Variable1</p>
<% end_control %>

Thanks guys!

Avatar
UncleCheese

Forum Moderator, 4096 Posts

17 January 2009 at 10:54am

Weird.. are you sure GarmentPage is a valid class? Run a db/build?flush=1 to rebuild the Manifest.

Try

return DataObject::get_by_id("GarmentPage", $newID);

Also, as a matter of good practice, you probably want to check is_numeric($newID) before you pass it along to the database. Especially if that ID is coming in through the URL. Yikes.

Avatar
Hamish

Community Member, 712 Posts

17 January 2009 at 11:10am

Also, the double equal notation is not valid SQL.

The corrected code is DataObject::get_one("GarmentPage", "GarmentPage.ID = $newID");, but it is functionally equivalent to the get_by_id notation.

Avatar
fishe

Community Member, 42 Posts

17 January 2009 at 11:45am

Thanks for the help guys. If I use this: return DataObject::get_by_id("GarmentPage", $newID);
I get the following error:
[User Error] Object::__call() Method 'forTemplate' not found in class 'GarmentPage'

However, if I use: DataObject::get_one("GarmentPage", "GarmentPage.ID = $newID");
I get the following error:
[User Error] Couldn't run query: SELECT `SiteTree_Live`.*, `GarmentPage_Live`.*, `SiteTree_Live`.ID, if(`SiteTree_Live`.ClassName,`SiteTree_Live`.ClassName,'SiteTree') AS RecordClassName FROM `SiteTree_Live` LEFT JOIN `GarmentPage_Live` ON `GarmentPage_Live`.ID = `SiteTree_Live`.ID WHERE (GarmentPage.ID = 14) AND (`SiteTree_Live`.ClassName IN ('GarmentPage')) ORDER BY Sort LIMIT 1 Unknown column 'GarmentPage.ID' in 'where clause'

Here is my GarmentPage.php:

<?php

class GarmentPage extends Page {
   
   public static $db = array(
      'GarmentName' => 'Text',
      'GarmentPrice' => 'Text',
      'GarmentSizes' => 'Text',
      'GarmentDescription' => 'Text'
   );
   
   public static $has_one = array(
      'GarmentSwatch1' => 'Image',
      'GarmentSwatch2' => 'Image',
      'GarmentSwatch3' => 'Image'
   );
   
   function getCMSFields() {
      $fields = parent::getCMSFields();
         
      $fields->addFieldToTab('Root.Content.Garment', new HeaderField('Garment 1'));   
      $fields->addFieldToTab('Root.Content.Garment', new TextField('GarmentName','Garment Name'));
      $fields->addFieldToTab('Root.Content.Garment', new TextareaField('GarmentDescription','Garment Description'));
   $fields->addFieldToTab('Root.Content.Garment', new TextField('GarmentSizes','Garment Sizes Available'));
      $fields->addFieldToTab('Root.Content.Garment', new CurrencyField('GarmentPrice','Garment Price'));
   
   $fields->addFieldToTab('Root.Content.Swatches', new ImageField('GarmentSwatch1'));
   $fields->addFieldToTab('Root.Content.Swatches', new ImageField('GarmentSwatch2'));
   $fields->addFieldToTab('Root.Content.Swatches', new ImageField('GarmentSwatch3'));
   
      return $fields;
   }
}

class GarmentPage_Controller extends Page_Controller {
}
?>

I have rebuilt the database. Could the issue be related to the file locations of the UserDefinedFormGarment.php and the GarmentPage.php? GarmentPage.php is in /mysite/code/ however UserDefinedFormGarment.php is in with the original file in /userforms/code/

Avatar
Hamish

Community Member, 712 Posts

17 January 2009 at 11:51am

Ah, ok DataObject::get_one("GarmentPage", "GarmentPage.ID = $newID"); should actually be:

DataObject::get_one("GarmentPage", "ID = $newID");

But then you should get the same error as for get_by_id

What does your template look like? You should be doing what you posted:

<% control OutputGarmentDetails %>
<p>$Variable1</p>
<% end_control %>

But from your error, it sounds like you might be doing:

$OutputGarmentDetails

Avatar
fishe

Community Member, 42 Posts

17 January 2009 at 2:29pm

Thanks Hamish!

Problem solved. But I soon realised I really need to make a custom form to do what I want. Ugh now I have issues with removing userforms and may have damaged my SS installation...see topic post in Other Modules section. I should have just left it sitting there :)