Make controller constructor value global codeigniter - php

Im trying to get the total unread accounts from the database, the value is assigned to $data['head']
I want to make the $data['head'] available globally so it will be automatically loaded into the template and displayed on the header.
What is the best way to do this?
Below is my controller
function __construct()
{
parent::__construct();
$this->load->model('process_model');
$data['headbody']='includes/header';
$data['head'] = $this->process_model->loadnew($this->session->userdata('id'));
}
function invform()
{
$this->load->model('slave');
$data['body']='slave-account';
$data['questions'] = $this->slave->loadq($this->uri->segment(3));
$this->load->view('includes/template',$data);
}
View
$this->load->view($head);
$this->load->view($body);
$this->load->view('includes/footer');

You first need to make $data into a variable outside the function, using variable scope. Can be private or public. I made it private in this case.
Here's a quick revision:
private $data = array();
function __construct()
{
parent::__construct();
$this->load->model('process_model');
$this->data['headbody']='includes/header';
$this->data['head'] = $this->process_model->loadnew($this->session->userdata('id'));
}
function invform()
{
$this->load->model('slave');
$this->data['body']='slave-account';
$this->data['questions'] = $this->slave->loadq($this->uri->segment(3));
$this->load->view('includes/template',$this->data);
}
Notice the $this->data, instead of $data. When we're accessing variables within the same class, but outside of the function, we use $this.

Related

Codeigniter: Using static variable

