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.
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: 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.
- Grav Nedir? Nasıl Kurulur?
- DigitalOcean Ubuntu Üzerine Nginx Grav Kurulumu
- Windows Ortamında Grav Kurulumu
- Grav CLI Nedir? Nasıl Kullanılır?
- Grav SubDomain (Alt Alanadı) Multisite Kullanımı
- Grav SubDirectory (Alt Klasör) Multisite Kullanımı
- Grav Multisite (Çoklu Site) ve Multilang (Çoklu Dil) Kullanımı
- Grav SnipCart Kurulumu
- Grav + Dropbox İle Site Yayını
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
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 İç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.
Ö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.
/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.
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
- Grav (CMS). Wikipedia ↩
- What is Grav? Grav Documentation ↩
- Installation. Grav Documentation ↩
- Administration Panel. Grav Documentation ↩
- Shop. Grav ↩
- A REST API plugin for GravCMS. Regaez/grav-plugin-api. GitHub ↩
- Paul Hibbitts. (2016). Git-Sync Plugin ↩
- Folder Structure. Grav Documentation ↩
- Configuration ↩
- getgrav/grav-theme-quark. GitHub ↩
- Basic Tutorial. Grav Documentation ↩
- Routing. Grav Documentation ↩
- Blueprints. Grav Documentation ↩