[PHP] CodeIgniter - Visualizzare singolo risultato

Gaz9000

Nuovo Utente
13 Nov 2016
1
0
1
27
Salve a tutti,
da qualche tempo sto cercando di utilizzare CodeIgniter per sviluppare un' applicazione web che ha come scopo quello di mostrare alcuni articoli giornalistici.
Attualmente sono riuscito a estrarre tutti gli articoli presenti all'interno del database che vengono utilizzati come anteprime per il lettore, adesso vorrei riuscire a mostrare ogni singolo articolo separandolo dagli altri.

Tutti gli articoli sono mostrati in /articoli/, vorrei mostrare ogni singolo articolo in /articoli/leggi/id/

Controller:

Codice:
<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Articoli extends CI_Controller
{
    
    public function index()
    {             
        $this->load->model('articles_model');
        
        $data = array (
                        'titolo' => ' Articoli'
                      );

        $articles_data['data'] = $this->articles_model->select_articles();
    
        $this->load->view('header', $data);
        
        $this->load->view('nav');
        
        $this->load->view('articles-content', $articles_data);
        
        $this->load->view('footer');
        
    }
    
    public function leggi()
    {
        //???????
    }
    
}

Model:

Codice:
<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Articles_model extends CI_Model
{
    
    public function select_articles()
    {
        $this->db->select('*');
        $this->db->from('articoli');
        $this->db->join('autori', 'articoli.id_autore = autori.id_autore', 'left');
        $this->db->join('immagini', 'articoli.id_immagine = immagini.id_immagine', 'left');
        $query = $this->db->get();
        return $query->result_array();
        
    }
    
}


View:



Codice:
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
?>
<div id="content" class="article">
   <div id="articles">
         <?php foreach($data as $row){
         $limited_article = word_limiter($row['testo_articolo'], 200);
      ?>
      <section class="article">
         <h2><?php echo $row['titolo_articolo'];?></h2>
         <img class="article-image" src="<?php echo base_url('/assets/images/' . $row['nome_immagine']) ;?>">
         <p class="info">Autore: <?php echo $row['nome_autore']; ?> Data: <?php echo $row['data_articolo'] ?></p>
         <p><?php echo $limited_article; ?></p>
      </section>
      <?php    }?>
   </div>
</div>

Come posso risolvere? Grazie in anticipo.
 

roberto bandiera

Nuovo Utente
17 Ott 2018
3
0
1
Innanzitutto aggiungi alla pagina della view, che mostra l'elenco degli articoli,
un ancora cliccabile in corrispondenza del titolo dell'articolo,
che richiami la funzione leggi() del Controller

Inoltre, per questioni di leggibilità del codice si consiglia di sostituire tutte
le istruzioni echo con espressioni di visualizzazioni di singole variabili:
PHP:
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
?>
<div id="content" class="article">
   <div id="articles">
        <?php foreach($data as $row){
        $limited_article = word_limiter($row['testo_articolo'], 200);
     ?>
     <section class="article">
        <h2>
         <?= anchor('articoli/leggi/'.$row['id_articolo'], $row['titolo_articolo']) ?>
        </h2>
        <img class="article-image" src="<?= base_url('/assets/images/' . $row['nome_immagine']) ?>">
        <p class="info">Autore: <?= $row['nome_autore'] ?> Data: <?= $row['data_articolo'] ?></p>
        <p><?= $limited_article ?></p>
     </section>
     <?php    }?>
   </div>
</div>


poi nel controller scrivi la funzione leggi() con parametro l'id dell'articolo da mostrare

public function leggi($id)
{
 $this->load->model('articles_model');
      
      // si chiama una apposita function del model
       $article_data['data'] = $this->articles_model->select_single_article($id);
 
       $this->load->view('header');
      
       $this->load->view('nav');
      
       $this->load->view('single_article_content', $article_data);
      
       $this->load->view('footer');
}


