首页 > 解决方案 > Silverstripe 管理列排序在 price.nice 上不起作用

问题描述

Silverstripe 3.6 管理列排序在 price.nice 上不起作用。我有以下代码

 private static $summary_fields = array (
    'GridThumbnail'           => '',
    'PricePerNight.nice'      => 'Price',
    'Title'                   => 'Title',
    'Status'                  => 'Status',
    'Proptype.Title'          => 'Type',
    'Pricetype.Title'         => 'Type',
    'Bedrooms'                => 'Beds',
    'NiceDate.Nice'           => 'Updated',
    'CreatedDate'             => 'Added',
    'FeaturedOnHomepage.nice' => 'Featured?'
);

当我使用 PricePerNight.nice 时,当我删除它时,它会上下移动排序列,它允许排序列有任何想法如何解决这个问题,或者它是一个错误?基本上任何具有 .nice 的列都不会排序。

标签: phpsilverstripe

解决方案


网格字段的排序由类提供GridFieldSortableHeader。它使用查询进行排序。当您调用时,PricePerNight.nice您指的是更改来自数据库的数据Nice()的类上的方法。Currency

您可以通过调用setFieldSortingon方法来解决此问题GridFieldSortableHeader。该方法需要一个数组,其中包含您的自定义字段名和实际字段名作为要排序的值。

从代码中,我猜您正在学习 SilverStripe 课程并且您正在使用 ModelAdmin。

对于模型管理员:

public function getEditForm($id = null, $fields = null)
{
    $form = parent::getEditForm($id, $fields);

    if($gridField = $form->Fields()->dataFieldByName($this->sanitiseClassName($this->modelClass))) {
        $config = $gridField->getConfig();
        $sortableHeader = $config->getComponentByType(GridFieldSortableHeader::class);

        $sortableHeader->setFieldSorting([
            'PricePerNight.nice'      => 'PricePerNight',
            'NiceDate.Nice'           => 'NiceDate',
            'FeaturedOnHomepage.nice' => 'FeaturedOnHomepage'
        ]);
    }

    return $form;
}

对于数据对象(页面):

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

    if($gridField = $fields->dataFieldByName('Property')) { //relationname
        $config = $gridField->getConfig();
        $sortableHeader = $config->getComponentByType(GridFieldSortableHeader::class);

        $sortableHeader->setFieldSorting([
            'PricePerNight.nice' => 'PricePerNight',
            'NiceDate.Nice' => 'NiceDate',
            'FeaturedOnHomepage.nice' => 'FeaturedOnHomepage'
        ]);
    }

    return $fields;
}

推荐阅读