Proje: Okul Platform · Hub: Okul Platform — Conventions

Consent checkbox pattern

Tüm lead/contact form’larında KVKK sözleşmesi ile pazarlama izni ayrı checkbox’larda gösterilir. Tek bir “Kullanıcı sözleşmesi VE pazarlama izni” combined checkbox kullanılmaz.

Field isimleri (kanonik)

  • kvkk_consent — Kullanıcı ve Gizlilik Sözleşmesi (zorunlu)
  • marketing_consent — Pazarlama / KVKK ticari elektronik ileti izni (opsiyonel)

Eski terms field’ı deprecated; yeni form’larda kullanma. Sadece bazı legacy endpoint’lerde hâlâ aranır (bkz. 2026-05-06-consent-fe-bypass-broken-endpoints).

Blade pattern

@if(!\App\Service\UserService::hasAuthUserConsentedToKvkk())
    <visible kvkk_consent checkbox>
@else
    {{ Form::hidden('kvkk_consent', 1) }}
@endif
 
@if(!\App\Service\UserService::hasAuthUserConsentedToMarketing())
    <visible marketing_consent checkbox>
@else
    {{ Form::hidden('marketing_consent', 1) }}
@endif

Neden @else ile hidden input? Login olmuş, daha önce consent vermiş kullanıcıya checkbox tekrar gösterilmez. Ama BE’ye değer gitmesi gerekiyorsa (legacy terms-bekleyen endpoint’ler veya gelecekte sıkı validation) hidden input ile otomatik 1 yollanır.

Helper’lar

app/Service/UserService.php:

  • hasAuthUserConsentedToKvkk(): bool — User imza tablosundan (UserAgreementTextSign + aktif TYPE_B2C_KVKK_CONSENT agreement) veya user_details.kvkk === '1'. Cache’li (KVKK_CONSENT_CACHE_TTL_DAYS).
  • hasAuthUserConsentedToMarketing(): booluser_details.notification === Config::USER_NOTIFICATION_ALL_ID.

Backend validation pattern

FormRequest rules:

use App\Service\UserService;
 
'kvkk_consent' => [
    UserService::hasAuthUserConsentedToKvkk() ? 'sometimes' : 'required',
    'accepted',
],
'marketing_consent' => [
    'sometimes',
    'accepted',
],

Mesajlar:

'kvkk_consent.required' => 'Kullanıcı sözleşmesini kabul etmelisiniz.',
'kvkk_consent.accepted' => 'Kullanıcı sözleşmesini kabul etmelisiniz.',
'marketing_consent.accepted' => 'Pazarlama iznini kabul etmelisiniz.',

Persist:

  • KVKK → UserAgreementTextSign insert (aktif agreement) veya user_details.kvkk = '1'. Cache invalidate: UserService::forgetKvkkConsentCacheForUser($userId).
  • Marketing → user_details.notification = Config::USER_NOTIFICATION_ALL_ID.

SchoolOfferService::validate() (~line 420) referans implementasyon. ConsentService::normalizeKvkkConsent() ve normalizeMarketingConsent() helper’ları var.

Bu pattern’e sahip endpoint’ler (referans)

  • Front/SchoolOfferRequest.php/ajax/submitOfferForm/{id}, /ajax/submitDynForm
  • Front/SchoolCommentRequest.php/ajax/addComment
  • Front/RegisterRequest.php/uye-ol
  • Front/ProfilingMultiOfferRequest.php/egitim-yaklasimi-testi/cok-okula-basvur