<?xml version="1.0" encoding="iso-8859-9"?>

<config>

<item>

<name>databasename</name>

<data><![CDATA[turbulance]]></data>

</item>

<item>

<name>username</name>

<data><![CDATA[eternity]]></data>

</item>

<item>

<name>password</name>

<data><![CDATA[8f10d078b2799206cfe914b32cc6a5e9]]></data>

</item>

<item>

<name>dbtype</name>

<data><![CDATA[mysql]]></data>

</item>

</config>

Gördüğünüz gibi son derece basit yapıda bir XML dosyası kullanacağız. <item> etiketleri arasına dosyada bulunmasını istediğimiz kayıtlar bulunuyor. Her kayıdın ismi <name> etiketi içerisinde, verisi ise <data> etiketi içerisinde yer alıyor. Dosyadaki <![CDATA[****]]> bölümleri gözünüzü korkutmasın. Bu blok sayesinde yazdığımız string içerisindeki < > gibi karakterlerin gözardı edilmesini sağlıyoruz.

Şimdi geldik işin asıl büyülü kısmına ;) ile bu tip konfigürasyon dosyalarını okuyabilmeli, güncelleyebilmeli veya sıfırdan yaratabilmeliyiz. Bunun için Config isimli bir class yazacağız. XML dosyalarını parse etmek için bildiğiniz gibi iki aytı API var. Bizim için hız önemli olduğu için SAX (Simple API for XML) kullanacağız. İşte class'ımız:

class Config

{

var $tag; // Bulunduğumuz tag

var $; // sayısı

var $file; // Konfigürasyon dosyası

var $itemData = array(); // Verilerin tutulacağı array

var $encoding; // XML dosyasında kullanılacak olak karakter seti

/**

* Class constructor'i. Bu classa ait herhangi bir obje oluşturmak için kullanacağımız

* class metodu.

*

* @param $encoding XML dosyasında kullanılacak olak karakter seti

*/

function Config($encoding = 'iso-8859-9')

{

// Başlangıç verileri

$this->encoding = $encoding;

$this->tag = "";

$this-> = 0;

}

/**

* için kullanılacak XML dosyasını belirleyen metod.

*

* @param $file Dosya adı

*/

function setFile($file) {

$this->file = $file;

}

/**

* Bu metod 'nin SAX API'si olan EXPAT için gereklidir.

* Bu metodu kullanarak XML parser herhangi bir açılış etiketine rastladığında ne yapacağını

* belirleyebiliriz.

*

* @param $parser Parser handle

* @param $name Parser'ın şılaştığı etiket ismi

* @param $attributes etikete ait özellikler

*/

function startElementHandler($parser, $name, $attributes)

{

// Şuanda üzerinde çalıştığımız etiket ismini hafızaya al

$this->tag = $name;

}

/**

* Bu metod 'nin SAX API'si olan EXPAT için gereklidir.

* Bu metodu kullanarak XML parser herhangi bir kapanış etiketine rastladığında ne yapacağını

* belirleyebiliriz.

*

* @param $parser Parser handle

* @param $name Parser'ın şılaştığı etiket ismi

*/

function endElementHandler($parser, $name)

{

// Hafızadaki etiket ismini temizle.

$this->tag = "";

// Eğer etiket adı ITEM ise sayacını bir arttır.

if ($name == "ITEM")

{

$this->++;

}

}

/**

* Bu metod 'nin SAX API'si olan EXPAT için gereklidir.

* Bu metodu kullanarak XML parser herhangi bir veri bloğuna geldiğinde ne yapacağını

* belirleyebiliriz.

*

* @param $parser Parser handle

* @param $data Açılış kapanış etiketleri arasında yer alan veri

*/

function characterDataHandler($parser, $data)

{

// Okunan veriyi temizle

$data = trim(htmlspecialchars($data));

// Eğer üzerinde çalıştığımız etiket NAME ise

if ($this->tag == "NAME")

{

// itemData array'ine isim kaydını gir

$this->itemData[$this->][0] .= $data;

} elseif ($this->tag == "DATA") {

// Eğer üzerinde çalıştığımız etiket DATA ise

// itemData array'ine veri kaydını gir

$this->itemData[$this->][1] .= $data;

}

}

/**

* Bu metod belirtilen dosyanın XML parser tarafından parse edilmesini sağlar

*/

function parseXml()

{

// Parser'ı oluştur

$this->xmlParser = xml_parser_create();

// Obje referansını gir (Bu xml parser'ı bir class içinde kullandığımız için gerekli)

xml_set_object($this->xmlParser, $this);

// Parser'a ait bazı özellikleri belirle

// Büyük küçük karakter ayrımı yapmaması için:

xml_parser_set_option($this->xmlParser, XML_OPTION_CASE_FOLDING, TRUE);

// White Space olarak tabir edilen boşluk, satırsonu karakteri gibi karakterleri gözardı

// etmesi için:

xml_parser_set_option($this->xmlParser, XML_OPTION_SKIP_WHITE, TRUE);

// Daha önceden mladığımız metodların XML parser tarafından kullanılması için mladığımız

// bu fonksiyonları bildiriyoruz.

xml_set_element_handler($this->xmlParser, "startElementHandler",

"endElementHandler");

xml_set_character_data_handler($this->xmlParser, "characterDataHandler");

// Dosyayı oku

if (!($fp = fopen($this->file, "r")))

{

die($this->file . " dosyası okunamadı");

}

// Parse etmeye başla

while ($data = fread($fp, 2048))

{

if (!xml_parse($this->xmlParser, $data, feof($fp)))

{

die("Şu meydana geldi: " .

xml_error_string(xml_get_error_code($this->xmlParser)));

}

}

// Parser'ı yoket

xml_parser_free($this->xmlParser);

}

/**

* Varsayılan karakter seti olarak kullandığımız iso-8859-9 karakter setinden

* başka bir karakter seti kullanmak için bu metodu çağıracağız.

*

* @param $encoding Geçerli kılınacak karakter seti

*/

function setEncoding($encoding) {

$this->encoding = $encoding;

}

/**

* Konfigürasyon verileri içerisinde isme göre arama yapabilmemizi sağlayan

* metod. İsmini verdiğimiz veriyi bize döndürür.

*

* @param $name Arama yapılacak olan ismi

*/

function getByName($name) {

foreach ($this->itemData as $item) {

// Eğer verilen isim ile ismi tutuyor ise kayda ait veriyi döndür.

if ($name == $item[0]) return $item[1];

}

// Eğer bu satıra erişilmiş ise bulunamamış demektir. False döndür.

return false;

}

/**

* Konfigürasyon verileri içerisinde kaydın bulunduğu sıra biliniyorsa bu method

* ile daha hızlı erişim sağlanabilir. Bu method ismine göre arama yapma

* ihtiyacı duymadığı için daha hızlı çalışmaktadır.

*

* @param $id Verisi görüntülenecek kayda ait id numarası. Dosyadaki ilk kaydın numarası 0 olacak şekilde.

*/

function getById($id) {

if(isset($this->itemData[$id])) {

// Eğer verilen id'ye göre bir var ise verisini döndür.

return $this->itemData[$id][1];

} else {

// bulunamadı ise false döndür.

return false;

}

}

/**

* Konfigürasyon verileri içerisindeki herhangi bir kaydı güncellemek için

* ismine göre arama yaparak kullanabileceğimiz method.

*

* @param $name ismi

* @param $data Kayıda ait yeni veri

*/

function setByName($name, $data) {

$i = 0; // Kayıtlar arasında arama yaparken kullanacağımız sayaç

foreach($this->itemData as $item) {

// Eğer verilen ismi ile şuan geçerli ismi tutuyor ise

// döngüden çık, tutmuyor ise sayacı bir arttır.

if($name == $item[0]) break;

else $i++;

}

// Sayaç hala 0 ise ilk kayıdın (id'si gerçekten 0 olan) ismi verilen isimden

// farklı ise false döndür.

if($i == 0 && $this->itemData[0][0] != $name) {

return false;

} else {

// Eğer yukarıdaki şartlar gerçekleşmedi ise bulundu demektir.

// Kayıda ait veriyi güncelle

$this->itemData[$i][1] = $data;

return true;

}

}

/**

* Id'si verilen kayda ait veriyi günceller

*

* @param $id id'si

* @param $data Kayıda ait yeni veri

*/

function setById($id, $data) {

// Verilen id'de bir var mı kontrol et.

if(isset($this->itemData[$id])) {

// var ise verisini güncelle.

$this->itemData[$id][1] = $data;

return true;

} else {

// yok ise false döndür.

return false;

}

}

/**

* Yeni bir konfigürasyon kaydı ekler.

*

* @param $name adı

* @param $data Kayıda ait veri

*/

function addField($name, $data) {

// Şuandaki sayısına göre yeni bir elemanı itemData

// arrayine ekle.

$this->itemData[$this->][0] .= $name;

$this->itemData[$this->][1] .= $data;

// sayacını arttır.

$this->++;

}

/**

* Mevcut verilerini dosyaya yazar.

*/

function saveXml() {

// XML dosyasını string olarak oluştur

$xmlData = "<?xml version="1.0" encoding="" . $this->encoding . ""?>n";

$xmlData .= "<config>n";

foreach ($this->itemData as $item) {

$xmlData .= " <item>n";

$xmlData .= " <name>".$item[0]."</name>n";

$xmlData .= " <data><![CDATA[".$item[1]."]]></data>n";

$xmlData .= " </item>n";

}

$xmlData .= "</config>";

if (!$fp = fopen ($this->file, "w")){

die("Dosyaya yazılamadı. Dosya üzerindeki yetkilerinizi kontrol ediniz.");

} else {

// Oluşturulan stringi dosyaya yaz.

fwrite($fp, $xmlData);

fclose($fp);

return true;

}

}

// Class sonu

}

?>

Yukarıda gördüğünüz class'ın çalışma mantığını anlayabilmeniz için kodu okumanız aslında yeterli, eklediğim comment'ler ile kodun açıklayıcı olmasına çalıştım. Ama parse edilen dosyadan okunan bilgilerin bir veriyapısı içerisinde tutulduğunu anlatmak istiyorum, böylece kod içerisinde kullanılan bazı metodların çalışma prensiplerini daha rahat anlayabilirsiniz. Class içerisindeki itemData array'inin örnek olarak verdiğim XML dosyası parse edildikten sonra bir hal aldığını anlamak için 'nin var_dump() fonksiyonundan yararlanabiliriz.

array(4) {

[0]=>

array(2) {

[0]=>

string() "databasename"

[1]=>

string(10) "turbulance"

}

[1]=>

array(2) {

[0]=>

string(8) "username"

[1]=>

string(8) "eternity"

}

[2]=>

array(2) {

[0]=>

string(8) "password"

[1]=>

string(32) "8f10d078b2799206cfe914b32cc6a5e9"

}

[3]=>

array(2) {

[0]=>

string(6) "dbtype"

[1]=>

string(5) "mysql"

}

}

Peki bu class'ı kullanacağız ? Aşağıdaki örnek kodu inceleyelim:

<?

// Öncelikle class'ımızı include edelim.

require_once('confmanager.');

// Yeni bir conf nesnesi yaratalım.

$conf = new Config();

// Nesnemizin kullanacağı konfigürasyon dosyasy adını belirleyelim

// Burada dosyanın tam yolunu vermemiz gerekiyor.

$conf->setFile('config1.xml');

// Dosyaya kaydedeceğimiz konfigürasyon verilerini girelim.

$conf->addField("databasename", "turbulance");

$conf->addField("username", "eternity");

$conf->addField("password", md5("deneme"));

$conf->addField("dbtype", "mysql");

// Oluşturduğumuz verileri dosyaya yazalım.

$conf->saveXml();

?>

Yukarıdaki kodu kullanarak bir konfigürasyon dosyası oluşturduk. İnanmıyorsanız gidin bakın :P.. Şimdi ise oluşturduğumuz bu dosyayı kullanacağız ona bir bakalım…

<?

// Öncelikle class'ımızı include edelim.

require_once('confmanager.');

// Yeni bir conf nesnesi yaratalım.

$conf = new Config();

// Nesnemizin kullanacağı konfigürasyon dosyasy adını belirleyelim

// Burada dosyanın tam yolunu vermemiz gerekiyor.

$conf->setFile('config1.xml');

// Dosyayı parse edelim verileri alalım

$conf->parseXml();

// Örneğin dbtype isimli konfigürasyon verisini almak istersek

$dbType = $conf->getByName('dbtype');

echo "Veritabanı tipi $dbType<br />n";

// Ya da ikinci sırada olduğun bildiğimiz username verisini almak için

// Dikkat ilk kaydın indexi 0 2. kaydın 1…

$userName = $conf->getById(1);

echo "Kullanıcı adı $userName<br />n";

// Şimdi içerisindeki password verisini değiştirelim

$conf->setByName('password', md5('yenisifre'));

// Hatta yeni bir daha ekleyelim

$conf->addField('siteName', 'infinity');

// Oluşturduğumuz verileri dosyaya yazalım.

$conf->saveXml();

?>

Evet bu makaledeki uygulama ile nesne tabanlı olarak EXPAT ile xml dosyalarını parse edebileceğinizi bu verileri kullanmanın ne kadar kolay olduğunu görmüş oldunuz. Yukarıdaki uygulama tabii ki mükemmel değil, eksiklerini olabilecek hatalarını gidermek size kalmış.

kaynak: ordan burdan

Tags: , , , , , , , , , , , , , , , , , , , , , , , , ,
Php - Xml Kullanarak Sık Kullandığınız Konfigürasyon Verilerinin Saklanması (scripti, nasıl, nedir?) konusu
Benzer yazılar:
    Benzer yazı yok