Tutorials

Einige nützliche Hilfen und Code-Schnipsel, die ich immer wieder benötige und deshalb hier für alle sammle.

Zurück zur Übersicht

TYPO3: Filter in TCA Typ Group verwenden

#Tutorials#TYPO3#PHP

Neulich habe ich das erste Mal gemerkt, dass man beim TCA Typ "group" nicht die Möglichkeit hat "foreign_table_where" zu verwenden, wie beim Typ "select". Das brachte die Schwierigkeit mit sich, dass ich eine Möglichkeit gesucht habe, den Benutzer daran zu hindern bestimmte Records auszuwählen, die nicht meinen Anforderungen entsprachen. Hierfür habe ich dann die Option "Filter" benutzt.

Diese ermöglicht es einem, eine Userfunc zu übergeben, welche dann die Liste filtert. Leider ist die Dokumentation etwas spärlich und nach mehreren Versuchen habe ich letztendlich geschafft, den Filter zu bauen.

Hier das TCA

...
'product' => [
      'exclude' => 1,
      'label' => 'LLL:EXT:ar_extension/Resources/Private/Language/locallang.xlf:product',
      'config' => [
        'type' => 'group',
        'internal_type' => 'db',
        'allowed' => 'tx_arext_product',
        'foreign_table' => 'tx_arext_product',
        'filter' => [
          [
            'userFunc' => 'AR\ArExt\User\ProductFilter->doFilter',
            'parameters' => [
              // Paramter als Array, die man im Filter benutzen kann
            ]
          ]
        ],
        'size' => 1,
        'maxitems' => 1,
        'minitems' => 0
      ]
    ],
...

Hier die Userfunc

Zur Info: Das Array Parameters ist immer mindestens mit dem Key values belegt.

<?php

namespace AR\ArExt\User;

class ProductFilter {

  public function doFilter(array $parameters, $parentObject) {
    $values = $parameters['values'];
    $cleanValues = array();
    if (is_array($values)) {
      foreach ($values as $value) {
        if (empty($value)) {
          continue;
        }
        $parts = \TYPO3\CMS\Core\Utility\GeneralUtility::revExplode('_', $value, 2);
        $productUid = $parts[count($parts) - 1];
        $product = \TYPO3\CMS\Backend\Utility\BackendUtility::getRecord('tx_arext_product',$productUid);
        if ($product['type'] == 'standard') {
          $cleanValues[] = $value;
        }
      }
    }
    return $cleanValues;
  }
}

Der Filter macht nicht mehr, als alle gegebenen Records darauf zu testen, ob sie vom Typ Standard sind. Hier kann man natürlich machen, was man braucht.


Kommentare

Es gibt noch keine Kommentare. Sei der Erste!

Hinterlasse einen Kommentar

Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Kommentar wird gespeichert
Danke für deinen Kommentar! Sobald er freigegeben wurde erscheint er hier.