HOC SiteDokümantasyon

Veri istekleri

Sayfa ve bileşen root.props üzerindeki adlı dataRequests list/get/create/update davranışını sahiplenir. Button ve InteractiveWrapper yalnızca adlı isteği tetikler. VariableInputBlock, isteklerin okuyup yazdığı değişkenleri düzenler. Liste arayüzleri satırları VariableArrayTemplateBlock ile entry[]/array değişkene bağlayarak tekrarlar.

Zihinsel model

Sorgular ne yapacaklarına kendileri karar verir. Bir istek op, objectTypeId, args (filters, searchQuery, fieldValues — çoğu zaman {{var:id}} veya {{bind:route.*}}), açık bir select, ters include listeleri ve başarılı çalışmadan sonra sonuçları değişkenlere kopyalayan isteğe bağlı resultWrites taşır. requests.<name> okuyan blokların yazıma ihtiyacı yoktur. Button/InteractiveWrapper yalnızca action=runRequest|runMutation ve requestName ayarlar (isteğe bağlı include takma adı, loadingText/successText/errorText). Arama veya gönderim mantığını butona koymayın.

Konum

Yalnızca content.root.props.dataRequests, inputSchema ve variables okunur. dataRequests her içerik dili için ayrı saklanır. Kayıtlı kopyası olmayan bir dil, birincil dilin isteklerini kullanır. {{bind:locale}} o içerik dili kodudur (örneğin en-US). {{bind:lang}} ödeme sayfaları için en veya tr olur. İkisini de sunucu yazar; sayfanın gönderdiği değer yok sayılır. Host sayfalar ComponentBlock.props.inputMappings ile bileşen girdilerini bağlar. Üst düzey veya yanlış yerdeki anahtarlar saklanır ama detailed/runtime tarafından yok sayılır — get_design_warnings uyarır.

Şema

