web-dev-qa-db-ja.com

カスタムdefault.phpレイアウトのキャンセルボタンがフォーム検証エラーを引き起こす

Default.phpのキャンセルボタンで問題が発生しています。これは、いくつかの入力フィールドと保存およびキャンセルボタンのあるフォームです。私のフォームにはいくつかの必須フィールドがあります。キャンセルボタンを使用すると、フォームの検証がアクティブになり、これらのフィールドに入力するように通知されます。

Default.phpレイアウトを使用した結果でしょうか?

5022015-更新
フォームはフロントエンドフォームであり、キャンセルボタンはJoomlaカスタムJToolBarを介して行われました

6022015-レイアウトの縮小コードを追加

<?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

これは、フロントエンドのツールバーを作成するためにここで使用されるJoomlasカスタムJToolBarの問題であると思われます。

最後の段落を参照してください: https://docs.joomla.org/Client-side_form_validation

問題は、この記事の回避策が機能しないことです。

その間に私は問題を見つけました。サイトのhmtl出力で生成されるボタンコードをよく見ると、ボタンのタイプが設定されていないことがわかります。この場合、「type = "button"」である必要があります。これが設定されていない場合、フォームの検証はどのような場合でもトリガーされます。

Dmitryの提案のような通常のボタン統合は成功につながります。カスタムツールバーのJoomlas JToolbarには修正が必要です。

2
Perino

別の解決策は、JToolBarをまったく使用しないことです。本当に必要ですか?次のようにボタンを作成するだけです(たとえば、「キャンセル」ボタン)。

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

次にJSで:

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

そして、あなたは行ってもいいです。

2
Dmitry Rekun

これは、使用しているレイアウトの結果ではなく、フォームの検証だけをスキップするキャンセルボタンの制限です。

通常、次のようなものを実装する必要があります。

_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"));
        }
    };
');
_

これはコアJoomla記事_edit.php_レイアウト( https://github.com/joomla/joomla-cms/blob/bd3d9cc947458437f790180fad4b817ee36e41d3/administrator/components/com_content/views/article/tmpl/edit .php 64行目)

基本的な考え方は、送信ハンドラーをオーバーライドして、キャンセルボタンかどうかを確認することです(_task = VIEWNAME.cancel_ ORを使用してドキュメントを検証します。これにより、キャンセルして期待どおりボタン。

あなたはおそらくこれをあなたのケースで機能させるためにいくつかのことをする必要があります:

  1. ' . $this->form->getField('articletext')->save() . 'を削除します。それはその見方に固有です。
  2. _article.cancel_を_VIEWNAME.cancel_に更新します。
  3. document.getElementById(...)をフォームのIDに更新します。
1
David Fritsch