Bidirektionale MM-Relation in Typo3 (ab Version 6.2). Feld wird nicht gespeichert, Feld bleibt leer. uid_local und uid_foreign vertauscht.

Problem: Man hat eine MM-Tabelle in Typo3 angelegt, z.B. um eine Verbindung zwischen den Tabellen „Firma“ und „Mitarbeiter“ zu schaffen. Beim Bearbeiten eines Datensatzes „Firma“ möchte man Mitarbeiter auswählen können. Anders herum (bidirektional) soll man beim Öffnen eines Datensatzes „Mitarbeiter“ sehen können, welchen Firmen er zugeordnet wurde und auch von dieser Seite aus die MM-Relation bearbeiten können. Man kann die MM-Relation also von beiden Seiten aus (bidirectional) bearbeiten.

Vorab: Ich habe sie alle probiert. Alle Tutorials die bei Google auftauchen, z.B.
http://de.kimpixel.wikia.com/wiki/TCA_Beispiele
http://blog.undkonsorten.com/datenbankrelationen-typo3-irre-extension
http://www.andreas-buergel.com/kb/typo3/typo3-mm-relation-beidseitig-in-extension.html
http://www.typo3tiger.de/blog/post/typo3-bidirektionale-mm-relation-tca-extbase.html
… und sie haben alle nicht funktioniert. Am Ende scheiterte es immer daran, dass beim Einfügen folgender Zeile ins TCA

'MM_opposite_field' => 'xxx'

keine Relationen mehr im dem bidirektionalen Datensatz gespeichert wurden. Das Feld blieb einfach leer. Wenn ich dagegen die Zeile auskommentiert hatte, wurden die uid_foreign und uid_local in der MM-Tabelle vertauscht.

Für Suchmaschinen: Typo3 bidirectional m:m relationship not working. Problem birdirektionale mm-Relation extbase. Bidrektionale MM-Relation Problem Feld wird nicht gespeichert. uid_local uid_foreign vertauscht. MM_opposite_field funktioniert nicht. MM-Datensätze beidseitig bearbeiten. uk Datenbank Tutorial Fehler. t3uk_db_tutorial für Typo3 6.2.

Lösung (Kurzversion)

:
1. Im TCA muss (neben dem Feld MM_opposite_field) zwingend die Einstellung ‚multiple‘ => ‚1‘ gesetzt werden

'multiple' => 1

2. In der MM-Tabelle muss es ein Feld für sorting_foreign geben:

sorting_foreign int(11) DEFAULT '0' NOT NULL

Lösung (Langversion und Beispiel)

Die entscheidenden Felder in der Tabelle ext_tables.sql:

#
# Die MM-Tabelle 'tx_beispiel_mitarbeiter_firma_mm'
#
CREATE TABLE tx_beispiel_mitarbeiter_firma_mm (
  uid_local int(11) DEFAULT '0' NOT NULL,
  uid_foreign int(11) DEFAULT '0' NOT NULL,
  tablenames varchar(30) DEFAULT '' NOT NULL,
  sorting int(11) DEFAULT '0' NOT NULL,
  sorting_foreign int(11) DEFAULT '0' NOT NULL,
  KEY uid_local (uid_local),
  KEY uid_foreign (uid_foreign)
);

#
# Die Tabelle für die Firmen
#
CREATE TABLE tx_beispiel_firma (
   ...
   mitarbeiter tinyint(1) DEFAULT '1' NOT NULL,
   ...
);

#
# Die Tabelle für die Mitarbeiter
#
CREATE TABLE tx_beispiel_mitarbeiter (
   ...
   firmen tinyint(1) DEFAULT '1' NOT NULL,
   ...
);

Die Feld-Definitionen im TCA für die Tabelle der Firma (tx_beispiel_firma). Hier ist entscheidend, dass ‚multiple‘ => 1 gesetzt ist:

'mitarbeiter' => array(
   'label'   => 'Mitarbeiter',
   'config' => array(
      'type' => 'select',            
      'size' => 10,
      'maxitems' => 9999,
      'autoSizeMax' => 10,
      'foreign_table' => 'fe_users',
      'multiple' => 1,
      'MM' => 'tx_beispiel_mitarbeiter_firma_mm',
   )
),

