Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CodeIgniter: Passing Arguments from View to Controller?

EDIT: With the code below now, I am unsure on how to print out the bookmarks and the tags correctly


I’m completely new to CI and I have recently hit a road block. I’m very unsure how I would go about passing a function argument from the view file to the controller so I could use it on a function?

I have a foreach loop on the view going through the all the items passed by function get_latest_bookmarks. That function returns a ID for each item and I am wanting to use this with another function called get_bookmark_tags which will get the tags of the bookmark from another table. I have provided the code I have done so far below.

Model:

<?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);
    }

}

View:

<h1>Latest Bookmarks</h1>

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

<?php print_r($bookmark); ?>

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

<?php endforeach; ?>
like image 838
ritch Avatar asked Jun 11 '11 00:06

ritch


People also ask

What is pass data between view and controller in CodeIgniter?

Pass Data Between View and Controller in CodeIgniter. HTML form is one of the common elements within the webpage which allows the user to input data and submit it for processing. The data is also passed by URL which is good for limited and less sensitive information.

Does CodeIgniter support multiple calls to $this->load->view () from within a controller?

The URL was similar to this: CodeIgniter will intelligently handle multiple calls to $this->load->view () from within a controller. If more than one call happens they will be appended together. For example, you may wish to have a header view, a menu view, a content view, and a footer view.

Is it possible to use CodeIgniter with a framework?

The point in using a Framework is to default to proper standards. CodeIgniter follows a loose MVC pattern but you should never pass things from the view to the controller. You can do it, but if you do it you'll be getting into a spaghetti mess pretty soon. Grab the ID's on the controller.

How do I map a URL in CodeIgniter?

Each of your sub-directories may contain a default controller which will be called if the URL contains only the sub-directory. Simply put a controller in there that matches the name of your default controller as specified in your app/Config/Routes.php file. CodeIgniter also permits you to map your URIs using its Defined Route Routing ..


2 Answers

You should do that in your Controller before you are passing the data to the View. Try with something like this:

<?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);
    }
} 
like image 96
Jonas Avatar answered Sep 28 '22 21:09

Jonas


You don't.

The point in using a Framework is to default to proper standards. CodeIgniter follows a loose MVC pattern but you should never pass things from the view to the controller.

You can do it, but if you do it you'll be getting into a spaghetti mess pretty soon.

Grab the ID's on the controller. Even if it implicates running the same loop twice. You'll thank yourself latter on.

like image 36
Frankie Avatar answered Sep 28 '22 19:09

Frankie