Diskusijų forumai
Diskusijų forumai     Tinklalapių kūrimas ir programavimas     PHP/MySQL     CodeIgniter



CodeIgniter

Macaque
Bendruomenės narys

 
Turiu keletą klausimų apie CodeIgniter, kaip Jūs darėte puslapio navigacija?

Pagrindinis | Naujienos | Straipsniai ir t.t.

yra kažkokia šiam dalykui skirta library (biblioteka) ar patys su html'u rašėt? smile
Paskutinį kartą temą redagavo Macaque (2010-07-14 13:23:49), redaguota kartų: 2
 


Atsakymai į temą

Edmundas
Tinklalapio šeimininkas

 
Padariau paprasčiausiu būdu, pasinaudodamas pagalbine funkcija iš URL Helper:

<?=anchor('straipsniai', 'Straipsniai')?>


Aišku, visą navigaciją buvo galima sugeneruoti dinamiškai ir per administravimo skydą valdyti meniu punktus, tačiau nematau tame prasmės, kadangi meniu keičiasi labai retai, tad kur kas paprasčiau tiesiog atsidaryti reikiamą „view“ failą ir jį paredaguoti. Tuo labiau, kad E-grafika.lt TVS kurta mums patiems, administratoriams, o ne eiliniams žmonėms, kurie nieko nenutuokia apie HTML, CSS, PHP, MySQL ir CodeIgniter.
Macaque
Bendruomenės narys

 
adijux rašė:
Padariau paprasčiausiu būdu, pasinaudodamas pagalbine funkcija iš URL Helper:

<?=anchor('straipsniai', 'Straipsniai')?>


Aišku, visą navigaciją buvo galima sugeneruoti dinamiškai ir per administravimo skydą valdyti meniu punktus, tačiau nematau tame prasmės, kadangi meniu keičiasi labai retai, tad kur kas paprasčiau tiesiog atsidaryti reikiamą „view“ failą ir jį paredaguoti. Tuo labiau, kad E-grafika.lt TVS kurta mums patiems, administratoriams, o ne eiliniams žmonėms, kurie nieko nenutuokia apie HTML, CSS, PHP, MySQL ir CodeIgniter.


Aišku, kažką ir galvojau, kad su anchor f-cja bus galima padaryti smile ,nes turiu pasidaręs CRUD sistemėlę paprastą :] ,o šitą jūs kaip esat pasidarę savo admin panelę, paprasčiausia login forma ir jeigu tenkina duomenys - rodo, kitu atvėju - ne?
Edmundas
Tinklalapio šeimininkas

 
Ne, tiesiog jeigu narys turi reikiamas teises prieiti prie administravimo, tada įkraunamas administravimo skydas. Kitu atveju nieko neįvyksta.
Macaque
Bendruomenės narys

 
Dabar darau pirmą "projektą" su CodeIgniter framework'u ir turiu klausimų smile pradžiai esu pasidaręs puslapiavimą ir duomenų traukimą iš DB, bet pas mane viskas "sukišta" vienoje controller funkcijoje . Pvz.

<?php

class Site extends Controller {

    function index()
    {
        $this->load->library('pagination');
        $this->load->library('table');

        $config['base_url'] = 'http://localhost/darbas/index.php/site/index';
        $config['total_rows'] = $this->db->get('skelbimai')->num_rows();
        $config['per_page'] = 20;
        $config['num_links'] = 5;

        $this->pagination->initialize($config);
        $this->table->set_heading('Pareigos', 'Firma', 'Miestas');

        $this->db->select('title, company, town');
        $data['records'] = $this->db->get('skelbimai', $config['per_page'], $this->uri->segment(3));

        $data['main_content'] = 'site_view';
        $this->load->view('includes/template', $data);
    }

}

Pask. redagavo Macaque (2010-07-23 13:42:43), redaguota kartų: 2

Edmundas
Tinklalapio šeimininkas

 
Nesupratau, ko tu klausi. meh
Macaque
Bendruomenės narys

 
Ar tvarkingas toks kodas? Nes kaip matai čia aš iškviečiu ir puslapiavimo f-cijas ir iš DB ištraukiu įrašus... smile
Edmundas
Tinklalapio šeimininkas

 
Ne visiškai. Veiksmus su duomenų baze reikėtų atlikti modeliuose, o ne pačiuose controlleriuose. Žinoma, gali daryti kaip nori, tačiau pagal MVC struktūrą darai negerai.

Taigi sukurk naują modelį ir pavadink jį, tarkime, „ads“.

class Ads extends Model 
{
	function Ads()
	{
	    parent::Model();
	}
	
	function get_ads($cat_id = NULL, $order = NULL, $offset = 0, $limit = NULL)
	{
		if($cat_id != NULL)
			$this->db->where('cat_id', $cat_id);
			
		if($order != NULL)
			$this->db->order_by($order[0], $order[1]);
		else
			$this->db->order_by('id', 'DESC');
			
		$limit	=	($limit == NULL) ? 20 : $limit;
			
		$this->db->limit($limit, $offset);
		
		$query	=	$this->db->get($this->db->dbprefix('skelbimai'));
		if($query->num_rows() == 0)
		{
			return FALSE;
		}
		else
		{
			return $query->result();
		}
	}
	
