web-dev-qa-db-fra.com

Le bouton Annuler de la présentation personnalisée default.php conduit à une erreur de validation du formulaire

Je suis confronté à un problème avec mon bouton d'annulation dans mon default.php, qui est un formulaire avec quelques champs de saisie ainsi qu'un bouton de sauvegarde et d'annulation. Il y a quelques champs obligatoires dans mon formulaire. Lorsque j'utilise le bouton d'annulation, la validation du formulaire est activée et m'informe de remplir ces champs.

Cela pourrait-il être le résultat de l'utilisation de la disposition default.php?

5022015 - UPDATE
Le formulaire est un formulaire frontal et le bouton d'annulation a été créé via Joomla custom JToolBar.

6022015 - Ajoute un code réduit de mise en page

<?php
defined('_JEXEC') or die;
JHtml::_('behavior.formvalidation');
JHtml::_('behavior.keepalive');
JHtml::_('formbehavior.chosen', 'select');
?>

<script type="text/javascript">
        Joomla.submitbutton = function(task)
    {
                if (task == 'contact.cancel' || document.formvalidator.isValid(document.getElementById('contact-form')))
        {
                        alert (task);
                        Joomla.submitform(task, document.getElementById('contact-form'));
        } else {
                if (task != 'contact.cancel' && document.formvalidator.isValid(document.id('contact-form'))) {
                        Joomla.submitform(task, document.getElementById('contact-form'));
                } else {
                    alert('<?php echo $this->escape(JText::_('JGLOBAL_VALIDATION_FORM_FAILED')); ?>');
                }
            }
    }               
</script>

<form action="<?php echo JRoute::_('index.php?option=com_ecms&view=contact&id=' . (int) $this->form->getInput('id')); ?>" method="post" name="contactForm" id="contact-form" class="form-validate" enctype="multipart/form-data">
    <div class="row-fluid">
        <fieldset class="form-horizontal">
                        <div class="control-group">
                            <div class="control-label"> 
                                <?php echo $this->form->getLabel('id'); ?>
                            </div>
                            <div class="controls">
                <?php echo $this->form->getInput('id'); ?>
                            </div>
            </div>
                        <div class="control-group">
                            <div class="control-label"> 
                                <?php echo $this->form->getLabel('surname'); ?>
                            </div>
                            <div class="controls">
                <?php echo $this->form->getInput('surname'); ?>
                            </div>
            </div>
                </fieldset>
                <div id="toolbar-cancel" class="btn-wrapper">
                    <button class="btn btn-small" onclick="Joomla.submitbutton('contact.cancel')">
                        <span class="icon-cancel"></span><?php echo JText::_('JCANCEL') ?>
                    </button>
                </div>            
        </div>
    <?php echo JHtml::_('form.token'); ?>
</form>
1
Perino

Il semble qu’il s’agisse d’un problème de JToolBar personnalisé Joomlas, qui est utilisé ici pour créer une barre d’outils pour le front-end.

voir le dernier paragraphe: https://docs.joomla.org/Client-side_form_validation

Le problème est que le travail autour de cet article ne fonctionne pas!

En attendant j'ai trouvé le problème. Si vous examinez de plus près le code du bouton, qui sera produit dans la sortie hmtl du site, vous verrez alors que le type du bouton n'est pas défini. Dans ce cas, il devrait s'agir de 'type = "bouton"'. Si cette option n'est pas définie, la validation du formulaire sera déclenchée dans tous les cas.

Une intégration de bouton normale, comme la suggestion de Dmitry, conduit au succès. Joomlas JToolbar pour les barres d’outils personnalisées nécessite une correction.

2
Perino

Une autre solution consiste à ne pas utiliser du tout JToolBar. Avez-vous vraiment besoin de ça? Faites simplement votre bouton comme ceci (bouton "Annuler" par exemple):

<button type="button" class="btn" onclick="Joomla.submitbutton('contact.cancel')">
    <span class="icon-cancel"></span>&#160;<?php echo JText::_('JCANCEL') ?>
</button>

Puis en JS:

Joomla.submitbutton = function(task) 
{
    if (task == 'contact.cancel')
    {
        Joomla.submitform(task);
    }
}

Et vous êtes prêt à partir.

2
Dmitry Rekun

Ce n'est pas un résultat de la mise en page que vous utilisez mais une limitation du bouton Annuler pour ignorer la validation du formulaire.

En règle générale, vous devrez implémenter quelque chose comme ceci:

JFactory::getDocument()->addScriptDeclaration('
    Joomla.submitbutton = function(task)
    {
        if (task == "article.cancel" || document.formvalidator.isValid(document.getElementById("item-form")))
        {
            ' . $this->form->getField('articletext')->save() . '
            Joomla.submitform(task, document.getElementById("item-form"));
        }
    };
');

Cette copie a été copiée à partir de la présentation de base de l'article Joomla edit.php ( https://github.com/joomla/joomla-cms/blob/bd3d9cc947458437f790180fad4b817ee36e41d3/administrator/components/com_content/views/tmpl/ edit.php ligne 64)

L'idée de base est de remplacer le gestionnaire de soumission pour vérifier s'il s'agit d'un bouton d'annulation (avec task = VIEWNAME.cancel OR pour valider le document. Cela devrait ignorer le validateur lors de l'annulation et du traitement. le bouton comme on peut s'y attendre.

Vous aurez probablement besoin de faire quelques choses pour que cela fonctionne dans votre cas:

  1. Supprimer ' . $this->form->getField('articletext')->save() . '. Cela est spécifique à cette vue.
  2. Mettez à jour article.cancel Pour qu'il soit VIEWNAME.cancel.
  3. Mettez à jour la document.getElementById(...) pour qu'elle soit l'identifiant de votre formulaire.
1
David Fritsch