si aggiunge al model una function che restituisce il dettaglio del singolo articolo
Ritengo che una espressione SQL parametrica sia più leggibile:

 public function select_single_article()
   {
       $query = 'select * from (articoli
                left join autori on articoli.id_autore = autori.id_autore)
                left join immagini on articoli.id_immagine = immagini.id_immagine
                where id_articolo = ?', array($id_articolo));
      // si restituisce una sola riga di dati
      return $query->row_array();
   }

notare che questa funzione ritorna un solo record (una sola riga)

ed infine la pagina della view che visualizza il singolo articolo


single_article_content.php


<?php
defined('BASEPATH') OR exit('No direct script access allowed');
?>
<div id="content" class="article">
     <section class="article">
        <h2>
         <?= $row['titolo_articolo']?>
        </h2>
        <img class="article-image" src="<?= base_url('/assets/images/' . $row['nome_immagine']) ?>">
        <p class="info">Autore: <?= $row['nome_autore'] ?> Data: <?= $row['data_articolo'] ?></p>
        <p><?= $row['testo_articolo'] ?></p>
     </section>
 
</div>

<?= anchor('articoli/index', 'ritorna a elenco degli articoli') ?>


Per ulteriori specificazioni puoi vedere il mio libro su CodeIgniter3.
roberto bandiera
 
Ultima modifica di un moderatore:

macus_adi

Utente Attivo
5 Dic 2017
1.343
91
48
IT/SW
Quoto @roberto bandiera anche se non capisco il motivo di creare un nuovo metodo nel model
select_single_article
, si potrebbe prevedere nel modello sin dall'origine, e utilizzerei un template engine (che preferisco per pulizia di codice) anziché il classico php.
Model
PHP:
public $filter=[];

/**
* Metodo per la risoluzione di qualsiasi richiesta,
*/
public function unique_model_search(ArticoliController $data){
//scriverei un helper per processare i dati o al massimo un hook per gestirli a livello globale
$this->db->select('tupla');
//eventuali join nel caso del dettaglio
foreach($this->filter as $k=>$v){
//naturalmente il caso banale, sarebbe necessario processare il tutto in AND o in OR
/* quindi $this->filter['AND']=[]; $this->filter['OR']=[]; $this->filter['ANDIN']=[] naturalmente ognuno utilizza l'approccio che più gli aggrada.*/
$this->where($k,$v);
}
$data->data_controller=$this->get($tabella)->result_object();
if(count($data->data_controller)==1)$data->details=TRUE;

}
Il model setta i parametri nel controller (in questo caso) per restituire la view corretta.

Nel controller non devi far altro:
PHP:
public $data_controller=[];
public $details=FALSE;

public function __construct(){
parent::__construct();
//da utilizzare se viene implementata la risoluzione degli obj automaticamente
//$this->resolv_object();
}

/**
* Metodo di risoluzione obj processando i dati in input
*/
public function resolv_object(){
}

/**
* metodo d'accesso a quanto richiesto
*/
public function find_actions($id=0){

($id>0)?$this->article_model->filter['AND'][]=['id'=>$id]:null;
$this->article_model->unique_model_search($this);

if($this->details){
//eseguo il rendering dei dati per singolo item
}else{
//eseguo il rendering dei dati per la lista degli item
}
}

Solitamente per comodità ed ereditarietà da altri framework la prima rotta sono solito dichiararla a mano lasciando all'action del controller l'onere di chiamare i metodi corretti, evitando di chiamare esattamente la mappatura del controller + action,
quindi in questo caso semplificato:
PHP:
$route['visualizza/articoli']='controller_articoli/find_actions';
$route['visualizza/articolo/(:num)']='controller_articoli/find_actions/$1';

Evitando la mappatura controller + action si riesce a proteggere meglio l'applicazione.
 
Ultima modifica:

Max 1

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
29 Feb 2012
4.449
338
83
@roberto bandiera
Da regolamento del forum, come tutti noi sei tenuto ad usare il tag
php-png.5742
quando posti del codice PHP e il tag
code-gif.5743
per il codice generico, oppure la funzione codice dalla barra degli strumenti
box-inserisci-2-png-jpg.5744


