Site Sayfaları

1.7k görüntülenme Markdown

Sayfa, sözleşme, haber, blog ve referans içeriklerini yöneten yedi uç.

Genel Bakış

Panelin Sayfalar, Sözleşmeler, Haberler, Bloglar ve Referanslar sekmelerinin hepsi tek bir içerik tipidir. Beşi de bu yedi uçtan yönetilir; aralarındaki tek fark gönderdiğiniz tip alanıdır.

İçerik dil başına tutulur: başlık, adres, gövde ve arama motoru alanları her dilde ayrı yaşar. Liste ucu geçerli dili verir, detay ucu hepsini; çeviri gerektiren her iş detaydan başlar.

Görseller ayrı uçlardan yüklenir ve tür ile adlandırılır. Hangi türün geçerli olduğu sayfanın tipine bağlıdır, bu yüzden aynı çağrı bir tipte çalışıp diğerinde reddedilebilir.

Referans

Sayfaları Listeleme

get/api/v1/admin/website/pages
Website/GetPages admin

Seçtiğiniz içerik tipindeki sayfaları döndürür.

Sorgu 4
typestringHangi içerik tipi: normal, contract, news, articles, references. Öntanımlı olarak düz sayfa.
searchstringBaşlıkta arar.
pageintKaçıncı sayfa.
limitintSayfa başına kayıt. En çok yüz.
Dönen alanlar data[] — 6 + meta — 5
idintSayfanın numarası.
typestringİçerik tipi.
titlestringGeçerli dildeki başlığı.
routestringGeçerli dildeki adresi.
categorystringKategorisinin adı.
created_atstringOluşturulma anı.
totalintToplam kayıt. Meta altında döner.
pageintBulunulan sayfa.
limitintSayfa boyutu.
type stringSüzülen içerik tipi.
next_pageintSonraki sayfa. Sıfır, son sayfadasınız demektir.
Hatalar 2
invalid_type422İçerik tipi tanınmıyor.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl 'https://panel.ornek.com/api/v1/admin/website/pages?type=news&limit=25' \
  -H "Authorization: Bearer $API_KEY"
const url = new URL('https://panel.ornek.com/api/v1/admin/website/pages');
url.searchParams.set('type', 'news');

const res  = await fetch(url, {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/website/pages?' . http_build_query(['type' => 'news', 'limit' => 25]));
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Tip verilmezse yalniz DUZ sayfalar doner; haberler ayri bir listede degil, ayni ucta.
$news = Api::Website()->GetPages([], ['type' => 'news'])['data'];

Sayfa Detayı

get/api/v1/admin/website/pages/{id}
Website/GetPage admin

Tek bir sayfayı bütün dilleri ve görselleriyle döndürür.

Dönen alanlar data — 12
idintSayfanın numarası.
typestringİçerik tipi: normal, contract, news, articles, references.
categoryintSayfanın kategorisi.
sidebarstringKenar çubuğu gösteriliyor mu.
statusstringSayfa yayında mı.
visibilitystring | nullListelerde görünürlüğü.
visible_to_userint | nullMüşteri panelinde görünüp görünmediği.
rankint | nullListedeki sırası.
optionsobjectTipe özgü seçenekler. Sözleşme seçenekleri ve arama motoru tercihi burada durur.
created_atstring | nullOluşturulma anı.
languagesobjectDil başına içerik: başlık, rota, gövde, arama motoru alanları ve referans tipinde ek metinler.
imagesobjectTür başına görsel adresi. O tipe uygun türler gelir.
Hatalar 2
page_not_found404Sayfa bulunamadı.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl 'https://panel.ornek.com/api/v1/admin/website/pages/5' \
  -H "Authorization: Bearer $API_KEY"
const res  = await fetch(`https://panel.ornek.com/api/v1/admin/website/pages/${id}`, {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/website/pages/' . $id);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Liste TEK DIL verir, detay HEPSINI; ceviri gerektiren her is detaydan baslar.
$page = Api::Website()->GetPage(['id' => $id])['data'];
$en   = $page['languages']['en'] ?? null;

Sayfa Oluşturma

post/api/v1/admin/website/pages
Website/CreatePage admin tip sonradan değişmez

Yeni bir sayfa açar ve dillerini yazar.

Gövde 15
typestringreqİçerik tipi: normal, contract, news, articles, references. Sonradan değiştirilemez.
languagesobjectreqDil başına içerik: başlık, rota, gövde ve arama motoru alanları. Gönderdiğiniz her dilde başlık gerekir.
statusstringSayfa yayında mı. Öntanımlı olarak yayında.
sidebarstringKenar çubuğu gösterilsin mi.
categoryintSayfanın kategorisi.
seo_indexintArama motorlarının sayfayı dizine almasına izin verir.
imagesobjectAynı istekte yüklenecek görseller. Tipe uymayan bir tür çağrıyı düşürür.
show_during_account_registrationintKayıt sırasında gösterilir. Sözleşme tipine özgü.
show_during_purchaseintSatın alma sırasında gösterilir. Sözleşme tipine özgü.
show_in_account_preferencesintHesap tercihlerinde gösterilir. Sözleşme tipine özgü.
mandatory_account_preferencesintHesap tercihlerinde onay zorunlu olur. Sözleşme tipine özgü.
visibilitystringSayfanın listelerde görünürlüğü. Haber ve referans tiplerinde işler.
visible_to_userintMüşteri panelinde de görünür. Haber tipine özgü.
rankintListedeki sırası. Referans tipine özgü.
websitestringReferansın adresi. Referans tipine özgü.
Dönen alanlar 201 — data — 12
dataobjectOluşan sayfa. Detay ucuyla aynı şekildedir.
Hatalar 7
invalid_type422İçerik tipi tanınmıyor.
languages_required422Hiç dil gönderilmedi.
title_required422Bir dilde başlık boş.
route_exists422Bu adres o dilde zaten kullanılıyor.
invalid_kind422Görsel türü bu tipe uymuyor.
create_failed500Sayfa oluşturulamadı.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X POST 'https://panel.ornek.com/api/v1/admin/website/pages' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"type":"normal","languages":{"tr":{"title":"Hakkimizda","content":"<p>Merhaba</p>"}}}'
const res = await fetch('https://panel.ornek.com/api/v1/admin/website/pages', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    type: 'normal',
    languages: {
      en: { title: 'About Us', content: '<p>Hello</p>' },
    },
  }),
});

