Ver Fonte

mustikas11: saldo summeerimine + CSV eksport

- views_aggregator: saldode vaadetele SUM summeerimine (deebet/kreedit kokku)
- views_data_export: /liikmed/eksport CSV eksport
- custom moodul mustikas_export: parandab CSV rea renderdamist D11-s
- Dockerfile: lisa views_aggregator + views_data_export
- LOEMIND.md: vaadete tabel + custom mooduli kirjeldus
ardo há 1 dia atrás
pai
commit
942ce59b51

+ 2 - 0
third/drupal/mustikas11/Dockerfile

@@ -8,6 +8,8 @@ RUN composer require --no-interaction \
     drupal/migrate_tools \
     drupal/migrate_upgrade \
     drupal/smtp \
+    drupal/views_aggregator \
+    drupal/views_data_export \
     && composer clear-cache
 
 # Make drush available on PATH

+ 22 - 0
third/drupal/mustikas11/LOEMIND.md

@@ -30,9 +30,31 @@ Põhineb `drupal:11` + paigaldatud:
 - `drupal/migrate_tools`
 - `drupal/migrate_upgrade`
 - `drupal/smtp`
+- `drupal/views_aggregator`
+- `drupal/views_data_export`
 
 Ehitamine: `docker compose build`
 
+## Vaated (D7 analoggid)
+
+| Path | Vaade | Sisend |
+|------|-------|--------|
+| `/liikmed`, `/liikmed/nimekiri` | `liikmed` | emal_liige nimekiri (nimi, e-mail, isikukood) |
+| `/projektid` | `projektid` | projektide nimekiri |
+| `/kanded/liikmemaksud` | `kanded` (kande_tyyp=6) | kannete tabel |
+| `/kanded/projektid` | `kanded` (kande_tyyp=8) | kannete tabel |
+| `/kanded/tegevuskulud` | `kanded` (kande_tyyp=29) | kannete tabel |
+| `/kanded/*/saldod` | `kanded` + views_aggregator SUM | summeeritud saldod |
+| `/kanded/koik-kanded` | `kanded` | kõik kanded |
+| `/synnipaevad`, `/liikmed/synnipaevad` | `synnipaevad` | emal_liige nimekiri |
+| `/docs` | `dokumendid` | filedepot_folder nimekiri |
+| `/liikmed/eksport` | `liikmed` data_export | CSV (nimed, isikukoodid, e-mailid) |
+| `/contact` | contact moodul | kontaktivorm (feedback) |
+
+Custom moodul `mustikas_export` parandab views_data_export rea renderdamist
+D11-s (fields row plugin tagastab #theme render array, mis ei serialiseeru CSV-ks).
+Asub `custom_modules/mustikas_export/` ja tuleb image'i sisse kopeerida.
+
 ## Migratsiooni jooksutamine
 
 ```bash

+ 76 - 0
third/drupal/mustikas11/add_aggregation.php

@@ -0,0 +1,76 @@
+<?php
+// Lisa kanded saldode display'dele views_aggregator SUM summeerimine.
+// Saldo = field_deebet - field_kreedit, summeeritud kõigilt ridadelt.
+use Drupal\views\Entity\View;
+
+$view = View::load('kanded');
+if (!$view) {
+  echo "kanded view puudub\n";
+  return;
+}
+
+$displays = $view->get('display');
+
+$update = [
+  'page_liikmemaksud_saldod' => ['title' => 'Liikmemaksude saldod'],
+  'page_projektid_saldod' => ['title' => 'Projektide saldod'],
+];
+
+foreach ($update as $id => $meta) {
+  if (!isset($displays[$id])) {
+    echo "skip $id (puudub)\n";
+    continue;
+  }
+  // Vaheta stiil views_aggregator'iks, summeeri deebet/kreedit.
+  $displays[$id]['display_options']['title'] = $meta['title'];
+  $displays[$id]['display_options']['style'] = [
+    'type' => 'views_aggregator_plugin_style_table',
+    'options' => [
+      'grouping' => [],
+      'columns' => [
+        'field_date' => 'field_date',
+        'field_kirjeldus' => 'field_kirjeldus',
+        'field_deebet' => 'field_deebet',
+        'field_kreedit' => 'field_kreedit',
+      ],
+      'default' => 'field_date',
+      'info' => [
+        'field_date' => [
+          'sortable' => false, 'default_sort_order' => 'asc', 'align' => '', 'separator' => '', 'empty_column' => false,
+          'has_aggr' => true, 'aggr' => ['views_aggregator_group_and_compress' => 'views_aggregator_group_and_compress'], 'aggr_par' => '',
+          'has_aggr_column' => false, 'aggr_column' => 'views_aggregator_first', 'aggr_par_column' => '',
+        ],
+        'field_kirjeldus' => [
+          'sortable' => false, 'default_sort_order' => 'asc', 'align' => '', 'separator' => '', 'empty_column' => false,
+          'has_aggr' => true, 'aggr' => ['views_aggregator_group_and_compress' => 'views_aggregator_group_and_compress'], 'aggr_par' => '',
+          'has_aggr_column' => false, 'aggr_column' => 'views_aggregator_first', 'aggr_par_column' => '',
+        ],
+        'field_deebet' => [
+          'sortable' => false, 'default_sort_order' => 'asc', 'align' => '', 'separator' => '', 'empty_column' => false,
+          'has_aggr' => false, 'aggr' => ['views_aggregator_first' => 'views_aggregator_first'], 'aggr_par' => '',
+          'has_aggr_column' => true, 'aggr_column' => 'views_aggregator_sum', 'aggr_par_column' => '',
+        ],
+        'field_kreedit' => [
+          'sortable' => false, 'default_sort_order' => 'asc', 'align' => '', 'separator' => '', 'empty_column' => false,
+          'has_aggr' => false, 'aggr' => ['views_aggregator_first' => 'views_aggregator_first'], 'aggr_par' => '',
+          'has_aggr_column' => true, 'aggr_column' => 'views_aggregator_sum', 'aggr_par_column' => '',
+        ],
+      ],
+      'column_aggregation' => [
+        'totals_per_page' => 1,
+        'totals_row_position' => [1 => 0, 2 => '2'],
+        'precision' => 2,
+      ],
+      'override' => true,
+      'caption' => '',
+      'summary' => '',
+      'description' => '',
+    ],
+  ];
+  $displays[$id]['display_options']['defaults']['style'] = false;
+  echo "uuendatud: $id\n";
+}
+
+$view->set('display', $displays);
+$view->save();
+echo "done\n";

+ 79 - 0
third/drupal/mustikas11/add_csv_export.php

@@ -0,0 +1,79 @@
+<?php
+// Loo CSV eksport liikmed vaatele (path /liikmed/eksport).
+use Drupal\views\Entity\View;
+
+$view = View::load('liikmed');
+if (!$view) {
+  echo "liikmed view puudub\n";
+  return;
+}
+
+$displays = $view->get('display');
+if (!isset($displays['data_export'])) {
+  $displays['data_export'] = [
+    'id' => 'data_export',
+    'display_title' => 'CSV eksport',
+    'display_plugin' => 'data_export',
+    'position' => 3,
+    'display_options' => [
+      'path' => 'liikmed/eksport',
+      'style' => [
+        'type' => 'data_export',
+        'options' => [
+          'formats' => ['csv' => 'csv'],
+          'csv_settings' => [
+            'delimiter' => ';',
+            'enclosure' => '"',
+            'escape_char' => '',
+            'strip_tags' => 1,
+            'trim' => 1,
+            'encoding' => 'utf8',
+            'utf8_bom' => 0,
+            'use_serializer_encode_only' => 1,
+          ],
+        ],
+      ],
+      'defaults' => ['style' => false, 'row' => false, 'fields' => false],
+      'row' => ['type' => 'fields', 'options' => ['default_field_elements' => false, 'inline' => false, 'separator' => '', 'hide_empty' => false]],
+      'fields' => [
+        'title' => [
+          'id' => 'title', 'table' => 'node_field_data', 'field' => 'title',
+          'entity_type' => 'node', 'entity_field' => 'title', 'plugin_id' => 'field',
+          'label' => 'Nimi', 'exclude' => false,
+          'alter' => ['alter_text' => false, 'text' => '', 'make_link' => false, 'path' => '', 'absolute' => false, 'external' => false, 'replace_spaces' => false, 'path_case' => 'none', 'trim_whitespace' => false, 'alt' => '', 'rel' => '', 'link_class' => '', 'prefix' => '', 'suffix' => '', 'target' => '', 'nl2br' => false, 'max_length' => 0, 'word_boundary' => true, 'ellipsis' => true, 'more_link' => false, 'more_link_text' => '', 'more_link_path' => '', 'strip_tags' => false, 'trim' => false, 'preserve_tags' => '', 'html' => false],
+          'element_type' => '', 'element_class' => '', 'element_label_type' => '', 'element_label_class' => '', 'element_label_colon' => true,
+          'element_wrapper_type' => '', 'element_wrapper_class' => '', 'element_default_classes' => true,
+          'empty' => '', 'hide_empty' => false, 'empty_zero' => false, 'hide_alter_empty' => true,
+          'click_sort_column' => 'value', 'type' => 'string', 'settings' => ['link_to_entity' => false],
+          'group_column' => 'value', 'group_columns' => [], 'group_rows' => true, 'delta_limit' => 0, 'delta_offset' => 0, 'delta_reversed' => false, 'delta_first_last' => false, 'multi_type' => 'separator', 'separator' => ', ', 'field_api_classes' => false,
+        ],
+        'field_isikukood' => [
+          'id' => 'field_isikukood', 'table' => 'node__field_isikukood', 'field' => 'field_isikukood',
+          'plugin_id' => 'field', 'label' => 'Isikukood', 'exclude' => false,
+          'alter' => ['alter_text' => false, 'text' => '', 'make_link' => false, 'path' => '', 'absolute' => false, 'external' => false, 'replace_spaces' => false, 'path_case' => 'none', 'trim_whitespace' => false, 'alt' => '', 'rel' => '', 'link_class' => '', 'prefix' => '', 'suffix' => '', 'target' => '', 'nl2br' => false, 'max_length' => 0, 'word_boundary' => true, 'ellipsis' => true, 'more_link' => false, 'more_link_text' => '', 'more_link_path' => '', 'strip_tags' => false, 'trim' => false, 'preserve_tags' => '', 'html' => false],
+          'element_type' => '', 'element_class' => '', 'element_label_type' => '', 'element_label_class' => '', 'element_label_colon' => true,
+          'element_wrapper_type' => '', 'element_wrapper_class' => '', 'element_default_classes' => true,
+          'empty' => '', 'hide_empty' => false, 'empty_zero' => false, 'hide_alter_empty' => true,
+          'click_sort_column' => 'value', 'type' => 'string', 'settings' => [],
+          'group_column' => 'value', 'group_columns' => [], 'group_rows' => true, 'delta_limit' => 0, 'delta_offset' => 0, 'delta_reversed' => false, 'delta_first_last' => false, 'multi_type' => 'separator', 'separator' => ', ', 'field_api_classes' => false,
+        ],
+        'field_e_mail' => [
+          'id' => 'field_e_mail', 'table' => 'node__field_e_mail', 'field' => 'field_e_mail',
+          'plugin_id' => 'field', 'label' => 'E-mail', 'exclude' => false,
+          'alter' => ['alter_text' => false, 'text' => '', 'make_link' => false, 'path' => '', 'absolute' => false, 'external' => false, 'replace_spaces' => false, 'path_case' => 'none', 'trim_whitespace' => false, 'alt' => '', 'rel' => '', 'link_class' => '', 'prefix' => '', 'suffix' => '', 'target' => '', 'nl2br' => false, 'max_length' => 0, 'word_boundary' => true, 'ellipsis' => true, 'more_link' => false, 'more_link_text' => '', 'more_link_path' => '', 'strip_tags' => false, 'trim' => false, 'preserve_tags' => '', 'html' => false],
+          'element_type' => '', 'element_class' => '', 'element_label_type' => '', 'element_label_class' => '', 'element_label_colon' => true,
+          'element_wrapper_type' => '', 'element_wrapper_class' => '', 'element_default_classes' => true,
+          'empty' => '', 'hide_empty' => false, 'empty_zero' => false, 'hide_alter_empty' => true,
+          'click_sort_column' => 'value', 'type' => 'basic_string', 'settings' => [],
+          'group_column' => 'value', 'group_columns' => [], 'group_rows' => true, 'delta_limit' => 0, 'delta_offset' => 0, 'delta_reversed' => false, 'delta_first_last' => false, 'multi_type' => 'separator', 'separator' => ', ', 'field_api_classes' => false,
+        ],
+      ],
+    ],
+  ];
+  $view->set('display', $displays);
+  $view->save();
+  echo "data_export display lisatud\n";
+} else {
+  echo "data_export juba olemas\n";
+}
+echo "done\n";

+ 5 - 0
third/drupal/mustikas11/custom_modules/mustikas_export/mustikas_export.info.yml

@@ -0,0 +1,5 @@
+name: 'Mustikas export'
+type: module
+description: 'Parandab views_data_export rea renderdamise D11 jaoks.'
+package: Custom
+core_version_requirement: ^11

+ 42 - 0
third/drupal/mustikas11/custom_modules/mustikas_export/mustikas_export.module

@@ -0,0 +1,42 @@
+<?php
+
+/**
+ * @file
+ * Parandab views_data_export rea renderdamise Drupal 11 jaoks.
+ */
+
+use Drupal\views\Plugin\views\row\Fields;
+use Drupal\views\ResultRow;
+use Drupal\views\ViewExecutable;
+
+/**
+ * Implements hook_views_data_export_row_alter().
+ *
+ * Drupal 11 fields row plugin render() tagastab #theme render array
+ * (sisaldab ViewExecutable objekti), mida CSV encoder ei suuda stringiks
+ * teisendada. See hook lapib rea tavalisteks skalaarväärtusteks.
+ */
+function mustikas_export_views_data_export_row_alter(&$row, ResultRow $result, ViewExecutable $view) {
+  $row_plugin = $view->rowPlugin;
+  if (!$row_plugin instanceof Fields) {
+    return;
+  }
+
+  $rendered = [];
+  foreach ($view->field as $field_id => $field) {
+    if (empty($field->options['exclude'])) {
+      $value = $field->advancedRender($result);
+      // Tavalista render array -> string.
+      if (is_array($value)) {
+        $value = (string) \Drupal::service('renderer')->renderPlain($value);
+      }
+      elseif (is_object($value) && !method_exists($value, '__toString')) {
+        $value = '';
+      }
+      $rendered[$field_id] = trim((string) $value);
+    }
+  }
+
+  // DataExport style ootab, et iga rida oleks assoc massiiv väljadest.
+  $row = $rendered;
+}