Při přidaní dalšího produktu nevalidovat form
- jAkErCZ
- Člen | 322
Zdravím,
mám problém mám form na kterém mám udělaný custom valider a mám problém že jakmile chci přidat další řádek spustí to validaci celého formu ale já chci aby když kliknu na tlačítko přidat produkt tak mi to nebude validovat a jakmile budu chtít odeslat form poté to bude validovat..
Došel jsem do fáze kdy do inputu který má přidat nový řádek se přidá atribut clicked=„true“
$(".validate-form").submit(function(){
var check = true;
for(var i=0; i<input.length; i++) {
if(validate(input[i]) == false){
showValidate(input[i]);
check=false;
}
}
return check;
});
$(".validate-form input[type=submit]").click(function() {
$("input[type=submit]", $(this).parents(".validate-form ")).removeAttr("clicked");
$(this).attr("clicked", "true");
});
Možnost přidat produkt:
<input type="submit" name="multiplier[multiplier_creator]" value="Další produkt" formnovalidate="" data-nette-validation-scope="["multiplier"]" class="btn btn-form width-100 mb-xs">
Odeslání celého formu:
<button type="submit" onsubmit="return validateForm()" class="contact100-form-btn" name="_submit" value="">Nezávazně poptat</button>
Celý js který validuje form:
(function ($) {
"use strict";
/*==================================================================
[ Validate ]*/
var input = $('.validate-input .input100');
$(".validate-form").submit(function(){
var check = true;
for(var i=0; i<input.length; i++) {
if(validate(input[i]) == false){
showValidate(input[i]);
check=false;
}
}
return check;
});
$(".validate-form input[type=submit]").click(function() {
$("input[type=submit]", $(this).parents(".validate-form ")).removeAttr("clicked");
$(this).attr("clicked", "true");
});
$('.validate-form .input100').each(function(){
$(this).focus(function(){
hideValidate(this);
});
});
function validate (input) {
if($(input).attr('type') == 'email' || $(input).attr('name') == 'email') {
if($(input).val().trim().match(/^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{1,5}|[0-9]{1,3})(\]?)$/) == null) {
return false;
}
}
else {
if($(input).val().trim() == ''){
return false;
}
}
}
function showValidate(input) {
var thisAlert = $(input).parent();
$(thisAlert).addClass('alert-validate');
}
function hideValidate(input) {
var thisAlert = $(input).parent();
$(thisAlert).removeClass('alert-validate');
}
})(jQuery);
Díky všem za pomoc nebo radu.
- Martk
- Člen | 661
Musíš upravit validation scope. Defaultně se validuje celý multiplier
$multiplier->addCreateButton('Přidat produkt')
->setValidationScope([]);
a pokud tohle není řešení a chceš to javascriptově, tak tady je inspirace:
$('html').on('click', '.validate-form input[type="submit"]', function (e) {
var hasNoValidate = $(this).attr('formnovalidate');
// nevaliduj
if (typeof hasNoValidate === 'undefined' || hasNoValidate === false) {
e.preventDefault();
return false;
}
validateForm($(this).parents('form:first'));
});
Editoval Martk (20. 6. 2018 22:01)
- jAkErCZ
- Člen | 322
Martk napsal(a):
Musíš upravit validation scope. Defaultně se validuje celý multiplier
$multiplier->addCreateButton('Přidat produkt') ->setValidationScope([]);
a pokud tohle není řešení a chceš to javascriptově, tak tady je inspirace:
$('html').on('click', '.validate-form input[type="submit"]', function (e) { var hasNoValidate = $(this).attr('formnovalidate'); // nevaliduj if (typeof hasNoValidate === 'undefined' || hasNoValidate === false) { e.preventDefault(); return false; } validateForm($(this).parents('form:first')); });
Co se týče toho kódu ->setValidationScope([]) tak to bohužel nefunguje jelikož validace je udělaná v js kde to reaguje na submit.
A co se týče js v tom se zase tak moc nevyznám proto bych byl rád nějak víc poradit jak to udělat…
tohle je ten input na kterém chci aby nespouštěl validaci…
<input type="submit" name="multiplier[multiplier_creator]" value="Přidat produkt" formnovalidate="" data-nette-validation-scope="["multiplier"]" class="btn btn-form width-100 mb-xs" clicked="true">
Hodnota: clicked=„true“ se tam přidá po kliknutí na input
Tohle pouští celou validaci:
$(".validate-form").submit(function(){
var check = true;
for(var i=0; i<input.length; i++) {
if(validate(input[i]) == false){
showValidate(input[i]);
check=false;
}
}
return check;
});
Díky
Editoval jAkErCZ (22. 6. 2018 12:13)
- Martk
- Člen | 661
$(".validate-form").submit(function(e) {
var noValidate = $(this).find('[clicked="true"][noformvalidate]').length !== 0;
if (noValidate) {
return true;
}
e.preventDefault();
var check = true;
for(var i=0; i<input.length; i++) {
if(validate(input[i]) == false){
showValidate(input[i]);
check=false;
}
}
if (check) {
$(this).unbind('submit').submit();
}
return check;
});
Editoval Martk (24. 6. 2018 11:53)
- jAkErCZ
- Člen | 322
Martk napsal(a):
$(".validate-form").submit(function(e) { var noValidate = $(this).find('[clicked="true"][noformvalidate]').length !== 0; if (noValidate) { return true; } e.preventDefault(); var check = true; for(var i=0; i<input.length; i++) { if(validate(input[i]) == false){ showValidate(input[i]); check=false; } } if (check) { $(this).unbind('submit').submit(); } return check; });
Děkuji, ale i při tvém řešení když kliknu na Přidat produkt i tak se mi všechno začne validovat… Říkám si jestli to není tím že tu druhou část formu nemám ve vlastním kontejneru…
Form:
*/
protected function createComponentInquiryForm()
{
$form = new Form;
$form->addRadioList('material', '', ([
'pvc' => 'Plast',
'eur' => 'Dřevo',
]));
$copies = 1;
$maxCopies = 10;
$multiplier = $form->addMultiplier('multiplier', function (\Nette\Forms\Container $container, \Nette\Forms\Form $form) {
$container->addRadioList('atribut', '', ([
'window' => 'Okno',
'door' => 'Dveře',
'balcony' => 'Balkón',
'gate' => 'Vrata',
'sliding' => 'Posuvné dveře',
]));
$container->addText('width', '');
$container->addText('height', '');
$container->addText('pieces', '');
}, $copies, $maxCopies);
$multiplier->addCreateButton('Přidat produkt', 1, function (Submitter $submitter) {
$submitter->setValidationScope(false);
});
$form->addRadioList('windows', '', ([
'dvoj' => 'Dvojsklo',
'troj' => 'Trojsklo',
]));
$form->addCheckbox('demontaz', '');
$form->addCheckbox('montaz', '');
$form->addCheckbox('zednicka', '');
$form->addCheckbox('likvidace', '');
$form->addCheckbox('zaluzie', '');
$form->addCheckbox('sitky', '');
$form->addCheckbox('vni_parapet', '');
$form->addCheckbox('ven_parapet', '');
$form->addText('first_name','');
$form->addText('last_name', '');
$form->addText('email', '');
$form->addText('phone', '');
$form->addTextArea('message', '');
$form->addSubmit('submit', '');
$form->getComponent('submit')->onClick[] = [$this, 'inquiryFormSucceeded'];
return $form;
}