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.

Data Model Questions /

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

Display data on page from many_many relationships in DataObjects


Go to End


2 Posts   2252 Views

Avatar
mspacemedia

Community Member, 12 Posts

20 January 2011 at 1:11pm

I hope someone can shed some light on this for me. I have two DataObjects (Products/ProductTypes) with a many_many and belongs_many_many relationship defined between them. In my modelAdmin I can assign my Products to their respective ProductTypes. What I want to do now is display the Products based on a ProductType link (formed as /browse/by/productType - where productType is its stored URLSegment) that has been clicked on.

Products:

class Product extends DataObject
{
	static $db = array(
		'Title' => 'Varchar(255)',
		'Description' => 'HTMLText',
		'TechnicalData' => 'HTMLText',
		'Price' => 'Decimal(6,2)',
		'URLSegment' => 'Varchar(255)',
		'MetaTitle' => 'Varchar(255)'
	);

	//Set our defaults
	static $defaults = array(	
		'Title' => 'New Product',
		'URLSegment' => 'new-product'
	);
	
	static $has_one = array(
		'Image' => 'Image',
		'ProductImage' => 'Image'
	);
	
	//Relate to the category pages
	static $belongs_many_many = array(
		'Categories' => 'CategoryPage',
		'ProductTypes' => 'ProductType'
	);
	
	//Fields to show in ModelAdmin table
	static $summary_fields = array(
		'Title' => 'Title',
		'URLSegment' => 'URLSegment',
		'Price' => 'Price (£)'
	);	

	//Add an SQL index for the URLSegment
	static $indexes = array(
		"URLSegment" => true
	);	

	//Fields to search in ModelAdmin
	static $searchable_fields = array (
		'Title',
		'URLSegment',
		'Description',
		'Categories.ID' => array(
			'title' => 'Category'
		),
	      'ProductTypes.ID' => array(
      		'title' => 'ProductTypes'
      )	);

ProductType:

	static $db = array(
	'Title' => 'Varchar(255)',
	'Description' => 'HTMLText',
	'URLSegment' => 'Varchar(255)'
	);
	
	// Set Default Entries
	static $defaults = array(
	'Title' => 'New Product Type',
	'URLSegment' => 'new-product-type'
	);
	
	static $has_one = array(
	'ProductBanner' => 'Image'
	);
	
	static $many_many = array(      
      'Products' => 'Product'
      );
      
	// Fields in ModelAdmin
	static $summary_fields = array(
	'Title' => 'Title',
	'URLSegment' => 'URLSegment',
	);
	
	// Add SQL Index for URLSegment
	static $indexes = array(
	"URLSegment" => true
	);

And a browsePage to control it the links are generated in productTypes by an overriding link function:

class BrowsePage_Controller extends Page_Controller 
{
	
	static $allowed_actions = array(
		'by'
	);
	
	
	//Return the list of products for this category
	public function getProductType()
	{

		$Params = $this->getURLParams();
		$URLSegment = Convert::raw2sql($Params['ID']);
         
        if($URLSegment )
        {       
            return DataObject::get('ProductType', "URLSegment = '" . $URLSegment . "'");
        }
      }

	//Shows the Product detail page
	function by()
	{
		
		//Get the Products
		if($Products = $this->getProductType())
		{
		    $Data = array( 'Products' => $Products );
		     
		    return $this->customise($Data)->renderWith(array('BrowsePage', 'Page'));			
		}
		else 
		{
		    return $this->httpError(404, 'Sorry that product could not be found');
		}
	}

The above when <% control Products %> is called just returns the ProductType details not the associated products ?

Any ideas where this is going wrong ?

Thanks in advance.

Avatar
mspacemedia

Community Member, 12 Posts

20 January 2011 at 11:57pm

Okay,

This was fixed by ajshort on irc for me and oh how simple it is...

Two lines needed changing:

return DataObject::get('ProductType', "URLSegment = '" . $URLSegment . "'");

to

return DataObject::get_one('ProductType', "URLSegment = '" . $URLSegment . "'");

Nice and simple, then in the browsePage.ss:

<% control Products.Products %>

to return the related products across the dataobjects !!

Thank you AJShort for the answers !