dataRequests[]: { name, op: list|get|create|update, objectTypeId, args?, select?, include?, resultWrites? }. filters[]: { fieldKey, operator, value?, valueFromField?, whenEmpty? }. Filtre değeri {{var:id}}, {{bind:locale}} veya {{bind:lang}} olabilir. Değişken boşken whenEmpty no-filter (varsayılan) filtreyi düşürür, no-results satır döndürmez. select döndürülecek her alanı listeler; ilişki anahtarları ve noktalı ileri yollar (category.name) dahildir. order.price gibi noktalı bir alan format number ve bir ISO para kodu kullanabilir. {{bind:…}} bu biçimli metni basar. currency yanındaki hazır para simgesi simgeyi yineler. Eksik veya boş select alan değeri döndürmez. include.select aynı kuralı izler. include[] ters ilişkileri yükler: { as, from, via, filters?, sortBy?, sortDirection?, limit?, select?, include?, rerun? }. sortDir, sortDirection yerine geçebilir. thenDir, thenDirection yerine geçebilir. from ilgili tip slug’ı, via o tipteki relation_object, as sonuç anahtarıdır. İç içe include NAMED_DATA_REQUEST_MAX_DEPTH (3) ile sınırlıdır. rerun include-only (atlanırsa varsayılan) yalnızca o include’un değişkeni değişince onu yeniden çeker; request üst isteği çalıştırır. Yalnızca bir include içinde kullanılan değişken o include’u yeniden çeker; üst sonuç ve diğer include’lar aynı nesneleri korur. resultWrites[]: { variableId, source?, distinct?, sortBy?, sortDirection?, orderFrom?, defaultVariableId? }. Yazımlar isteğe bağlıdır ve yalnızca değişkenlere kopyalar. source varsayılanı results’tır ve total, hasMore, page veya pageCount olabilir. results[].field ve images[].size gibi include yolları entry fieldValues içinden okunur. results.0.field ilk satırın alanını bir metin değişkenine kopyalar. results.field results dizisinden bir alan okumaz. results[].field yansıtılmış listedir, tek bir metin değildir. distinct tekil skaler değerleri tutar. sortBy value veya bir alan anahtarı sıralar; orderFrom üst alan yoludur (dizi veya çok satır) ve listedeki sıra kazanır, listede olmayanlar sıralama düzeninde arkada kalır. defaultVariableId, hedef değişken boşsa ilk değere ayarlar. Eşleme kaynağı requests.<name>.results.<as> bir include okur. inputSchema[]: { id, name, type }. Tokenlar: {{var:id}}, {{bind:route.*}}, {{bind:query.*}}. Metin alanları ve bileşen girdileri bu sayfanın sorgu alanlarını, değişkenlerini ve adres parametrelerini çip olarak ekler. Liste satırları: VariableArrayTemplateBlock.arrayBinding = {{var:hits}} (veya {{var:items}}); slot içinde {{var:item.<fieldKey>}}. VariableArrayTemplateBlock ve SlotSliderBlock ayrıca tam değer {{bind:requests.<name>.results}} kabul eder; her satır düzleştirilir, {{var:item.<fieldKey>}} çalışmaya devam eder. itemFilter bağlı diziyi istemcide minItems öncesinde süzer. Boş sonuç emptyContent slotunu gösterebilir. Bu değişkenler detailed görünümde clientDependencies olur, istek bağımlılığı değil. Button runRequest include ile yalnızca o takma adı yenileyebilir. Bir select girdisi alan anahtarı veya { field, format?: "html"|"excerpt", maxChars?, suffix? } olur. Metin ve format excerpt düz alıntı döndürür (maxChars 160’ı ezer, suffix varsayılanı …). format html saklanan HTML’i bırakır. format date, style short, medium veya long ya da dd/MM/yyyy gibi bir pattern alır (pattern kazanır). Değer içerik yerelinde biçimlenir; {{var:item.date}} bu metni gösterir. args.page 1 tabanlıdır; ikisi birden varsa args.offset kazanır ve page (page - 1) * limit olur. Liste sonucu total, hasMore, çözülen 1 tabanlı page ve pageCount (ceil(total / limit), en az 1) içerir. Bunları {{bind:requests.<name>.total}}, {{bind:requests.<name>.hasMore}}, {{bind:requests.<name>.page}} ve {{bind:requests.<name>.pageCount}} ile bağlayın. URL parametreleri {{bind:query.*}} üzerinde kalır. Doğrudan yükleme, ilk render’da ?page= değerini {{bind:query.page}} ile uygular. Filtre operatörü overlaps, çoklu relation_object üzerinde paylaşılan herhangi bir kimliği eşler. valueFromRoute "$id" veya "id" rota kaydının kimliğidir. Diğer valueFromRoute değerleri, o URL parametresi varsa onu kullanır (/urun/[slug] üzerinde slug); yoksa rota kaydındaki o alandan ilişki kimlikleridir. searchQuery doluyken searchFieldKeys atlanırsa text, email, phone, multilineText, url ve enum alanları aranır. Filtre operatörü contains o alandaki metni eşler. Üst düzey bir değişken syncQueryKey ile bir URL sorgu anahtarına bağlanabilir: herkese açık sayfa değişkeni o anahtardan doldurur (sunucu render dahil) ve değişiklikleri replaceState ile yazar (1. sayfa yazılmaz). Başka bir eşlenen değişken değişince sayfalama değişkenleri (syncQueryKey "page" veya bir listenin args.page bağladığı değişken) ve ham page sorgu anahtarı 1'e döner. Sayı updateVariables op add ve subtract 1…pageCount aralığına kıstırılır. pageCount'u aşan bir sayfa istekte son sayfaya çekilir. args.page {{var:id}} ise ve offset yoksa o değişken de sıkıştırılan sayfaya yazılır. Açık args.offset olduğu gibi kalır. args.excludeRouteEntry rota kaydının kimliğini düşürür. args.fallback { sortBy, sortDirection } süzülmüş satırlar limitten kısaysa, dönen kimlikleri ve rota kaydını atlayarak limite kadar doldurur. Button eylemleri requestNextPage ve requestPrevPage isteği ve bir sorgu anahtarını (varsayılan page) adlandırır, sonraki veya önceki sayfayı o URL sorgusuna yazar ve isteği yeniden çalıştırır. requestPrevPage 1. sayfada kapalıdır. requestNextPage son sayfada (page >= pageCount) kapalıdır. valueFromRoute veya excludeRouteEntry kullanan listeler rota kimliği ve slug’ına göre önbelleğe alınır; sayfa ve bileşen resultWrites satırları sunucu HTML’indedir. InteractiveWrapper adresleri Button ile aynı şekilde {{var:}} ve {{bind:}} çözer. args.thenBy ve args.thenDirection ikinci bir sıralama ekler; atlanırsa yalnızca birincil sıralama kalır. Sayfayı {{bind:query.page}} ile bağlayın. VariableInputBlock labelGap, etiket ile kontrol arasındaki boşluktur (px); atlanırsa stil sayfası kalır. documentId atlandığında örnek kimlik, hâlâ herkese açık rotası olan canlı bir sayfadır. {{bind:session.id}} httpOnly site oturumudur. Sunucu bunu yazar; sayfadan gelen değer yok sayılır. {{bind:user.id}}, {{bind:user.email}}, {{bind:user.roleLabel}} ve {{bind:user.entryId}} oturum açmış site ziyaretçisidir. Sunucu bunları yazar ve sayfanın gönderdiği user bağını yok sayar. Kimse oturum açmamışsa user yoktur. {{bind:user.id}} erişim belirtecindeki website kullanıcı kimliğidir (websiteUserId). {{bind:user.entryId}} üye nesne kaydının kimliğidir (website_users.object_entry_id). Bu iki kimlik farklıdır. Bu belirteçler oturum açmış ziyaretçi için blok metninde de çözülür. see_own, bu üyenin oluşturduğu kayıtları eşler (created_by_website_user_id, {{bind:user.id}} ile aynıdır). Kendi kendine kayıt bu sütunu yazar; rolün kullanıcı türünde see_own izni varsa id = {{bind:user.entryId}} liste filtresi o üyeyi döndürür. Bir filtre bu izni genişletmez. whenEmpty: no-results ile id = {{bind:user.entryId}}, bağ boşken satır döndürmez ve see_own kaydı eşlemediğinde de satır döndürmez. Oturum açmış ziyaretçi onaylıdır ve engelli değildir. email_verified oturum açmayı engellemez. Kayıt bir rol atar: kullanıcı türündeki role alanının varsayılanı, yoksa etiketi user olan rol, yoksa en eski rol. assign_user_role yalnızca o rolü değiştirir ve oturum açmak için gerekmez. {{bind:session.id}} misafir çerezidir. sessionOwned işaretli alan, herkese açık oluşturmada bu kimlikle damgalanır ve istemci yazamaz. sessionOwned alanı olan bir türde anonim liste, get, güncelleme, include ve ileri yüklemeler yalnızca geçerli oturumun kaydını görür. Bunun için public view_all gerekmez. view_all her satırı listeler; o kapalıyken oturum filtresi yine bu oturumun satırlarını döndürür ve read false olan bir alan gizli kalır. Anonim yanıtlar sessionOwned alan değerlerini atlar. Herkese açık slug, name ve label bu alanları seçmez. sessionOwned alanı olan bir türün listesi public_list_hidden uyarısı değildir. Filtre fieldKey id, kaydın id’sini eşler. Başka bilinmeyen bir fieldKey hiç satır eşlemez ve get_design_warnings bunu bildirir. sortBy createdAt created_at sütunudur, mutatedAt mutated_at sütunudur. Anonim create ve update, o sayfa veya sayfa bileşeni ile addaki kayıtlı isteği çalıştırır. Tarayıcı değişken değerleri, honeypot ve formStartedAt gönderebilir. Kayıtlı bir create veya update olmayan ad reddedilir. Kayıtlı args içindeki tokenlar yine çözülür. Liste ve get sayfada kayıtlı isteği çalıştırır. Yazma sınırı herkese açık alan yazma izinleridir; liste ve get, görüntüleyenin okuyamadığı alanları nesne vitrinleriyle aynı şekilde düşürür. Create args.children kabul eder: [{ objectTypeId, fieldValues, linkField }]. Çocuklar aynı işlemde eklenir. linkField yeni ebeveyne bir ilişki olmalıdır ve ziyaretçi yazamasa da damgalanır. Önce çocuk entry_created, sonra ebeveynin entry_created çalışır; ödeme initialize satırları görür. {{var:sel.0.price}} price doğrudan özellik değilse fieldValues okur; doğrudan özellik kazanır. Button action.type, kind yoksa action.kind olarak okunur.