Die Feld-Definitionen im TCA für die Tabelle der Mitarbeiter (tx_beispiel_mitarbeiter). Hier ist entscheidend, dass ‚multiple‘ => 1 und ‚MM_opposite_field‘ => ‚mitarbeiter‘ gesetzt ist. ‚mitarbeiter‘ ist dabei der „gegenüberliegende“ Feld-Name in der Tabelle tx_beispiel_firma.

'firmen' => Array (
   'label' => 'Firmen',
   'config' => array(
      'type' => 'select',
      'size' => 10,
      'maxitems' => 9999,
      'multiple' => 1,
      'foreign_table' => 'tx_beispiel_firma',
      'MM' => 'tx_beispiel_mitarbeiter_firma_mm',
      'MM_opposite_field' => 'mitarbeiter',
   )
),

composer auf HostEurope Server installieren

So kann man composer auf einem HostEurope WebServer (hier: Dedicated WebServer Managed) installieren.

  1. Verzeichnis anlegen, z.B. „scripts“
  2. per SSH ins Verzeichnis wechseln
  3. curl -sS https://getcomposer.org/installer | php -d suhosin.executor.include.whitelist=phar
  4. Ins Verzeichnis wechseln, in welches das Alias genutzt werden soll
  5. alias composer=’php -d suhosin.executor.include.whitelist=phar,http://,https:// /is/htdocs/wp_xxx_xxx/scripts/composer/composer.phar‘ aufrufen (Pfad zum Verzeichnis entsprechend anpassen!)
  6. Alternativ (für PHP 5.6 bei HostEurope) alias composer=’php5.6 -d allow_url_fopen=1 -d suhosin.executor.include.whitelist=phar,http://,https:// /is/htdocs/wp_xxx_xxx/scripts/composer/composer.phar‘

Danach sollte composer über den Terminal normal aufrufbar sein, z.B. „composer require omnipay/omnipay:~2.0“

Konvertieren von Indesign-Dokumenten zu Photoshop mit Ebenen und editierbarem Text

Konvertieren von Indesign zu Photoshop

Für Suchmaschinen: Konvertieren von Indesign zu Photoshop. Indesign Texte als editierbare Texte in Photoshop kopieren. Indesign Ebenen zu Photoshop Ebenen. Convert Indesign layers to Photoshop layers. Indesign in Photoshop öffnen. Indesign kopieren von Textformaten in Photoshop. Exportieren aller InDesign Elemente als getrennte Ebenen in Photoshop. Convert Adobe InDesign Layers to Photoshop and keep text editable. indesign zu photoshop exportieren. Indesign Ebenen zu Photoshop exportieren. Indesign typesheet erstellen mit Übersicht aller Schriften in einem Dokument. Übersicht aller Schriften in InDesign Datei erstellen.

InDesign für Web- und App-Design?

In Zeiten der vektorbasierten SVGs und responsiven Webdesigns kommt es immer öfter vor, dass Designer für Ihre Layouts von Web + App nach InDesign oder Illustrator greifen.

Layout in diesen Programmen hat gegenüber Photoshop viele Vorteile:

  • Der Export zu SVGs ist möglich
  • Die Vektor-Funktionen sind schneller und leichter zu handhaben
  • Mehrere Objekte können auf einer Ebene sein – das Dokument bleibt deutlich übersichtlicher als eine PSD
  • Texte lassen sich schneller formatieren
  • Stilvorlagen, Absatzformate und Objektformate beschleunigen massiv die Arbeit
  • Mehrere Seiten innerhalb eines Dokumentes sind möglich

Dumm nur, wenn man 215 Seiten in InDesign gelayoutet hat und die Produktionsfirma oder Programmierer – aus welchen irrationalen Gründen auch immer – auf Photoshop-Dokumente mit Ebenen bestehen.

Nach einigen Recherchen im Netz haben wir keine wirklich brauchbare Lösung gefunden, die Elemente aus InDesign in Photoshop zu kopieren oder exportieren. Die perfekte Lösung wäre:

  • Es wird automatisch ein PSD Dokument erstellt mit den gleichen Pixelmaßen wie in InDesign
  • Beim Exportieren kann man selbst entscheiden, wann Elemente zu einem Smartobject gruppiert werden – oder auf seperaten Ebenen landen
  • Die Elemente werden pixelgenau platziert
  • Texte bleiben editierbar
  • Textformatierungen innerhalb eines Textabschnitts werden mit übernommen

