Chceš rozjet Affiliate? Tak jedině v CJ.com, technologii využívá iDnes.cz, Denik.cz i SME.sk
Zobrazují se odpovědi 1 až 6 z 6

Začátky s MVC (CodeIgniter) zhodnocení scriptu

  1. Zdravím,
    doufám, že mě neukamenujte když sem plácnu jeden ze svých amatérských výtvorů, ale rád bych slyšel co dělám špatně. Přidat možnost zhodnocení kódu mi hodně chyběla a sem rád že se zde takové téma objevilo :).
    Nějaký ten čas se už PHP věnuji, ale nikdy jsem neměl možnost zjistit, jestli to co píšu je správné. To že to funguje nemusí znamenat správné řešení a já bych nerad psal nějaké paskvily.
    Tolik na úvod a teď ke scriptu:

    Seznamuji se s CodeIgniter a mám tu první menší aplikaci napsanou v něm.
    Účel: Ze zadané adresy na diskusi na d.jpw.cz hlídat nové posty (stále mi u nich chybí možnost sledovat téma) a upozorňovat, pokud se objeví nový komentář.

    Controller:
    PHP kód:
    <?php
        
    if(!defined('BASEPATH')) exit('No direc script access allowed');
        
        class 
    Djpw extends CI_Controller
        
    {
            public function 
    __construct()
            {
                
    parent::__construct();
                
    $this->load->model('channelControll_model');
            }
            public function 
    index()
            {
                
    $data $this->channelControll_model->check();
                if(!
    $data['posts'])
                {
                    
    $data['posts'] = null;
                }
                
    $this->template->setTemplate('title''djpw feed');
                
    $this->template->viewTemplate('index_view'$data);
            }
            
            public function 
    addChannel()
            {
                
    $this->template->setTemplate('title''Add channel');
                
    $this->form_validation->set_rules('addChannel''Add channel''trim|required|is_url|unique')
                                      ->
    set_error_delimiters('''');
                                      
                if(
    $this->form_validation->run())
                {
                    if(
    $this->channelControll_model->addChannel())
                    {
                        
    $this->session->set_flashdata('urlExist''<p class="flash success">This URL is added</p>');
                        
    redirect('');
                    }
                }
                else
                {
                    
    $error validation_errors();
                    if(
    $error)
                    {
                        
    $this->session->set_flashdata('urlAdd''<p class="flash error">'.$error.'</p>');
                    }
                    
    redirect('');
                }
            }
            
            public function 
    check($idPost)
            {
                
    $url $this->channelControll_model->visit($idPost);
                
    redirect($url);
            }
            
            public function 
    deletePost($idPost)
            {
                
    $query $this->db->where('id'$idPost)
                                  ->
    delete('posts');
                if(
    $this->db->affected_rows()) 
                {
                    
    $this->session->set_flashdata('deletePost''<p class="flash success">The post is deleted!</p>');
                    
    redirect('');
                }
                else
                {
                    return 
    false;
                }
            }
        }
    Model channelControll_model:
    PHP kód:
    <?php
        
    if(!defined('BASEPATH')) exit('No direct script access allowed');
        
        class 
    ChannelControll_model extends CI_Model
        
    {
            public function 
    addChannel()
            {
                
    preg_match_all("~<div class=\"posttext\">([^']+?)</div>~"selectSourceCode($this->input->post('addChannel')), $posts);
                
    $insertData = array(
                    
    'id' => '',
                    
    'url' => $this->input->post('addChannel'),
                    
    'posts' => count($posts[0]),
                );
                
    $query $this->db->insert('posts'$insertData);
                return 
    $this->db->affected_rows();
            }
            
            public function 
    check()
            {
                
    $data null;
                
    $query $this->db->query("SELECT url FROM posts ORDER BY id DESC");
                
    $url $query->result_array();
                for(
    $i 0$i count($url); $i++)
                {
                    
    $data[$i] = $url[$i]['url'];
                }
                if(
    $data)
                {
                    return 
    $this->channelControll_model->loadPost($data);    
                }
            }
            
            public function 
    loadPost($urls)
            {
                foreach(
    $urls as $key => $url)
                {
                    
    preg_match_all("~<div class=\"posttext\">([^']+?)</div>~"selectSourceCode($url), $posts);
                    
    preg_match_all('~<title>([^"]+?)</title>~'selectSourceCode($url), $title);
                    
    $query $this->db->query("SELECT posts,id FROM posts WHERE url = '".$url."' ORDER BY id ASC");
                    
    $countPost $query->result_array();
                    
    $id $query->result_array();
                    if(
    $countPost[0]['posts'] < count($posts[0]))
                    {
                        
    $data['posts'][$key] = array(
                            
    'titlePost' => mb_convert_encoding(character_limiter($title[1][0], 35), 'UTF-8''iso-8859-2'),
                            
    'urlPost' => $url,
                            
    'idPost' => $id[0]['id'],
                            
    'newPost' => 1,
                        );
                    }
                    else                
                    {
                        
    $data['posts'][$key] = array(
                            
    'titlePost' => mb_convert_encoding(character_limiter($title[1][0], 35), 'UTF-8''iso-8859-2'),
                            
    'urlPost' => $url,
                            
    'idPost' => $id[0]['id'],
                            
    'newPost' => 0,
                        );
                    }
                }
                return 
    $data;
            }
            
            public function 
    visit($idPost)
            {
                
    $query $this->db->query("SELECT url FROM posts WHERE id = '".$idPost."'");
                
    $url $query->row_array();
                
    preg_match_all("~<div class=\"posttext\">([^']+?)</div>~"selectSourceCode($url['url']), $posts);
                
    $updateData = array(
                    
    'posts' => count($posts[0]),
                );
                
    $this->db->where('id'$idPost)
                         ->
    update('posts'$updateData);
                         
               return 
    $url['url'];
            }
        }
    View index_view:
    PHP kód:
    <?php
        $addChannel 
    = array(
            
    'name' => 'addChannel',
            
    'id' => 'addChannel',
        );
        
    $submit = array(
            
    'name' => 'submit',
            
    'value' => 'Add',
        );
        echo 
    form_open('addChannel');
        echo 
    form_label('Add channel: ''addChannel');
        echo 
    form_input($addChannel);
        echo 
    form_submit($submit);
        echo 
    form_close();
        
        echo 
    $this->session->flashdata('urlExist');
        echo 
    $this->session->flashdata('urlAdd');
        echo 
    $this->session->flashdata('deletePost');
        echo 
    validation_errors();
        
        if(
    $posts)
        {
            echo 
    '<div id="post">';
            foreach(
    $posts as $post)
            {
                if(
    $post['newPost'] == 1$new 'strong';
                else 
    $new '';
    ?>
                <div class="post">
                <?php echo anchor('check/'.$post['idPost'], $post['titlePost'], array('class' => $new)); ?>
                <span><a href="deletePost/<?php echo $post['idPost']?>">X</a></span>
                </div>
    <?php
            
    }
    ?>
            </div>
    <?php
        
    }
    ?>
    Library template.php:
    PHP kód:
    <?php 
        
    class MY_Form_validation extends CI_Form_validation {
            function 
    unique($value)
            {
                
    $ci =& get_instance();
                
                
    $query $ci->db->where('url'$value)
                                ->
    get('posts');
                
                if(
    $query->num_rows() > 0
                {
                    
    $ci->form_validation->set_message('unique''%s this url is in your database.');
                    return 
    false;
                }
                else
                {
                    return 
    true;
                }            
            }
            
            function 
    is_url($value)
            {
                
    $ci =& get_instance();
                
    preg_match('$(http|https|ftp)\://([a-zA-Z0-9\.\-]+(\:[a-zA-Z0-9\.&%\$\ -]+)*@)?((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]) \.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25 [0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5] |2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])|([a-zA-Z0-9\-]+\ .)*[a-zA-Z0-9\-]+\.[a-zA-Z]{2,4})(\:[0-9]+)?(/[^/][a-zA-Z0-9\.\,\?\'\\ /\+&%\$#\=~_\-@]*)*$'$value$match);
                if((bool)
    $match == true)
                {
                    return 
    true;
                }
                else
                {
                    
    $ci->form_validation->set_message('is_url''%s Isn\'t URL address.');
                    return 
    false;
                }
            }
        }
    A Helper selectSourceCode
    PHP kód:
    <?php
        
    function selectSourceCode($url)
        {
            if(
    $url)
            {
                
    $ch curl_init($url);
                
    curl_setopt($chCURLOPT_HEADER0);
                
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
                
    curl_setopt($chCURLOPT_USERAGENT"Mozilla/5.0 (Windows; U; Windows NT 6.0; cs; rv.1.9.0.3) Gecko/2008092417 Firefox/3.0.3");
                return 
    curl_exec($ch);
            }
            else
            {
                echo 
    'This isn\'t URL address!!';
            }
        }
    Nečekám nějaký zázrak. Objektově programuji (snažím se) chvíli a s CodeIgniterem se také zatím seznamuji. A jsou věci, které pořád nemám vychytány. Řekl bych že budou připomínky především k použití výpisu chyb u Form_validation (jejich řešení výpisu chyb mi přijde poněkud těžkopádné, myslím že by to mohli vyřešit jinak a elegantněji) a k View
    Není použit žádný šablonovací systém. Defaultně žádný neobsahuje a já ho zatím nezkoušel nějaký dohledat.

    Předem díky
    Ondra Z.

  2. Co se právě děje na Webtrhu?
  3. w3m Hodnocení: 22 (100%) w3m je na dobré cestě
    2
    Osobne s codeigniterem taky zacinam, ale is_url() vs selectSourceCode($url) = fail.
    Pro hezky kod (ciste esteticky) by mohlo pomoct: http://codeigniter.com/user_guide/ge...tyleguide.html

    A jinak: Bud jsem nepochopil MVC, nebo HTML kod nema v controlleru moc co delat, zkus to dat do viewu.

  4. Citace Původně odeslal w3m Zobrazit příspěvek
    A jinak: Bud jsem nepochopil MVC, nebo HTML kod nema v controlleru moc co delat, zkus to dat do viewu.
    Nemá tam co dělat, díky za upozornění

    ale is_url() vs selectSourceCode($url) = fail.
    Toho jsem si také nevšiml

    Díky za tip

  5. Kód:
    if(!$data['posts']) 
                { 
                    $data['posts'] = null; 
                }
    Toto je spatne napsana podminka v podstate v ni rikas, pokud nejaka promenna je null dosad do ni null. Dale pak, testovani existence prvku v poli by se melo delat pres isset pripadne pres array_key_exists + testovani hodnoty.

    Kód:
         
    if($post['newPost'] == 1) $new = 'strong'; 
     else $new = '';
    Mnohem elegantnejsi zapis podobnych podminek je
    Kód:
    $new = isset($post['newPost']) && $post['newPost'] == 1 ? 'strong' : '';

  6. Toto je spatne napsana podminka v podstate v ni rikas, pokud nejaka promenna je null dosad do ni null.
    Todle je problém, který me celkem trápí. Vím, že je to blbost, ale když to nechám bez podmínky, tak to dopadá tak že script hlásí chybu že $posts není definovaná. Posílám $data['posts'] do view kde pak pracuji s $posts a tu pomocí foreach rozděluji, pokud ji nenastavím na null, hlásí chybu že není definovaná.
    A nepodařilo se mi přijít na to jak to zapsat správně.

    Mnohem elegantnejsi zapis podobnych podminek je
    Pravda.

  7. volf.tomas Hodnocení: 12 (100%) volf.tomas je zatím velká neznámá
    6
    Dve veci se mi nelibi (teda tyhle dve jsem postrehl pri letmem cteni):
    1)
    Kód:
     $data = null; 
    ....
                if($data)
    me primo bije do oci...
    Kód:
     $data = false; 
    ....
                if($data)
    je podle me lepsi.... ve vysledku je to asi jedno, ale php ma funkci is_null z nejakeho duvodu, kdyz uz if($data), tak to nastavovat na false, ne na null

    2) z hlediska unit testovani je chyba v modelu tahat data primo z postu, mel by je dostavat jako parametr funkce

Hostujeme u Server powered by TELE3