I am making a website in which i have to save a global variable.
I am using this person code globals_helper.php custom global variable class
But i always get static variable value null.
globals_helper.php:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
// Application specific global variables
class Globals
{
private static $authenticatedMemberId = null;
private static $initialized = false;
private static function initialize()
{
if (self::$initialized)
return;
self::$authenticatedMemberId = null;
self::$initialized = true;
}
public static function setAuthenticatedMemeberId($memberId)
{
self::initialize();
self::$authenticatedMemberId = $memberId;
}
public static function authenticatedMemeberId()
{
self::initialize();
return self::$authenticatedMemberId;
}
}
I have done all the steps like add globals_helper.php in helper folders and updated autoload file. Now I am trying to access those static variable from a custom library "Ctrl_utility" function "get_search_term" and my controllers calling get_search_term function
Ctrl_utility.php
class Ctrl_utility {
protected $CI;
public static $static_search = "";
public function __construct()
{
// Assign the CodeIgniter super-object
$this->CI =& get_instance();
}
public function get_search_term($searchTerm){
$searchTerm = $this->CI->security->xss_clean(htmlspecialchars($searchTerm));
if (isset($searchTerm) && strlen($searchTerm)>0) {
Globals::setAuthenticatedMemeberId($searchTerm);
} else {
$searchTerm = Globals::authenticatedMemeberId();
}
return $searchTerm;
}
One of my controller and they all have class ctrl_utility, get_search_term function:
class Blog_controller extends CI_Controller{
public function __construct() {
parent::__construct();
$this->load->model('blogs_model');
}
public function index(){
//Get SearchTerm Values
$searchTerm = $this->ctrl_utility->get_search_term($this->input->post('searchTerm'));
//Get Url First Parameter
$start = $this->ctrl_utility->get_url_first_parameter();
// Get Data from solr
$rows = 10;
$data = $this->blogs_model->solrData($start, $rows, $searchTerm); //give start of documents
//Pagination
$this->pagination->initialize($this->ctrl_utility->pagination_config($this->uri->segment(1), $rows, $data['found']));
//Views
$this->load->view('tabs/blogs', $data);
}
}
Am i doing something wrong?
Now when it comes to define them in CodeIgniter, there are several ways do that. I’ve listed some of them below:
Create your own file in application/libraries in which class constructor contains an array as an argument. Now create a new file in /application/config with same name as given in application/libraries and declare your global variables in it. Now to use these variables, autoload the newly created library.
Create your own file in application/core and declare the global variables in it. Than in controller you need to extend your file name instead of CI_Controller.
If the Global Variables are true constants, just add them in application/config/constants.php file and name them in all uppercase like the others are defined.
If you want to set application constants create new config file and add the variables. Now load it as $this->config->load(‘filename’); And access those variables as
$this->config->item(‘variable_name’);
Instead of creating helper create a library
Step 1: First of all, open application/libraries and create a custom
class name globals.php. It contains a constructor function which
contains an array as an argument.
<?php
class Globals {
// Pass array as an argument to constructor function
public function __construct($config = array()) {
// Create associative array from the passed array
foreach ($config as $key => $value) {
$data[$key] = $value;
}
// Make instance of CodeIgniter to use its resources
$CI = & get_instance();
// Load data into CodeIgniter
$CI->load->vars($data);
}
}
?>
Step 2: Now to make config file, open application/config and create
file as globals.php and write the code given below. This file contains
the config variable which will be passed as an array to constructor of
Globals class where its keys and values are stored in $data
<?php
// Create customized config variables
$config['web_Address']= 'https://www.example.com/blog';
$config['title']= 'CodeIgniter Global Variable';
?>
When constructor function loads, it will take the config variables
from the config file in order to use these variables anywhere.
Note: Name of the above file must be same as the class created in
libraries folder otherwise the code will not work.
Step 3: But before using these variables we have to autoload the newly
created library globals as given below.
And load library in autoload
$autoload['libraries'] = array('globals');
Now, you can use global variables in your controller
<?php
class CI_Global_Variable_Tutorial extends CI_Controller{
public function __construct() {
parent::__construct();
}
// Load view page
public function index() {
$this->load->view('show_global_variables');
}
}
?>
Views : show_global_variables.php
In view page, we can use global variables according to our need.
<?php
echo "Title of the blog post : ".$title;
echo "<a href='$web_Address'>"."Click here to go to blog page"."</a>";
?>

CodeIgniter can not access global variable in controller

I have already tried lots of ways. add library, add config file, add a controller, just add in same controller.........etc.
This also have same problem:
(this is add in same controller)
<?php
class Test extends CI_Controller{
public $data = array();
public function __construct(){
parent::__construct();
//if call add_data() here, it is work
}
function add_data(){
$arraya = array('a'=>'aa', 'b'=>'bb');
$this->data = $arraya;
}
function index(){
$this->add_data();
}
function want_print(){
print_r($this->data);
}
}
?>
if I call add_data in index, i cannot get any data in want_print()....
if I call add_data in the construct, i can get data in want_print()..
Please anyone help me solve this problem?
I don't want to call it in construct because i will not call it every time...
You can set the data in your want_print() function like this:
function want_print() {
$this->index();
print_r($this->data);
}

Declaring private variable in Codeigniter Controller

I'm new to CI and I'm trying to access a private variable through the application, but I set a value to the variable, next time I try to access the function(that I called from a submit form in my view), the private variable that I had set is empty. Can someone help? thx
class Example extends CI_Controller{
private $_variable;
public function __construct()
{
parent::__construct();
}
public function index()
{
//value from database
$this->_variable = 'somevalue';
}
//calling this function from a view
public function some_method()
{
// code...
// $this->_variable returning without any value
}
}
Your views shouldn't directly try to access methods of your controller, instead, you should send those while calling the view in the second arg:
See Codeigniter's docs related to this (I assume you're spanish, because you use "variable").
$args = Array( "var1" => "variable", "var2" => "variable" );
$this->load->view("some_url", $args);
Then $var1 and $var2 will be available in your view.
Your some_method is not actually a view. At best it could be a Example Controller function that will calling from a view. Your index() function is actually assigning the value in your private $_variable, so to pass the value to your view, you must first call the index() function to assign variable and the value will be available to your some_method(). Example of how you'll pass the variable to your view is given bellow.
public function some_method()
{
return $this->_variable;
}
In Your view, to access the variable:
echo $this->some_method();
I believe this will help you to show your private variable in your view.

