将 OctoberCMS 中的用户列表导出为 CSV

Posted

技术标签:

【中文标题】将 OctoberCMS 中的用户列表导出为 CSV【英文标题】:Export a list of users in OctoberCMS to CSV 【发布时间】:2020-02-05 18:14:00 【问题描述】:

我已阅读有关在 OctoberCMS 中使用导入和导出功能的教程。

但是对于rainlab-users 插件,这些指南不起作用。我也尝试安装插件vojtasvoboda-userimportexport,但它会导出所有用户,而不是过滤的用户。

class Users extends \RainLab\User\Controllers\Users


    public $implement = [
        'Backend.Behaviors.FormController',
        'Backend.Behaviors.ListController',
        'Backend.Behaviors.ImportExportController',
    ];
....

当我将此代码添加到Users.php 控制器时,我收到错误:

Class .....\User\Controllers\Users 已经使用 Backend\Behaviors\ImportExportController 进行了扩展。

当我尝试在没有上述代码的情况下导出时,出现错误:

调用未定义的方法 October\Rain\Database\QueryBuilder::export()

【问题讨论】:

【参考方案1】:

我认为这有点困难,因为我们无法访问用户插件工具栏来添加按钮。

但是是的我们可以做到,我们需要更加努力:)让我们开始

最终结果

要添加导出按钮,我们需要扩展 rainlab.user 插件。所以从你自己的插件中你需要它。


1.在插件的 Boot 方法中添加扩展代码

class Plugin extends PluginBase

    use \System\Traits\ConfigMaker; // trait to read config

    public function boot()    

      \RainLab\Users\Controllers\Users::extend(function($controller) 
          // we only extend if its not already extended with ImportExport Behavior
          if(!$controller->isClassExtendedWith('Backend.Behaviors.ImportExportController')) 

            $controller->implement[] = 'Backend.Behaviors.ImportExportController';
            // make sure you replace this path to your plugin directory
            $extensionPath = '$/hardiksatasiya/stackdemo/user_extension_files/';
            $controller->addDynamicProperty(
              'importExportConfig',
              $extensionPath . 'config_import_export.yaml'
            );
            $newListConfig = $this->makeConfig(
              '$/rainlab/user/controllers/users/config_list.yaml'
            );
            $newListConfig->toolbar['buttons'] =
              $extensionPath . '_new_list_toolbar.htm';

            $controller->listConfig = $newListConfig;
          
      );

    

    ....

2。创建文件夹和文件

在插件的根目录中创建文件夹并将其命名为user_extension_files

在那个目录里面

在内容中添加config_import_export.yaml

export:
  useList: true

在内容中添加_new_list_toolbar.htm [这将只是plugins/rainlab/user/controllers/users/_list_toolbar.htm 的副本,稍作修改]

添加Our Brand New Shiny Export button 不粘贴整个代码会太长,所以只粘贴它的片段。

<div data-control="toolbar">
    ... copied code ...

    <!-- our export button -->
    <a
        href="<?= Backend::url('rainlab/user/users/export') ?>"
        class="btn btn-primary oc-icon-sign-out">
        Export
    </a>

</div>

现在,当您点击导出按钮时,它应该会导出记录,它还会 尊重所有应用的过滤器。


@NOTE:我们正在将代码复制到_new_list_toolbar.htm,因此,如果将来用户插件正在更新并且他们决定在工具栏中添加新按钮,那么我们将无法拥有它变化。因此,那时我们只需将代码从plugins/rainlab/user/controllers/users/_list_toolbar.htm 复制并粘贴到我们的文件_new_list_toolbar.htm 中。我们又回来了:)。

如有任何疑问,请发表评论。

【讨论】:

非常感谢!对我的项目进行一些修改后,您的代码就可以工作了!【参考方案2】:

所以我实际上以与控制器不同的方式解决了此类问题。我制作了一个分离的前端管理系统。因此,网站所有者永远不必登录后端。相信我,这已经为用户避免了许多头疼和错误,因为他们会弄乱他们不应该做的事情。所以这就是我解决这个问题的方法:

    安装插件 Content Type by Sozonov Alexey

    制作一个 CMS 页面并确保它的 .csv 在 URL 的末尾。你 应该看到内容类型插件在 页面设置。您可以单独保留 html 选择,但添加 text/csv 在它的右边是你自己的。

    这是一个页面模板的示例。

    % spaceless %
    NAME,EMAIL
    % for row in csv %
     row.name , row.email 
    % endfor %
    % endspaceless %
    

    这是 CMS 页面 PHP 代码部分的外观。这可以让您对列表进行查询并根据需要进行过滤。然后,您可以检查客户端是否登录到后端或以用户身份登录,并且可能是管理员或版主。当然你可以制作一个插件和组件,然后附加到这个页面上。

    use Rainlab\User\Models\User;
    
    function onStart() 
        $users = User::all();
        $this['csv'] = $users;
    
    

旁注我使用相同的技术来创建动态 css、javascript 或 rss 提要。我也使用它来制作站点地图。

【讨论】:

@Pettis 可能是你误会了,他想要filtered list of users to be exported 不是所有的。正如他已经提到的he can export all the user。也似乎它不适用于Frontend he used plugin and plugin is for back-end - so he is talking about backed I guess @HardikSatasiya 我实际上希望你能直接回答他关于后端的问题。我会说,虽然我没有误解。我说“与控制器中的方式不同”,我还说“这可以让您对列表进行查询并根据需要进行过滤”。这是一个可行的解决方案,我说它是在前端达到的,但是哦? 是的,我有点忙,但一旦有时间,我一定会提供一些答案:),很高兴知道你没有弄错主意。我以为您将其发布为答案,所以只是指出:)

以上是关于将 OctoberCMS 中的用户列表导出为 CSV的主要内容,如果未能解决你的问题,请参考以下文章

OctoberCMS 如何使用插件扩展中的字段创建自定义用户注册表单

将 SharePoint 2007 列表/视图导出为 PDF(并通过链接下载)

如何使用获取页面树在 OctoberCMS 中获取静态页面下拉列表?

OctoberCMS 或纯 Laravel [关闭]

Liferay 列表导出

在 OctoberCMS 插件中使用 Omnipay