Grav: 101

Bir İçerik Yönetim Sistemi (CMS) seçiminde seçeneklerin popülerliği (geliştirici, kullanım vb.) kadar sundukları teknik ve pratik özellikler de değerlendirilmeli.

AA

WordPress PHP programlama dili üzerinde geliştirilen, güçlü bir API desteği sunan, oldukça yaygın bir kullanım ve geliştirici topluluğunu sahip en başarılı örneklerden biri. Ancak, özellikle bilgiayar teknolojilerine aşina olmayan veya sadece temel bir soruna çözüm sağlamak isteyen kullanıcılar için maalesef bir öğrenme eşiği söz konusu.

Özellikle, temelde içerik üretmenin bulunduğu durumlarda eklentiler, fonksiyonlar vb. konular da avantaj olmak bir yana sorunun kendisi haline de gelebilmekteler. Bu tür durumlara karşın, kişisel deneyimlerim çerçevesinde önerdiğim birkaç içerik yönetim sistemi bulunuyor; Ghost ve Grav. Ghost bir başka yazının konusu olarak şimdilik kenarda dursun ve Grav ile devam edelim.

Grav CMS

Grav: 101

Grav, 2014 yılından bu yana PHP dili kullanılarak geliştirilen flat-file (dosya tabanlı) bir içerik yönetim sistemi. 2016 yılında En İyi Açık Kaynak İçerik Yönetim Sistemi (Best Open Source CMS), 2017 ve 2019 yıllarında ise En İyi Dosya Tabanlı İçerik Yönetim Sistemi (Best Flat File CMS) ödüllerini alan Grav içerikleri markdown ifadeleri ile yazılır ve Twig template sistemi ile işlenir1 2. Sistem nasıl davranacağı yaml dosyaları ile belirlenir. Yani, bir eklenti veya özelleştirme için çoğu zaman PHP fonksiyonu yazmak yerine ilgili blueprint (Grav yaml dosyalarını bu şekilde tanımlamakta) dosyasına 1-2 satır eklemek yeterli olabilmektedir. Kişisel olarak bu yapıyı oldukça başarılı bulduğumu sık sık dile getirmekteyim. Şimdi, Grav sistemine dair detaylara girmeden önce, geçmişte Grav ile ilgili ne tür yazılar yayınlamışım bir bakalım.

Görüldüğü üzere, yazılar ağırlık olarak farklı ortamlar ve gereksinimler doğrultusundaki kurulumlar özelinde gruplandırılabilir. O halde kurulumdan bir sonraki aşamaya geçebiliriz.

Grav CMS: Admin Panel

Grav CMS

Grav diğer pek çok popüler içerik yönetim sisteminde tercih edilen PostgreSQL, MsSQL, MySQL gibi bir veritabanına ihtiyaç duymaz ve tüm işlemlerini metin tabanlı dosyalar aracılığıyla gerçekleştirir. Örneğin, içerikler *.md (Markdown) formatında saklanırken, yapılandırma dosyaları \*.yaml (YAML: YAML Ain’t Markup Language) dosyası olarak tutulur. Yani, web sayfanıza ait tüm dosyaları kopyala-yapıştır ile kolaylıkla kopyalayabilir, farklı barındırma alanlarına taşıyabilirsiniz ve hemen hiçbir değişiklik olmamış gibi kaldığınız yerden web sitenizi kullanmaya devam edebilirsiniz.

Grav CMS, en temel kurulum3 sonrasında kendine ait bir komut satırı uygulaması olan Grav CLI aracılığıyla yönetilir. Ancak, eklenti olarak bir yönetim paneli4 seçeneği de mevcuttur. Grav, bir içerik yönetim sisteminden beklenen tüm özelliklere kolaylıkla ve etkili bir şekilde cevap verebilecek teknik özelliklere sahiptir. Ek olarak, eklentiler vasıtasıyla bir e-ticaret sitesine5 dönüştürülebilir, çoklu dil (multi-language) ve çoklu kullanım (multi-site) yetenekleri kazandırılabilir ya da REST API6 eklentisiyle bir sisteme entegre edilebilir veya Headless CMS olarak kullanılabilir. Daha önce de belirttiğim gibi, bir geliştirme ihtiyacınız olduğunda, çoğu zaman PHP kodu yazmak yerine birkaç twig veya yaml satırı ile çözüme kolaylıkla ulaşabilmektesiniz. Bu da Grav’ı tasarımcılar ve web geliştirme ajansları için etkili bir çözüm haline getirmekte.

Grav CMS Modular Page

Grav İçerik Yönetim Sistemi