const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/website/pages');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'type'      => 'normal',
        'languages' => ['en' => ['title' => 'About Us', 'content' => '<p>Hello</p>']],
    ]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Adres verilmezse basliktan uretilir; ayni dilde carpisirsa cagri 422 ile doner.
Api::Website()->CreatePage([
    'type'      => 'news',
    'languages' => ['en' => ['title' => 'Maintenance notice']],
]);

Sayfayı Güncelleme

patch/api/v1/admin/website/pages/{id}
Website/UpdatePage admin

Sayfanın gönderdiğiniz alanlarını ve dillerini değiştirir.

Gövde 14
languagesobjectreqDil başına içerik: başlık, rota, gövde ve arama motoru alanları. Gönderdiğiniz her dilde başlık gerekir.
statusstringSayfa yayında mı. Öntanımlı olarak yayında.
sidebarstringKenar çubuğu gösterilsin mi.
categoryintSayfanın kategorisi.
seo_indexintArama motorlarının sayfayı dizine almasına izin verir.
imagesobjectAynı istekte yüklenecek görseller. Tipe uymayan bir tür çağrıyı düşürür.
show_during_account_registrationintKayıt sırasında gösterilir. Sözleşme tipine özgü.
show_during_purchaseintSatın alma sırasında gösterilir. Sözleşme tipine özgü.
show_in_account_preferencesintHesap tercihlerinde gösterilir. Sözleşme tipine özgü.
mandatory_account_preferencesintHesap tercihlerinde onay zorunlu olur. Sözleşme tipine özgü.
visibilitystringSayfanın listelerde görünürlüğü. Haber ve referans tiplerinde işler.
visible_to_userintMüşteri panelinde de görünür. Haber tipine özgü.
rankintListedeki sırası. Referans tipine özgü.
websitestringReferansın adresi. Referans tipine özgü.
Dönen alanlar data — 12
dataobjectGüncel sayfa. Detay ucuyla aynı şekildedir.
Hatalar 5
page_not_found404Sayfa bulunamadı.
title_required422Bir dilde başlık boşaltıldı.
route_exists422Bu adres o dilde zaten kullanılıyor.
invalid_kind422Görsel türü bu tipe uymuyor.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X PATCH 'https://panel.ornek.com/api/v1/admin/website/pages/5' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"status":"inactive","languages":{"tr":{"title":"Sirketimiz"}}}'
const res = await fetch(`https://panel.ornek.com/api/v1/admin/website/pages/${id}`, {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    status: 'inactive',
    languages: { en: { title: 'About Our Company' } },
  }),
});

const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/website/pages/' . $id);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'PATCH',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'status'    => 'inactive',
        'languages' => ['en' => ['title' => 'About Our Company']],
    ]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Yalniz gonderilen dil yazilir, digerleri KORUNUR; tip alani yoksayilir.
Api::Website()->UpdatePage([
    'id'        => $id,
    'languages' => ['en' => ['title' => 'About Our Company']],
]);

Sayfayı Silme

delete/api/v1/admin/website/pages/{id}
Website/DeletePage admin

Sayfayı bütün dilleriyle kaldırır.

Dönen alanlar data — 2
deletedboolSilme çalıştı mı.
idintSilinen sayfanın numarası.
Hatalar 3
page_not_found404Sayfa bulunamadı.
blocked_by_gate422Bir kanca silmeyi reddetti.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X DELETE 'https://panel.ornek.com/api/v1/admin/website/pages/5' \
  -H "Authorization: Bearer $API_KEY"
const res = await fetch(`https://panel.ornek.com/api/v1/admin/website/pages/${id}`, {
  method: 'DELETE',
  headers: { Authorization: `Bearer ${apiKey}` },
});

