Экспорт списка пользователей в OctoberCMS в CSV - PullRequest
1 голос
/ 08 октября 2019

Я прочитал учебник по использованию функций импорта и экспорта в 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 контроллер, я получил ошибку:

Класс ..... \ User \ Controllers \ Users уже расширен с Backend \ Behaviors \ ImportExportController.

Когда я пытаюсь экспортировать без кода выше, я получил ошибку:

Вызов неопределенного метода Октябрь \ Дождь \ База данных \ QueryBuilder :: export ()

Ответы [ 2 ]

1 голос
/ 10 октября 2019

Я думаю, что это немного сложно, так как у нас нет доступа к панели инструментов плагина пользователя, чтобы добавить кнопку, чтобы.

Но ДА мы можем это сделать, нам нужно попробовать немного сложнее :)Давайте начнем

Конечный результат

enter image description here

Чтобы добавить кнопку экспорта, нам нужно Расширить rainlab.user плагин. Так что из вашего собственного плагина вам это нужно.


1. Добавление кода расширения в метод загрузки вашего плагина

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>

Теперь, когда вы нажимаете на кнопку экспорта, он должен экспортировать записи и он также будет учитывать все примененные фильтры.


@ ПРИМЕЧАНИЕ: мы копируем код в _new_list_toolbar.htm, поэтому в будущем, если плагин пользователя обновляется и он решает добавить новые кнопки на панели инструментов, тогдамы не можем этого добиться. Поэтому в это время нам просто нужно скопировать и вставить код из plugins/rainlab/user/controllers/users/_list_toolbar.htm в наш файл _new_list_toolbar.htm снова. Мы снова в деле :).

если есть сомнения, прокомментируйте.

0 голосов
/ 08 октября 2019

Так что я действительно решил что-то подобное иначе, чем в контроллере. Я делаю отделенную интерфейсную систему администратора. Таким образом, владельцы сайтов никогда не должны входить в бэкэнд. То, что мне доверяло, спасло от множества головных болей и ошибок пользователей, которые не хотят ничего делать. Вот как я решил это:

  1. Установить плагин Тип контента Автор: Созонов Алексей
  2. Создайте страницу CMS и убедитесь, что она есть. CSV в конце URL. Вы должны увидеть, что плагин типа контента добавил вкладку типа контента в настройках страницы. Вы можете оставить выбор html в одиночку, но добавьте текст / csv как свой собственный справа от него.

    enter image description here

  3. Вотпример того, как выглядит шаблон страницы.

    {% spaceless %}
    NAME,EMAIL
    {% for row in csv %}
    {{ row.name }},{{ row.email }}
    {% endfor %}
    {% endspaceless %}
    
  4. Вот как будет выглядеть раздел PHP-код страницы CMS. Это может позволить вам делать запросы в списке и фильтровать по желанию. Затем вы можете проверить, вошел ли клиент в бэкэнд или как пользователь и, возможно, является администратором или модератором. Конечно, вы можете создать плагин и компонент, а затем прикрепить его к этой странице.

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

Примечание: я использовал эту же технику для создания динамических лент css, javascript или rss. Я также делаю карту сайта, используя это.

...