Proje: Okul Platform · Hub: Okul Platform — Incidents
Symptom
Mobile’da popup-login-modal register tab’ından üye olmaya çalışınca, backend /kayit-ol (user.register.post) 422 dönüyor — errors.kvkk_consent, errors.name, errors.email vs. — ama form’da hiçbir hata mesajı görünmüyordu. Console’da bir süre Uncaught TypeError: n.parent().after is not a function da çıkıyordu.
Aynı sorun LGS form (/ajax/submitDynForm), scholarship form, college-show form için de geçerliydi (kvkk_consent özelinde).
Root cause — üç bug üst üste
1. mobile/app.js içindeki callAjax 422’yi handle edemiyor (latent bug)
callAjax (line ~2686) error branch’ında xhr.responseJSON referansı var:
error: function (xhr) {
var errorData = {success: false, messages: {}};
if (xhr.responseJSON) { ... }
callback(errorData);
}Framework7 1.6 Dom7’nin $$.ajax error callback’i raw XMLHttpRequest veriyor, jQuery gibi responseJSON populate etmiyor — bkz. bower_components/framework7/dist/js/framework7.js:12838-12858. Sonuç: xhr.responseJSON her zaman undefined, errorData.messages hep boş {} kalıyor.
Dosyanın geri kalanında pattern doğru: JSON.parse(data.responseText) (line 2315, 4203, 5670).
callAjax çoğu yerde 200 + {success:false, messages:{...}} wrapper’lı endpoint’lerle çalışıyor (Laravel FormRequest kullanmayan custom controller’lar), o yüzden bug uzun süredir fark edilmemiş. Login/register tek 422 dönen flow.
2. Register form field’larının id’leri name’le eşleşmiyor
mobile/components/login-popup.blade.php register tab’ında:
name="name",name="email",name="phone",name="userType"— id yokname="password"→id="popupRegisterPasswordInput"name="kvkk_consent"→id="register-kvkk_consent"
Eski kod $$("#" + i).parent().append(err) ile field’ı arıyordu — hiçbir field bulunamıyordu, hiçbir error render edilmiyordu.
3. Dom7 1.6’da .first() ve .after() yok
İlk denemede .find('[name=...]').first() ve $input.parent().after(err) yazdım — ikisi de Dom7 1.6’da yok (bkz. 2026-04-14-dom7-vs-jquery-gotchas). Silent fail veya TypeError.
Fix
mobile/app.js:5866 loginRegisterAjax fonksiyonu:
callAjax’a dokunulmadı (her yerde kullanıldığı için risk yüksek). Bunun yerineloginRegisterAjaxkendi$$.ajaxçağrısını yapıyor.- Error branch’ta
JSON.parse(xhr.responseText)ilebody.errorsveyabody.messagesparse ediliyor. - Field lookup
$form.find('[name="' + i + '"]').eq(0)(Dom7’de.first()yerine.eq(0)). - Error eklerken native DOM API:
var parentEl = $input.parent()[0]; var errEl = document.createElement('div'); errEl.className = 'error-input'; errEl.setAttribute('style', 'display: block; color: #F50000; font-size: 12px; margin-top: 4px;'); errEl.textContent = msg; parentEl.parentNode.insertBefore(errEl, parentEl.nextSibling);.after()yerineinsertBefore(node, ref.nextSibling). - Konum:
$input.parent()text input için.input-container(.form-groupflex-column içinde altta görünür); kvkk/marketing için.terms-container(flex container’dan dışarı, formda kardeş olarak). İçine eklersem icon kayıyor (input-container position:relative, absolute icon top:30%) ve flex layout’ta yan yana geliyordu.
Mevcut clear handler’lar (input/change event’leri) bu yeni konumu zaten temizliyor (.form-group veya .terms-container.parent() scope’unda .error-input siliyor).
Diğer dosyalardaki aynı pattern (aynı PR’da düzeltildi)
frontend/high-school-assistant.js:264-277—$("#" + i)kvkk için boş,#${i}-errorfallback eklendi.mobile/high_school_assistant.js:401-413— aynı.frontend/scholarship.js:113-117— 422 error branch success branch’tan farklı; kvkk için özel$("#dynamic-form #error-kvkk_consent").text(val)eklendi.frontend/college-show.js:290-298— aynı.mobile/app.js:4188-4197(dynamic-form-offer 422 branch) — aynı.
Rule
Mobile’da form 422 render ederken:
callAjax422’de boş messages dönebilir; kritik formlarda$$.ajaxdirekt kullan,JSON.parse(xhr.responseText).- Field lookup’ta
[name=]selector kullan (id varsayma; popup’larda id’ler standart değil). - Dom7 metodu kullanmadan önce 2026-04-14-dom7-vs-jquery-gotchas’a bak.
- Error yerleşiminde
.input-container(absolute icon’lu) veya.terms-container(flex) içine ekleme — sibling olarak ekle,.form-groupflex-column içinde otomatik altta görünür.
Related
- 2026-04-14-dom7-vs-jquery-gotchas — Dom7 1.6’nın bilinen API eksikleri (
.first(),.after(),responseJSONvs.) - 2026-05-06-consent-checkbox-pattern —
kvkk_consentfield naming ve BE validation pattern - 2026-04-14-mobile-login-modal-duplication — aynı popup-login-modal yapısı
- 2026-05-11-review-form-consented-user-silent-fail — consent UI silent fail benzer kategori