Statt alles in einem Skript abzufertigen, haben wir uns für die Aufteilung in einzelne Teilfunktionen entschieden. Es sind zwar ein paar Klicks mehr – dafür hat man aber auch das Ergebnis besser unter Kontrolle und kann direkt in InDesign entscheiden, welche Elemente später in Photoshop als Gruppe / Smartobjekt und welche auf einer eigenen Ebene landen sollen.

Download

Paket mit allen nötigen Scripten downloaden

Installation (Mac)

1. Paket mit allen nötigen Scripten downloaden und Ordner entpacken.
2. Die Distiller Voreinstellung ExportToPS_bleedmarks durch Doppelklick installieren oder in den Ordner /Users/[NAME]/Library/Application Support/Adobe/Adobe PDF kopieren.
3. Alle jsx-Dateien aus dem Ordner scripts nach /Programme/Adobe InDesign CS6/Scripts/Scripts Panel kopieren
4. Den Ordner xtools nach /Programme/Adobe Photoshop CS6/ kopieren.

Tools nutzen

1. Indesign und Photoshop öffnen.
2. In InDesign das Skripte-Fenster öffnen unter Fenster -> Hilfsprogramme -> Skripte. Darin gibt es einen Ordner „Anwendung“ in dem die neuen jsx-Dateien auftauchen sollten. Falls nicht, InDesign neu starten.
3. InDesign-Datei öffnen. Darauf achten, dass InDesign als Farbraum sRGB und bei den Maßeinheiten überall auf Pixel steht.

Beschreibung der Tools

00 – Neues leeres PSD erstellt einfach ein leeres, neues PSD mit den gleichen Maßen wir das InDesign.
01 – Neues PSD mit Vorschau wie oben, zusätzlich wird eine Ebene mit Vorschau des InDesign-Dokumentes angelegt. Dient als Positionierungshilfe, falls etwas schief geht.
02 – Auswahl -> getrennte PSD Ebenen Macht aus jedem augewählten Objekt in InDesign eine eigene Photoshop-Ebene mit einem Smartobject.
03 – Auswahl -> eine PSD Ebene wie 02, aber die einzelnen Elemente werden zu einem Smartobject verschmolzen
04 – Text -> PSD Textfelder Konvertiert die Textfelder aus InDesign zu editierbaren Photoshop Textebenen
05 – Auswahl -> einzelne PDF, SVG, PNG Konvertiert jedes ausgewählte Element in InDesign zu einem eigenen PDF, SVG und PNG mit den Maßen des jeweiligen Elementes zzgl. etwas Platz (5 px) am Rand. Der Abstand kann in der JavaScript Datei sehr leicht angepasst werden.
06 – Elemente auf ganze Pixelwerte Bringt die ausgewählten Objekte auf exakte, gerundete Pixelwerte.
07 – TypeSheet erstellt ein neues InDesign-Dokument mit einer Übersicht aller verwendeten Schriften des Quell-Dokumentes. Legt eine neue Ebene im Quelldokument an und beschriftet die Textfelder mit Etiketten um die Schriften leichter zuordnen zu können.

Danke

Keine falschen Lorbeeren! Die Hälfte der Skripten ist aus dem Netz zusammengesucht und neu aufgemischt bzw. erweitert oder gefixed. Danke an die Community dafür!
https://www.oss-usa.com/blog/exporting-indesign-photoshop
https://github.com/fabiantheblind/extendscript/wiki/Pages-And-Margins
http://jongware.mit.edu/idcs4js/pc_DocumentPreference.html
http://www.adobe.com/content/dam/Adobe/en/devnet/indesign/cs5_docs/indesign_scripting/guide-en-US/InDesignCS5_ScriptingGuide_JS.pdf
https://forums.adobe.com/thread/456608

Extbase/Fluid ViewHelper für TCA Tabellen-Wizard (tablewizard) in eigener Extension nutzen

Problem: Man möchte in einer eigenen Extension den Tabellen-Wizard für ein TCA-Feld nutzen und diese dann per css_styled_content in einem Fluid-Template ausgeben lassen. Leider konnte ich keinen ViewHelper dafür finden und auch die ersten Verdächtigen z.B. über so etwas wie f:format.html parseFuncTSPath =“tt_content.table.20″ scheiterten.

Für Suchmaschinen: tca tablewizard viewhelper für tabellen. Eigener ViewHelper für tablewizard Daten Typo3. Parse tablewizard data in fluid template. tablewizard String in Tabelle konvertieren in eigener Extension. Tabellendaten in Typo3 Fluid ViewHelper umwandeln. Konvertieren von Daten aus dem Tabellen-Assistenten für Typo3. tablewizard in eigener Extension nutzen und in Fluid per css_styled_content parsen lassen.

Table-Wizard im TCA nutzen
Dazu nutzt man im TCA das Script wizard_table.php:

'tabellen_daten_feld' => array(
   'label' => 'Lebenslauf',
   'l10n_mode' => 'mergeIfNotBlank',
   'config' => array (
      'type' => 'text',
      'cols' => '30',   
      'rows' => '5',
      'default' => '',
      'wizards' => array(
         '_PADDING' => 2,
         'list' => Array(
            'notNewRecords' => 1, 
            'type' => 'script',
            'title' => 'Table wizard',
            'icon' => 'wizard_table.gif',
            'script' => 'wizard_table.php',
            // So kann die Option "kleine Felder" automatisch deaktiviert werden
            // 'script' => 'wizard_table.php?TABLE[textFields]=0',
            'params' => array(
               'xmlOutput' => 0
            )
         ),
      ),
   ),
),

ViewHelper für das Rendern der Tabelle
Der ViewHelper nutzt css_styled_content um die per Zeilenumbruch und mit dem Pipe-Symbol (|) getrennte Spalten und Zeilen in eine Tabelle umzuwandeln.

registerArgument('table', 'string', 'Die Tabellen-Daten, Delimiter ist das Pipe-Symbol', false, null);
      $this->registerArgument('layout', 'string', 'Die Zahl, die an der Klasse contenttable-XX erscheint', false, null);
   }

    /**
     * Rendert die Tabelle mit csc_styled_content
     */

    public function render() {

      if (!$this->arguments['table']) {
         $this->arguments['table'] = html_entity_decode($this->renderChildren());
      }
      
      $this->cscController->cObj = $this->configurationManager->getContentObject();
      $this->cscController->cObj->data = $this->arguments;

      return $this->cscController->render_table( null, array('field'=>'table') );
      
      
    }
}
?>

Der ViewHelper kann so eingesetzt werden:
Dabei kann unter „layout“ eine Zahl angegeben werden, die bei an der Tabelle als z.B. class=“contenttable-2″ erscheint.

{namespace VH=Pfad\ZuDeinen\ViewHelpers}

{tabellen_daten_feld}



{VH:table(layout:2,table:tabellen_daten_feld)}

Multiple YouTube Videos auf Seite in iFrame andere anhalten / stoppen

Problem: Man hat auf einer Seite mehrere YouTube Videos als iFrame eingebunden. Die Videos lassen sich aber parallel starten und dadurch laufen alle Videos gleichzeitig. Dieses Script stoppt alle anderen Videos auf der Seite automatisch, wenn eines der Videos gestartet wird:

Für Suchmaschinen: youtube alle videos stoppen wenn ein video startet, stop all iframes youtube videos when one video starts. Andere Videos anhalten, wenn ein Video läuft. Automatisch alle YouTube Filme anhalten wenn neues Video play gedrückt wird. Immer nur ein Video abspielen in YouTube iFrame auch wenn mehrere Videos auf der gleichen Seite eingebunden wurden.

(function ($) {
   $(function () {

      var tag = document.createElement('script');
      tag.src = "https://www.youtube.com/iframe_api";
      tag.type='text/javascript';
      $('body').append(tag);
   
      $('iframe[src*="youtube"]').each(function(){
         var $me = $(this);
         var src = $me.attr('src');
         if (src.indexOf('enablejsapi=1') == -1) {
            $me.attr({src: src + (src.indexOf('?') == -1 ? '?' : '&') + 'enablejsapi=1'});
         }
      });
   
      window.onYouTubeIframeAPIReady = function () {
   
         var playerCurrentlyPlaying = null;
         var player_cnt = 0;
         
         $('iframe[src*="youtube"]').each(function(){
            
            var $me = $(this);
            var player_id = $me.attr("id");
            
            if (!player_id) {
               player_id = "ytpl-"+(player_cnt++);
               $me.attr({id:player_id});
            }
            
            var player = new YT.Player( player_id, { 
               events: {   
                  'onReady': function () {},
                  'onStateChange': function (event) {
         
                     if (event.data == YT.PlayerState.PLAYING) { 
                        if (playerCurrentlyPlaying && playerCurrentlyPlaying != $me.data().player) {
                           playerCurrentlyPlaying.pauseVideo();
                        }
                        playerCurrentlyPlaying = $me.data().player;
                     }         
                  }
               }   
            });
            
            $me.data({player:player});
         });   
      }
   
   });
})(jQuery);

