【问题标题】:SilverStripe data not showing in the templateSilverStripe 数据未显示在模板中
【发布时间】:2016-04-19 22:28:39
【问题描述】:

我试过了,但无法在我的数据库服务器中输出现有数据。

Page.ss(布局目录)

<div class="content-container unit size3of4 lastUnit">
    <article>
        <div>
            <% loop $LatestMyData %>
              $Data1
            <% end_loop %>
        </div>
        <div class="content">$Content</div>
    </article>
    $Form
    $CommentsForm
</div>

MyData.php(我的站点/代码目录)

class MyData extends DataObject {

    private static $db = array(
        'Data1' => 'Varchar(30)'
    );
}

class MyData_Controller extends Controller {
    public function LatestMyData($count = 1) {
        return MyData::get()
            ->limit($count);
    }   
}

我尝试使用/dev/build 构建数据库并使用?flush=all 刷新缓存,但仍然没有输出。有谁知道怎么回事?

【问题讨论】:

  • 您创建了页面吗?您如何尝试显示数据对象?查看我们的示例,您希望 MyData 成为一个页面,那么您应该从 Page 扩展 MyData 并从 Page_Controller 扩展 MyData_Controller
  • @Greg 我想做的是扩展一个 DataObject 并将其显示在页面上,这有意义吗?
  • 要在页面上显示 DataObject,您应该使用页面中的关系,例如 has_one 或 has_many。这取决于您希望成为“Data1”属性的内容。它可能是页面本身的属性。 LatestMyData 方法将在您的 Page_Controller 中与您的 Page.ss 一起使用(DataObjects 通常没有控制器,并为页面提供数据)

标签: php silverstripe


【解决方案1】:

LatestMyData 函数应该在 Page_Controller 而不是 MyData_Controller 中,因为这是页面模板将调用的控制器。

MyData 对象也需要在 CMS 中以某种方式进行控制。这可以通过 ModelAdmin 或与页面有关系的 GridField 来完成。

这是一个工作示例,展示了一种使用PageDataItem 之间的一对多关系的方法:

DataItem.php

class DataItem extends DataObject {
    private static $db = array(
        'Title' => 'Varchar(30)'
    );
    private static $has_one = array(
        'Page' => 'Page'
    );
}

Page.php

class Page extends SiteTree {
    private static $has_many = array(
        'DataItems' => 'DataItem'
    );

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

        $dataItemsField = GridField::create(
            'DataItems',
            'Data Items',
            $this->DataItems(),
            GridFieldConfig_RecordEditor::create()
        );
        $fields->addFieldToTab('Root.DataItems', $dataItemsField);

        return $fields;
    }

}

class Page_Controller extends ContentController {
    function LatestDataItems($limit = 1) {
        return $this->DataItems()->limit($limit);
    }
}

模板/布局/Page.ss

<div class="content-container unit size3of4 lastUnit">
    <article>
        <div>
        <% loop $LatestDataItems %>
            $Title
        <% end_loop %>
        </div>
        <div class="content">$Content</div>
    </article>
    $Form
    $CommentsForm
</div>

如果我们只想要第一个DataItem 对象,我们可以调用$DataItems.First 而不是我们的LatestDataItems 函数:

模板/布局/Page.ss

<div class="content-container unit size3of4 lastUnit">
    <article>
        <% if $DataItems.First %>
        <% with $DataItems.First %>
        <div>
            $Title
        </div>
        <% end_with %>
        <% end_if %>
        <div class="content">$Content</div>
    </article>
    $Form
    $CommentsForm
</div>

【讨论】:

    猜你喜欢
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2019-01-14
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    相关资源
    最近更新 更多