Zum Inhalt springen

TCA Pflichtfeld mit Bedingung

Erstellt am 8. August 2008 · 3 Antworten · letzte Antwort am 8. August 2008

Tags: TCA, Frage

tb238 ·

Ich hoffe ihr könnt mir bei meinem Problem helfen:

Ich habe eine Teaser Extension geschrieben, die dem BE Benutzer nur gewisse Felder anbietet, die er ausfüllen kann. Einige von diesen Feldern sind Pflichtfelder, die ich im TCA Array als "eval" => "required" deklariere. Jetzt stehe ich vor dem Problem, dass ich ein bestimmtes Feld (Alttext eines Bildes) nur zum Pflichtfeld machen will, wenn auch ein Bild ausgewählt wurde. Die Konfigurationsarrays sehen wie folgt aus:

# Bild
$temp_tca['columns']['image'] = Array (
'label' => 'LLL:{elementPath}{elementName}/locallang.php:image',
"config" => Array (
"type" => "group",
"internal_type" => "file",
"allowed" => $GLOBALS["TYPO3_CONF_VARS"]["GFX"]["imagefile_ext"],
"max_size" => 500,
"uploadfolder" => "uploads/tx_specialelements_uploads",
"show_thumbs" => 1,
"size" => 1,
"minitems" => 0,
"maxitems" => 1,
)
);

# Alttext (ist momentan immerPflichtfeld) 🙁
$temp_tca['columns']['altText'] = array('label' => 'LLL:{elementPath}{elementName}/locallang.php:alttext',
'config' => Array (
"type" => "input",
"eval" => "required"
)
);

Für Lösungsvorschläge bin ich sehr dankbar!

typo3tester ·

Man kann in den TCA Definitionen für bestimmte Felder userdefinierte Funktionen angeben.
In diesen Funktionen kann man dann (per PHP) Bedingungen formulieren und Werte des TCA überschreiben, also z.B. nur wenn Bedingung (Bild geladen) wahr, dann wird "eval" auf "required" gesetzt.

So habe ich schon einige Fälle gelöst, die mit einfacher Konfiguration nicht zu lösen waren.
Vielleicht gehts aber auch eleganter ohne Programmieraufwand.

Gruß, Regina

tb238 ·
typo3tester schrieb

Man kann in den TCA Definitionen für bestimmte Felder userdefinierte Funktionen angeben.
In diesen Funktionen kann man dann (per PHP) Bedingungen formulieren und Werte des TCA überschreiben, also z.B. nur wenn Bedingung (Bild geladen) wahr, dann wird "eval" auf "required" gesetzt.

So habe ich schon einige Fälle gelöst, die mit einfacher Konfiguration nicht zu lösen waren.
Vielleicht gehts aber auch eleganter ohne Programmieraufwand.

Gruß, Regina

Hallo Regina,

danke für deine schnelle Antwort. Sowas ähnliches hatte ich mir als Lösung vorgestellt. Weiß aber noch nicht so genau wie ich das dort einbauen soll, vielleicht kannst du mir noch einen Tipp geben:

Wie kann ich vom TCA Konfigurationsarray aus eine php funktion aufrufen und welche variabel muss ich dann in meiner php-Datei abfragen um zu prüfen ob ein Inhalt vom BE User eingetragen wurde.

MfG Thomas

typo3tester ·

Es ist schon wieder lange her, daß ich das gemacht habe, ich versuche mal, daß ich das zusammen bekomme, was für Dich wichtig ist.

Es gibt zwei Bereiche, wo Du ansetzen kannst:

1. Funktion itemsProcFunc

Bei mir im Beispiel handelt es sich um eine Select-Box
d.h. die entsprechenden Array-Bestandteile lauten so:

'type' => 'select',
'itemsProcFunc' => 'tx_partner_select->ProduktBerggenuss',

Nun gibt es in der Extension Datei namens tx_partner_select und dort eine Klasse tx_partner_select und dort die Funktion ProduktBerggenuss.

Diese Funktion hat zwei Parameter &$params, &$pObj.
In &$params sind die Array-Elemente des TCA-Feldes abgebildet, um die es sich dreht.
Die anderen TCA-Felder, z.B. wo das Bild geladen ist oder nicht, kannst Du mit $TCA abfragen, die Variable mußt Du aber erst auf global setzen.