Select seçenekleri (VariableInputBlock)

Seçenekler blok props’tan değil, değişken tanımından gelir. type: "list" ve options: [{ id, label }, …] kullanın. type: "options" kabul edilir ve list olarak işlenir. Seçeneklerde id yerine value de kullanılabilir. VariableInputBlock’ta control: "select" (veya auto).

Herkese açık oluşturma

Public create ve view_all yalnızca ziyaretçi anonimken uygulanır. Oturum açmış bir ziyaretçi yalnızca web sitesi kullanıcı rolüne göre denetlenir. Bu izinler kamusal izinlere eklenmez. Oluşturma, o nesne türünde mutate_own gerektirir. object_types haritası herhangi bir türü listeleyip başka bir türü atlarsa, public create açık olsa bile atlanan tür reddedilir. Boş bir object_types haritası oluşturma, okuma ve güncelleme için eski izindir. Anonim create/update alan izinleri, bir honeypot ve dakikada 20 mutasyonluk çerez hız sınırı kullanır. Liste ve get hız sınırına girmez. Public create ve update, eksik formStartedAt değerini ve bu damgadan antiSpam.minFillMs milisaniye önce gelen gönderimi de reddeder (varsayılan 2000, izin verilen 0–10000). Sayfa formStartedAt’ı veri isteği sağlayıcısı hidrate olurken yazar; yeni yüklenen sayfada bu pencere içindeki bir tıklama form.too_fast ile başarısız olur. 2 saatten eski bir damga form.spam_rejected ile reddedilir. Gelecekteki bir milisaniye damgası da form.spam_rejected olur. Yaş, sunucunun alış zamanından damga çıkarılınca bulunur. İstek gönderilirken alınan bir damga, yolculuk antiSpam.minFillMs değerinden uzunsa form.too_fast döndürmez. Başarısız çalışmada mesajın yanında errorCode döner. Tek düğmeli bir ödemede antiSpam.minFillMs değerini 0 yapın. Honeypot ve hız sınırı durur. Başlangıç için save_component_preset kind=form. Bağlı form bileşeninin modu login, register, request_password_reset veya update_own ise runMutation o modu kullanır. E-posta ve parola fieldValues içinde kalır. websiteUserSignIn ve websiteUserSignUp düğme eylemi değildir. Oturum açma ve kayıt, formMode değeri login veya register olan bir kullanıcı tipi formla yapılır. formMode, o sayfa bileşeninde content.root.props.formMode alanındadır. args.formComponentId o sayfa bileşeninin id’sidir. Create veya update veri isteği ve runMutation düğmesi kullanın. Sayfa yolunu site oluşturur. İstemci required nitelikleri kaldırılsa bile sunucu boş zorunlu nesne alanlarını reddeder. Create veya update yanıtı satırı birincil veritabanından yeniden okur ve view_all kapalı olsa da seçilen alanları döndürür. read false olan bir alan yine atlanır. Mutasyon başarısız olursa o isteği adlandıran düğme etiketinde sunucu hatasını gösterir (errorText varsa onu) ve yükleme durumunu kapatır.

