[PHP] CodeIgniter - Visualizzare singolo risultato

Gaz9000

Nuovo Utente
13 Nov 2016
1
0
1
25
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.333
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.406
339
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
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
G Invio form con PHP PHP 3
T fatture con voci fattura in php PHP 0
T ALTRO PROBLEMA CON ARRAY PHP PHP 1
M Collegamento tra form html e script php PHP 4
M Problemi con la stampa dei valori in php PHP 1
W [Cerco collaborazioni] Sviluppatore Web (PHP) Offerte e Richieste di Lavoro e/o Collaborazione 1
D passare valori da database sql a php PHP 1
L Ricezione dei dati su file php da modulo html PHP 6
E Inviare variabile a PHP da ciclo in JS Javascript 0
A form PHP prenotazione tramite query PHP 2
A Form php prenotazione di un azienda sanitaria locale presso studio medico PHP 1
F menù select dinamico da db in php PHP 3
L Problemi form Pagina php HTML e CSS 3
L php mysql non salva solo id PHP 21
L php mysql cerca e visualizza pagina PHP 0
F Il codice php è giusto? PHP 2
R Aggiornare record mysql con Ajax, jQuery e php Ajax 2
A invio massivo dati a file php Javascript 4
Z MySql injection PHP PHP 1
V PHP form intersecate PHP 0
I [Offro][Retribuito] Programmatore Php Offerte e Richieste di Lavoro e/o Collaborazione 0
P Funzione jQuery Ajax invio file a php jQuery 1
C Dopo chiusura del tag php la stringa html va a capo PHP 1
E Transaction php PHP 11
B ciclare file xml con PHP PHP 1
L Estrazione dati php Database 6
A Aiuto per pagina php PHP 0
E Php select option e ajax PHP 23
I Aiuto php Dependent Lookup PHP 0
T arretramento versione PHP... PHP 3
D problema php mysql PHP 1
D problema php mysql PHP 1

Discussioni simili