3

显然,GridFieldExportButton唯一导出当前可见的数据集(分页)。有没有办法让它从模型中导出所有行?

或者:有没有办法显示所有行(例如绕过分页),以便用户可以在显示所有行后执行导出?我不想一直显示所有行(这可能可以通过设置来实现ModelAdmin::set_page_length(<ridiculouslyHighNumber>);),而只是按需显示。

4

4 回答 4

8

您可以覆盖 ModelAdmin::getExportFields() 以定义要导出的列。该方法需要返回一个以列名为键、db 字段为值的数组。

例如:

class MyCustomModelAdmin extends ModelAdmin {

....

    public function getExportFields() {
        return array(
                    'FirstName' => 'FirstName',
                    'Surname' => 'Surname',
                    'Age' => 'Age'
        );
    }

}
于 2013-10-31T23:42:21.257 回答
5

通过创建自定义子类GridFieldExportButton并将其用于我的模型来解决它。关键是在方法中使用$gridField->getList();而不是。$gridField->getManipulatedList();generateExportFileData

这是任何感兴趣的人的完整课程:

class GridFieldExportAllButton extends GridFieldExportButton {
    /**
     * Generate export fields for CSV.
     *
     * @param GridField $gridField
     * @return array
     */
    public function generateExportFileData($gridField) {
        $separator = $this->csvSeparator;
        $csvColumns = ($this->exportColumns)
            ? $this->exportColumns
            : singleton($gridField->getModelClass())->summaryFields();
        $fileData = '';
        $columnData = array();
        $fieldItems = new ArrayList();

        if($this->csvHasHeader) {
            $headers = array();

            // determine the CSV headers. If a field is callable (e.g. anonymous function) then use the
            // source name as the header instead
            foreach($csvColumns as $columnSource => $columnHeader) {
                $headers[] = (!is_string($columnHeader) && is_callable($columnHeader)) ? $columnSource : $columnHeader;
            }

            $fileData .= "\"" . implode("\"{$separator}\"", array_values($headers)) . "\"";
            $fileData .= "\n";
        }

        $items = $gridField->getList();

        foreach($items as $item) {
            $columnData = array();
            foreach($csvColumns as $columnSource => $columnHeader) {
                if(!is_string($columnHeader) && is_callable($columnHeader)) {
                    if($item->hasMethod($columnSource)) {
                        $relObj = $item->{$columnSource}();
                    } else {
                        $relObj = $item->relObject($columnSource);
                    }

                    $value = $columnHeader($relObj);
                } else {
                    $value = $gridField->getDataFieldValue($item, $columnSource);
                }

                $value = str_replace(array("\r", "\n"), "\n", $value);
                $columnData[] = '"' . str_replace('"', '\"', $value) . '"';
            }
            $fileData .= implode($separator, $columnData);
            $fileData .= "\n";

            $item->destroy();
        }

        return $fileData;
    }
}
于 2013-07-06T13:36:41.937 回答
0

谢谢你!

我必须在安全管理员中为成员 GF 使用它。

为任何感兴趣的人创建了一个扩展。

class SecurityAdminExtension extends Extension{


      function updateEditForm($form){

          $gf = $form->Fields()->fieldByName('Root.Users.Members');
          $gfConfig = $gf->getConfig();
          $gfConfig->removeComponentsByType('GridFieldExportButton');
          $gfConfig->addComponent(new GridFieldExportAllButton());

      }


 }
于 2013-10-08T21:43:15.613 回答
-1

回来的时候,我创建了一个小插件,可以轻松地将 DataObjects 导出为 CSV 或 Excel 文件。

https://github.com/firebrandhq/excel-export

它带有一个可以添加到网格字段的按钮。

它依赖于 PHP-Excel。

于 2016-05-21T05:38:36.183 回答