2015-01-23 2 views
0

У меня возникли проблемы с отправкой и проверкой формы с помощью кнопки вне формы, используя Yii2.Yii2: Внесите и подтвердите свою форму, нажав кнопку возле формы

Это мой случай:

У меня есть форма (Myform) и кнопку отправки (MyButton) внутри этой формы. Когда я нажимаю на myButton, выполняется проверка, и если проверка не выполняется, то подача не выполняется. Это, конечно, ожидается, и это работает.

Однако, что я действительно хочу, чтобы представить Myform, нажав на MyButton, который находится за пределами элемента формы. Чтобы это сделать, я просто вызываю jQuery ('myForm'). Submit(), и подача работает.

Проблема, с которой я столкнулся с этим последним сценарием, заключается в том, что проверка не удалась, но форма еще не отправлена, что не ожидается.

Как я могу отправить форму с помощью кнопки вне формы и выполнить проверку?

Это мое мнение:

<?php 

    $form = ActiveForm::begin([ 
      'validateOnSubmit' => true, 
      'type' => ActiveForm::TYPE_VERTICAL, 
      'options' => ['class' => 'main-task-form'] 
     ]); 

    echo Form::widget([ 
      'model' => $modelData, 
      'form' => $form, 
      'columns' => 2, 
      'attributes' => [ 
       'closeDate' => [ 
         'type'=> 'widget', 
         'widgetClass'=> DatePicker::className(), 
         'options'=>[ 
          'type' => DatePicker::TYPE_COMPONENT_APPEND, 
          'pluginOptions' => [ 
           'autoclose' => true, 
           'language' => 'es', 
           'format' => 'dd-mm-yyyy', 
           'todayBtn' => 'linked', 
          ], 
         ], 
        ], 
       'descriptionClose' => [ 
        'type'=>'textarea', 
        'options' => [ 
         'rows' => 3, 
        ], 
       ], 
      ], 
     ]); 
?> 



<?php ActiveForm::end() ?> 
<!-- Form Ends Here --> 


<!-- Submit Button Outside Form --> 
<?= Html::button('Completar Tarea', ['class' => 'btn btn-primary btn-task-form']) ?> 

И это код Javascript, чтобы сказать кнопку вне формы, чтобы вызвать представить:

function assignCompleteButtonToTaskForm() 
{ 

    var completeButton = jQuery ('button.btn-task-form')[0]; 
    var mainTaskForm = jQuery ('form.main-task-form')[0]; 

    completeButton.onclick = function (e) { 
     mainTaskForm.submit(); 
    } 
} 

Любая идея по этому поводу?

Также, как я могу инициировать непосредственно процесс проверки перед выполнением отправки вручную? Возможно, это поможет мне контролировать процесс отправки.

ответ

0

Я нашел решение своей проблемы, объединив некоторые из ваших предыдущих ответов. Теперь я могу запустить проверку формы и запросить подтверждение правильно, как ожидалось первоначально. See the final code. Спасибо за помощь.

0

Ну, вы можете просто сделать это, используя jQuery.

jQuery(document).ready(function($){ 
    // Set Button ID or class replacing # to . 
    $("#you_button_id").on('click', function(event){ 
     // When you click on this button don't do any thing. 
     event.preventDefault(); 
     // Set form ID and submit that form 
     $("#your_form_id").submit(); 
    }); 
}) 

попробуйте, если это будет работать.

+0

Да, это работает, подача работает как ожидалось. Проблема, с которой я сейчас сталкиваюсь, заключается в том, что отправка продолжается, даже когда проверка не выполняется. Я думаю, что это будет работать для большинства разработчиков, не являющихся разработчиками. –

4

Вы также можете вручную запустить проверку формы в Yii образом, со следующим JavaScript кода

$('#form-id').yiiActiveForm('submitForm'); 

Это будет проверить форму и возвращает true, если нет ошибок проверки иначе false.

Таким образом, вы можете комбинировать эти и формы отправки вызовов для достижения желаемого поведения.

Кроме того, иногда его хорошая идея погрузиться в код и посмотреть, как все работает внутри, вы можете видеть, как yii обрабатывает большую часть своей активной формы в frontend в yii.activeForm.js, я уверен, вы не пожалеете об этом.

+0

'submitForm' НЕ отправляет форму. Он запускает «on submit» -validation и возвращает логическое значение, чтобы указать, является ли безопасным фактическое представление. – Blizz

+0

@Blizz Правда, спасибо за исправление, я обновил ответ. Хотя и не уверен, если это лучший способ решить эту проблему. – Tahir

+0

Ну, хотя функция submitForm вызывается несколько раз сама по себе (не знаю почему), подсказка работает, за исключением чего-то: если я хочу отобразить диалог подтверждения, тогда диалог подтверждения отобразится дважды или более, поскольку иногда функция submitForm Yii возвращает false и до последнего вызова возвращает true. Смотрите видео: youtu.be/kyzZt-3E1J4. Любая идея? –

0

Я посчастливилось иметь такую ​​же ситуацию в моем коде, и я использую комбинацию обоих других ответов:

$(document).ready(function() { 
    var $form = $('#form_id"); 
    $form.on('submit', function(e) { 
     return $form.yiiActiveForm('submitForm'); 
    }); 

    $('#submit_button_id").on('click', function() { 
     $form.submit(); 
    }); 
}); 

Причина вы должны позвонить submitForm самостоятельно (если вы хотите проверить еще раз, прежде чем представить) потому что реализация по умолчанию Yii2 связывает вызов этой функции, чтобы представить входные данные в форме.Это означает, что он не будет вызван для внешнего триггера.

+0

Это странно, когда вы отлаживаете этот код, вызов «submitForm» Yii происходит более одного раза, возвращая false, и до последнего вызова он возвращает true, поэтому я не могу использовать эту функцию, чтобы определить, нужно ли выполнять фактическую Отправить. –

+0

Ну, хотя функция submitForm вызывается несколько раз сама по себе, она работает, за исключением чего-то: если я хочу отобразить диалог подтверждения, тогда диалог подтверждения отобразится дважды или более, так как иногда функция submitForm Yii возвращает false, а иногда и true , Смотрите видео по адресу: http://youtu.be/kyzZt-3E1J4 Любая идея? –