2016-06-25 58 views
2

我想使用has_many关系在模板上循环我的产品,但有些事情做错了。首先,我使用has_one创建DataObject Product并创建用于添加新产品的ModelAdmin。之后,我创建了ProductPage模型和控制器以及ProductPage模板,其中我循环了产品。Silverstripe循环has_many模板内

数据对象:

<?php 

class Product extends DataObject 
{ 
    private static $db = array(
     'Name' => 'Varchar', 
     'Description' => 'HTMLText', 
     'Price' => 'Decimal' 
    ); 

    private static $has_one = array(
     'Photo' => 'Image', 
     'ProductPage' => 'ProductPage' 
    ); 

    public function getCMSFields() 
    { 
     $fields = FieldList::create(TabSet::create('Root')); 

     $fields->addFieldsToTab('Root.Main', array(
      TextField::create('Name'), 
      HtmlEditorField::create('Opis'), 
      NumericField::create('Price'), 
      UploadField::create('Photo') 
     )); 

     return $fields; 
    } 

} 

ProductPage:

class ProductPage extends Page 
{ 
    private static $has_many = array(
     'Products' => 'Product' 
    ); 
} 

class ProductPage_Controller extends Page_Controller 
{ 

} 

模板:

<% if $Products %> 
    <% loop $Products %> 
     <div class="col-md-4"> 
      <h3>$Name</h3> 
     </div> 
    <% end_loop %> 
<% else %> 
    No product found 
<% end_if %> 

上午得到的所有时间No product found,但我对我们的产品在大tabase。

什么是问题?

回答

3

您应该在模板中使用您用于关系的名称。例如。你的关系名为RelationName,那么这就是你用来访问代码或模板中的关系的东西。

private static $has_many = array('RelationName' => 'ObjectName'); 

所以你的情况,使用Products

<% if $Products %> 
    <% loop $Products %> 
     <div class="col-md-4"> 
      <h3>$Name</h3> 
     </div> 
    <% end_loop %> 
<% else %> 
    No product found 
<% end_if %> 

你需要确保产品实际上是链接到您的产品页。只是在ModelAdmin中创建它们不会为您建立关系...我建议您使用GridField。您可以将下面的代码添加到您的ProductPage这样做:

public function getCMSFields() 
{ 
    $fields = parent::getCMSFields(); 

    $gridConfig = GridFieldConfig_RelationEditor::create(); 

    /** @var GridField $gridField */ 
    $gridField = GridField::create(
     'Products', 
     _t('ProductPage.has_many_Products', 'Products'), 
     $this->Products(), 
     $gridConfig 
    ); 

    $gridField->setModelClass('Product'); 

    $fields->addFieldToTab('Root.Main', $gridField); 

    return $fields; 
} 

如果你想通过ModelAdmin创造产品,而不是将它们链接到ProductPage,则可以跳过整个has_many关系,只是输出的所有产品中的方法ProductPage

public function Products() 
{ 
    return Product::get(); 
} 
+0

我也试过并且不工作,我只是想在末尾添加's'。 – Ivan

+0

如果我与类别有关系并在该循环中显示cat id,那么该怎么办? – Ivan

+0

@结束我建议你为此创建一个新问题 – bummzack