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

A Page has_many another page does not show in template


Reply

3 Posts   1235 Views

Avatar
Raccoonwao

27 March 2011 at 10:50pm Community Member, 4 Posts

Hi,

This is a question involving one of the classes under ecommerce module but I think it is more like a general question about customized page relationship. So I believe better to put under General Questions.

I have created an additional relation for a PageA class to PageB class by:

class SpecialPage extend Page {

static $has_many = array(
'MyProducts' => 'Product'

);

}

where Product is the ecommerce Product class which extends Page as well.

After successfully database rebuilt and put some testing relationships, database data is updated correctly, i.e. table Product gets a new column called SpecialPageID with the corresponding page IDs. However, this is not able to be displayed in the template:

SpecialPage.ss

<% if MyProducts %>
<% control MyProducts %>

$ProductName, $Price...
($Pos / $TotalITems)

<% end_control %>
<% else %>
no products...
<% end_if %>

No matter how many Products are linked to a SpecialPage, it always shows "no products..."

It works fine if:

1. the SpecialPage has_many non-page object, or
2. the Product (which is a page) is a child page of the SpeicalPage

Am I missing something for Page-has_many-page relationship?

Any help is greatly appreciated.

Avatar
martimiz

28 March 2011 at 2:56am Forum Moderator, 1091 Posts

I've tested a similar setup where Product has_one Page and Page has_many product, and that works - providing the Product is 'Published' and has, if translatable is enabled, the same locale. So this is at least possible in certain conditions :-)

You could check by doing a ?showqueries=1 on your frontend (must be logged in and in 'dev' mode) and see what query SilverStripe comes up with.

Better yet - create a method in your SpecialPage controller that gives you a bit more control:

<% control ShowMyProducts %>
   Product name: $ProductName
<% end_control %>

public function ShowMyProducts() {
   
   $myProducts = $this->MyProducts();

   // perform some check, check $myProducts->Count() or
   // echo something to see if the function gets called at all
   // make it easy to 'spot' the correct query when ?showqueries=1

   return $myProducts;   
}

Avatar
Raccoonwao

28 March 2011 at 5:48am (Last edited: 28 March 2011 5:48am), Community Member, 4 Posts

Right, now I have overrided onAfterSave() to publish ALL products (because I don't know which products are involved). It is slow but works. Thanks alot!

   function onAfterWrite() {
      parent::onAfterWrite();
      
      $products = DataObject::get('Product');

      foreach ($products as $product) {
         $product->doPublish();
      }      
   }