Silverstripe 在模板内循环 has_many

Silverstripe looping has_many inside template

我想使用 has_many 关系在模板上循环我的产品,但有些地方做错了。首先,我使用 has_one 创建 DataObject Product 并创建 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;
    }

}

产品页面:

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 但我在数据库中有产品。

可能是什么问题?

您应该使用您在模板中用于关系的名称。例如。您将您的关系命名为 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 %>

您需要确保产品确实 linked 到您的产品页面。仅在 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 而不是 link 创建产品到 ProductPage,你可以跳过整个 has_many 关系,只输出所有产品ProductPage的方法:

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