Using CodeIgniter to populate drop down lists in forms - php

Being new to CI and PHP, especially arrays, I'm struggling with documentation and tutorials. Please don't point me to the documentation, I have been reading it all day.
As I understand it, I need a view (form), controller and model. The model connects to my default DB connection via a class/function (my DB is where my drop-down list country data is stored), it returns an array, and finally the model parses the array to the form.
Where I struggle is how to parse the array along to the view. Because I'm dealing with 3 files, to output one html file, context is really important, as is syntax. I asked this earlier today and nearly lost my mind as the two answers I got were fragmented and out of context. They were helpful but assumed I knew a lot more than I do.
In other words, please be explicit, because a syntax oversight or knowledge assumption could have me scratching my head for hours. Thanks in advance!
Here's my attempt which isn't working, basically whatever variable I use in the view returns a variable undefined error...
View/Form...
<body>
<?php echo form_open('form'); ?>
<h5>Country</h5>
<?php echo form_dropdown('', $data, '');?>
<div><input type="submit" value="Submit" /></div>
<?php echo form_close() ?>
</body>
My controller...
<?php
class Form extends CI_Controller {
function index()
{
$this->load->helper(array('form', 'url'));
$this->load->library('form_validation');
$this->load->model('country');
$data['country'] = $this->country->get_country();
$this->load->view('myform', $data);
if ($this->form_validation->run() == FALSE)
{
$this->load->view('myform');
}
else
{
$this->load->database();
$sql = "INSERT INTO donations (country) VALUES (
".$this->db->escape($this->input->post('country')).";
$this->db->query($sql);
echo $this->db->affected_rows();
$this->load->view('formsuccess');
}
}
}
?>
My model...
<?php
class Country extends CI_Model
{
function get_country() {
$this->load->database();
$sql = ('select * from countries');
return $this->db->query($sql)->result();
}
}
?>

Controller
You have $data['country'] with data from database, but your are not adding the $data to the view.
Use $this->load->view('myform', $data); to pass the data to the view.
View
I believe codeigniter extracts the key in the $data:
so simply test in the view what's there var_dump($data); and var_dump($country) and
then build the form_dropdown.
Use echo form_dropdown('country_dropdown', $country, ''); in your view.
Model
Adjust the model to return the array structure needed for form_dropdown.
function get_country() {
$this->load->database();
$sql = ('select * from countries');
$query = $this->db->query($sql);
foreach($query->result_array() as $row) {
$data[$row['id']] = $row['name'];
}
return $data;
}

Related

Codeigniter : how can i get user data by user_id

I'm still very new to this codeigniter. So i have a tables in my database called users table and t_lowongan table. The t_lowongan table have user_id field as a foreign key for the id_user in the users table. So when the user login and create a job posting, the user_id will be filled by the id_user from that user. I want to get the user data so that this user know which job posting that he has created by that user, but the data isn't showing, how can i fix it??
The Controller Lowongan :
public function lowongan()
{
$this_id = $this->session->userdata('id_user');
$data['t_lowongan'] = $this->db->get_where('t_lowongan', ['user_id', $this_id])->result();
$this->load-view('lowongan', $data);
}
Your approach to debugging isn't quite right here. Firstly, you must understand that the database object's result() method returns an array of row objects in the form of $row->field (or in your case, $row->user_id). On the other hand, the database object's result_array() method returns an array of arrays (in your case, $row['user_id']). Since you've used the former, I hope you've dealt with those row objects accordingly in the lowongan view which you then show. Failure to do so might result in the problem you've described in the question.
Assuming you've taken care of the view, the second thing to do then is to place an error_log() statement and see what value it's returning. You can place something like this just after the get_where() statement and then observe your HTTP server logs what value it's getting:
error_log("THE RESULT IS: " . print_r($data, true));
Depending on whether or not this is printing the correct value, you can then further troubleshoot where exactly the problem lies.
You must create controller and model and call model from construct
constroller :
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class LowonganController extends CI_Controller {
public function __construct()
{
parent::__construct();
$this->load->model(array('m_lowongan'));
}
public function lowongan() {
$id = $this->session->userdata('id_user');
$data['t_lowongan'] = $this->m_lowongan->get_user_by_id($id);
$this->load-view('lowongan', $data);
}
}
model:
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class M_Lowongan extends CI_Model {
public function __construct()
{
parent::__construct();
}
public function get_user_by_id($id)
{
$this->db->where('user_id', $id);
$query = $this->db->get('your_table_name');
return $query->row_array();
}
}
So what i did is that. I create a function called get_data on my model
The model :
public function get_data($where, $table){
return $this->db->get_where($table, $where);
}
And in the controller i just do this :
The Controller :
public function lowongan()
{
$this_id = $this->session->userdata('id_user');
$data['t_lowongan'] = $this->m_lowongan->get_data($where,'t_lowongan')->result();
$this->load-view('lowongan', $data);
}
And it works :D. But please let me know if this is like a wrong thing to do, Thank you :D
Try this
public function lowongan()
{
$this_id = $this->session->userdata('id_user');
$data['t_lowongan'] = $this->db->get_where('t_lowongan', ['user_id', $this_id])->row();
$this->load-view('lowongan', $data);
}
in your views
<?php print_r($t_lowongan)?>