Inoltre ti prego di leggere attentamente il regolamento generale del forum e quello di sezione dove posti
Grazie
 

roberto bandiera

Nuovo Utente
17 Ott 2018
3
0
1
Concordo pienamente con la nuova versione proposta.
La mia forse risultava più semplice da leggere, tuttavia l'utilizzo di metodi più generali riduce il numero di righe di codice da scrivere.
Le prestazioni del DBMS non credo siano diverse nei due casi.

Per quanto riguarda il marcatore PHP, non sapevo di averlo usato.
Io ho semplicemente fatto un copia incolla dal blocco note.
Roberto Bandiera
 
Discussioni simili
Autore Titolo Forum Risposte Data
M [PHP] Logica esatta sul mostrare contenuto se inattivo con Codeigniter PHP 2
L [PHP] Convertire web codeigniter in App PHP 0
F Cerco Hosting con VECCHIE versioni di php Hosting 0
Cosina Captcha php PHP 1
S passare un valore da un form a un file .php con metodo post PHP 4
N php msyql PHP 6
N php problemi a visualizzare video PHP 3
A menu a tendina php PHP 1
D protezione cartelle: blocco visualizzazione/scaricamento contenuto, ma abilitazione utilizzo dati da parte di file .php presenti sul sito Web Server 1
F Php date_diff PHP 1
K [PHP] Aggiungere caratteri ad una stringa in base alla lunghezza della stessa PHP 2
C Wp-admin a file php WordPress 5
Lino80 [Retribuito] Cerco programmatore php per modifica/inserimento funzione/valori da un plugin importer wordpress Offerte e Richieste di Lavoro e/o Collaborazione 0
csi Inviare file jpg in locale alla stampante con php PHP 0
M Passaggio variabili array php su un tasto jq PHP 3
E Php aggiornamento tabella PHP 9
G phpmailer e php 8.1 con estensione mysqli PHP 6
M Invio dati database via email php PHP 0
K [php] Problema con inner join PHP 4
K [php]form invio dati PHP 0
P Codifica caratteri speciali mysql php PHP 0
K [PHP] Problema con variabili concatenate. PHP 1
E Stampante termica escpos-php PHP 6
JeiMax Modifica codice php personalizzato PHP 2
G Come modificare un pdf in php PHP 1
U Link a doppio file PHP PHP 0
E PHP & jQuery PHP 8
N Passare array da php a javascript PHP 5
F Applicazione PHP/MySQL per prenotazioni: limitare il numero massimo di posti prenotabili PHP 20
L tipo boolean non funzionante su mariadb (mysql). E codice php 7.4. PHP 0
U PHP creare un file excel dopo ricerca nel DB PHP 0
M PHP/MySQL - Estrarre valori min e max di ogni gruppo PHP 5
F Php e fatturazione elettronica PHP 0
P lanciare script asp (o php) da jquery Javascript 1
Couting95 inserire dati da un file di testo in una tabella in php PHP 1
P Data scraping in PHP non funziona PHP 4
C Calcoli matematici in php PHP 5
F Scrivere dei dati in word con php PHP 0
D PHP leggere cartella di Windows PHP 1
I dominio aruba versione php server linux Domini 3
G Colorare menu select attraverso ricerca php PHP 0
L PHP motore di ricerca nel sito PHP 1
S PHP e Mysqli PHP 0
Y Stampare da php su un foglio A6 attraverso una stampante esterna PHP 1
M Visulizzare immagine con php PHP 8
G [PHP] Creare script di prenotazione con controllo disponibilità. PHP 7
G leggere file txt e stampare con php il contenuto a video PHP 7
F Ricreare struttura php+mysql su Xampp Apache 0
Z PHP.INI - STMP per invio email con PHP Server Dedicati e VPS 0
M Array associativi php su 2 campi mysql PHP 10

Discussioni simili