【问题标题】:How to export all rows as CSV in ModelAdmin (SilverStripe 3.1)?如何在 ModelAdmin(SilverStripe 3.1)中将所有行导出为 CSV?
【发布时间】:2013-07-04 08:22:13
【问题描述】:

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

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

【问题讨论】:

  • 这已在 3.1.2 中修复

标签: silverstripe modeladmin


【解决方案1】:

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

例如:

class MyCustomModelAdmin extends ModelAdmin {

....

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

}

【讨论】:

    【解决方案2】:

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

    以下是所有感兴趣的人的完整课程:

    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;
        }
    }
    

    【讨论】:

    【解决方案3】:

    谢谢!

    我必须在安全管理员中为会员 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());
    
          }
    
    
     }
    

    【讨论】:

      【解决方案4】:

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

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

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

      它依赖于 PHP-Excel。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-04
        • 2016-08-31
        • 2021-04-14
        • 2017-09-30
        相关资源
        最近更新 更多