En uno de nuestros proyectos, tenemos 2 casos de uso que podrían mapearse con una extensión, excepto por un pequeño detalle. Este pequeño detalle es una dirección de correo electrónico, que es un campo obligatorio en un caso de uso y no tiene que ser introducido en el otro.
Extbase es muy consistente gracias al principio MVC. Así que si se especifica en un modelo que la dirección de correo electrónico no es un campo obligatorio, no se puede decir simplemente en tiempo de ejecución que la dirección de correo electrónico de repente se convierte en un campo obligatorio.
Echemos un vistazo al código fuente para ver por qué esto no es posible:
Falla debido a la createAction(). Esto se debe a que especifica que todas las entradas del formulario deben transferirse al modelo Tx_ExtName_Domain_Model_Topic. Sin embargo, aquí nos encontramos dentro de la lista de parámetros de una llamada a un método y, por lo tanto, no tenemos ninguna opción, por ejemplo, seleccionar otro modelo con una validación diferente, ya que aquí no se permiten métodos PHP como if y switch.
La opción de comprobar posteriormente la dirección de correo electrónico dentro del createAction también falla, ya que Fluid ya no puede averiguar si esta propiedad ha causado un error o no. Esto significa que la clase de error CSS "f3-form-error" ya no se puede añadir al campo de correo electrónico en caso de error. Por lo tanto, el visitante del sitio web ya no recibe ninguna respuesta visual.
Sin embargo, con la ayuda de un método initialiseCreateAction adicional, es posible intervenir ANTES de la llamada real del método createAction. Pero aquí también hay problemas. Aunque el ConjunctionValidator está pensado básicamente para incluir varios validadores, incluso después de varias horas no ha sido posible añadir un validador con addValidator que también funcione. Extbase y Fluid aparentemente esperan una estructura/anidamiento predefinido de los validadores.
/**
* añadir nuevo validador al tema
*
* @return void
*/
public function inicializarCrearAcción() {
if ($this->arguments->hasArgument('nuevoTema')) {
if ($this->settings['emailIsMandatory']) {
/** @var Tx_Extbase_Validation_ValidatorResolver $validatorResolver */
$validatorResolver = $this->objectManager->get('Tx_Extbase_Validation_ValidatorResolver');
$topicValidator = $validatorResolver->getBaseValidatorConjunction('Tx_ExtName_Domain_Model_Wme_Topic');
/** @var Tx_Extbase_Validation_Validator_ConjunctionValidator $conjunctionValidator */
$conjunctionValidator = $this->arguments->getArgument('newTopic')->getValidator();
/* eliminar validador por defecto */
foreach ($conjunctionValidator->getValidators() as $validator) {
$conjunctionValidator->removeValidator($validator);
}
/* añadir nuestro propio validador con email obligatorio al tema */
$conjunctionValidator->addValidator($topicValidator);
}
}
}
El método initialiseCreateAction comprueba ahora si el método posterior (createAction) contiene el argumento $newTopic y si la dirección de correo electrónico se ha establecido como campo obligatorio mediante TypoScript.
Si este es el caso, obtenemos el objeto ValidatorResolver. Utilizando el método getBaseValidatorConjunction contenido, ahora podemos crear un nuevo validador para el modelo de dominio en el que la dirección de correo electrónico es ahora un campo obligatorio (WME = With Mandatory Email).
Ahora recuperamos los validadores creados por Extbase, los borramos todos y volvemos a añadir nuestro validador de creación propia al argumento para el createAction.
Autor: Stefan Frömken