Az önce de belirttiğim gibi, Grav yapılandırma sürecini oldukça pratik bir şekilde çözmekte. Ancak, bu da beraberinde çeşitli sınırlandırmaları getirmekte. Örneğin, kompleks bir sistem ihtiyacında Grav doğrudan bir çözüm olmayacaktır. Örneğin, yoğun alışveriş işlemlerinin söz konusu olduğu, farklı sistemlerin (ERP, CRM vb.) entegre edildiği, kullanıcı özelleştirmeleri ve etkileşimlerinin olduğu bir durum içerisinde Grav’a yer vermek çok mantıklı olmayacaktır. Peki, kimlere öneririm?

  • Kurumsal web siteleri (firmalar, ajanslar, startuplar, yerinde servisler),
  • Butik alışveriş siteleri,
  • Kuaförler, çiçekçiler, dekorasyon gibi rezervasyon gerektiren çözümler,
  • Marka-kampanya temelinde mikro websiteleri ve varış sayfaları (landing page),
  • Restoranlar, kafeler ve eğlence yerleri,
  • Sivil toplum kuruluşları,
  • Kişisel web siteleri (gazeteci, yazar, blogger, araştırmacı, danışman, avukat, diyetisyen, sanatçı, tasarımcı vb.),
  • Podcast yayıncıları,
  • Sağlık, güzellik ve spor web siteleri,
  • Servis ve Uygulamalar

Örneğin, cep telefonunuzda bulunan iA Writer gibi bir editör aracılığıyla ya da Dropbox ya da Github / Gitlab / BitBucket7 ile kolaylıkla içerik oluşturabilirsiniz. Vaktinizi bir panele erişmek yerine sadece içeriğin kendisine ayırmanız yeterli. Post işlemi veya veritabanı kaydı olmadığı için yaşanacak bir bağlantı sorununda içeriğinizi kaybetmezsiniz.

Bu başlıkları elbette daha da detaylandırmak mümkün. Ancak, ilgili maddeler üzerinden Grav’a dair bir çerçeve çizebildiğimi umuyorum.

Grav Medi Theme

Örnek olarak Medi temasını inceleyebilirsiniz.

Dosya Yapısı ve İçerik Üretimi

GetGrav.org üzerinden idirilen paket şu dosya / dizin yapısına sahiptir8. Root dizine bu dosyaların atılması yeterli olacaktır. Bizim için önemli olan ise /user klasörü.

CHANGELOG.md       LICENSE.txt        backup             composer.json      index.php          robots.txt         user
CODE_OF_CONDUCT.md README.md          bin                composer.lock      logs               system             vendor
CONTRIBUTING.md    assets             cache              images             now.json           tmp                webserver-configs

/user içeriğimiz ise şu şekilde;

accounts config   data     pages    plugins  themes

/accounts oluşturulan kullanıcılara ait konfigürasyonları barındırır9. Dosyalar <kullaniciadi>.yaml şeklinde tutulur. /config eklenti, site ve güvenlik ayarları gibi websitesinin nasıl davranacağına dair yönergeleri içerir. Tüm bu işlemler ayrı dosyalar halinde ve yine yaml uzantılı olarak tutulur.

backups.yaml   media.yaml     scheduler.yaml security.yaml  site.yaml      streams.yaml   system.yaml
plugins:
aboutme.yaml      pagination.yaml   relatedpages.yaml simplesearch.yaml taxonomylist.yaml

/data bir eklenti ve/veya fonksiyon neticesinde oluşturulan verileri barındırır. Örneğin, md formatındaki içeriklerin feed, sitemap vb. yığınları, bildirimler ve benzeri derlenmiş yaml dosyaları burada yer alacaktır. Gelelim sıklıkla kullanacağımız /themes , /plugins ve /pages klasörlerine.

Grav CMS Page

/themes temaların, /plugins ise eklentilerin bulunduğu klasörlerdir. Temalar ve eklentiler kendi klasörlerinde yapılandırma yönergelerini taşırlar ve sistem seviyesinde (belirli sınırlar dahilinde) ayarlara erişebilir ve bu ayarları değiştirebilirler. Kurulumla birlikte Quark10 teması da paket içerisinde gelmektedir. /pages klasörü içeriklerin bulunduğu alandır.

01.home:
departments _doctors     _hero        _steps       _welcome     default.md

02.about:
1.jpg    about.md

03.departments:
01.dentistry       02.cardiology      03.ent-specialists 04.astrology       05.neuroanatomy    06.blood-screening departments.md

04.blog:
01.hello-world 02.bye         blog.md

05.contact:
contact.md

06.category:
category.md

Her içerik bir klasör olarak tutulur. Örneğin, Home sayfası için home veya 01.home klasörüne ve bu klasör altında da *.md uzantılı markdown dosyasına ihtiyacımız olacaktır11.

---
title: Home
content:
    items: '@self.modular'
    order:
        custom:

            - _hero
            - _welcome
            - _departments
            - _doctors
            - _steps

---
This is really ***very*** important text.

--- alanları header içeriğidir ve sayfa özelliklerini belirler. Bir yönetim paneline ihtiyaç olmadan, CLI aracılığıyla sayfanın nasıl davranması gerektiğine dair bilgileri bu bölüm içerisinde belirtiriz. Örneğin, yukarıdaki bilgilere bakıldığında, Home sayfası bir modular page ve içerisinde _hero , _welcome , _departments , _doctors , _steps modüllerini belirtilen sıra ile göstermekte. Klasör isimlerindeki 01 gibi rahamlar klasörün sırasını (order) belirtir. Bu sayede navigasyon, içerik listeleme vb. alanlarda belirtilen rakam belirtilen şekilde (asc veya desc gibi) işleme alınır. Ancak, bir dizinin başında _ ise bu ilgili dizinin public olarak erişilemeyeceğini, ilgili dizinin bir sayfanın parçası olarak ele alınacağını gösterir. Örneğin, modüller bu şekilde ifade edilir.