Tarifler

İletişim formu: alan değişkenleri + VariableInputBlock + create dataRequest + Button runMutation.
Arama / liste: q (text) ve hits (entry[]) değişkenleri + list dataRequest (searchQuery {{var:q}} + resultWrites → hits) + VariableInputBlock + Button runRequest + VariableArrayTemplateBlock (arrayBinding {{var:hits}}, slot’ta {{var:item.<fieldKey>}}; entry fieldValues item üzerine düzleştirilir). Boşluk/sütun için şablonu FlexListBlock/GridListBlock ile sarın.
Yenile: aynı istek adına runRequest. args içindeki değişken üst isteği yeniden çalıştırır. Yalnızca include içinde kullanılan değişken o include’u yeniden çeker; Button runRequest include aynı işi yapar.
Beden seçici: metin dizisi değişkeni veya source images[].size / results[].size, distinct true, isteğe bağlı sortBy value ve orderFrom ürün beden alanı, defaultVariableId seçim değişkeni. Set-variable düğmelerini VariableArrayTemplateBlock içinde tekrarlayın ({{var:item}}, minItems 2). Galeriyi itemFilter ve {{var:size}} ile süzer; whenEmpty no-filter veya no-results; emptyContent boş sonucu gösterebilir. Tek eşleşen düğme aria-pressed olur. Grupta seçili düğme aria-checked ve data-selected olur.
Ürün detayı (tek get, products/[slug] gibi): bir get, category.name gibi ileri select ve sections ile images için ters include. Girdileri requests.<name>.results ve requests.<name>.results.<as> üzerinden eşleyin.
Sayfalama: args.page {{bind:query.page}} veya syncQueryKey’li {{var:pg}} ve bir limit. ?page= doğrudan yüklemede ilk render’da kullanılır. pageCount’u aşan bir sayfa istekte son sayfaya çekilir. args.page {{var:id}} ise ve offset yoksa o değişken de sıkıştırılan sayfaya yazılır. Başka bir eşlenen değişken değişince sayfa 1’e döner. Button requestNextPage ve requestPrevPage (sorgu anahtarı page) sonraki veya önceki sayfayı yazar ve yeniden çalıştırır. {{bind:requests.<name>.total}}, .hasMore ve .page bağlayın veya resultWrites source total, hasMore ya da page ile kopyalayın.
İlgili yazılar: paylaşılan ilişkide { fieldKey, operator: overlaps, valueFromRoute } filtresi, args.excludeRouteEntry ve örtüşme limitten kısaysa args.fallback. SlotSliderBlock.arrayBinding ilk slaydı öğe başına {{var:item.*}} ile tekrarlar.

İnceleme

mode=detailed: requests, requestsDetailed (include kendi dependencies ile), inputSchema, clientDependencies ve parseErrors. Üst istek bağımlılıkları yalnızca include içinde geçen değişkenleri içermez. get_design_warnings bilinmeyen blok/action ve hatalı dataRequests satırlarını bildirir.

Hazır ayarlar ve migrasyon

MCP save_component_preset {objectTypeId, kind}. Liste preset’i {{var:hits}} bağlı VariableArrayTemplateBlock ve örnek {{var:item.*}} başlığı üretir. Liste satırları VariableArrayTemplateBlock ve sayfa-güvenli bloklar kullanır.