- Home
- Categorie
- Coding e Sistemistica
- PHP
- framework
-
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
Avete dei consigli? Guide in Italiano?
Ringrazio in anticipo
Buona Serata
-
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!
-
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
-
Grazie 1000 a tutti per le risposte!
ci sto studiando ancora sopra ma alcune cose non mi sono chiarissime
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: 52grazie 1000 in anticipo
buona serata a tutti
-
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.
-
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 tuttiactor_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]
-
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(); }
-
grazie mille Thedarkita!!
funziona ancora e c'è meno codice, meglio credo
buon week end
a risentirci!
-
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?
grazie 1000
buona giornata