Dann kannst Du auf $TCA abfragen und die Werte von $param manipulieren (also z.B. required setzen.

Auf diese Weise mache ich die verschiedensten Manipulationen.

Dann fällt mir gerade beim Anschauen noch auf, daß ich ja solche Überprüfungen auf required in Abhängigkeit von anderen Feldern auch noch ganz anders gelöst habe.
Es gibt das Feld Bankleitzahl (wir reden von der Extension partner, die ich für meine Zwecke angepasst habe).
Das sieht im TCA so aus:

'maiden_name' => Array (
			'exclude' => 1,
			'label' => 'LLL:EXT:partner/locallang.php:tx_partner_main.maiden_name',
			'config' => Array (
				'type' => 'input',
				'size' => '10',
				'max' => '9',
				'eval' => 'tx_partner_bankleitzahl',
			)
		),

Dann gibt es einen Unterordner in der Extension Partner namens eval.
Dort befindet sich eine Datei tx_partner_bankleitzahl.php

class tx_partner_bankleitzahl{
	/**
	 * This function needs to return JavaScript code for client side evaluation of the
	 * field value. The JavaScript variable "value" is set to the field value in the context
	 * of this JS snippet.
	 * In this example we just add the string "[added by JS]" to the field value.
	 *
	 * @return	JavaScript code for evaluating the 
	 */
	function returnFieldJS() { 
          global $SOBE;
          $id= $SOBE->elementsData[0]['uid'];         
          $JS = "if((document.editform.elements['data[tx_partner_main][".$id."][marital_status]'].options[1].selected==true  "; 
          $JS .= " || document.editform.elements['data[tx_partner_main][".$id."][marital_status]'].options[2].selected==true) ";
          $JS .= " &&  document.editform.elements['data[tx_partner_main][".$id."][maiden_name]_hr'].value.length <8 )" ;    
          $JS .= "{alert('Wenn Sie Lastschriftverfahren wünschen, darf die BLZ nicht leer sein! Sie muß mindestens 8 Ziffern lang sein!');";
          $JS .= "document.editform.elements['data[tx_partner_main][".$id."][maiden_name]_hr'].focus();}; ";
          $JS .= "return value";
          return $JS;
		#return '
			#return value + " [added by JS]";
		#';
	}
                                            
	/**
	 * This is the server side (i.e. PHP) side of the field evaluation.
	 * In this example we just add the string "[added by PHP]" to the field value.
	 *
	 * @param	mixed		$value: The value that has to be checked.
	 * @param	string		$is_in: Is-In String
	 * @param	integer		$set: Determines if the field can be set (value correct) or not (PASSED BY REFERENCE!)
	 * @return	The new value of the field
	 */
	function evaluateFieldValue($value, $is_in, &$set) {
      
          foreach($_POST['data']['tx_partner_main'] as $id =>$idvalue)   
          
          if(isset($_POST['data']['tx_partner_main'][$id]['marital_status']) && ($_POST['data']['tx_partner_main'][$id]['marital_status'] == 1 || $_POST['data']['tx_partner_main'][$id]['marital_status'] == 2) )
          {
               if(strlen($_POST['data']['tx_partner_main'][$id]['maiden_name']) < 8-)
               {
                    $set = false;                        
               }
              
          }
          return $value;
     }
}


if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/partner/eval/class.tx_partner_bankleitzahl.php']) {
	include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/partner/eval/class.tx_partner_bankleitzahl.php']);
}

Tut mir leid, ich kann Dir nur so ein paar Brocken hinwerfen, ich fahre später weg übers Wochenende und habe deswegen keine Zeit mehr, alle Fäden zusammen zu suchen, wie die diversen Funktionen aufgerufen und verarbeitet werden.

Du kannst nur versuchen mit den Stichworten, die ich geliefert habe in den diversen Hilfedokus zu suchen.
In der TYPO3 Core API müßtest Du fündig werden.
Auf Seite 91 gehts z.B. um das Stichwort "eval"

Vielleicht findest Du in einer Extension, die Du verwendetst in der TCA ein Beispeil der Verwendung für die beiden Arten von Userdefinierten Funktionen und kannst Dir dort was abgucken.
Auf diese Art bin ich auch vorgegangen.

Gruß, Regina