• User Attivo

    framework

    Buonasera a tutti,

    volevo avvicinarmi ad un framework per fare prima a sviluppare dei progetti;

    ho scelto così codeigniter+grocery CRUD che mi è un po' più familiare, premetto che sono un principiante di php;

    qualcuno lo usa? di fatto riesco a fare delle pagine statiche, faccio il controller, gli array e li passo ad una view;

    ora vorrei fare un amministrazione, e con delle query estrarre i dati; ho installato grocery CRUD,

    ho aperto il controller, view e l model ma non mi è molto chiaro come procedere :arrabbiato:

    Avete dei consigli? Guide in Italiano?

    Ringrazio in anticipo
    Buona Serata


  • Super User

    Ciao Enrico,

    Benvenuto nel forum! 😄

    Parto dal presupposto che tu abbia esperienza con PHP, SQL (e la sua implementazione in MySQL) e l'utilizzo "object oriented" di PHP. Nel caso così non fosse, ti consiglio di rimediare prima di procedere con CodeIgniter o altri framework.

    Puoi immaginare un framework come un pacchetto di funzioni che facilitano lo sviluppo di applicazioni web. Nello specifico:

    • Evitano di dover "reinventare la ruota" riscrivendo ogni volta funzioni per collegarsi al database, acquisire dati passati tramite GET/POST, URL Rewrite etc;
    • Strutturano l'applicazione in diversi "moduli" (appunto, "Views", "Models" e "Controllers", l'architettura MVC) che facilita la futura espansione del progetto e garantisce una distribuzione delle risorse sensata.

    ***Partiamo da un discorso generale, prima di entrare nei dettagli di CodeIgniter...

    ***L'architettura MVC non è legata ad un particolare linguaggio. Per quanto CodeIgniter sia scritto in PHP (come altri quali Laraverl e CakePHP) ne esistono altrettanti non basati su tale linguaggio, quale il framework "rails" per Ruby (Ruby on Rails).

    Un'applicazione MVC è composta da tre unità fondamentali:

    • "Views": File semi-statici che hanno il solo compito di disporre il contenuto sulla pagina. Solitamente si tratta di un misto di HTML, CSS e Javascript (ed estensioni varie quali JQuery, AJAX, etc.)
    <table>
    <tr>
    <td>Nome:</td><td>$utente->nome</td>
    </tr>
    <tr>
    <td>Cognome</td><td>$utente->cognome</td>
    </tr>
    <tr>
    <td> Data Registratione</td><td>$utente->data_registratione</td>
    </tr>
    
    • "Contollers": Lo "scheletro" dell'applicazione. Questo è il file che viene chiamato quando l'utente invia una richiesta al server. Ad esempio, se la tua applicazione risiede su example.com, una richiesta a example.com/user sara indirizzata al *controller *"Users". Ad esempio:
    
    
    // Questa classe estende la classe 'controller' del framework
    class users extends controller {
    
    // Qui possiamo eseguire delle istrizioni ogni volta che il controller
    // viene chiamato indipendentemente da quale richiesta sarà poi eseguita
    function __construct() {
    
    // Necessario in CI
    parent::__construct();
    
    }
    
    function index() {
    
    /* Codice */
    
    }
    
    function add() 
    
    /* Codice */
    
    }
    
    function delete($id) {
    
    /* Codice */
    
    }
    
    

    Ritornando quindi al nostro esempio example.com/users". "users" è il primo "url segment", ovvero dice al framework di indirizzare la richiesta al controller "users". Per default, la funzione chiamata è "index". Tuttavia, possiamo decidere altrimenti specificando un secondo "url segment". Ad esempio, example.com/users/add eseguirà la funzione "add" del controller "users". Infine, il terzo "url segment" rappresenta un parametro passato alla funzione. example.com/users/delete chiamerà la funzione 'delete' assegnando $id = 3. Alcuni framework, fra cui CodeIgniter, permettono di dichiarare ulteriori url fragment.

    Le "views" sono chiamate dal "controller". Ad esempio:

    
    
    function index() {
    
    $this->load->view('index');
    
    }
    
    
    

    Eseguirà il file index.php nella cartella 'views' e trasmetterà il risultato (html) al browser.

    Possiamo anche caricare più "views" che verranno caricate nell'ordine.

    
    
    function index() {
    
    $this->load->view('header');
    $this->load->view('index');
    $thsi->load->view('footer');
    
    }
    
    
    • Infine, i "model" si occupano di rappresentare il database. In genere si ha un model per tabella, anche se ciò può variare a seconda dei casi. I model sono responsabili per interagire direttamente e aggiornare o caricare informazioni salvate sul DB. Solitamente un model può: Ricevere un oggetto e salvarlo sul database *o *ricevere informazione dal database e passarla come oggetto al controller. Ad esempio:
    
    
    class users_model extends model {
    
    // Inserisce l'oggetto nel DB
    function insert($user) {
    
    $sql = "INSERT INTO users (nome, cognome, eta) VALUES ($user->nome, $user->cognome, $user->età)";
    $this->query($sql);
    
    }
    
    function get($id) {
    
    $sql = "SELECT users.nome, users.cognome, users.eta FROM users WHERE id = $id";
    $result = $this->query($sql);
    
    $user = new user();
    $user->nome = $result->nome;
    $user->cognome = $result->cognome;
    $user->eta = $result->eta;
    
    return $user;
    
    }
    
    }
    
    
    

    Quindi, la richiesta viene inoltrata al controller , il controller elabora la richiesta, aggiorna il database o recupera informazioni tramite il model e la trasmette al view che la presenta all'utente.

    Per quanto riguarda CodeIgniter

    CI usa la propria library 'load' per generare istanze di un oggetto.

    Quindi, invece di:

    [PHP]include('../models/myModel.php');[/PHP]

    Si usa:

    [PHP]$this->load->model('myModel');[/PHP]

    Che si può poi chiamare tramite
    [PHP] $this->myModel->myMethod();[/PHP]

    Ad esempio:

    [PHP]$user = $this->myModel->getWhereId($id);[/PHP]

    Può essere usato per recuperare un oggetto 'user' dal database.

    Per le views:

    [PHP]$this->load->view('view');[/PHP]

    Genera il file view.php nella cartella views.

    Fammi sapere come va! 😄


  • ModSenior

    Ciao,
    le basi le trovi anche qui, anche se per questioni di tempo non ho potuto finire la guida:
    http://www.giorgiotave.it/forum/scripting-e-risorse-utili/198679-guida-codeigniter.html


  • User Attivo

    Grazie 1000 a tutti per le risposte! 😄

    ci sto studiando ancora sopra ma alcune cose non mi sono chiarissime :arrabbiato:

    però è comodo, in quando l'amministrazione è già fatta,

    ci si dedica alle query per estrarre i dati e alle view di fatto, o sbaglio?

    Una cosa non capisco, provo ad estrarre dei dati dal db, ma non funziona, posto il codice nella speranza che qualcuno possa aiutarmi:

    actor_model.php (MODEL)
    [PHP]
    <?php
    class actor_model extends CI_Model {
    var $actor_id = '';
    var $fullname = '';
    var $last_update = '';

    function __construct()
        {parent::__construct();}
    

    function get_dati()
    {
    $this->db->select('*');
    $this->db->from('actor');
    $query = $this->db->get();

       foreach ($query->result() as $row)
       {
             $return[] = $row;
       }
        return $return;                 
    }
    

    }
    [/PHP]

    actor.php (CONTROLLER)
    [PHP]
    <?php
    class actor extends CI_Controller {
    public function index()
    {
    $this->load->model("actor_model");
    $dati['elementi'] = $this->actor_model->get_dati();
    }
    }
    [/PHP]

    actor.php (VIEW)
    [PHP]
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="utf-8" />
    <title>Actor</title>
    </head>
    <body>
    <?php
    foreach ($elementi as $key => $value) {
    echo $value->actor_id;
    echo $value->fullname;
    echo $value->last_update;
    }

    ?>
    

    </body>
    </html>
    [/PHP]

    l'errore che mi restituisce è questo:

    A PHP Error was encountered
    Severity: Notice
    Message: Undefined property: actor::$db
    Filename: core/Model.php
    Line Number: 52

    grazie 1000 in anticipo
    buona serata a tutti


  • ModSenior

    Ciao,
    metti in autoload il database, manca l'istanza per quello hai quell'errore.
    Nel controller che hai messo manca anche il richiamo della view a cui passi poi l'array, per cui non vedrai in ogni caso nulla con quel codice nel controller.


  • User Attivo

    Grazie Thedarkita,

    avevi ragione su tutto, grazie infinite 😄 comincio a capirci qualcosa;

    posto il codice nel caso a qualcuno fosse utile.

    ci si sente presto mi sa 😄
    buona serata a tutti

    actor_model.php
    [PHP]
    <?php
    class actor_model extends CI_Model {
    var $actor_id = '';
    var $fullname = '';
    var $last_update = '';

    function __construct()
        {parent::__construct();}
    

    function get_dati()
    {
    $this->db->select('*');
    $this->db->from('actor');
    $query = $this->db->get();

       foreach ($query->result() as $row)
       {
             $return[] = $row;
       }
        return $return;                 
    }
    

    }
    [/PHP]

    actor.php (CONTROLLER)
    [PHP]
    <?php
    class actor extends CI_Controller {
    public function index()
    {
    $this->load->model("actor_model");
    //$dati['title'] = "title"; // variabile

             $dati['elementi'] = $this->actor_model->get_dati(); // array
            
             $this->load->view('actor',$dati);
       }
    

    }
    [/PHP]

    actor.php (VIEW)
    [PHP]
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="utf-8" />
    <title>Actor</title>
    </head>
    <body>
    <?php
    foreach ($elementi as $key => $value) {
    echo $value->actor_id."<br />";
    echo $value->fullname."<br />";
    echo $value->last_update."<br /><br />";
    }

    ?>
    

    </body>
    </html>
    [/PHP]


  • ModSenior

    Prego,
    una cosa però non fare questo:

    
    function get_dati()
        {
           $this->db->select('*');
           $this->db->from('actor');
           $query = $this->db->get();
          
           foreach ($query->result() as $row)
           {
                 $return[] = $row;
           }
            return $return;                 
        }
    
    

    Perchè è sufficiente(E migliore prestazionalmente) fare questo:

    
    function get_dati()
        {
           $this->db->select('*');
           $this->db->from('actor');
           $query = $this->db->get();
            return $query->result();  
    }
    
    

    E volendo proprio essere pignoli:

    
    function get_dati()
        {
           $query = $this->db->get('actor');
           return $query->result();  
    }
    
    

  • User Attivo

    grazie mille Thedarkita!!

    funziona ancora e c'è meno codice, meglio credo 😄

    buon week end
    a risentirci!


  • User Attivo

    Ciao Thedarkita,

    dunque... continuo qui la discussione su codeigniter,

    posto il codice della home:

    home.php (controller)

    [PHP]
    <?php class home extends CI_Controller { public function index(){ $this->load->model("home_model"); $dati['elementi'] = $this->home_model->get_dati(); // array $metatag['title'] = 'title'; $metatag['description'] = 'description'; $metatag['keywords'] = 'keywords';
    $this->load->view('header', $metatag); $this->load->view('home',$dati); $this->load->view('footer'); } }[/PHP]

    home_model.php (model)

    [PHP]
    <?php class home_model extends CI_Model { function __construct(){parent::__construct();} function get_dati(){ $query = $this->db->order_by('data desc')->get('articoli'); return $query->result(); } }[/PHP]

    home.php (view)

    [PHP]
    <!DOCTYPE html><html lang="en"><head><meta charset="utf-8" /><title>Home</title></head><body> <?php foreach ($elementi as $key => $value) { echo "<strong>ID</strong>: ".$value->id."<br />"; echo "<strong>ID Categoria</strong>: ".$value->categoria_id."<br />"; echo "<strong>Title</strong>: ".$value->title."<br />"; echo "<strong>Description</strong>: ".$value->description."<br />"; echo "<strong>Keywords</strong>: ".$value->keywords."<br />"; echo "<strong>Data</strong>: ".$value->data."<br />"; echo "<strong>Titolo</strong>: ".$value->h1."<br />"; echo "<strong>Sottotitolo</strong>: ".$value->h2."<br />"; echo "<strong>Testo</strong>: ".$value->testo."<br />"; echo "<strong>Visibile</strong>: ".$value->visibile."<br />"; echo "<br />"; echo "<hr>"; echo "<br />"; } ?></body></html>[/PHP]

    di fatto mi da tutti i record della tabella "articoli";
    ora vorrei inserire un link nel titolo dell'articolo per andare nel dettaglio e vedere solo quello;

    come si fa? :arrabbiato:

    grazie 1000
    buona giornata