const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/website/pages/' . $id);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'DELETE',
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Yayindan kaldirmak icin silmek yerine DURUMU kapatin: adres ve gecmis korunur.
Api::Website()->UpdatePage(['id' => $id, 'status' => 'inactive']);

Sayfa Görseli Yükleme

put/api/v1/admin/website/pages/{id}/images/{kind}
Website/UploadPageImage admin

Bir sayfa görselini yükler ve öncekinin yerine koyar.

Yol 2
idintSayfanın numarası.
kindstringGörsel türü: header-background, cover, mockup. Kapak türü haber, blog ve referansta; maket türü ise referansta geçerli.
Gövde 1
imagestringreqYüklenecek görsel. Adres ya da gömülü veri olarak verilebilir.
Dönen alanlar 201 — data — 2
kindstringYüklenen görselin türü.
urlstringGörselin genel adresi.
Hatalar 3
page_not_found404Sayfa bulunamadı.
invalid_kind422Görsel türü bu tipe uymuyor.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X PUT 'https://panel.ornek.com/api/v1/admin/website/pages/5/images/header-background' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"image":"https://ornek.com/afis.jpg"}'
const res = await fetch(`https://panel.ornek.com/api/v1/admin/website/pages/${id}/images/header-background`, {
  method: 'PUT',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ image: 'https://example.com/banner.jpg' }),
});

const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/website/pages/' . $id . '/images/header-background');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'PUT',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['image' => 'https://example.com/banner.jpg']),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Kapak ve maket turleri kucuk resmi de URETIR; afis turu tek dosya birakir.
Api::Website()->UploadPageImage([
    'id' => $id, 'kind' => 'cover', 'image' => $data,
]);

Sayfa Görselini Kaldırma

delete/api/v1/admin/website/pages/{id}/images/{kind}
Website/DeletePageImage admin

Bir sayfa görselini ve varsa küçük resmini kaldırır.

Yol 2
idintSayfanın numarası.
kindstringKaldırılacak görsel türü: header-background, cover, mockup.
Dönen alanlar data — 3
deletedboolSilme çalıştı mı.
idintSayfanın numarası.
kindstringKaldırılan görsel türü.
Hatalar 3
page_not_found404Sayfa bulunamadı.
invalid_kind422Görsel türü bu tipe uymuyor.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X DELETE 'https://panel.ornek.com/api/v1/admin/website/pages/5/images/header-background' \
  -H "Authorization: Bearer $API_KEY"
const res = await fetch(`https://panel.ornek.com/api/v1/admin/website/pages/${id}/images/header-background`, {
  method: 'DELETE',
  headers: { Authorization: `Bearer ${apiKey}` },
});

const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/website/pages/' . $id . '/images/header-background');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'DELETE',
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Gorseli DEGISTIRMEK icin once silmeye gerek yok; yukleme zaten yerine koyar.
Api::Website()->DeletePageImage(['id' => $id, 'kind' => 'cover']);

Tuzaklar

Tip oluşturma anında seçilir

İçerik tipi kaydın kimliğinin bir parçasıdır ve güncelleme onu yoksayar. Düz sayfa olarak açılmış bir kaydı habere çeviremezsiniz; doğru tiple yeniden oluşturup eskisini kaldırmanız gerekir. Tip yanlış girildiğinde bu, adresin ve görsellerin de yeniden kurulması demektir.

Adres dil başına benzersizdir

Aynı adres farklı dillerde yan yana durabilir, ama tek bir dilde iki sayfa aynı adresi taşıyamaz. Çakışma hatası hangi dilde olduğunu söyler. Adres göndermezseniz başlıktan üretilir; benzer başlıklı iki haber bu yüzden beklenmedik bir çakışma yaratabilir.

Görsel türü sayfa tipine bağlıdır

Afiş görseli her tipte geçerlidir; kapak haber, blog ve referansta, maket ise referansta kabul edilir. Uymayan bir tür 422 ile döner. Bu sayfa oluştururken de geçerlidir: gövdeye konan geçersiz bir görsel türü sayfanın hiç oluşmamasına yol açar.

Tipe ait alanlar diğerlerinde sessizce durur

Sözleşmenin onay seçenekleri, haberin müşteri panelinde görünmesi ve referansın sırası ile adresi kendi tiplerinde iş görür. Başka bir tipte gönderilirse hata alınmaz, değer de bir işe yaramaz. Beklediğiniz davranış çıkmıyorsa önce kaydın tipini doğrulayın.

Güncelleme dilleri birleştirir

Güncellemede gönderdiğiniz diller yazılır, göndermedikleriniz korunur. Yani tek bir dili düzeltmek için diğerlerini taşımanız gerekmez. Bu, sitenin diğer bazı yazma uçlarından farklıdır; oralarda gövde tanımın tamamı sayılır ve eksik bırakılan silinir.

Faydalı oldu mu?

Geri bildiriminiz için teşekkürler!

Hâlâ Yardıma mı İhtiyacınız Var?

Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.