【问题标题】:Silverstripe looping has_many inside templateSilverstripe 在模板内循环 has_many
【发布时间】:2016-06-25 06:59:30
【问题描述】:

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

可能有什么问题?

【问题讨论】:

    标签: php silverstripe


    【解决方案1】:

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

    【讨论】:

    • 我也尝试过,但不工作。我只是想在最后添加“s”。
    • 如果我与类别有关系并且想在该循环中显示猫 ID 怎么办?
    • @Zend 我建议你为此创建一个新问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 2013-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多