Crop Images in Typo3 Backend. Bildausschnitt im Typo3 Backend. Bilder beschneiden im Backend.

 


Die Sache mit dem Ausschnitt

Typo3 bietet in Fluid einen wunderbaren ViewHelper, um Bilder zu verkleinern und beschneiden. Allerdings führt der Anschnitt eines Bildes – je nach Endformat – immer wieder zu unschönen Ausschnitten. Dieses Fluid-Template…





… sieht im Hochformat noch gut aus, allerdings wäre es beim Querformat besser, wenn der Bildaussschnitt weiter oben wäre:


 


Der c-Minus-Parameter

Klar: Dazu gibt es einen Parameter, den man hinter das „c“ hängen kann. „200c-100“ bedeutet: Beschneide das Bild auf eine Höhe von 200px und nimm den Bild-Ausschnitt von der oberen Kante. Um das Bild von unten anzuschneiden wäre es „200c+100“. So sieht es dann im Fluid aus…





… und das Ergebnis ist deutlich besser:

 


Der klassische Workaround

Um das Problem in den Griff zu bekommen ist der häufigste Weg: Innerhalb einer Extension getrennte Datei-Upload-Felder für verschiedene Bildformate. Dadurch kann z.B. das quadratische Bild der ListView einen anderen Bildausschnitt haben als das Bild in der SingleView. Unschön ist daran aber, dass man viele redundante Kopien eines Bildes auf dem Server liegen hat und im Fluid den Fallback von einem Format auf ein anderes relativ umständlich umsetzen muss, abhängig davon in welche Felder Bilder hochgeladen wurden.

 


Eine Extension muss her

Allerdings macht das in der Praxis wenig Sinn, weil man sich meistens in einer ListView mit vielen Bildern befindet, bei dem es schwer wird, eine Einstellung zu finden, die für alle Bilder gleich gut geeignet ist. Besser wäre es, wenn man den Bildausschnitt individuell im Backend von Typo3 bestimmen könnte. Hierzu haben wir eine Extension entwickelt (t3pimper).

Nach dem Upload eines Bildes im FAL erscheinen Masken in verschiedenen Formaten, mit denen man für das Bild den optimalen Bildausschnitt angeben kann:

Das erste Feld „Standard“ ist der allgemeine Anschnitt des Bildes. Der Rahmen kann hier frei gesetzt werden. Damit können z.B. störende Ränder oder optische Geräusche aus dem Bild abgeschnitten werden. Die anderen Formate sind in den Proportionen von der Höhe / Breite festgelegt. Man gibt die gewünschten Ausschnitte einfach per Drag & Drop wie beim Beschneidungswerkzeug in Photoshop an:

Danach kann man im ImageViewHelper komplett auf die Angabe des c-Minus-Parameters verzichten. Man gibt einfach die gewünschte Höhe und Breite des Bildes an. Da die Extension den Standard Fluid Typo3-Image-ViewHelper und Uri.Image-ViewHelper manipuliert, wird die Einstellung für den Bildausschnitt für jedes Bild individuell ermittelt. Das macht es sehr einfach und flexibel…





… ergibt genau die Bildausschnitte, die im Backend festgelegt wurden:

Die Formate für die Beschneidungsrahmen im Backend können bequem per TypoScript-Setup festgelegt werden. Es können beliebig viele Formate angegeben werden – was aber gar nicht nötig ist, wie man gleich sehen wird:

config.t3pimper.imgvariants {
  presets {
    default {
      label = Standard  
    }
    
    square {
      label = Quadrat
      aspectratio = 1:1
    }
    
    landscape {
      label = Querformat
      aspectratio = 2:1
    }
  
    portrait {
      label = Hochformat
      aspectratio = 1:2
    }
  }
}

 


Intelligentes Interpolieren der Formate

Der neue ImageViewHelper vergleicht alle im Backend angegebenen Rahmen und Beschneidungs-Formate mit der in Fluid angegebenen Breite und Höhe. Er entscheidet nicht nur, welcher Ausschnitt am Besten geeignet ist sondern interpoliert auch zwischen den Formaten. Dadurch sind die Bildausschnitte auch für alle Zwischengrößen perfekt:

 


Wo gibt es die Extension?

