CakePHP Xml: Sitemap Oluşturalım

Merhaba,

PHP çatıları arasında hangisini tercih etmezsin diye sorulursa bir gün CakePHP diyeceğimden kuşkunuz olmasın.

CakePHP üzerine geniş bir bilgim yok aslında. Bunun nedeni ise yine çatının kendisinde saklı. Çok dar ve kısıtlı bir topluluk desteği var. Bunun yanı sıra güncellemelerde gelen metodların çok sık değişmesi ve kullanıcı kitlesinin az olması gibi birçok olumsuz neden sayabilirim. Ve bugün tüm bu olumsuzluklara rağmen CakePHP 3.x sürümü ile bir çalışma yapacağız.

Bu çalışma kodlarını açıklamak benim için oldukça zorlu olacak. Çünkü yerel sunucumda çalışan sitemap, sunucuda hata verdi. Bu yüzden nerde ne kullanacağımı ben de kestiremiyorum. Birkaç günlük yoğun bir araştırma ile Xml elde ettim ve gelen verimi ekrana bastırmayı başardım.

Sitemap Paketi

Öncelikle GitHub’ta CakePHP için yazılmış bir paket bulunmakta. Ben temiz bir CakePHP sürümünü üzerinde değil de zaten kompleks olan bir betik üzerinde çalıştığım için midir yoksa bilgi eksikliğinden midir bilemiyorum paketi çalıştıramadım. Birçok yere mail attım lakin yine de çözüm bulamadım.

Ben paylaşayım, eğer çalıştırmayı başarırsanız mailinizi bekliyorum.

https://github.com/loadsys/CakePHP-Sitemap

Controller

Her çatıda ve her MVC mimarisinde olduğu gibi CakePHP de sağ olsun bize bu güzelliği sunan teknolojilerden. Bazı çatılarda yönlendirme metodları ile controller ve model akışını ayarlayabiliyoruz. Fakat CakePHP de dosya isimlerine göre belirleniyor. O yüzden buna dikkat edelim.

Ana dizinimde src/Controller içerisinde SitemapController adında bir dosya oluşturuyorum.

namespace App\Controller;
use App\Controller\AppController;
use Cake\Event\Event;
class SitemapController extends FrontController 
{    
public function initialize() {
parent::initialize();
$this->loadComponent('RequestHandler');     
} 
public function index() {
$this->loadModel('SitemapModel');
$data = $this->Sitemap->find('all');
$compact = $this->set(compact('data'));
}  
}

Model

Model dosyamı oluşturmamın buradaki tek nedeni ORM kullandığım için.tablomu seçmek.

Ana dizinimde src/Model/Table içerisinde SitemapTable.php adında bir dosya oluşturuyorum.

namespace App\Model\Table;
use Cake\ORM\Table;
class SitemapTable extends Table
{
public function initialize(array $config)
{
$this->table('pages');
}
}

Benim pages ismindeki tablomdaki verileri Controller dosyamdaki find metodu ile çekebilirim artık.

Burada yer alan table metodu CakePHP 2.x sürümlerinde setTable imiş galiba.

View

Bu katmanların isimlerini yabancı dilde yazmaktan hiç hoşlanmasam da mimariye uysun diye mecbur kalıyorum.

Ana dizinimde src/Template/Sitemap/xml/ içerisinde index.ctp adında bir dosya oluşturuyorum.

<?php echo '<?xml version="1.0" encoding="UTF-8"?>'; ?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 
http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
<url>
<loc><?php echo $this->Url->build('/', true);?></loc>
<changefreq>weekly</changefreq>
<priority>0.8</priority>
</url>
<?php foreach($data as $key): ?>
<url>
<loc><?php echo $this->Url->build(["controller" => $key['slug'] ], true);?></loc>
<lastmod><?php echo $key['modified']->i18nFormat('yyyy-MM-dd'); ?></lastmod>
<changefreq>weekly</changefreq>
<priority>0.5</priority>
</url>
<?php endforeach; ?>
</urlset>

Burada pages tablomdan gelen slug ve modified kolonlarımı kullandım.

Routes

URL’de Xml uzantısına izin vermeli ve sitemap yolumu tanımlamalıyım. Ana dizinimde config/routes.php dosyamı düzenlemem gerek.

Buradaki Router::defaultRouteClass(DashedRoute::class); kodundan hemen sonra Router::extensions([‘json’, ‘xml’]); kodunu ekliyorum. Ve hemen aşağısına yeni bir yönlendirme bloğu tanımlıyorum.

Router::scope(
'/sitemap.xml',
['controller' => 'Sitemap','action' => 'index'],
function ($routes) {
$routes->connect(
'/', 
['action' => 'index']
);              
}
);

Ve onun da hemen altına hatalarımızı takip edebilmek için hata ayıklama modunu açıyoruz.

Configure::write('debug',2);

Sonuç

Ben genelde bu tarz düzenlemeler paylaşmasam da bunu gerekli buldum. Çünkü stabil olmayan bir döküman var ve açıklamalar yeterli değil. Sürümler arasında farklar var. Yerel sunucumda çalışan kodların, uzak sunucuda hata vermesi gibi birçok aksilik yaşadım. Hiçbir anlamı olmayan garip hata kodları var. Bu yüzden CakePHP ile Xml çalışmanız gerektiğinde bu yazı size yardımcı olabilir.

Sevgiler.

Kaynak ve İleri Okuma:

  • https://stackoverflow.com/questions/35102199/cakephp-3-creating-xml-view
  • https://stackoverflow.com/questions/39212157/when-i-create-a-view-using-xml-layout-in-cakephp-a-head-tag-is-showed
  • https://stackoverflow.com/questions/23408838/cakephp-sitemap-error

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir