Anasayfa » Codeigniter, Php

Codeigniter Dersleri – 8 – Kütüphane Oluşturma

3 Temmuz 2011 7.246 kez okundu 19 yorum
1 Star2 Stars3 Stars4 Stars5 Stars (6 oy,5 üzerinden : 4,33 )
Loading...

Daha önce menümüzü basitçe oluşturmuştuk. Şimdi birazda kütüphanelerden bahsedeceğiz. Örnek olarak menümüzü kütüphaneye koyacağız.

CodeIgniter\application\libraries dizini altına MyMenu.php dosyası oluşturuyoruz. İçerisine aşağıdaki kodları ekliyoruz:

<?php
class MyMenu{
 	function show_menu(){
  		$obj =& get_instance();
  		$obj->load->helper('url');
  		$menu  = "<ul>";
  		$menu .= "<li>";
  		$menu .= anchor("pizza/index","Siparisler");
  		$menu .= "</li>";
  		$menu .= "<li>";		
  		$menu .= anchor("pizza/order","Siparis Ver");		
  		$menu .= "</li>";		
  		$menu .= "</ul>";
 
  		return $menu;
 	}
}
?>

Burada kütüphanemiz diğer codeigniter class ve kütüphanelerine erişiyor. Örneğin url helper kullanıyoruz. Url helper bizim daha kolay url ler yazmamızı sağlıyor. Örneğin aşağıdaki iki kod aynı anlama geliyor.

 anchor("pizza/order","Siparis Ver") 
 = 
 <a href="http://localhost/CodeIgniter/index.php/
pizza/order">Siparis Ver</a>

Menümüzde <ul> ve <li> kullandık, daha sonra css dersimizde bunları modifiye edeceğiz. Şimdilik çalışması bizim için yeterli.

CodeIgniter\application\controllers altındaki pizza.php dosyamızdaki index() ve order() fonksiyonlarına kütüphanemizi include edip yeni menü objesi oluşturuyoruz ve show_menu() fonksiyonunu çağırıp dönen değeri  pizza_view dosyasına yolluyoruz. Şu şekilde

	function index()
	{
		$data['title']='Kodmerkezi.net Pizza Sipariş Sayfası';
		$data['header']='<h1>Siparisler</h1>';
 
		$this->load->model('pizza_model');
		$data['orders']=$this->pizza_model->get_all_orders();
 
		$this->load->library('MyMenu');//kütüphanemizi yüklüyoruz.
		$menu = new MyMenu; //classımızdan yeni bir obje oluşturuyoruz.
		$data['menu'] = $menu->show_menu();//objenin fonksiyonunu çağırarak menümüzü döndürüyoruz.
 
		$this->load->view('pizza_header');
		$this->load->view('pizza_menu',$data);//kütüphaneden dönen menümüzü view dosyamıza yolluyoruz.
		$this->load->view('pizza_view',$data);
		$this->load->view('pizza_footer');
	}
	function order()
	{
		$data['title']='Kodmerkezi.net Pizza Sipariş Sayfası';
		$data['header']='<h1>Siparis Ver</h1>';
 
		$this->load->library('MyMenu');
		$menu = new MyMenu;
		$data['menu'] = $menu->show_menu();
 
		$this->load->view('pizza_header');
		$this->load->view('pizza_menu',$data);
		$this->load->view('pizza_order',$data);
		$this->load->view('pizza_footer');
	}

Şimdi CodeIgniter\application\view klasörü altındaki pizza_menu.php dosyamızı şu şekilde tekrar güncelliyoruz.

<?=$menu ?>

Sayfamızı tekrar test edebiliriz. Menümüz çalışır durumda olması gerekmektedir.

Eğer anlamakta zorluk çekiyorsanız. Önceki derslere tekrar göz atıp, anlamadığınız yerlerde bana yorum yazabilirsiniz.

<<< Önceki:

Sonraki: >>>


Facebookta Paylaş

19 yorum »

  • Hasan Hüseyin İŞLER dedi ki:

    Merhabalar hocam sizin burada kullanmış olduğunu
    $obj =& get_instance();
    bu komut ile $obj değişkenine aktarmanızdaki amaç $this yerine $obj yi kullanmak gibi görünüyor. Tam olarak da anlayamamıs olabilirim. Ama sizin burada aktarmanızdaki amacınız nedir ve bize ne gibi bir faydası vardır?

  • admin dedi ki:

    Evet $this yerine $obj kullanıyoruz. Codeigniter bize model, view ve controller dosyalarımızda $this ile direkt olarak süper class a erişimimize izin veriyor. Ancak bunun dışındaki dosyalarda (yukarıdaki örnekte olduğu gibi) bu izin yok.Bu süper class ı kullanabilmek için önce bunu bir değişkene atamamız gerekiyor. get_instance() bize codeigniterın ana kaynaklarını kullanabilmek için obje döndürüyor. Biz bunu referans ile alarak kopyası yerine orjinalini kullanmış oluyoruz.

  • Hasan Hüseyin İŞLER dedi ki:

    Bilgilendirmeniz için teşekkür ederim.

  • Ege dedi ki:

    Hocam ben yeni basliyom bu codeigntere ondan bir sey sormak istyom yukarida siz hem index() hemde order() fonksiyinlarinin icinde ayni seyleri load etmisinz buna ne gerek niye hem index hemde orders fonksiyonun iicnde load etyoruz birinin icnde load etsek yetmezmi ?

  • Gürcan Kavakçı dedi ki:

    Ege, Biz bir controller classını çağırdığımızda içindeki fonksiyonlardan sadece birisi çalışıyor. Örneğin sorunuzda ya index() fonksiyonunu yada order() fonksiyonunu çalıştırıyoruz. Böyle olunca her seferinde menümüzü görüntüleyebilmek için tekrar menü kütüphanemizi load edip show_menü() fonksiyonunu çağırmamız gerek. Sizin dediğiniz gibi ve bu örnekte olduğu gibi, eğer bir kütüphane veya helper bütün fonksiyonların içinde çağrılıyorsa, Bu fonksiyonları construct içinde yazmak daha mantıklı olacaktır. Zaten bu projeyi geliştirmeye devam ederseniz. Her fonksiyonun içinde tekrar tekrar yazmayacaksınız aynı şeyleri. Construct içinde bir kere yazmanız yetecektir. Çünkü o dosyaya girildiğinde class mantığından dolayı önce construct sonra ilgili fonksiyon çalışacaktır.

  • Nahita dedi ki:

    pizza_menu.php de en son güncellemeyi yapınca


    A PHP Error was encountered

    Severity: Notice

    Message: Undefined variable: menu

    Filename: core/Loader.php(742) : eval()'d code

    Line Number: 1

    hatasını aldım. Defalarca kontrol ettim kodda bir yanlışlık yok. Konfigürasyonda mı bir hata var acaba

  • admin dedi ki:

    < ?=$menu ?>
    yerine
    < ?php echo $menu; ?>
    kullanmayı deneyebilirsiniz. Eğer aynı hatayı alırsanız, library de bir sorun olduğunu düşünebiliriz.

  • Nahita dedi ki:


    yazdım yine aynı hatayı verdi. Library için yukarıdaki kodun aynısını kopyala yapıştır yazıyorum sorun aynı.

  • Nahita dedi ki:

    menu değişkeni tanımlanmamış görünüyor acaba belirli bir konfigürasyonda ayarlama mı yapmalıyız.

  • admin dedi ki:

    Nahita;
    application altındaki autoload.php içerisindeki iki satırı şu şekilde ayarlayarak deneyebilirsin, bunun haricinde herhangi bi konfigürasyon olacağını düşünmüyorum.
    $autoload['libraries'] = array('session','database');
    $autoload['helper'] = array('url','form');
    Bunun haricinde siteden kaynak kodlarını indirip, denemeni tavsiye ederim. Bazı derslerde kaynak kodlarını paylaştım. Örneğin 20. derste kodları indirebileceğin bölüm bulunmakta.

  • Yahya dedi ki:

    Teşekkür ederiz, yanlız bir sorum olacak.

    menu değişkenini de data dizisi içine attık yukarıda. o data pizza_order’a da gidiyor. Onu farklı isimli bir diziye $menu_data[‘menu’] gibi pizza_order view’ine fazladan bir şey göndermememize yardımcı olur mu, yoksa yukarıda ki gibi mi kullanmak daha doğru?

  • admin dedi ki:

    Yahya haklısın, tabi ki order sayfasına menüyü göndermenin anlamı yok, yukarıdaki derste sadelik açısından bu şekilde kullanıldı. Ancak senin söylediğin, menü sayfasına menü değişkenini, order sayfasına diğer bilgileri göndermek hem daha mantıklı, hemde performans açısından daha iyi.
    İkinci sorunuza gelince, normalde index yerine farklı fonksiyonlar içinde çalışması lazım, eğer ikinci link te çalışmıyorsa muhtemelen hata başka noktadadır. Çünkü ikinci projemizde kullanılan linkin aynısı. Soruyu daha ayrıntılı sorabilirseniz çözüm bulabiliriz.

  • Yahya dedi ki:

    bir soru daha.
    ben örneklerinizdeki gelişimi saklamak adına farklı fonksiyonlar üzerinden index alıyorum, örneğin buradaki controllerda index fn’nin bendeki karşılığı index3.

    MyMenu’nun ürettiği linkler hatalı yol veriyor, muhtemelen ben bir yerde hata yaptım.

    verdiği çıktı:
    http://localhost/fwtest/pizza/index3
    http://localhost/fwtest/pizza/order

    ancak bu yollara tıkladığımda bulunamıyor diyor çünkü index.php eksik.

    Sebep ne olabilir acaba?

  • Yahya dedi ki:

    admin, yanıtlar için teşekkür ederim.
    İkinci soru için .htaccess ile çözüm buldum. madem index.php/ göstermiyor ben de tamamıyla kaldırırım dedim.


    RewriteEngine on
    RewriteBase /
    # Hide the application and system directories by redirecting the request to index.php
    RewriteRule ^(application|system|\.svn) /fwtest/index.php/$1 [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond $1 !^(index\.php|images|css|js|robots\.txt)
    RewriteRule ^(.*)$ /fwtest/index.php/$1 [QSA,L]

    Doğru yaptığımı sanıyorum ama yine de onayın içime su serper :)

  • admin dedi ki:

    Yahya, .htaccess kullanmak link görünümü ve seo için iyidir. Ancak yazdığınız htaccess tüm durumlar için çalışıyor mu, bu da önemli. Yani ileride başka url ler için de doğru çalışacağına eminseniz kullanabilirsiniz. Yazdığınız kodu denemedim ancak urlden 2,3 değişken gönderdiğinizde de çalışıyorsa rahatlıkla kullanabilirsiniz.
    Eğer index.php görünmüyorsa şunu kontrol edebilirsin;
    \application\config altındaki config.php içerisindeki $config[‘index_page’] = ‘index.php’; şeklinde yazılı olduğuna emin olun.

  • Mirza dedi ki:

    Hocam @Nahita arkadaşımızdaki hata bendede çıktı dediklerinizi yaptım fakat sorunu çözemedim “A PHP Error was encountered” hatası alıyorum.

  • admin dedi ki:

    Mirza,

    Kaynak kodlarını indirip çalıştırdığında da sorun devam ediyor mu?

  • oğuzhan önder dedi ki:

    Benim sorunum var eğer yardımcı olursanız sevinirim.Veritabanından kategorileri listelemek istiyorum ama Aşağıdaki hayatı alıyorum.

    A PHP Error was encountered

    Severity: Notice

    Message: Undefined variable: kategoriler

    Filename: views/index_view.php

    Line Number: 10
    ——————————
    A PHP Error was encountered

    Severity: Warning

    Message: Invalid argument supplied for foreach()

    Filename: views/index_view.php

    Line Number: 10
    ——————————
    A PHP Error was encountered

    Severity: Notice

    Message: Undefined variable: kategorilerin

    Filename: views/index_view.php

    Line Number: 15
    ——————————
    A PHP Error was encountered

    Severity: Notice

    Message: Trying to get property of non-object

    Filename: views/index_view.php

    Line Number: 15
    ——————————
    A PHP Error was encountered

    Severity: Notice

    Message: Undefined variable: kategorilerin

    Filename: views/index_view.php

    Line Number: 16
    ——————————
    A PHP Error was encountered

    Severity: Notice

    Message: Trying to get property of non-object

    Filename: views/index_view.php

    Line Number: 16
    ———————————
    Bu benim Model sınıfım:

    class index_model extends CI_Model{

    function __construct()
    {
    parent::__construct();
    $this->load->database();
    }
    function kategoriler()
    {
    // Select baslik from kategori
    $this->db->select(“id”,”baslik”);
    $this->db->from(“kategori”);
    $query=$this->db->get();

    //echo $this->db->lastquery();

    // print_r($query->result);

    return $query->result;
    }
    }

    ?>
    ————————————————–
    Bu da kontrol sınıfım:
    load->model(‘index_model’);
    $kategorilerim[‘kategoriler’]=$this->index_model->kategoriler();
    /// şimdi index_view de kategorileri listeliyecem
    $this->load->view(‘index_view’,$kategorilerim);
    }
    }
    ——————————————–
    Bu da view sayfam :

    <?php echo 'Kategorilerin Listesi'.'’; ?>

    id;
    echo $kategorilerin->baslik.””;?>

    ——– Yardımcı olursanız çok teşekkür ederim hocam kolay gelsin

  • selçuk dedi ki:

    selamlar hocam library içerisindeki dosyadan database e erişme imkanımız var mı ? yani modaldaki dosyayı oraya gömüp orda işlem yapabilir miyiz? iyi günler…

Yorum Bırakın!

Yorum yaz, yada kendi sitende trackback (Geri besleme) olarak ekle. Ayrıca RSS ile bu konuya üye olabilirsin. .

Nazik olun. Temiz tutun. Konu dışına çıkmayın. Spam yaratmayın.

Bu tagları kullanabilirsiniz:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Bloğumuz gavatarı desteklemektedir. Kendi gavatarınızı edinmek için lütfen Gravatar a üye olun.