模板

时间:2016-06-25 06:59:31

标签: php silverstripe

我想使用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,但我有数据库中的产品。

可能有什么问题?

1 个答案:

答案 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