PHP access property of individual method inside object

Trying to get the property inside a function so not sure how to do it.
Here is my class:
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
class Data extends CI_Controller {
public $data;
public function __construct() {
parent::__construct();
$this->load->model('months');
$this->load->driver('cache');
}
}
public function graph1() {
$this->data = $this->months->get_months();
$this->layout->view('graph1', $this->data);
}
So trying to get value of $data inside graph1() in another class, for example:
$object = new Data();
print_r($object->data);
This gives me a blank output, how can i make the $data value have the database result set?
Before dumping your object data, call your graph method to actually get the data. i.e.
$object = new Data();
$object->graph1();
print_r($object->data);
You could also call graph1 from your constructor like:
public function __construct() {
parent::__construct();
$this->load->model('months');
$this->load->driver('cache');
$this->graph1();
}
That way you would be able to actually use:
$object = new Data();
print_r($object->data);
If this solves your problem, I suggest you should read up OOP concepts. Regards.
I will show the real solution that works with the web application and unit testing.
Change this on data controller to:
public function graph1() {
$this->data = $this->months->get_months();
$this->layout->view('graph1', $this->data);
}
To:
public function graph1() {
$this->data = $this->months->get_months();
$this->layout->view('graph1', $this->data);
return $this->data;
}
The return won't cause problems with the layout and views. And will return the correct data to the unit test:
public function testgraph1() {
$object = new Data();
$out = $object->graph1();
print_r($out);
$this->assertArrayHasKey('11', $out);
}
So the other answer is incorrect, and will cause issues with the layout when graph1() is called in the constructor. I don't need to read about OOP but would suggest the person who answered incorrectly to read about web applications and unit testing.

Codeigniter: Where to put the variable from a url

I am developing a stats site in Codeigniter locally. I have a url like localhost/sitename/player/show_profile/PlayerName
I currently have the following:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Player extends CI_Controller
{
public function __construct()
{
parent::__construct();
$this->load->model('player_model');
$player_name = $this->uri->segment(3);
}
public function index()
{
echo "index";
}
public function show_profile($player_name)
{
$data['player_stats'] = $this->player_model->get_stats( $player_name );
$this->load->view('player/player_stats', $data);
}
}
?>
This works, but my question is regarding the $player_name variable. I have $player_name = $this->uri->segment(3); in the __construct so it's available to all of the class methods. Is this the way I should be doing it?
Is this safe?
Fist of all, there is no point in assigning the variable in the constructor because it's going to get overwritten. When you pass CI a url like localhost/sitename/player/show_profile/PlayerName, anything passed the method (i.e. PlayerName) get's set as the parameters. Therefore, your variable in
public function show_profile($player_name){
is already set when you get to your method code.
Secondly, I agree with Peter's:
protected $player_name;
for making it globally accessible in the controller. BUT, I don't agree with setting it in the constructor. If you have another method in this controller that passes a variable in that spot, you're going to get the wrong data in there. Set it in the method you called:
public function show_profile($player_name){
$this->player_name = $player_name;
$data['player_stats'] = $this->player_model->get_stats( $player_name );
$this->load->view('player/player_stats', $data);
}
What you could do is define a class variable called $player_name and in the constructor set this to segment(3).
class Player extends CI_Controller
{
protected $player_name;
public function __construct() {
parent::__construct();
$this->load->model( 'player_model' );
$this->player_name = $this->uri->segment( 3 );
}
public function index() {
echo "index";
}
public function ( show_profile ) {
$data['player_stats'] = $this->player_model->get_stats( $this->player_name );
$this->load->view( 'player/player_stats', $data );
}
}
This way will be able to access the $play_name variable anywhere in the class.
You could also check to see if it's set using the $this->uri->uri_to_assoc(n) method and check to see if the key/value isset() http://codeigniter.com/user_guide/libraries/uri.html.
Peter

Categories