Die Extension ist zur Zeit noch als „Experimental“ gekennzeichnet. Falls Sie Interesse haben, die Extension auszuprobieren, melden Sie sich einfach bei uns!

FAL Bild im Backend umrechnen, Thumbnail in Extension erzeugen

In vielen Beispielen im Internet findet man Beispiele, wie durch ein TypoScript-Array zusammen mit einem selbst instanziierten cObject ein Bild innerhalb einer Extension generiert werden kann. Das Ganze geht aber seit Typo3 6.2 einfacher: Beispiel, wie man innerhalb einer extbase-Extension, z.B. im Controller, ein Thumbnail von einem File Abstract Layer (FAL) erzeugen kann.


$fileRepo = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('\TYPO3\CMS\Core\Resource\FileRepository');
$file = $fileRepo->findFileReferenceByUid($row['uid']);
$filename = $file->getPublicUrl();

$image = $this->imageService->getImage($filename, null, false);
$processingInstructions = array(
  'maxWidth' => 400,
  'maxHeight' => 200,
);

$processedImage = $this->imageService->applyProcessingInstructions($image, $processingInstructions);
$imageUri = $this->imageService->getImageUri($processedImage);

Typo3 FAL (file abstract layer) Tabelle sys_file_reference um eigenes Feld erweitern

Möchte man ein eigenes Feld zu der Tabelle sys_file_reference hinzufügen, macht man dazu am Besten eine kleine Extension. Die entscheidenden Stellen sind:

Datei: ext_tables.sql

CREATE TABLE sys_file_reference (
   gallerysize varchar(15) DEFAULT '' NOT NULL
);

Datei: /Configuration/Overrides/sys_file_reference.php

 array (
      'exclude' => 0,
      'label' => 'Bildgröße (in Gallerien)',
      'config' => array (
         'type' => 'select',
         'items' => array (
            array('', ''),
            array('mittel', '10'),
            array('gross', '20'),
         ),
         'size' => 1,
         'maxitems' => 1,
      )
   ),
);

\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTCAcolumns(
   'sys_file_reference',
   $temporaryColumns
);
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addToAllTCAtypes(
   'sys_file_reference',
   'gallerysize',
   '',
   'before:title'
);

\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addFieldsToPalette(
   'sys_file_reference', 'imageoverlayPalette', 'gallerysize', 'before:crop'
);

Datei: Typoscript setup.txt

config.tx_extbase.persistence.classes{
   TYPO3\CMS\Extbase\Domain\Model\FileReference {
      subclasses {
         0 = Nng\Nnhansi\Domain\Model\FileReference
      }
   }
   Nng\Nnhansi\Domain\Model\FileReference {
      mapping {
         tableName = sys_file_reference
      }
   }
}

Datei: Classes/Domain/Model/FileReference.php

gallerysize;
   }

   /**
    * Sets the gallerysize
    *
    * @param string $gallerysize
    * @return void
    */
   public function setGallerysize($gallerysize) {
      $this->gallerysize = $gallerysize;
   }
   

}

Datei: Fluid Template


{file.referenceProperties.gallerysize}

t3pimper – Kurzdoku

Link zum GIT-Repo der Extension:
https://github.com/99grad/TYPO3.Extbase.t3pimper


Styling der Headlines

 

[1] Hinzufügen von Farben

Die Farbe erscheint als class=“col-xx“ an dem H-Tag. „xx“ ist dabei der Key im Typoscript. Mit removeItems, altLabels und addItems kann das Dropdown geändert werden:

# kommt ins root_page.ts
TCEFORM.tt_content.tx_t3pimper_headercolor {
   removeItems = 2,3,4,5,6
   altLabels {
      1 = Umbra
   }
   addItems {
      10 = apeshit-brown
   }
}

[2] Hinzufügen von Headline-Typen (h1-h6)

Neue Typen können mit addItems hinzugefügt werden. Die Nummer der Headline bestimmt dabei die Hierarchie und Klasse. „31“ wird z.B. zu einer h3 mit der Klasse „h-31“, „44“ wäre h4 mit class=“44″ etc. Eine weitere Formatierung im TS-Setup (lib.stdheader.10…) entfällt.

# kommt ins root_page.ts
TCEFORM.tt_content.header_layout.altLabels {
    2 = mittelgroß (h2)
    3 = klein (h3)
    4 = sehr klein (h4)
}
TCEFORM.tt_content.header_layout.addItems {
    31 = klein, zwo
}

