Passing parameters to __construct library in Codeigniter - php

I am really new to Codeigniter, and just learning from scratch. checked the documentation on Creating Libraries but no success on my example:
I need to pass a value to __construct library.
class: libraries/Myclasses/Bird
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Bird{
public $fly;
public $goodsound;
public function __construct($fly, $goodsound) {
$fly = $this->fly;
$goodsound = $this->goodsound;
}
public function sentance(){
return "This Bird can ".$this->fly . " and has ". $this->goodsound;
}
}
class: libraries/Mybird
<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');
require_once(APPPATH.'libraries/Myclasses/Bird.php');
class Mybird extends Bird {
public function __construct() {
}
}
controller: Birds
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Birds extends CI_Controller {
public function __construct(){
parent::__construct();
$config = array('fly' => 'fly', 'goodsound' => 'very good');
$this->load->library('Mybird', $config);
}
public function index(){
$mybird = new mybird();
echo $mybird->sentance();
}
}
I think that the problem is in Mybird class that not passing the values but i can't figure out how to handle it.

One issue is in the constructor for Bird. Try this.
class Bird{
public $fly;
public $goodsound;
public function __construct($fly, $goodsound)
{
$this->fly = $fly;
$this->goodsound = $goodsound;
}
Without the $this-> before the property name you are creating local variables that will go out of scope when the constructor ends.
Secondly, any class extending Bird should pass two arguments to the base class constructor. For instance:
class Mybird extends Bird {
public function __construct()
{
parent::__construct('Fly', 'very good');
}
}
You could define Mybird to accept arguments too and then pass those to parent::__construct
class Mybird extends Bird {
public function __construct($fly, $goodsound)
{
parent::__construct($fly, $goodsound);
}
}
There is no need for the new call in the Controller - $this->load->library('Mybird', $config); did that for you already.
index() should work fine as shown below. Note that Mybird is a property of the controller and so needs to be accessed using $this.
public function index(){
echo $this->Mybird->sentance();
}
However, if you want to pass a $config array as an argument when loading a library then you need to revise both the Bird and the Mybird classes like so.
class Bird
{
public $fly;
public $goodsound;
public function __construct($config)
{
$this->fly = $config['fly'];
$this->goodsound = $config['goodsound'];
}
}
class Mybird extends Bird
{
public function __construct($config)
{
parent::__construct($config);
}
}

Your library Mybird also needs to be set to except parameters in its constructor when the library is called from the controller Bird with $this->load->library('Mybird', $config);
when extending the library, you need to stick to what is set in your config.php, something like $config['subclass_prefix'] = 'MY_'; would require MY_Bird instead of Mybird
more info on the subject here and here

Related

How to extend a common controller by other controllers in Laravel 5.2?

I am new to Laravel. I have extended a common controller by other controllers in Codeigniter. Here is my CI common controller.
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Common extends CI_Controller {
protected $_data = array();
public function __construct() {
parent::__construct();
$this->load->helper(array('url','form','html'));
$this->load->library(array('session','authentication','upload','image_lib','pagination'));
$this->_data['totalUser'] = 10;
$this->_data['newUser'] = 2;
$this->_data['totalChallenge'] = 1;
$this->_data['totalReport'] = 1;
}
}
This is how I extended it in other CI controllers:-
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
include_once('common.php');
class Dashboard extends Common {
public function __construct() {
parent::__construct();
$this->load->model('login_model');
}
public function index()
{
$data['globalData'] = $this->_data;
$entity = 'dashboard';
$action = 'view';
$data['action'] = $action;
$data['entity'] = $entity;
$this->authentication->is_loggedin($this->session->userdata('user_name'));
$this->load->view('admin/dashboard',$data);
}
}
Now, in view page, I can just print the values like <?php echo $globalData['totalUser'];?>
Why am I doing this?
Suppose, today I need to add 20 more data in all the controllers. Then I will have to change only in the common controller. Since $data['globalData'] = $this->_data; will make all 20 data available in every controller, it is easy for coder to write one LOC instead of 20 LOC.
How can I do the above work in Laravel 5.2?
In Laravel you have a base controller located in App\Controller.
You can use it exactly as are you using your CIController, because all the generated controllers (by Artisan) are extending that base project controller.
You can easily create the base controller which extents Laravel Controller in same directory ie(/controllers)
Following sample
DashboardController.php
class DashboardController extends \BaseController {
public function index()
{
$data['globalData'] = $this->_data;
$entity = 'dashboard';
......
}
BaseController.php (extends laravel Controller)
<?php
class BaseController extends Controller {
/**
*
* define your value
*/
protected $_data = "20";
}
please add if anything is missing

Load a model in Codeigniter 3.0.3

I have a project whith this structure in controllers folder:
places.php
users.php
items.php
...
And in my models folder:
Place.php (the name inside is class Place extends ActiveRecord\Model)
User.php
...
Inside my controller places.php if I want to load a model I have to do just that:
$this->load->model('Place');
And after that I have to call my method like that:
$this->place->get_all_places();
It was work in my localhost but not in my server I check my php version in the server and it's 5.6.
How I can fix that?
That's my model file Place.php
class Place extends ActiveRecord\Model
{
static $table_name = 'places';
static $has_many = array(
);
public function get_all_places()
{
return true;
}
}
That's my controller file places.php
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Places extends MY_Controller {
function __construct()
{
parent::__construct();
if($this->user){
$access = TRUE;
}else{
redirect('login');
}
}
function index()
{
$this->content_view = 'places/all';
}
function get_places(){
$this->theme_view = '';
$this->load->model('Place');
$this->place->get_all_places();
}
}
And the error it was that:
Unable to locate the model you have specified: place
Your model file name should be
Places_model.php
and inside model
class Places_Model extends CI_Model # Changed
{
static $table_name = 'places';
static $has_many = array();
public function get_all_places()
{
return true;
}
}
Models in Codeigniter
I think every thing is right.But the problem is due to this line..
class Place extends ActiveRecord\Model
If you define a new model which extends the CI_Model.And then name of new model can not like as ActiveRecord\Model.Name may be as ActiveRecordModel.SO one solution for you can be..replace above line as below if you define the new model named as ActiveRecordModel in application/core folder.
class Place extends ActiveRecordModel
Another solution can be if you have not define any new model.then just replace above line as
class Place extends CI_Model

PHP - How to extend and access parent constructor properties

I am attempting to access the parent class __construct properties within a child class that extends this, however not sure how to do this as I have tried multiple methods and didn't give me the expected result.
So I have a baseController and a indexController which extends it, I want to be able to have direct access to the properties of the parent within the child controller.
$config = ['site' => 'test.com'];
class baseController {
public function __construct($config){
$this->config = $config;
}
}
class indexController extends baseController {
public function __construct(){
parent::__construct(); // doesnt seem to give any outcome
}
public static function index() {
var_dump($this->config); // need to access within this method
}
}
$app->route('/',array('indexController','index')); // the route / would call this controller and method to return a response
There are several issues with code you have there. You are setting up config as a global, it should be inside your BaseController and set it to public or protected:
class BaseController {
protected $config = ...
Just like #mhvvzmak1 mentioned, your child constructor is calling the parent properly. for example you can do it like so:
class IndexController extends BaseController {
public function __construct(){
$config = [];
parent::__construct($config);
}
and finally just like dan08 mentioned, you can't reference $this from a static method, change your index function:
public function index() {
Update
If you really want the child function to remain static as required by your framework, you make config a static function on the BaseController and call it in the child.
class BaseController {
protected static function config() {
return ['site' => 'mySite'];
}
}
class Child extends BaseController {
public static function index() {
$config = BaseController::config();
}
}

How to call one controller function in another controller in codeigniter

I have one controller named home.php in which a function named podetails is there. I want to call this function in another controller user.php.
Is it possible to do so? I have read about HMVC in CI, but I want to know is it possible to do without using hmvc?
To extend controller please either follow this tutorial or see some code below.
differences between private/public/protected
make a file in folder /application/core/ named MY_Controller.php
Within that file have some code like
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class MY_Controller extends CI_Controller {
protected $data = Array(); //protected variables goes here its declaration
function __construct() {
parent::__construct();
$this->output->enable_profiler(FALSE); // I keep this here so I dont have to manualy edit each controller to see profiler or not
$this->load->model('some_model'); //this can be also done in autoload...
//load helpers and everything here like form_helper etc
}
protected function protectedOne() {
}
public function publicOne() {
}
private function _privateOne() {
}
protected function render($view_file) {
$this->load->view('header_view');
if ($this->_is_admin()) $this->load->view('admin_menu_view');
$this->load->view($view_file . '_view', $this->data); //note all my view files are named <name>_view.php
$this->load->view('footer_view');
}
private function _isAdmin() {
return TRUE;
}
}
and now in any of yours existing controllers just edit 1st or 2nd line where
class <controller_name> extends MY_Controller {
and you are done
also note that all your variables that are meant to be used in view are in this variable (array) $this->data
example of some controller that is extended by MY_Controller
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class About extends MY_Controller {
public function __construct() {
parent::__construct();
}
public function index() {
$this->data['today'] = date('Y-m-d'); //in view it will be $today;
$this->render('page/about_us'); //calling common function declared in MY_Controller
}
}
write the podetails() as a function within a helper file.
then load that helper in both of the controllers.
in the controller you just call podetails()
Suppose:
--controller 1--
function podetails()
{
podetails(); // will call function in helper ;
}
--controller 2--
function podetails()
{
podetails(); // will call function in helper ;
}

Codeigniter on Ubuntu not Loading Model

I've recently switched from Windows 7 to Ubuntu.. Now I'm having this strange problem with codeigniter.. My code works prefect on Widnows 7 Xampp server, but when I try to access it on ubuntu having apache2, I cannot load any model, libraries etc.
Here is my code for model
<?php
class Usermodel extends CI_Model
{
function __construct()
{
// Call the Model constructor
parent::__construct();
$this->user_per_page = 8;
}
function getUser($id)
{
$query = $this->db->query("SELECT * FROM user WHERE id = $id");
if(intval($query->num_rows()) > 0)
{
$data = $query->result();
return $data[0];
}
else
return null;
}
}
Here is the code of my controller where i am loading model
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Register extends CI_Controller
{
public function index()
{
$this->load->model("Usermodel");
$fb_config = array(
'appId' => 'xxxxxxxxxxx',
'secret' => 'xxxxxxxxxxxxxxxxxxxxxxxx'
);
$this->load->library('facebook', $fb_config);
$this->load->helper('security');
}
}
I've already tried the following
1. Changed usermodel.php to Usermodel.php
2. Changed $this-load->model("Usermodel") to $this-load->model("usermodel")
but none seem to work
I get this fatal error when i call $this->Usermodel->getUser(1) in index() function of my controller
PHP Fatal error: Call to a member function getUser() on a non-object in /var/www/voicebuds/application/controllers/register.php on line 19, referer: mysite
UPDATE
If i put the Usermodel in config/autoload.php, it works fine.. So I must say there is some problem with loader function.
check your model file name for model
<?php
// file name usermodel.php
class Usermodel extends CI_Model
{
function __construct()
{
// Call the Model constructor
parent::__construct();
$this->user_per_page = 8;
}
function getUser($id)
{
$query = $this->db->query("SELECT * FROM user WHERE id = $id");
if(intval($query->num_rows()) > 0)
{
$data = $query->result();
return $data[0];
}
else
return null;
}
}
in your controller load appropriate model using model file name
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Register extends CI_Controller
{
public function index()
{
$this->load->model("usermodel");//your file name of model
$fb_config = array(
'appId' => '454005957970086',
'secret' => '7b8e9664cb0439f88da00007996278c7'
);
$this->load->library('facebook', $fb_config);
$this->load->helper('security');
}
}
Model classes are stored in your
application/models/
folder. They can be nested within sub-folders if you want this type of organization.
The basic prototype for a model class is this:
class Model_name extends CI_Model {
function __construct()
{
parent::__construct();
}
}
Where Model_name is the name of your class. Class names must have the first letter capitalized with the rest of the name lowercase. Make sure your class extends the base Model class.
The file name will be a lower case version of your class name. For example, if your class is this:
class User_model extends CI_Model {
function __construct()
{
parent::__construct();
}
}
Your file will be this:
application/models/user_model.php
So please check, is your model in any sub-folder or not.
It is said to be a best practice to load models, libraries in __construct (constructor)
class User extends CI_Controller
{
public function __construct()
{
parent:: __construct();
$this->load->model('usermodel');
}
}
I found in your controller there is not construct. try to add constructor and load usermodel there
I've ended up using __construct() in controller class.. I now first initialize model in constructor and then call in in function and its working now.!! But still I'm puzzled why load-model() didn't work for me in index() function
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Register extends CI_Controller
{
function __construct()
{
// Call the Model constructor
parent::__construct();
$this->load->model("Usermodel");
$fb_config = array(
'appId' => 'XXXXXXXXXXXXXXXX',
'secret' => 'XXXXXXXXXXXXXXXXXXXXXXXXXX'
);
$this->load->library('facebook', $fb_config);
$this->load->helper('security');
}
public function index()
{
$data = $this->Usermodel->getUser(1);
print_r($data);die;
}
}

Categories