/user
└── /pages
    ├── /01.home
    │   ├── /_header
    │   ├── /_features
    │   ├── /_body
    ├── /02.blog
    │   ├── /blog-item-1
    │   ├── /blog-item-2
    │   ├── /blog-item-3
    │   ├── /blog-item-4
    │   └── /blog-item-5
    ├── /03.services
    │   ├── /service-item-1
    │   ├── /service-item-2
    ├── /04.about-us
    ├── /05.contact
    └── /error

Sayfa Türleri

Grav standard, listing ve modular olmak üzere 3 sayfa tipine sahiptir.

Standard (veya Regular) sayfa tipi ön tanımlı sayfa tipidir. Genelde içerik sayfaları (blog post, about, contact, error vb.) bu sayfa tipinde sunulur.

Grav CMS Sayfa Tipleri

Listing, blog gibi alt sayfalara (child pages) sahip sayfa tipidir. Blog yayını, servisler, departmanlar, ürünler, haberler ve benzeri yapılar için bu sayfa tipi kullanılır. Bu sayfa tipinde gösterilecek alt içerik sayısı (limit), sayfalandırma (pagination), içeriklerin sıralanması (order) gibi kararlar oluşturulabilmektedir.

Modular sayfa tipi lego mantığı ile hareket eden, farklı modüllerin bir arada bulunduğu ve yönetilebildiği sayfalardır. Örneğin, bir kurumsal web siteniz olsun. Anasayfanızda bir slider, hizmetlere dair özetler, kullanıcı yorumları, son eklenen ürünler, son yayınlanan blog yazıları ve benzeri içerikleri bir arada sunmak istediğinizi varsayalım. Bu tür bir sayfayı modular page ile oluşturabilirsiniz.

Tekrar başa dönmek gerekirse, Grav’ın twig template motorunu kullandığını söylemiştim. Temalar içerisinde sayfalar bir hedef gözetilerek oluştururlar ve bu hedefe uygun twig komutları (include, extend, block vb.) içerirler. Dolayısıyla, sayfaları oluştururken sadece kullanılabilecek modüller ve sayfalar seçilebilir. Örneğin, yukarıda içeriğini gördüğümüz home bir modular page’dir ve içeriğinde 5 adet modül barındırmaktadır. Bu modüllerin sırasını ilgili dosya üzerinden değiştirebiliriz. Ancak, ilgili modülü sayfadan kaldırmak için o modüle ait içeriği (klasör) silmemiz gerekir. Mesela, _hero modülünün anasayfada görüntülenmesini istemiyorsak pages > 01.home > _hero yolunu takip edip _hero klasörünü silmemiz gerekir.

Son olarak, bir tema ile uyumlu şekilde oluşturulan içerikler bir başka temada doğru şekilde çalışmayabilirler. Bu durumda içeriklerin header yapılarının yeniden ele alınması gerekir.

Çoklu Dil

Grav ile kolaylıkla çok dilli bir web sayfası oluşturulabilir. Routing12 yapısı sayesinde her dil için URL parametreleri veya farklı URL tanımları kullanılabilir. Örneğin, anasayfayı İngilizce için /homepage , Fransızca için /page-d-accueil şeklinde tanımlayabiliriz.

home:
  aliases:
    en: /homepage
    fr: /page-d-accueil

Bu süreçte elbette canonical ve redirection gibi pek çok özellikten de kolaylıkla faydalanabilmekteyiz.

SEO

Çok dilli olsun ya da olmasın arama motoru optimizasyonu için gerekli olan neredeyse her özellik Grav tarafından ön tanımlı olarak sunulmakta. Diğer yandan, ön bellek (caching), görsel optimizasyonu ve daha pek çok yapı doğrudan yönetilebilmekte.

E-ticaret

Grav ile oluşturulan bir web sitesine Snipcart tarafından sunulan Snipcart eklentisi ile kolaylıkla e-ticaret özelliği kazandırılabilmekte. Ancak, WooCommerce gibi gömülü bir yapı mümkün değil.

Yönetim Paneli

Yukarıda genel olarak CLI ve yönetim paneli tarafından ortak ele alınan konulara değinmeye çalıştım. Belirttiğim gibi, pek çok düzenleme için ilgili yaml dosyasına müdahale etmek yeterli oluyor. Blueprints olarak ifade edilen bu dosyalar sayesinde tanımlanan her sayfa türü için içerik yönetim bölümleri özelleştirilebilmekte13. Örneğin, yeni alanlar (fields), tab’ler eklenebilir. WordPress eklenti ve tema fonksiyonlarında hook’lar aracılığıyla yapılan bu işlemler sadece bir kaç yaml satırı ile kolaylıkla oluşturulabilmekte. Dolayısıyla, tema kullanıcısı için arayüz çok daha etkili bir hale getirilebilemekte.

İleri Okumalar