CodeIgniter: Passaggio di Argomenti da Vista Controller?

EDIT: Con il codice qui sotto ora, non ho le idee chiare su come stampare i segnalibri e i tag correttamente


Io sono completamente nuovo al CI e mi hanno recentemente colpito un blocco stradale. Io sono molto incerto su come effettuare il passaggio di un argomento di una funzione da visualizzare file per il controller in modo da poter utilizzare su una funzione?

Ho un ciclo foreach nella visualizzazione di passare attraverso tutti gli elementi passati dalla funzione get_latest_bookmarks. Che la funzione restituisce un ID per ogni elemento e sto volendo utilizzare questo con un’altra funzione chiamata get_bookmark_tags che otterrà il tag del segnalibro da un’altra tabella. Ho fornito il codice che ho fatto finora seguito.

Modello:

<?php 

class Bookmark_model extends CI_Model {

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

    function get_latest_bookmarks($limit) 
    {
        //Load Database
        $this->load->database();
        //Query Database 
        $query = $this->db->get('Bookmark', $limit);
        //Return Result
        return $query;
    }

    function get_bookmark_tags($id)
    {
        //Load Database
        $this->load->database();
        $query = $this->db->query('SELECT Tag.Title 
                                    FROM `Tag` 
                                    INNER JOIN BookmarkTag
                                    WHERE BookmarkTag.BookmarkID = "'.$id.'" AND Tag.TagID = BookmarkTag.TagID');
        return $query;
    }

Controller:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Welcome extends CI_Controller {

    public function index()
    {
        //Load URL Helper
        $this->load->helper('url');
        //Load User Library
        $this->load->library('ion_auth');
        //Is User Logged In
        if ($this->ion_auth->logged_in())
        {
            $data['user'] = $this->ion_auth->get_user_array();
        }
        else
        {
            redirect('auth/login');
        }
        //Load Bookmark Model
        $this->load->model('Bookmark_model');

        //Create Arrays
        $bookmarks = array();
        $tags = array();

        //Query Database
        $query = $this->Bookmark_model->get_latest_bookmarks(4);
        //
        foreach ($query->result() as $row) {
             array_push($tags, $this->Bookmark_model->get_bookmark_tags($row->BookmarkID));
             array_push($bookmarks, $row);
        }
        $data['tags_latest'] = $tags;
        $data['bookmarks_latest'] = $bookmarks;
        $this->load->view('welcome_message', $data);
    }

}

Vista:

<h1>Latest Bookmarks</h1>

<?php foreach ($bookmarks_latest as $bookmark): ?>

<?php print_r($bookmark); ?>

<?php print_r($tags_latest->result()); ?>

<?php endforeach; ?>
  • ci può essere un modo per fare questo, ma i dati si suppone che il flusso dal controller per la vista e non l’altro senso intorno.
  • Qualcuno potrebbe rispondere come passare l’argomento da vista controller per esempio scrivendo questo in vista non funzionano <?=form_open("Welcome/bookmark_tags($id)";?> se $id parametro è un array, poi come faremo a passare
InformationsquelleAutor ritch | 2011-06-11



2 Replies
  1. 4

    Si dovrebbe fare in un Controllore prima di passare i dati alla Vista.
    Provare con qualcosa di simile a questo:

    <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
    
    class Welcome extends CI_Controller {
    
        public function index()
        {
            //Load Model
            $this->load->model('Bookmarks');
            //Get Latest Bookmarks
            $query = $this->Bookmarks->get_latest_bookmarks(4);
            $bookmarks = array();
            $tags = array();
            foreach ($query->result() as $row) {
                 $bookmark_query = $this->Bookmarks->get_bookmark_tags($row->id);
                 $bookmark_arr = array();
                 foreach (bookmark_query->result() as $bookm) {
                     array_push($bookmark_arr, $bookm);
                 }
                 array_push($tags, $bookmark_arr);
                 array_push($bookmarks, $row);
            }
            $data['tags'] = $tags;
            $data['bookmarks'] = $bookmarks;
            //Load and Pass Data into View
            $this->load->view('welcome_message', $data);
        }
    } 
    • È questo passaggio sia il segnalibro dettagli e tag? Grazie
    • No, ma si può aggiungere che con $data['query'] = $bookmarks; prima di caricare la vista, se si desidera.
    • Come faccio a stampare i tag? Ho aggiunto modificato il codice di cui sopra per l’ultima.
    • Ho aggiornato il mio codice. Provare print_r($tags); e print_r($bookmarks); ora nel vostro punto di vista. E si può loop attraverso di loro.
  2. 0

    Non.

    Punto nell’utilizzo di un Framework è quello di default di standard appropriati. CodeIgniter segue un sciolto pattern MVC, ma non si dovrebbe mai passare le cose da vista per il controller.

    Si può fare, ma se lo fai sarai sempre in un pasticcio di spaghetti piuttosto presto.

    Afferrare l’ID del controller. Anche se implica l’esecuzione di loop stesso due volte. Ti ringrazio te stesso.

    • Ciao, stai rispondendo alla domanda dopo la MODIFICA?
    • la mia risposta non è molto legato al codice, non importa se prima o dopo la modifica. Basta non passare le cose da vista per il controller. Ora, se avete dei dubbi su altre cose, basta aprire una nuova domanda per quelli.
    • Io non sono d’accordo. Si può passare “cose” ai controllori, come altro vorresti implementare dire un Login, sicuramente è necessario per ottenere l’invio dei dati da vista, la risposta è una sciocchezza.
    • Posso capire il tuo punto di vista, ma su una applicazione web non funziona in quel modo. Il cliente (utente) invia i dati ad apache (server), che poi interprete di codice PHP (CI App). Come CI App è caricato i tuoi dati sono disponibili da $_SERVER, $_POST qualunque cosa… e la prima cosa che CI viene eseguito è il controller, quindi fai quello che devi fare e passare i dati per lo spettatore di interpretare e servire il cliente come una bella pagina web. Visualizzatore in questo scenario significa qualcosa di completamente diverso dal tuo browser UI.

Lascia un commento