web-dev-qa-db-fra.com

Composant de construction - Remplacer "Champ invalide: Mon champ" par un message personnalisé

Je développe un composant personnalisé pour Joomla.

J'ai bien réussi à valider le champ en ajoutant une règle personnalisée. Mais si la valeur entrée ne passe pas par ma validation, cela donne l'erreur "Champ invalide: Nom de mon champ"

Je veux remplacer ceci par mon propre message.

Je sais que je peux utiliser "JText :: _ ('LANGUAGE_STRING'). Mais je ne sais pas trop où je dois l'ajouter.

J'ai une règle personnalisée appelée "validemails" qui renvoie la valeur false tant côté client que côté serveur.

La validation côté client est la suivante: (components/com_helpdesk/models/forms/create.js)

jQuery(document).ready(function () {
    document.formvalidator.setHandler('validemail', function (value) {
        var emails = [value];
        if (value.indexOf(';') !== -1) {
            emails = value.split(';');
        }
        else if(value.indexOf(',') !== -1) {
            emails = value.split(',');
        }
        regex = /^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/;
        var result = false;
        emails.each(function (value) {
            result = regex.test(jQuery.trim(value));
            if (result === false) {
                return false;
            }
        });
        return result;
    });
});

La validation côté serveur est la suivante: (components/com_helpdesk/models/rules/validemail.php)

use Joomla\Registry\Registry;

JFormHelper::loadRuleClass('email');

class JFormRuleValidemail extends JFormRuleEmail {

    public function test(SimpleXMLElement $element, $value, $group = null, Registry $input = null, JForm $form = null) {
        $emails = array($value);
        if (strpos($value, ';') !== false) {
            $emails = explode(';', $value);
        }
        else if (strpos($value, ',') !== false) {
            $emails = explode(',', $value);
        }

        foreach ($emails as $email) {
            if (!parent::test($element, trim($email))) {
                return false;
                continue;
            }
        }

        return true;
    }

}

Veuillez noter que je développe une vue frontale du composant et non du back-end.

4
Sahil Purav

Heureusement, ma validation côté serveur a fonctionné comme suit:

use Joomla\Registry\Registry;

JFormHelper::loadRuleClass('email');

class JFormRuleValidemail extends JFormRuleEmail {

    public function test(SimpleXMLElement $element, $value, $group = null, Registry $input = null, JForm $form = null) {
        $emails = array($value);
        if (strpos($value, ';') !== false) {
            $emails = explode(';', $value);
        }
        else if (strpos($value, ',') !== false) {
            $emails = explode(',', $value);
        }

        foreach ($emails as $email) {
            if (!parent::test($element, trim($email))) {
                ***$element->addAttribute('message', JText::_('COM_HELPDESK_ERROR_EMAIL').' '.$value);***
                return false;
                continue;
            }
        }

        return true;
    }

}

J'ai la solution. Peut-être sera-t-il utile pour les autres googleurs. Vous trouverez ci-dessous un extrait de code pour la validation côté client. Mettez le code ci-dessous dans votre JS personnalisé:

jQuery('.validate').click(function (e) {

    var msg = {"error": []};
    if (jQuery('#jform_priority').hasClass('invalid')) {
        msg.error.Push(Joomla.JText._('COM_HELPDESK_PRIORITY_ERROR'));
    }
    if (jQuery('#jform_description').hasClass('invalid')) {
        msg.error.Push(Joomla.JText._('COM_HELPDESK_DESCRIPTION_ERROR'));
    }
    if (jQuery('#jform_subject').hasClass('invalid')) {
        msg.error.Push(Joomla.JText._('COM_HELPDESK_SUBJECT_ERROR'));
    }      
    if (jQuery('#jform_bcc').hasClass('invalid')) {
        msg.error.Push(Joomla.JText._('COM_HELPDESK_BCC_ERROR'));
    }
    if (jQuery('#jform_cc').hasClass('invalid')) {
        msg.error.Push(Joomla.JText._('COM_HELPDESK_CC_ERROR'));
    }
    Joomla.renderMessages(msg);
    e.preventDefault();
});
4
Sahil Purav

Je ne sais pas pour le côté JS, mais pour le php vous feriez:

$app = JFactory::getApplication();
$app->enqueueMessage(JText::_('LANGUAGE_STRING'), 'warning');
1
Rob Clayburn