Das Adventure PHP Framework beinhaltet eine sehr umfangreiche Formular-Unterstützung die auf dem Taglibs-Konzept basiert. Die Grundlagen und vorhandenen Taglibs sind im Abschnitt Formulare beschrieben. Dieses Kapitel beschäftigt sich nun mit der Verwendung von Formularen, der dynamischen Formular-Generierung und der Erweiterung der Formular-Taglibs.
Formulare sind - genau wie Template-Fragmente - Elemente, die im DOM-Baum existieren, jedoch bei der Transformation nicht automatisch ausgegeben werden. Hierzu bedarf es eines Document-Controller. Der Grund dafür ist simple: nahezu jedes Formular ist an Aktionen geknüpft, die mit dem Absenden des Formulars ausgeführt werden sollen (z.B. Speichern der Daten).
Um ein Formular mit Hilfe eines Document-Controller auszugeben, ist folgender Code notwendig:
class form_controller extends BaseDocumentController {
public function transformContent(){
$form = &$this->getForm('Search');
$form->transformOnPlace();
}
}In der Variable $form steht dabei eine Instanz der Klasse HtmlFormTag zur Verfügung, die ein APF-Formular mit all seinen Elementen und Funktionen kapselt. Mit Hilfe dieser Referenz auf das Formular-Objekt im DOM-Baum kann das Formular ausgegeben, manipuliert, befüllt und angepasst werden. Details dazu können den folgenden Kapiteln entnommen werden.
Grundlage für alle Formular-Elemente ist die Klasse AbstractFormControl. Diese implementiert Basis-Funktionalitäten für alle konkreten Formular-Elemente und definiert die Struktur eines Formular-Elements. Da die Formular-Elemente als Taglibs ausgeführt sind, unterliegen sie dem Lifecycle des Page-Controllers. Das bedeutet, dass sie darüber hinaus alle Methoden einer "normalen" Taglib implementieren müssen.
Mit Hilfe dieser Funktionen wird der Entwickler darin untrstützt, eigene Formular-Elemente zu erstellen. Mehr dazu in Kapitel 7.
Mit dem Release 1.12 wurde im Zusammenhang mit der Einführung der Client-Validierung ein Attribut-Whitelisting für Formular-Taglibs eingeführt. Dieses sorgt dafür, dass nur XHTML-kompatible Attribute in den Quelltext geschrieben werden. Proprietäre Attribute - etwa zur Steuerung der Validierung - werden nicht beachtet.
Bei der Erstellung einer eigenen Formular-Taglib muss da daher darauf geachtet werden, dass zusätzlich notwendige Attribute in die Whitelist aufgenommen werden. Hierzu empiehlt es sich, den Konstruktor der Taglib zu nutzen:
class SpecialFormControlTag extends AbstractFormControl {
public function __construct() {
$this->attributeWhiteList[] = 'name';
$this->attributeWhiteList[] = 'accesskey';
}
}class form_controller extends BaseDocumentController {
public function transformContent(){
$form = &$this->getForm('MyForm');
if($form->isSent()){
echo 'Form was send');
}
if($form->isValid()){
echo 'Form is valid';
}
}
}class form_controller extends BaseDocumentController {
public function transformContent(){
$form = &$this->getForm('MyForm');
$searchField = &$form->getFormElementByName('searchterm');
if($searchField->isValid()){
echo 'Search field is valid';
}
}
}class form_controller extends BaseDocumentController {
public function transformContent(){
$form = &$this->getForm('MyForm');
$button = &$form->getFormElementByID('button');
if($button->isSent()){
echo 'Search button was clicked';
}
}
}<html:form name="product-form">
<form:error>Please fill in the mandatory fields!</form:error>
<form:text name="code" minlength="5" maxlength="5"/>
<form:text name="title" minlength="20"/>
<form:area name="description" minlength="30"/>
<form:addvalidator
class="TextLengthValidator"
control="code|title|description"
button="send"
/>
<form:button name="send" value="Save" />
</html:form>class form_controller extends BaseDocumentController {
public function transformContent(){
$form = &$this->getForm('product-form');
$form->transformOnPlace();
}
}<html:form name="product-form">
<form:listener control="code">Please fill in a five letter product code!</form:listener>
<form:text name="code" minlength="5" maxlength="5"/>
<form:listener control="title">Please fill in a title with at least 20 characters!</form:listener>
<form:text name="title" minlength="20"/>
<form:listener control="description">Please provide a verbose product description!</form:listener>
<form:area name="description" minlength="30"/>
<form:addvalidator
class="TextLengthValidator"
control="code|title|description"
button="send"
/>
<form:button name="send" value="Save" />
</html:form>class form_controller extends BaseDocumentController {
public function transformContent(){
$form = &$this->getForm('product-form');
$form->transformOnPlace();
}
}Innerhalb des <form:listener />-Tags können gemäß Listener noch weitere Tags zur Definition der Inhalte verwendet werden.
In einigen Situationen kann es einfacher bzw. schneller sein, eine Formular-Validierung im Controller durchzuführen anstatt einen eigenen Validator zu schreiben. Um auch in diesen Fällen eine Markierung der Formular-Felder zu ermöglichen wurde in Version 1.14 eine neue Methode für Formular-Felder eingeführt.
Als Beispiel soll im folgenden Formular das Feld searchterm nach einer eigenen Regel im Controller validiert werden:
<html:form name="search">
<label for="searchterm">Suchbegriff:</label>
<form:text id="searchterm" name="searchterm" value="" />
<form:button name="search" value="GO" />
</html:form>Der passende Controller beinhaltet folgenden Code zur Prüfung, dass das Suchfeld den Buchstaben e nicht enthält:
class search_controller extends BaseDocumentController {
public function transformContent() {
$form = &$this->getForm('search');
$searchTerm = &$form->getFormElementById('searchterm')
if(stripos($searchTerm->getValue(), 'e') !== false) {
$searchTerm->markAsInvalid();
$searchTerm->appendCssClass(AbstractFormValidator::$DEFAULT_MARKER_CLASS);
}
$form->transformOnPlace();
}
}Beim Abschicken des Formulars mit einem Wort, das den Buchstaben e beinhaltet, wird das Feld searchterm technisch als invalid markiert und erhält die Standard-CSS-Klasse, die zur optischen Markierung eingesetzt wird. Sofern eine eigene Klasse genutzt werden soll, kann diese entweder im Controller fest definiert werden oder aus einem Attribut des Formular-Feldes bezogen werden (z.B. valmarkerclass).
Eine häufige Aufgabe beim Handling von Formularen stellt das Auslesen von Werte dar. Hierzu können im Document-Controller folgende Methoden genutzt werden:
class form_controller extends BaseDocumentController {
public function transformContent(){
$form = &$this->getForm('product-form');
if($form->isSent() && $form->isValid()){
$code = &$form->getFormElementByName('code');
echo 'product code: '.$code->getValue();
$title = &$form->getFormElementByName('title');
echo 'product title: '.$title->getValue();
$description = &$form->getFormElementByName('description');
echo 'product desc: '.$description->getValue();
}
}
}<html:form name="product-form">
<form:error name="error">
<error:placeholder name="ph1" />
</form:error>
...
</html:form>class form_controller extends BaseDocumentController {
public function transformContent(){
$form = &$this->getForm('product-form');
$error = &$form->getFormElementByName('error');
// simple way:
$error->setPlaceHolder('ph1','My placeholder value');
// alternative way:
$placeHolder = $error->getFormElementByName('ph1');
$placeHolder->setContent('My placeholder value');
}
}class edit_controller extends BaseDocumentController {
public function transformContent(){
$form = &$this->getForm('...');
$textFields = &$form->getFormElementsByTagName('form:text');
$user = new GenericDomainObject('User');
$count = count($textFields);
for($i = 0; $i < $count; $i++){
$user->setProperty(
$textFields[$i]->getAttribute('name'),
$textFields[$i]->getValue()
);
}
}
}<core:addtaglib
namespace="tools::form::taglib"
class="HtmlFormTag"
prefix="html"
name="form"
/>
<html:form name="UserEdit" method="post">
<strong>FirstName</strong>:
<form:text name="FirstName" />
<br />
<strong>LastName</strong>:
<form:text name="LastName" />
<br />
<br />
<form:button name="Edit" value="Save" />
<form:hidden name="userid" />
</html:form>$form = &$this->getForm('UserEdit');
$userID = &$form->getFormElementByName('userid');
$userID->setAttribute('value','...');
$firstName = &$form->getFormElementByName('FirstName');
$fFirstName->setAttribute('value','...');
$lastName = &$form->getFormElementByName('LastName');
$lastName->setAttribute('value','...');<core:addtaglib
namespace="tools::form::taglib"
class="HtmlFormTag"
prefix="html"
name="form"
/>
<html:form name="UserCreate" method="post">
<strong>Salutation</strong>:
<form:select name="Salutation" />
<br />
<strong>FirstName</strong>:
<form:text name="FirstName" />
<br />
<strong>LastName</strong>:
<form:text name="LastName" />
<br />
<br />
<strong>Groups</strong>:
<br />
<form:multiselect name="Group" />
<br />
<br />
<form:button name="Edit" value="Save" />
<form:hidden name="userid" />
</html:form>$form = &$this->getForm('UserCreate');
$salutations = array(...);
$salutation = &$form->getFormElementByName('Salutation');
for($i = 0; $i < count($salutations); $i++){
$salutation->addOption($salutations[$i]['DisplayName'], $salutations[$i]['Value']);
}
$goups = array(...);
$group = &$form->getFormElementByName('Groups');
for($i = 0; $i < count($groups); $i++){
$group->addOption($groups[$i]['DisplayName'], $groups[$i]['Value']);
}$form = &$this->getForm('PermissionSetEdit');
// load permissions and fill the select field
$allPermissions = $uM->loadPermissionList();
$permField = &$form->getFormElementByName('Permission[]');
for($i = 0; $i < count($allPermissions); $i++){
$permField->addOption($allPermissions[$i]->getProperty('DisplayName'),$allPermissions[$i]->getProperty('PermissionID'));
}
// preselect the options
$selectedPermissions = $uM->loadPermissionsOfPermissionSet($permSet);
for($i = 0; $i < count($selectedPermissions); $i++){
$permField->setOption2Selected($selectedPermissions[$i]->getProperty('PermissionID'));
}$form = &$this->getForm('UserEdit');
$userID = &$form->getFormElementByName('userid');
echo $userID->getValue();
$firstName = &$form->getFormElementByName('FirstName');
echo $firstName->getValue();
$lastName = &$form->getFormElementByName('LastName');
echo $lastName->getValue();Um die selektierten Optionen eines Einfach- oder Mehrfachselektionsfeldes auszulesen, stehen die Methoden getSelectedOption() und getSelectedOptions() zur Verfügung. Die folgende Codebox zeigt den Anwendungsfall:
$form = &$this->getForm('UserCreate');
$salutations = array(...);
$salutation = &$form->getFormElementByName('Salutation');
for($i = 0; $i < count($salutations); $i++){
$salutation->addOption($salutations[$i]['Value'],$salutations[$i]['DisplayName']);
}
$option = &$salutation->getSelectedOption();
echo $option->getAttribute('value').', '.$option->getContent();
$groups = array(...);
$group = &$form->getFormElementByName('Groups[]');
for($i = 0; $i < count($groups); $i++){
$group->addOption($groups[$i]['Value'],$groups[$i]['DisplayName']);
}
$selectedGroups = &$group->getSelectedOptions();
for($i = 0; $i < count($selectedGroups); $i++){
echo $selectedGroups[$i]->getAttribute('value').', '.$selectedGroups[$i]->getContent();
}In einigen Anwendungsfällen ist es notwenig, Formulare dynamisch nach Anforderung zu erstellen. Hierzu besitzt die Implementierung der Formular-TagLib (HtmlFormTag) die Methoden
<@controller namespace="..." class="select_controller" @>
<core:addtaglib
namespace="tools::form::taglib"
class="HtmlFormTag"
prefix="html"
name="form"
/>
<html:form name="type" method="post">
<table>
<tr>
<td>
Please choose the desired form type:
<form:select name="type">
<select:option value="triangle">triangle</select:option>
<select:option value="square">square</select:option>
</form:select>
</td>
<td>
<form:button name="submit" value="send" />
</td>
</tr>
<tr>
<td>
<form:marker name="fields" />
</td>
</tr>
</table>
</html:form>class select_controller extends BaseDocumentController {
// specify form element container
private $formElements = array();
public function __construct(){
// define form elements for the triangle
$this->formElements['triangle'][] = array('label' => 'coord 1','name' => 'coordone');
$this->formElements['triangle'][] = array('label' => 'coord 2','name' => 'coordtwo');
$this->formElements['triangle'][] = array('label' => 'coord 3','name' => 'coordthree');
// define form elements for the square
$this->formElements['square'][] = array('label' => 'coord 1','name' => 'coordone');
$this->formElements['square'][] = array('label' => 'coord 2','name' => 'coordtwo');
$this->formElements['square'][] = array('label' => 'coord 3','name' => 'coordthree');
$this->formElements['square'][] = array('label' => 'coord 4','name' => 'coordfour');
}
public function transformContent(){
// get form reference
$form = &$this->getForm('type');
// get current decision
$Select = &$form->getFormElementByName('type');
$Option = &$Select->getSelectedOption();
if($Option === null){
$CurrentType = 'triangle';
}
else{
$CurrentType = $Option->getAttribute('value');
}
// add form elements
for($i = 0; $i < count($this->formElements[$CurrentType]); $i++){
// add label
$form->addFormContentBeforeMarker('fields',$this->formElements[$CurrentType][$i]['label'].': ');
// add text field (name attribute is present to enable validation and presetting!)
$currentElementID = $form->addFormElementBeforeMarker(
'fields',
'form:text',
array('name' => $this->formElements[$CurrentType][$i]['name'])
);
// configure further form element attributes
$currentElement = &$form->getFormElementByObjectID($currentElementID);
$currentElement->setAttribute('style','width: 200px;');
// add a line break
$form->addFormContentBeforeMarker('fields','<br />');
}
// display form
$form->transformOnPlace();
}
}Mit dem Release 1.11 wurde das Konzept der Filter und Validatoren überarbeitet. Dies wirkt sich auch auf die Definition von dynamischen Formular-Elementen mit Filtern und Validatoren aus.
Wie im Kapitel Aufbau von Validatoren und Aufbau von Filtern besprochen wurde, werden Validatoren und Filter als Observer an Formular-Elemente geheftet. Bei dynamischen Formularen kann durch "Simulation" der <form:addvalidator />- und <form:addfilter />-Tags ebenso verfahren werden. Für die konkrete Anwendung bedeutet das, dass nach der Definition eines dynamischen Formular-Feldes der gewünschte Validator oder Filter über die Methoden addValidator() bzw. addFilter() angeheftet werden kann. Dies gestaltet sich in Code ausgedrückt im Kontext des in den letzten Kapiteln besprochenen Beispiels wie folgt:
// gather button instance of the form
$button = &$form->getFormElementByName('submit');
// create dynamic form elements
for($i = 0; $i < count($this->formElements[$CurrentType]); $i++){
// add label
$form->addFormContentBeforeMarker('fields',$this->formElements[$CurrentType][$i]['label'].': ');
// add text field (name attribute is present to enable validation and presetting!)
$currentElementID = $form->addFormElementBeforeMarker(
'fields',
'form:text',
array('name' => $this->formElements[$CurrentType][$i]['name'])
);
// configure further form element attributes
$currentElement = &$form->getFormElementByObjectID($currentElementID);
$currentElement->setAttribute('style','width: 200px;');
// add filter to the current element
$filter = new NoSpecialCharactersFilter($currentElement,$button);
$currentElement->addFilter($filter);
// add validator to the current element
$validator = new TextLengthValidator($currentElement,$button);
$currentElement->addValidator($validator);
// add a line break
$form->addFormContentBeforeMarker('fields','<br />');
}$form->isValid()array(
'name' => 'current_name'
)class HoneypotFormControlTag extends AbstractFormControl {
public function transform(){
$htmlCode = (string)'<input ';
$htmlCode .= $this->getAttributesAsString($this->attributes);
$htmlCode .= 'type="text" ';
$htmlCode .= 'style="margin: 0px; padding: 0px; display: none; height: 0px; width: 0px;"';
$htmlCode .= ' />';
return $htmlCode;
}
}$htmlCode .= $this->getAttributesAsString($this->__Attributes);$htmlCode .= $this->__getAttributesAsString($this->__Attributes);Da die Rückgabe des Validitäts-Status, die Möglichkeit Validatoren und Filter anzuheften und Presetting der eingegebenen Werte beim Absenden bereits in der Klasse AbstractFormControl enthalten ist, stellt die oben gezeigte Klasse bereits den vollständig Funktionsumfang dar.
Um das neue Element in einem Formular verwenden zu können, muss dieses mit Hilfe des <form:addtaglib />-Tags im Formular bekannt gemacht werden:
<core:addtaglib
namespace="tools::form::taglib"
class="HtmlFormTag"
prefix="html"
name="form"
/>
<html:form name="CheckedForm">
...
<form:addtaglib
namespace="..."
class="HoneypotFormControlTag"
prefix="form"
name="honeypot"
/>
<form:honeypot name="check" />
...
</html:form>class HoneypotValidator extends TextFieldValidator {
public function validate($input){
if(empty($input)){
return true;
}
return false;
}
...
}class HoneypotValidator extends TextFieldValidator {
public function validate($input){
if(empty($input)){
return true;
}
return false;
}
public function notify(){
$this->control->markAsInvalid();
$this->notifyValidationListeners($this->control);
}
}$this->markControl($this->control);<core:addtaglib
namespace="tools::form::taglib"
class="HtmlFormTag"
prefix="html"
name="form"
/>
<html:form name="CheckedForm">
<form:addtaglib
namespace="..."
class="HoneypotFormControlTag"
prefix="form"
name="honeypot"
/>
<form:honeypot name="check" />
<form:addvalidator
namespace="..."
class="HoneypotValidator"
control="check"
button="send"
/>
<form:button name="send" value="Send" />
</html:form>class GermanUmlautsFilter extends AbstractFormFilter {
public function filter($input){
return $input;
}
}class GermanUmlautsFilter extends AbstractFormFilter {
public function filter($input){
return str_replace(
array('ä','ö','ü','Ä','Ö','Ü','ß'),
array('ae','oe','ue','Ae','Oe','Ue','ss'),
$input
);
}
}Die Anwendung des Filters gestaltet sich dann im Zusammenhang mit einem Text-Feld oder einer Text-Area wie folgt:
<core:addtaglib
namespace="tools::form::taglib"
class="HtmlFormTag"
prefix="html"
name="form"
/>
<html:form name="UmlautsForm">
<form:text name="name" />
<form:area name="comment" />
<form:addfilter
namespace="..."
class="GermanUmlautsFilter"
control="name|comment"
button="send"
/>
<form:button name="send" value="Send" />
</html:form>Seit Release 1.16 wird seitens des APF auch ein weiteres Tool zum Erzeugen von Datei-Uploads mit Vorschau-Funktion sowie prozentualer Fortschrittanzeige angeboten: der MultiFileUpload. Ausführliche Informationen dazu entnehmen Sie bitte der Dokumentation im Wiki: MultiFileUpload im Wiki.
Mit dem Release 1.17 wurden die Formular-Elemente um ein Sichtbarkeitsmerkmal erweitert. Dieses wird bei der Transformation dazu genutzt zu entscheiden, ob ein Formular-Element dargestellt wird oder nicht. Dies ermöglicht Ihnen das aus- bzw. einblenden von Formular-Elemente via (Document-)Controller.
Zusätzlich zum Sichtbarkeits-Status lassen sich pro Formular-Element abhängige Elemente definieren, die beim Ausblenden ebenso ausgeblendet werden. So lassen sich - in gewissen Grenzen - ganz einfach dynamische Formulare erzeugen.
Die folgenden Kapitel beschreiben die möglichen Anwendungsfälle und die zugehörige Implementierung.
In Version 1.17 wurde die Klasse AbstractFormControl um die Methoden
erweitert. Da alle Formular-Elemente von dieser ableiten, steht die Sichtbarkeits-Definition grundsätzlich in jedem Element zur Verfügung. Weitere Hinweise finden Sie im Kapitel Unterstützte Formular-Elemente.
Die Methode isVisible() kann dazu genutzt werden um den aktuellen Status zu in einem Controller oder einem Tag zu erfragen. show() setzt das Element auf den Status sichtbar, hide() versteckt es.
Als Beispiel soll uns das in der Code-Box abgebildete Login-Formular dienen:
<html:form name="log-in">
<label for="user-name">Benutzer-Name:</label>
<form:select name="user-name" id="user-name" />
<label for="password">Passwort:</label>:
<form:text name="password" id="password" />
<label for="stay-logged-in">Eingeloggt bleiben?</label>:
<form:checkbox name="stay-logged-in" id="stay-logged-in" />
<form:button name="log-in" value="Anmelden" />
</html:form>Wie aus der Code-Box zu entnehmen ist, beinhaltet das Formular je ein Feld für Benutzer-Namen und Passwort sowie ein Feld, das die dahinterliegende Applikation dazu veranlasst eine permanente Anmeldung zu erzeugen.
Um die Checkbox zur Aktivierung der permanenten Anmeldung auszublenden kann folgender Controller-Code verwendet werden:
class LoginController extends BaseDocumentController {
public function transformContent() {
$form = &$this->getForm('log-in');
$checkbox = &$form->getFormElementByName('stay-logged-in');
$checkbox->hide();
...
$form->transformOnPlace();
}
}Bei der Anzeige des Formulars ist die Checkbox nun nicht mehr sichtbar und damit für den Anwender nicht mehr nutzbar.
Bitte beachten Sie die Hinweise in Kapitel 8.4 zur Implementierung von eigenen Formular-Elementen unter Nutzung der Sichtbarkeits-Definition.
Bitte beachten Sie, dass die per hide() ausgeblendeten Elemente weiterhin in Ausführung der Validierung und Filterung einbezogen werden. Dies kann dazu führen, dass nicht mehr sichtbare Elemente einen Fehler auslösen und das Formular dadurch nicht mehr absendbar ist. Da das Feld nicht sichtbar ist, kann der Benutzer dann leider keinen Einfluss mehr darauf nehmen.
Beinflussen Sie die Sichtbarkeit von Formular-Elementen im Controller, achten Sie bitte darauf, dass ein ausgeblendetes Feld entweder per
$checkbox = &$form->getFormElementByName('stay-logged-in');
$checkbox->hide();
$checkbox->markAsValid();im Controller als valide oder definieren Sie für dieses Feld einen optionalen Validator (siehe Formulare).
Nachteil der in Kapitel 8.1. beschriebenen Vorgehensweise: das Label-Element der Checkbox weiterhin angezeigt wird. Dies lässt sich sehr einfach dadurch umgehen, dass das als HTML-Tag definierte Label als APF-Formular-Tag ausgeführt wird. Dieser lässt sich dann mit Hilfe des Attributes dependent-controls als abhängiges Element der Checkbox markieren und wird beim Ausblenden der Checkbox ebenso ausgeblendet.
Die Definition des Formulars erweitert sich dadurch wie folgt:
<html:form name="log-in">
<label for="user-name">User name:</label>
<form:select name="user-name" id="user-name" />
<label for="password">Password:</label>:
<form:text name="password" id="password" />
<form:label name="stay-logged-in-label" for="stay-logged-in">Stay logged-in?</form:label>:
<form:checkbox
name="stay-logged-in"
id="stay-logged-in"
dependent-controls="stay-logged-in-label"
/>
<form:button name="log-in" value="Anmelden" />
</html:form>Die Definition von abhängigen Elementen ist rekursiv möglich. Wird beispielsweise das Passwort-Feld als abhängiges Element des Label-Tags definiert, so werden beim Ausblenden der Checkbox sie selbst, der Label-Tag und das Passwort-Feld ausgeblendet.
Möchten Sie pro Feld mehrere abhängige Felder referenzieren, so trennen Sie die Namen der Felder jeweils mit einem | (Pipe-Zeichen). Beispiel:
stay-logged-in-label|passwordDie Sichtbarkeits-Definition wird nicht von allen Formular-Elementen unterstützt. Dies hat den Grund, dass für bestimmte Elemente wie z.B. der <form:hidden />-Tag bereits vor Release 1.17 keine sichtbare Darstellung besitzen und bei Elementen wie dem <form:error />-Tag eine Sichtbarkeit fachlich nicht sinnhaft ist.
Die folgende Liste zeigt die Tags, die die Definition der Sichtbarkeit unterstützen:
Die Definition der Sichtbarkeit ist in der Klasse AbstractFormControl verankert und steht damit jedem Formular-Element-Typ zur Verfügung. Da die Auswirkung der Sichtbarkeit jedoch jedes Element selbst definiert muss bei der Implementierung von eigenen Formular-Tags der Status bei der Erzeugung der Ausgabe beachtet werden oder bewusst ignoriert werden.
Der Sichtbarkeits-Status wird in der Klassenvariablen AbstractFormControl::$isVisible verwaltet. Der Wert true entspricht dabei dem Status sichtbar, bei false werden die in Kapitel 8.3. nicht angezeigt.
Soll der Sichtbarkeits-Status bei der Ausgabe Ihres Formular-Elements beachtet werden, so können Sie die folgende Code-Box als Vorlage nutzen:
class MyCustomFormTag extends AbstractFormControl {
...
public function transform() {
if ($this->isVisible) {
return '...what ever your tag generates as its output...';
}
return '';
}
...
}Ein weiterer Anwendungsfall bei der Implementierung von eigenen Formular-Elementen ist das direkte Ausblenden von benachbarten Formular-Elementen im Tag-Code. Dies kann notwendig sein, wenn Sie z.B. ein Formular-Element eine direkte Abhängigkeit zu einem anderen besitzt.
Das Ausblenden aller in einem Formular enthaltenen Check-Boxen lässt sich beispielsweise wie folgt in einem eigenen Formular-Tag abbilden:
class MyCustomFormTag extends AbstractFormControl {
...
public function onAfterAppend() {
$form = &$this->getParentObject();
$controls = $form->getFormElementsByTagName('form:checkbox');
foreach ($controls as $control) {
$control->hide();
}
...
}
...
}Die Entwicklung des APF wird von JetBRAINS mit PHPStorm-Lizenzen unterstützt und wir sind überzeugt davon, dass PHPStorm die Qualität nachhaltig steigert. Benutzen auch Sie PHPStorm!
Proud to useIntelligent PHP IDE for coding, testing and debugging with pleasure