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);
}
Related
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.
I'm running CakePHP 2.4.1 and PHP 5.5.3.
I read here about how to create/write to/access a global variable, but it's not working for me. I'm doing something like this:
class SploopsController extends AppController {
public $crung;
public function process() {
$this->crung = 'zax';
}
public function download() {
$this->response->body($this->crung);
$this->response->type('text/plain');
$this->response->download('results.txt');
return $this->response;
}
}
But the downloaded file results.txt is blank, i.e. $this->crung is empty. (If I replace $this->crung with a simple string like 'Granjo' it works as intended.) Does anyone have an idea of what's going wrong?
Additionally, Configure::write and Configure::read aren't working for me either (if I call each within a function of the Controller).
Here's the context: I create an array with results to a query in process(), and display them in process.ctp, and I want to have a button that can download these results to a text file in a more text friendly format. So I want to make a global array, that I can modify in process() and then access in download().
Thanks!
Just call procees before setting
public function download() {
$this->process();
$this->response->body($this->crung);
$this->response->type('text/plain');
$this->response->download('results.txt');
return $this->response;
}
Edit
public function process() {
if (!empty($this->request->data)) { // assuming you're processing the user entered data by means of post
$this->Session->write('crung', 'zax');
$this->Session->write('data', $this->request->data);
}
}
public function download() {
$this->crung = $this->Session->read('crung');
$data = $this->Session->read('data'); // you can process the data in the way you want.
$this->response->body($this->crung);
$this->response->type('text/plain');
$this->response->download('results.txt');
return $this->response;
}
you need to call process() function before use $this->crung like as below
public function process() {
$this->crung = 'zax';
}
public function download() {
$this->process();
$this->response->body($this->crung);
$this->response->type('text/plain');
$this->response->download('results.txt');
return $this->response;
}
else you can use beforeFilter() function that will be called before your download() function. This is useful when you need to assign values
public function beforeFilter()
{
$this->crung = 'zax';
}
I am trying to initialize data in index function of controller, so that initialized data can be used in subsequent functions of controller. But the problem is data is not being displayed when I am trying to access it from other function. All of this is just to follow a sort of object oriented pattern.
Here is my code.
class Dashboard extends CI_Controller
{
private $account_data; /*Declaration*/
private $profile_data;
function __construct() {
// code...
}
function index() /*Here I am initializing data*/
{
$this->load->model('db_model');
$this->account_data = $this->db_model->get_row();
$this->profile_data = $this->db_model->get_row();
$this->load->view('user/dashboard');
}
function function account_details()
{
print_r($this->account_data); // This displays nothing
}
/*other function...*/
}
Idea is to get data once and use it for other functions and if data is updated again calls a function to initialize it.
But it is not working out. Please help me. Also suggest if I am following right approach.
Thanks for your time.
index method is not initializer, its default page/sub_method,
if you call the "*account_details*" in url as index.php/dashboard/account_details the index wont be called.
try put the code on constructor,
class Dashboard extends CI_Controller
{
private $account_data; /*Declaration*/
private $profile_data;
function __construct() { /*Here I am initializing data*/
parent::CI_Controller(); // Thank you Sven
$this->load->model('db_model');
$this->account_data = $this->db_model->get_row();
$this->profile_data = $this->db_model->get_row();
}
function index()
{
$this->load->view('user/dashboard');
}
function function account_details()
{
print_r($this->account_data); // This displays nothing
}
/*other function...*/
}
Note : don't the models or other computations on __construct() if you don't need on all methods of this controller.
create a private method like "model_initializer()" put this codes on this scope, and the call it in your other methos as $this->model_initialize(); if you need.
Thanks yo Sesama Sesame for note,
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
How to pass variable between two functions in same controller?
Do I need to use $this->session->set_flashdata is this right way to go ?
function load() {
$this->userhash = $this->uri->segment(3);
}
function save() {
$query_customer = $this->Customers->get_customer($this->userhash);
}
sorry if this is a basic stuff, but I am still learning.
I need to edit my question
In Ivan link, that I also googled out
there is a code which goes something like this
function index() {
$this->msg = 'data';
$this->testme();
}
function testme() {
echo $this->msg;
}
and its works, but I can not call $this->testme() directly in index(), so I can not load save() in load()
Passing data between two functions in my controller class