CodeIgniter - Displaying data from a query [duplicate]

I want to pass $data from the controller named poll to the results_view however I am getting an undefined variable error.
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Poll extends CI_Controller {
public function __construct()
{
parent::__construct();
$this->load->database();
$this->load->helper('form');
}
public function index()
{
$this->load->view('poll_view',$data);
}
public function vote()
{
echo "Voting Successfull";
$this->db->insert('votes',$_POST);
}
public function results()
{
echo "These are the results";
//$query = $this->db->get('votes');
$data = "hello";
$this->load->view('results_view', $data);
}
}
Results_view.php
<html>
<?php echo $data; ?>
</html>
$data should be an array or an object: http://codeigniter.com/user_guide/general/views.html
$data = array(
'title' => 'My Title',
'heading' => 'My Heading',
'message' => 'My Message'
);
$this->load->view('results_view', $data);
results_view.php
<html>
<?php
//Access them like so
echo $title.$heading.$message; ?>
</html>
In simple terms,
$data['a'] in controller becomes $a in your view. ($data won't exist in your view, only the index will become available)
e.g.
Controller:
$data['hello']='hellow world';
view:
echo $hello;
You just need to create a array, you using codeigniter right?
Example on controller:
$data['hello'] = "Hello, world";
$this->load->view('results_view', $data);
In de page "results_view" you just have to:
<?php echo $hello;?>
Obs: You can create n datas, just pay attention in the name and make it a array.
ObsĀ²: To use the data use the key of the array with a echo.
The view wouldn't call the data 'data'
The controller would include an associative index (not sure if that's correct nomenclature) for data e.g 'stuff' looking thus $data['stuff']
You'd echo in the view so: echo $stuff; not echo $data;
I am a v lowly code fiddler but do really like CodeIgniter so excuse me if i've got this arse about tit.
One more thing - surely your constructor function is a bit of a waste. All that loading of libraries and helpers is done with the autoload file.
You can create property $data = []; inside CI_Controller(path: system/core/Controller.php) and store all data to show in view. U can load common data like languages, menu, etc in CI_Controller. Also u can add special data for view in controller. (example: $this->data['message'] = "Hello world";)
Finally, u can pass $this->data to view when load view (example: $this->load->view('view_name',$this->data);)
I hope this will help you
you can do it this way
defined array in controller
$data['hello'] = "hello";
and pass variable to view
echo $hello;
If you pass
$data = your code
$this->load->view('your-page', $data);
and get data on your view as
<?php echo $data;?>
It won't work because ci didn't understand this patern. If like to pass value form controller to view so you can try this -
controller -
$data['any-name'] = your values;
$this->load->view('your-page', $data);
then in your view you can get this data by -
<?php echo $any-name;?>
Hope this helps you.
In your controller you can pass
$data['poll'] = "Your results";
In your view you can call
echo $poll;
In controller:
$data["result"] = $this->login_model->get_login(); // Get array value from DB..
$this->load->view('login-form',$data); // Pass the array to view
In view:
print_r($result); // print the array in view file
Ok so I finally solved it. You should really have a model (it helps a lot)
In your model do something like
Model
class poll_model extends CI_MODEL {
function __construct() {
$this-load->database();
}
function get_poll {
$this->db->query("SELECT * FROM table");
$row = $query->row();
$obj = array(
'id' => $row->id
);
return $obj;
}
}
Now if you have more than an id say name of poll # you can add in array.
Now in your controller do
class Poll extends CI_Controller {
public function __construct()
{
parent::__construct();
$this->load->database();
$this->load->helper('form');
$this->load->model('poll_model');
}
public function index()
{
$data["a"] = $this->poll_model->get_poll();
$this->load->view('poll_view',$data);
}
And finally in VIEW put
<? echo $a["id"]; ?>
This is a big help. I figured it out by testing and it works for me.
I have seen all above answer so here is what I do when I have to load the data from the controller to my view.
To Pass the Data To the view from the controller:
public function your_controller(){
// Your Necessary Code
// You have the $data, $data2, $data3 to post to the view.
$this->load->view('your_view_directory or view_page',['data'=>$data, 'data2'=>$data2, 'data3'=>$data3... so on ]);
}
And At the View Side You can simply retrieve that data:
To Display You can simply use echo, print, print_r. And if you want to loop over it, you can do that as well.
In controller:
public function product(){
$data = array("title" => "Books", "status"=>"Read","author":"arshad","company":"3esofttech",
"subject":"computer science");
Data From Model to controller
$this->load->model('bookModel');
$result = $this->bookModel->getMoreDetailsOfBook();
**Add *$result* from model to *$data* array**
$data['tableRows'] = $result;
$data from Controller to View
$this->load->view('admin/head',$data);
And to access in view file
views/user.php
<?php echo $data;
foreach($tableRows as $row){ echo
$row['startData']; } ?>
Instead of
$data = "hello";
$this->load->view('results_view', $data);
Do
$data['hello'] = 'hello';
$this->load->view('results_view', $data);
In your controller file and controller will send data having hello as string to results_view and in your view file you can simply access by
echo $hello;

Question about Session data and CodeIgniter 3 [duplicate]

I want to pass $data from the controller named poll to the results_view however I am getting an undefined variable error.
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Poll extends CI_Controller {
public function __construct()
{
parent::__construct();
$this->load->database();
$this->load->helper('form');
}
public function index()
{
$this->load->view('poll_view',$data);
}
public function vote()
{
echo "Voting Successfull";
$this->db->insert('votes',$_POST);
}
public function results()
{
echo "These are the results";
//$query = $this->db->get('votes');
$data = "hello";
$this->load->view('results_view', $data);
}
}
Results_view.php
<html>
<?php echo $data; ?>
</html>
$data should be an array or an object: http://codeigniter.com/user_guide/general/views.html
$data = array(
'title' => 'My Title',
'heading' => 'My Heading',
'message' => 'My Message'
);
$this->load->view('results_view', $data);
results_view.php
<html>
<?php
//Access them like so
echo $title.$heading.$message; ?>
</html>
In simple terms,
$data['a'] in controller becomes $a in your view. ($data won't exist in your view, only the index will become available)
e.g.
Controller:
$data['hello']='hellow world';
view:
echo $hello;
You just need to create a array, you using codeigniter right?
Example on controller:
$data['hello'] = "Hello, world";
$this->load->view('results_view', $data);
In de page "results_view" you just have to:
<?php echo $hello;?>
Obs: You can create n datas, just pay attention in the name and make it a array.
ObsĀ²: To use the data use the key of the array with a echo.
The view wouldn't call the data 'data'
The controller would include an associative index (not sure if that's correct nomenclature) for data e.g 'stuff' looking thus $data['stuff']
You'd echo in the view so: echo $stuff; not echo $data;
I am a v lowly code fiddler but do really like CodeIgniter so excuse me if i've got this arse about tit.
One more thing - surely your constructor function is a bit of a waste. All that loading of libraries and helpers is done with the autoload file.
You can create property $data = []; inside CI_Controller(path: system/core/Controller.php) and store all data to show in view. U can load common data like languages, menu, etc in CI_Controller. Also u can add special data for view in controller. (example: $this->data['message'] = "Hello world";)
Finally, u can pass $this->data to view when load view (example: $this->load->view('view_name',$this->data);)
I hope this will help you
you can do it this way
defined array in controller
$data['hello'] = "hello";
and pass variable to view
echo $hello;
If you pass
$data = your code
$this->load->view('your-page', $data);
and get data on your view as
<?php echo $data;?>
It won't work because ci didn't understand this patern. If like to pass value form controller to view so you can try this -
controller -
$data['any-name'] = your values;
$this->load->view('your-page', $data);
then in your view you can get this data by -
<?php echo $any-name;?>
Hope this helps you.
In your controller you can pass
$data['poll'] = "Your results";
In your view you can call
echo $poll;
In controller:
$data["result"] = $this->login_model->get_login(); // Get array value from DB..
$this->load->view('login-form',$data); // Pass the array to view
In view:
print_r($result); // print the array in view file
Ok so I finally solved it. You should really have a model (it helps a lot)
In your model do something like
Model
class poll_model extends CI_MODEL {
function __construct() {
$this-load->database();
}
function get_poll {
$this->db->query("SELECT * FROM table");
$row = $query->row();
$obj = array(
'id' => $row->id
);
return $obj;
}
}
Now if you have more than an id say name of poll # you can add in array.
Now in your controller do
class Poll extends CI_Controller {
public function __construct()
{
parent::__construct();
$this->load->database();
$this->load->helper('form');
$this->load->model('poll_model');
}
public function index()
{
$data["a"] = $this->poll_model->get_poll();
$this->load->view('poll_view',$data);
}
And finally in VIEW put
<? echo $a["id"]; ?>
This is a big help. I figured it out by testing and it works for me.
I have seen all above answer so here is what I do when I have to load the data from the controller to my view.
To Pass the Data To the view from the controller:
public function your_controller(){
// Your Necessary Code
// You have the $data, $data2, $data3 to post to the view.
$this->load->view('your_view_directory or view_page',['data'=>$data, 'data2'=>$data2, 'data3'=>$data3... so on ]);
}
And At the View Side You can simply retrieve that data:
To Display You can simply use echo, print, print_r. And if you want to loop over it, you can do that as well.
In controller:
public function product(){
$data = array("title" => "Books", "status"=>"Read","author":"arshad","company":"3esofttech",
"subject":"computer science");
Data From Model to controller
$this->load->model('bookModel');
$result = $this->bookModel->getMoreDetailsOfBook();
**Add *$result* from model to *$data* array**
$data['tableRows'] = $result;
$data from Controller to View
$this->load->view('admin/head',$data);
And to access in view file
views/user.php
<?php echo $data;
foreach($tableRows as $row){ echo
$row['startData']; } ?>
Instead of
$data = "hello";
$this->load->view('results_view', $data);
Do
$data['hello'] = 'hello';
$this->load->view('results_view', $data);
In your controller file and controller will send data having hello as string to results_view and in your view file you can simply access by
echo $hello;

CodeIgniter calling model on view?

I have a view which comport a table of data, this data is generated on a model.
How can I call this model in my view to be posted on my view...?
That's the Equivalent of what I want to do with codeIgniter on php :
while($row = mysql_fetch_array($requet))
{
// code of displaying my data;
}
try using
$CI =& get_instance()
then load your model like this:
$CI->load->model('someModel')
then call your model function like this:
$result = $CI->someModel->somefunction()
then display using foreach
foreach($result as $row){ $row->somecolumnName }
i called model method like this.
<?php
$CI =& get_instance();
$CI->load->model('MyModel');
$result= $CI->MyModel->MyMethod($parameter)->result_array();
foreach($result as $row){
echo $row['column_name'];
}
?>
I think it is not a good idea to call a model directly from the view.
Your controller must get data from the model then send it to your view
$this->load->model('my_model');
$my_data['my_array'] = $this->my_model->get_my_data();
$this->load->view('your_view', $my_data);
In your view use it like this
foreach($my_array as $item){
echo $item;
}
First Model interacts withe the database.Then load the model and access relevant function in your controller.Finally load the data to view from the controller.That's it...you can show the data simply in a foreach loop.
You can call model functions form view. Remember: This solution is against MVC pattern
Model:
function getdata() {
$query = $this->db->query($sql);
return $query->result_array();
}
View:
foreach($this->modelname->getdata() as $item) {
}

Codeigniter loading two different data array from a database with the second one is dependent with the first one and load into a view

This is my code:
my model : My_model
function load_modules(){
$modules = $this->db->query('SELECT name FROM module');
$result = $modules->result_array();
return $result;
}
function load_lesson($modname){
$lessons = $this->db->query(
'SELECT lesson.name
FROM lesson
INNER JOIN module
ON module.id = lesson.moduleid and module.name = $modname'
);
$result = $lessons->result_array();
return $result;
}
my controller : My_controller
$this->load->model('My_model');
$arraydata['values'] = $this->My_model->load_modules();
and in my view:
foreach($values as $modulename){
load_lesson($modulename); // This is the method from my model which
// I want to be access in my controller in a way that will work like this.
}
What I wanted to happen is to be able to get all lessons for each module. But I can't figure out of a way to do it in a controller. Hope you can help me with this. Thanks!
don't try to call a method of a model from a view. try something like this in controller....
$this->load->model('My_model');
$arraydata['values'] = $this->My_model->load_modules();
foreach($arraydata['values'] as $key=>$value){
$arraydata['values'][$key]['lessons']=$this->My_model->load_lesson($value);
}

Categories