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.

Data Model Questions /

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

Display data on page from many_many relationships in DataObjects


Go to End
Reply


2 Posts   1431 Views

Avatar
mspacemedia

Community Member, 10 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, 10 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 !