我想使用has_many
关系在模板上循环我的产品,但是我做错了。首先,我使用Product
创建DataObject has_one
并创建ModelAdmin以添加新产品。之后,我创建ProductPage模型和控制器和ProductPage模板,其中我循环产品。
数据对象:
<?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
,但我有数据库中的产品。
可能有什么问题?
答案 0 :(得分: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
关系,只需使用{{1}的方法输出所有产品}:
ProductPage