[3] Hinzufügen von Schmuck

Der Schmuck erscheint als class=“deco-xx“ an dem H-Tag. „xx“ ist dabei der Key im Typoscript. Mit removeItems, altLabels und addItems kann das Dropdown geändert werden:

# kommt ins root_page.ts
TCEFORM.tt_content.tx_t3pimper_headerdeco {
   removeItems = 2,3,4,5
   altLabels {
      1 = Line drunter
   }
   addItems {
      10 = Super!
   }
}

Styling Rahmen / Layout

 

[1] Hinzufügen/Ändern von Layout-Optionen

Das Layout erscheint als class=“layout-xx“ an dem Inhaltselement-DIV. „xx“ ist dabei der Key im Typoscript:

# kommt ins root_page.ts
TCEFORM.tt_content.layout {
   removeItems = 2,3,4,5,6
   altLabels {
      1 = Kleinere Schrift
   }
   addItems {
      10 = Größer Zoomen
   }
}

[2] Hinzufügen/Ändern von Rahmen/Einrückungen-Optionen

Der gewählte Rahmen erscheint als class=“rahmen-xx“ an dem Inhaltselement-DIV. „xx“ ist dabei der Key im Typoscript:

# kommt ins root_page.ts
TCEFORM.tt_content.section_frame {
   removeItems = 1,5,6,10,11,12,20,21
   addItems {
      100 = Grauer Hintergrund
      101 = Blaue Blumen
   }
}

[3] Hinzufügen/Ändern von „Abstand zum Rand“

Der „Abstand zum Rand“ erscheint als class=“marg-xx“ an dem Inhaltselement-DIV. „xx“ ist dabei der Key im Typoscript.

# kommt ins root_page.ts
TCEFORM.tt_content.tx_t3pimper_margin {
   # So kann man das Dropdown komplett ausblenden:
   # disabled = 1
   removeItems = 2,3,4,5,6
   altLabels {
      1 = viel Abstand
   }
   addItems {
      10 = super viel Abstand
   }
}

Typo3 extBase Validatoren in eigener Extension nutzen

Der Typo3 Core bietet in Version 6 eine ganze Reihe von Validatoren, die z.B. zur Formularüberprüfung verwendet werden können. Eine genaue Dokumentation findet man auf dieser Seite.

\TYPO3\CMS\Extbase\Validation\Validator\AlphanumericValidator 
\TYPO3\CMS\Extbase\Validation\Validator\ConjunctionValidator 
\TYPO3\CMS\Extbase\Validation\Validator\DateTimeValidator 
\TYPO3\CMS\Extbase\Validation\Validator\DisjunctionValidator 
\TYPO3\CMS\Extbase\Validation\Validator\EmailAddressValidator 
\TYPO3\CMS\Extbase\Validation\Validator\FloatValidator 
\TYPO3\CMS\Extbase\Validation\Validator\GenericObjectValidator 
\TYPO3\CMS\Extbase\Validation\Validator\IntegerValidator 
\TYPO3\CMS\Extbase\Validation\Validator\NotEmptyValidator 
\TYPO3\CMS\Extbase\Validation\Validator\NumberRangeValidator 
\TYPO3\CMS\Extbase\Validation\Validator\NumberValidator 
\TYPO3\CMS\Extbase\Validation\Validator\ObjectValidatorInterface 
\TYPO3\CMS\Extbase\Validation\Validator\RawValidator 
\TYPO3\CMS\Extbase\Validation\Validator\RegularExpressionValidator 
\TYPO3\CMS\Extbase\Validation\Validator\StringLengthValidator 
\TYPO3\CMS\Extbase\Validation\Validator\StringValidator 
\TYPO3\CMS\Extbase\Validation\Validator\TextValidator

In einer eigenen Extension lassen sich die Validatoren relativ einfach verwenden. Alle Validatoren erben die Funktion „validate()“ und „getErrors()“ von \TYPO3\CMS\Extbase\Validation\Validator\AbstractValidator. Als Rückgabe geben sie ein Array mit gut lesbarer Fehlermeldungen zurück oder einen leeren String, falls die Validierung in Ordnung war:

$email = 'john@malone.com'; // Hier testweise mal eine falsche E-Mail eingeben!
$validator = $this->objectManager->create('\TYPO3\CMS\Extbase\Validation\Validator\EmailAddressValidator');
print_r( $validator->validate($email)->getErrors() );