понедељак, 29. јул 2013.

Blog

Još jedna aplikacija koja ima za cilj da demonstrira moj skromni trud. 

Na prvi pogled deluje jednostavna ali poseduje funkcionalnosti koje je još više pojednostavljuju, a ujedno i komplikuju.Za razliku od telefonskog imenika, prilikom učitavanja strana poziva se tzv. multiple view u svakoj f-ji u controller-u. Veoma velika pogodnost. 


Drugo, koristi html helper. Napravio sam funkciju menu() pomoću koje se kreiraju stavke menija, a sve to kroz asocijativni niz. Da pojednostavim... Kroz menu_view.php pišem ime stavke u meniju, npr. о_meni, o_blogu, kontakt itd. a dobijam kao izlaz O MENI, O BLOGU, KONTAKT... Dakle vrši se konverzija iz malih u velika slova kao i zamena znaka "_" sa razmakom.Kroz routes.php je iskazana putanja svake stavke menija, odnosno putanja do odgovarajuće f-je u controller-u, čime je postignuta automatizacija u radu i manje opterećenje servera.


Jedino ulogovan korisnik može kreirati postove, dok ih ostali korisnici mogu samo čitati.
Parametri za login: Username: admin Password: admin --->>> dakle razrađene su sesije... 

Koristi i pagination.php library u kome su neka osnovna podešavanja u prikazu postova.

Pored toga, od biblioteka još koristi form_validation, email i session.

Instalacija

Da bi ste instalirali CodeIgniter, neophodno je preuzeti poslednju verziju sa zvaničnog sajta i raspakovati je (ukoliko koristite xampp onda je to folder htdocs).

Na početku naravno baza

Može se preuzeti ovde

Pristup bazi

Fajl application/config/database.php apdejtovati u sledeće: 
$db['default']['hostname'] = 'localhost';
$db['default']['username'] = 'root';
$db['default']['password'] = '';
$db['default']['database'] = 'myblog';

routes.php izgleda ovako:

$route['default_controller'] = "blog_controller";
$route['404_override'] = '';
$route['naslovna']= 'blog_controller/naslovna/';
$route['napravi_post']= 'blog_controller/napravi_post/';
$route['o_meni']= 'blog_controller/o_meni/';
$route['o_blogu'] = 'blog_controller/o_blogu';
$route['kontakt']= 'blog_controller/kontakt/';
$route['posts/(:any)'] = 'blog_controller/pregled_posta';

pagination.php izgleda ovako:

<?php
$this->CI = &get_instance(); // Public property preuzet po referenci

$config['base_url'] = base_url().'blog_controller/index';
$config['total_rows'] = $this->CI->db->get('posts')->num_rows(); // Public property komunicira sa bazom preko CI jezgra
$config['per_page'] = 8;
$config['num_links'] = 3;
$config['full_tag_open'] = '
'; $config['full_tag_close'] = '
'; $config['next_link'] = 'Sledeća>>'; $config['prev_link'] = 'Prethodna<<'; ?>

autoload.php izgleda ovako:

$autoload['libraries'] = array('database', 'session', 'form_validation', 'pagination');

$autoload['helper'] = array('html', 'url', 'text', 'form');

encriptyon key po kome se sesije kriptuju u config.php:

$config['encryption_key'] = 'date_of_birth';

html_helper.php i funkcija menu():

if ( ! function_exists('menu'))
{
    function menu($menu = '')
    {
        $id = $menu['id'];
        $item = $menu['menus'];
        
        $nav_menu = '
'; foreach ($item as $li_menu) { /* * Vrsi se zamena znaka "_" sa razmakom * Vrsi se konverzija iz malih u velika slova */ $li_a_nav[] = '<a href='.base_url().$li_menu.'>'.strtoupper(str_replace('_', ' ',$li_menu)).'</a>'; //promenljiva (niz) $li_a_nav[] predstavlja stavke u menijima } $nav_menu .= ul($li_a_nav).'</div> '; return $nav_menu; }

Code aplikacije "blog"
blog_model.php


<?php
class blog_model extends CI_Model
{
    function get_posts($per_page, $row)
    {
        $this->db->limit($per_page, $row);
        $this->db->order_by('date', 'desc');
        
        $query = $this->db->get('posts');
        if ($query)
        {
            return $result = $query->result_array();
            
            return TRUE;
        }
 else     return FALSE;
                
        
    }
    
    function save_post()
    {
        $data = array(
            
            'title' => $this->input->post('title'),
            'body' => $this->input->post('body')           
        );
        
        $query = $this->db->insert('posts', $data);
        if ($query)
        {
            return TRUE;
        }
        else            return FALSE;
    }
    function prikazi_post($id)
    {
        $this->db->where('id', $id);
        $query = $this->db->get('posts');
        if ($query->num_rows > 0)
        {
            return $query->result_array();
            return TRUE;
        }
 else     return FALSE;
    }
    
    function provera_lozinke($user, $pass)
    {
        $this->db->where('username', $user);
        $this->db->where('password', md5($pass));
        
        $query = $this->db->get('users');
        if ($query->num_rows() == 1)
        {
            return $query->result();
            return TRUE;
        }
        else            return FALSE;
    }

}

?>

Controllers/blog_controller.php izgleda ovako:

<?php

class blog_controller extends CI_Controller
{
    public function __construct() {
        parent::__construct();
        $this->config->load('pagination', TRUE);
        $this->load->model('blog_model');
    }
    
    function index()
    {
        $this->naslovna();
    }
    
    function naslovna()
    {
        $per_page = $this->config->item('per_page', 'pagination');
        $row = $this->uri->segment(3);
        
        $data['posts'] = $this->blog_model->get_posts($per_page, $row);
        
            $this->load->view('header_view');
            $this->load->view('menu_view');
            $this->load->view('headerbg_view');    
            $this->load->view('content_view', $data);
            $this->load->view('footer_view');
    }
    
    function napravi_post()
    {
        
        if ($this->session->userdata('logged_in')){
            
        $this->form_validation->set_rules('title', 'Ime posta', 'trim|required|xss_clean|is_unique[posts.title]');
        $this->form_validation->set_rules('body', 'Post', 'trim|required|xss_clean');
        
        if ($this->form_validation->run() == FALSE)
        {
            $this->load->view('header_view');
            $this->load->view('menu_view');
            $this->load->view('headerbg_view');  
            $this->load->view('create_post_view');
            $this->load->view('footer_view');
        }
        elseif ($this->blog_model->save_post() == TRUE) {
            redirect(base_url());    }
    
 else {
        echo 'error';    
    }
    }
 else {
        
      $this->load->view('header_view');
            $this->load->view('menu_view');
            $this->load->view('headerbg_view');    
            $this->load->view('restricted');
            $this->load->view('footer_view');
     
 }
    }
    
     function pregled_posta()
    {
        $post_num = $this->uri->segment(2); 
        $pos_string = strrpos($post_num, '_'); //Pronalazi poslednje _ u stringu
        $id = substr($post_num, $pos_string+1); // Poziciju poslednjeg _ u stringu uvecava za 1 i dobija id iz baze
        
        if ($data['posts'] = $this->blog_model->prikazi_post($id))
        {
            $this->load->view('header_view');
            $this->load->view('menu_view');
            $this->load->view('headerbg_view');  
            $this->load->view('post_view', $data);
            $this->load->view('footer_view');
        }
 else {
            redirect(base_url());
 }
    }
    function o_meni()
    {
            $this->load->view('header_view');
            $this->load->view('menu_view');
            $this->load->view('headerbg_view');  
            $this->load->view('about_me');
            $this->load->view('footer_view');
    }
    
    function o_blogu()
    {
            $this->load->view('header_view');
            $this->load->view('menu_view');
            $this->load->view('headerbg_view');  
            $this->load->view('about_blog');
            $this->load->view('footer_view');
    }
            
    function uloguj_se()
    {
            $this->load->view('header_view');
            $this->load->view('menu_view');
            $this->load->view('headerbg_view');  
            $this->load->view('login');
            $this->load->view('footer_view');
    }
    
    function verify()
    {
        $this->form_validation->set_rules('username', 'Korisničko ime', 'trim|required|xss_clean');
        $this->form_validation->set_rules('password', 'Šifra', 'trim|required|xss_clean|callback_proveri_lozinku');
        if ($this->form_validation->run())
        {
            redirect('logged_controller', 'refresh');
        }
 else {
            $this->load->view('header_view');
            $this->load->view('menu_view');
            $this->load->view('headerbg_view');  
            $this->load->view('login');
            $this->load->view('footer_view');
 }
    
    }
    
    function proveri_lozinku($user, $pass)
    {
        $user = $this->input->post('username');
        $pass = $this->input->post('password');
        
        if ($result = $this->blog_model->provera_lozinke($user, $pass))
        {
           $sess_array = array();  
           foreach ($result as $rec) {
               $sess_array = array(
                   'username' => $rec->username,
               );
           }
           $this->session->set_userdata('logged_in', $sess_array);
           return TRUE;
        }
        
        $this->form_validation->set_message('proveri_lozinku', 'GREŠKA. Uneto je pogrešno korisničko ime ili lozinka. Molimo pokušajte ponovo.');
        return FALSE;
    }
    
    function izloguj_se()
    {
        $this->session->unset_userdata('logged_in');
        redirect ('blog_controller', 'refresh');
    }
    
    function kontakt()
    {
            $this->load->view('header_view');
            $this->load->view('menu_view');
            $this->load->view('headerbg_view');  
            $this->load->view('contact');
            $this->load->view('footer_view');
    }
    
    function verify_email()
    {
        $this->form_validation->set_rules('ime', 'Ime', 'trim|required|xss_clean');
        $this->form_validation->set_rules('email', 'Email', 'trim|required|xss_clean|valid_email');
        $this->form_validation->set_rules('poruka', 'Poruka', 'trim|required|xss_clean');
        
        if ($this->form_validation->run())
        {
            $this->load->helper('email');
            $this->load->library('email');
            
            $this->email->from(set_value("email"), set_value("ime"));
            $this->email->to("vl.radovanovic@gmail.com");
            $this->email->subject('Pitanje u vezi aplikacije blog');
            $this->email->message(set_value("poruka"));
            
            $mail = $this->email->send();          
            if ($mail)
            {
                $this->load->view('header_view');
                $this->load->view('menu_view');
                $this->load->view('headerbg_view');    
                $this->load->view('success');
                $this->load->view('footer_view');
            }
            else show_404();
        }
        
        else {
            $this->load->view('header_view');
            $this->load->view('menu_view');
            $this->load->view('headerbg_view');  
            $this->load->view('contact');
            $this->load->view('footer_view');
        }
    }
  
}

?>



Views/header_view.php izgleda ovako:
<html>
    
        
        
        
            Vladimir Radovanović blog
             
        
        
            <?php
            
            $link = array(
                
                'href' => base_url().'css/style.css',
                'type' => 'text/css',
                'rel' => 'stylesheet'
               
            );
            
            echo link_tag($link);
            
            ?>

    
    
    
 
        

Views/menu_view.php izgleda ovako:
<?php

if ($this->session->userdata('logged_in'))
{
    $data = array(
    
    'id' => 'menu',
    'menus' => array(
        'menu1' => 'naslovna',
        'menu2' => 'napravi_post',
        'menu3' => 'o_meni',
        'menu4' => 'o_blogu',
        'menu5' => 'kontakt'
    )
);
echo menu($data);
}
 else {
     $data = array(
    
    'id' => 'menu',
    'menus' => array(
        'menu1' => 'naslovna',        
        'menu2' => 'o_meni',
        'menu3' => 'o_blogu',
        'menu4' => 'kontakt'
    )
);
echo menu($data);
}

?>?


Views/headerbg_view.php izgleda ovako:
</div>

    
<?php 

if (!$this->session->userdata('logged_in')) {
  
?>
  
  
Ovaj blog pokreće CodeIgniter framework...
</div> <?php } else { ?>
<?php $temp = $this->session->userdata('logged_in'); $users['username'] = $temp['username']; echo 'Ulogovani ste: '.$users['username'].''; ?>
Ovaj blog pokreće CodeIgniter framework...
<?php } ?>

Views/content_view.php izgleda ovako:
<div id="page">

   
        <?php 
        
           echo $this->pagination->create_links();
           foreach ($posts as $post){
               echo '

'.ucfirst($post['title']).'

Postavljen : '.$post['date'].''; echo ''.character_limiter($post['body'],255).'

Opširnije

'.br().' '; echo '
'; echo '
'; } echo $this->pagination->create_links(); ?> </div>

Controllers/logged_controller.php izgleda ovako:
<?php

class logged_controller extends CI_Controller
{
    public function __construct() {
        parent::__construct();
        $this->config->load('pagination', TRUE);
        $this->load->model('blog_model');
    }
    
    
    function index()
    {
            $per_page = $this->config->item('per_page', 'pagination');
            $row = $this->uri->segment(3);
        
            $data['posts'] = $this->blog_model->get_posts($per_page, $row);
            
       if ($this->session->userdata('logged_in'))
       {
 
            $this->load->view('header_view');
            $this->load->view('menu_view');
            $this->load->view('headerbg_view');    
            $this->load->view('content_view', $data);
            $this->load->view('footer_view');
       }
 else     {
            $this->load->view('header_view');
            $this->load->view('menu_view');
            $this->load->view('headerbg_view');    
            $this->load->view('restricted');
            $this->load->view('footer_view');
 }
    }                     
}
?>

Views/login.php izgleda ovako:
<div id="page">
    
        
       <?php echo validation_errors(); ?> 
      <?php 
      echo form_open('blog_controller/verify');
     
      ?>
        Korisničko ime: 
         
 

        Lozinka: 
                
 

      
        
        
        <?php      echo form_close();
        
        ?>

    </div>


Views/post_view.php izgleda ovako:
<div id="page">
    
<?php foreach ($posts as $post) { echo "

".ucfirst($post['title'])."

"; echo '
'.nl2br($post['body']).'
'; echo '

Objavljeno: '.$post['date'].'

' ; } ?> </div> </div>

Views/restricted.php izgleda ovako:
<div id="page">
    
        
    

Morate biti ulogovani da bi ste pristupili ovoj stranici.

ULOGUJ SE

</div>

Views/about_me.php izgleda ovako:
<div id="page">
    
    
Zovem se Vladimir Radovanović. Rođen sam u Kragujevcu 08.04.1984. godine. 
Završio sam specijalističke strukovne studije na Visokoj Tehničkoj školi strukovnih studija u Kragujevcu i dobio zvanje "strukovni informatičar".


Na studijama nisam imao puno prilike da kroz realne probleme učim programiranje tako da sam morao lično da pronađem najbolji način da se posvetim praksi.
Web programiranjem se nikada nisam bavio profesionalno, ali me je oduvek interesovalo tako da mi i učenje nije padalo teško. 


Od tehnologija preferiram PHP i CodeIgniter kao framework. Zašto?
 
1. Laka instalacija i konfiguracija 
2. Čista i elegantna MVC implementacija
3. Nudi i Active Record za upravljanje bazom podataka
4. Dobre performanse

5. Veliki broj biblioteka i helpera koje olakšavaju rad
6. Velika CI zajednica
7. Jednostavno mi pasuje


Od tehnologija za upravljanje sadržajem najviše sam koristio Joomla-u od 1.5 do 2.5 verzije. Jednostavno volim hijerarhijsku strukturu
preko sekcija, kategorija do članaka, kojim Joomla upravlja. Kao akrivan član na forum.joomla.org stekao sam mnogo znanja pri rešavanju konkretnih problema.
Ranije objavljeni projekti: hranaizdravlje.com, prostorinzenjering.com, kao i mnostvo ne objavljenih projekata.

 
Podrazumevana znanja ----->>>> HTML, CSS, JavaScript, JQuery...   


----->>>> Active record, PHP Data Object (PDO) interfejs za pristup bazi podataka, kroz MySQL...

</div>

Views/about_blog.php izgleda ovako:
<div id="page">
    
  Još jedna aplikacija koja ima za cilj da demonstrira moj skromni trud. 
  Na prvi pogled deluje jednostavna ali poseduje funkcionalnosti koje je još više pojednostavljuju, a ujedno i komplikuju.
 
  Za razliku od telefonskog imenika, prilikom učitavanja strana poziva se tzv. multiple view u svakoj f-ji u controller-u. Veoma velika pogodnost.  
Drugo, koristi html helper. Napravio sam funkciju menu() pomoću koje se kreiraju stavke menija, a sve to kroz jednostavan niz.Da pojednostavim... Kroz menu_view.php 
  pišem ime stavke u meniju, npr. о_meni, o_blogu, kontakt itd. a dobijam kao izlaz O MENI, O BLOGU, KONTAKT... Dakle vrši se konverzija iz malih u velika slova kao i zamena znaka "_" sa razmakom.
  Kroz routes.php je iskazana putanja svake stavke menija, odnosno putanja do odgovarajuće f-je u controller-u, čime je postignuta automatizacija
  u radu i manje opterećenje servera. 
  
  Jedino ulogovan korisnik može kreirati postove, dok ih ostali korisnici mogu samo čitati.
  Parametri za login:  Username: admin   Password: admin  --->>> dakle razrađene su sesije... 
  Koristi i pagination.php library u kome su neka osnovna podešavanja u prikazu postova.
  BTW, pagination.php koristi tzv. public property CI koji koristi sve biblioteke koje su mu dostupne, a sve to bez extendovanja. Zašto? 
  
  Zato što je napravljen objekat koji instancira sve klase iz CI jezgra, a pozvan je po referenci.
  
  Pored toga, od biblioteka još koristi form_validation, email, session...

</div>


Views/contact.php izgleda ovako:
<div id="page">
    
         
       <?php echo validation_errors(); ?> 
      <?php 
      echo form_open('blog_controller/verify_email');
    
      ?>
   
    Vaše ime: 
        
 

       Vaš email: 
        
 


       Poruka:  
       
       Za: vl.radovanovic [et] gmail.com
       

        

        

       
        
        
        <?php      echo form_close();
        
        ?>

    </div>

Views/success.php izgleda ovako:
<div id="page">
    
        
    

Uspešno ste poslali pitanje. Odgovoriću Vam u najkraćem mogućem roku

NASLOVNA

</div>

Views/creat_post_view.php izgleda ovako:
<div id="page">
    
        
       <?php echo validation_errors(); ?> 
      <?php 
      echo form_open();
     
      ?>
        Ime posta: 

         
 

        Post: 

        
        
 

        
        
        <?php      echo form_close();
        
        ?>
        
     
    

Ceo projekat možete preuzeti ovde.

Srdačan pozdrav.
Vladimir

github.com/vlradovanovic
codexist.blogspot.com