	function count_ads($cat_id = NULL)
	{
		if($cat_id != NULL)
			$this->db->where('cat_id', $cat_id);
			
		return $this->db->count_all_results($this->db->dbprefix('skelbimai'));
	}
}


Tada controlleryje atitinkamai naudojiesi tuo modeliu.

class Site extends Controller
{
	function Site()
	{
		parent::Controller();
	}
	
	function index()
	{
		$this->load->model('ads');
		$this->load->library('pagination');
		$this->load->library('table');
		
		$config['base_url'] 	= site_url('site/index/');  
		$config['total_rows'] 	= $ads->count_ads(); 
		$config['per_page'] 	= 20; 
		$config['num_links'] 	= 5; 
		
		$this->pagination->initialize($config); 
		$this->table->set_heading('Pareigos', 'Firma', 'Miestas');    
		
		$data['records']	=	$this->ads->get_ads(NULL, NULL, $this->uri->segment(3), 20);
		if(!$data['records'])
		{
			// Jeigu nebuvo rasta jokių įrašų, galime apie tai pranešti naršančiajam.
		}     		
		else
		{
			$data['main_content'] = 'site_view'; 
			$this->load->view('includes/template', $data);
		}
	}
}


Tokiu būdu gali paimti tuos pačius duomenis iš kitų controllerių ir išvengti vadinamojo „code repetition“. Beje, visada nepamiršk controlleriuose, bibliotekose bei modeliuose nurodyti konstruktoriaus. Controlleryje jį pridėjau.

	function Site()
	{
		parent::Controller();
	}


Taip pat neįsivaizduoju, kaip tu ketini visą tinklalapį sutalpinti į vieną controllerį (sprendžiu tai pagal jo pavadinimą „Site“). Gerai, jeigu tai bus tik paprastučiai puslapiai, tačiau pagalvok apie tokį atvejį (paaiškinsiu žemiau).

Tarkime, tau reikia 3 pagrindinių rubrikų: naujienos, skelbimai ir kontaktai. Galiu visas rubrikas sudėti į vieną controllerį:

class Site extends Controller
{
	function Site()
	{
		parent::Controller();
	}
	
	function index()
	{
		// Numatytasis puslapis (home page?).
	}
	
	function naujienos()
	{
		// Naujienų rubrika.
	}
	
	function skelbimai()
	{
		// Skelbimų rubrika.
	}
	
	function kontaktai()
	{
		// Kontaktai.
	}
	
}


O kas, jeigu aš noriu turėti atskirą puslapį naujienų kategorijoms? Galėčiau pridėti dar vieną metodą naujienu_kategorijos(), tačiau jame vėl reiks užkrauti naujienų modelį, konfigūraciją (jeigu reikia), tam tikras bibliotekas ir pan. Žodžiu, bereikalingas kodo kartojimasis. Tad paprasčiau būtų tiesiog kiekvieną rubriką išskaidyti į atskirą controllerį.

class Naujienos extends Controller
{
	function Naujienos()
	{
		parent::Controller();
		
		// Konstruktoriuje galime užkrauti reikalingas bibliotekas ir modelius, 
		// kurie bus reikalingi beveik visuose metoduose.
	}
	
	function index()
	{
		// Naujienų pagrindinis puslapis
		// Pav.: manopuslapis.lt/naujienos
	}
	
	function kategorijos()
	{
		// Naujienų kategorijų puslapis
		// Pav.: manopuslapius.lt/naujienos/kategorijos
	}
	
	function kategorija($url = NULL)
	{
		// Naujienos pagal kategoriją
		// Pav.: manopuslapis.lt/naujienos/kategorija/$url
	}
}


Tikiuosi padėjau. Sėkmės.

P.S. Negarantuoju, kad mano parašytas kodas visur teisingas, mat galėjau kur nors įvelti klaidų. Pats kodo realiai netikrinau.
Macaque
Bendruomenės narys

 
Ačiū, už tokį atsakymą, bet dabar pagalvojau, kad geriau pristabdysiu savo projekto kūrimą nuo 0, nes trūksta žinių iš PHP pusės smile ir dar klausimas: Ar būtina naudoti konstruktorius? Nes man atrodo skaičiau apie PHP OOP ir ten pagal PHP versijas skiriasi kažkaip tie konstruktoriaus rašymai...
Edmundas
Tinklalapio šeimininkas

 
Naudojant CodeIgniter konstruktoriai modeliuose ir controlleriuose yra būtini, jie gali būti rašom dvejopai: jeigu nori suderinamumo su PHP4, metodo pavadinimas turi sutapti su klasės pavadinimu, o PHP5 atveju naudojamas žodis __construct.

class Naujienos extends Controller
{
	// PHP4 konstruktorius.
	function Naujienos()
	{
		parent::Controller();
	}
	
}


class Naujienos extends Controller
{
	// PHP5 konstruktorius.
	public function __construct()
	{
		parent::Controller();
	}
}


Dabartinė CodeIgniter versija (1.7.2) vis dar palaiko PHP4, todėl gali rašyi arba PHP4, arba PHP5 stiliumi. Nuo CodeIgniter 2 versijos PHP4 nebebus palaikoma, tad šiaip patariu iš karto pratintis prie PHP5 konstruktorių.