I have this function that is constantly being reused in my controllers. I have decided to move it into a file that can be referenced all the time. This is my file structure
controllers
|Generic
|Users
|get_all_languages.php
|Users
|Lang
|Lang.php
I want to reference get_all_languages which contains
<?php
function get_all_languages(){
$this->curl->create(GetAllLanguages);
$this->curl->http_login(REST_KEY_ID,REST_KEY_PASSWORD);
return json_decode($this->curl->execute(),true);
}
So far, I have tried including it in the top of my file like:
<?php
include __DIR__.'/../../Generic/Users/get_all_languages.php';
class Lang extends CI_Controller{
However, when I try to use that function like $this->get_all_languages();, an error occurs saying Call to undefined method Lang::get_all_languages()
I have also tried to include it after the __contruct but it doesn't allow me to compile.
I hope someone can let me know how I can reference that function.
Thank you.
You can use library or helper of codeigniter.
And you can load them automatically in application/config/autoload.php.(Reference it)
If you want the specific controller, you can use it in construct of controller using $this->load->library() or $this->load->helper().
For example:
class A extends CI_Controller
{
public function __construct()
{
parent::__construct();
$this->load->library('libraryname');
$this->load->helper('helpername');
}
public function index() {...}
...
}
...
Updated
application/helpers/global_lang_helper.php
<?php
function get_all_languages(){
$CI = &get_instance();
$CI->load->library('curl');
$CI->curl->create(GetAllLanguages);
$CI->curl->http_login(REST_KEY_ID,REST_KEY_PASSWORD);
return json_decode($CI->curl->execute(),true);
}
At your controller...
public function __construct()
{
parent::__construct();
$this->load->helper('global_lang');
}
I like to pass a variable to a controller trough the URL like this:
a href="<?php print base_url('/profile/' . $this->session->userdata('id')); ?>">Profiel</a>
/profile/ = controller
$this->session->userdata('id') = variable
Now I want to give it to Profile but it only works when I do /profile/index/1 and I like to it like this: /profile/1
When actually to use a new controller?
This is my controller:
<?php
class Profile extends CI_Controller
{
function __construct()
{
parent::__construct();
$this->load->library('login');
$this->load->helper('url');
}
function index()
{
$this->load->view('profile_view');
}
}
?>
Found it,
I just need to add this line to the routes.php file in the config folder:
$route['profile/(:num)'] = "profile/index/$1"
Then when profile/1 is entered it will automatically think it's profile/index/1
Or you could use _remap function in your controller class. Read the related part in users guide. It is under "controllers" part.
I am following this tutorial http://book.cakephp.org/2.0/en/development/rest.html to get up and running with REST in my CakePHP application.
I have added the following to my routes.php file:
Router::mapResources(array('fantasyPicks', 'fantasyPlayers'));
Router::parseExtensions();
In each of my controllers, I have included the RequestHandler component and also setContent to json in the beforeFilter() callback. It looks something like this:
class FantasyPicksController extends AppController {
public $components = array('RequestHandler');
public function beforeFilter() {
parent::beforeFilter();
$this->RequestHandler->setContent('json','text/x-json');
$this->layout = 'json/default';
}
public function index() {
$fantasyPicks = $this->FantasyPick->find('all');
$this->set('json', $fantasyPicks);
$this->render('/json/data');
}
...
My json/data view simply echos json_encode:
<?php echo json_encode($json); ?>
After all of this, navigating to /fantasyPicks/view/1 works as expected. However, /fantasyPicks/1 is giving me the following error:
Missing Method in FantasyPicksController
Error: The action 1 is not defined in controller FantasyPicksController
Error: Create FantasyPicksController::1() in file: app\Controller\FantasyPicksController.php.
<?php
class FantasyPicksController extends AppController {
public function 1() {
}
}
Does anyone know what I am doing incorrectly? Any help is appreciated!
You have to use proper controller naming conventions when accessing the page.
http://book.cakephp.org/2.0/en/getting-started/cakephp-conventions.html
Refer to the URL considerations section. So you should be going to /fantasy_picks/1 and it will work properly.
I just started working with CodeIgniter and I am having some trouble with the segment-based urls. I understand how to call them doing $variable = $this->uri->segment(2); but whenever I go to the url, I am getting a 404. Is there something I need to do for URI routing?
For example, I am trying to go to localhost/ci/index.php/games/1000 (where 1000 would be a game ID), but I am getting a 404. localhost/ci/index.php/games/ works fine.
In order for that to work you would need to have a controller called games.php with this content
class Games extends CI_Controller
{
public function index($id)
{
echo $id;
}
}
Unless you do something like this
class Games extends CI_Controller
{
public function index()
{
echo 'this is index';
}
public function game($id)
{
echo $id;
}
}
and add this to your routes.php
$route['game/(:any)'] = "games/game/$1";
By default the 2nd segment of the URI is a method (function) within the controller which CI automatically calls.
So in your case you are actually attempting to call a function named 1000() within the games controller, which doesn't exist and therefore results in a 404.
Instead what I think you want to do is call the index() function, and pass the variable 1000 to it.
So if you were to go to localhost/ci/index.php/games/index/1000 you shouldn't get a 404 anymore, however your URI segment will now be wrong to get the variable 1000.
Here is a working example of the controller with the corrected URI segment:
class Games extends CI_Controller
{
// good habit to call __construct in order to load
// any models, libraries, or helpers used throughout this controller
public function __construct()
{
parent::__construct();
}
// default controller
public function index()
{
// this should display 1000
echo $this->uri->segment(3);
}
}
here's an example of url:
http://www.example.com/search/search-keyword
I am trying to make this work, I removed the index.php using .htaccess, search is the controller and I want to pass a parameter in the index method.
this is currently what it looks like:
class Search extends CI_Controller{
function index($param){
echo $param;
}
}
any suggestions? I can't seem to make it work
You need the index segment http://www.example.com/search/index/search-keyword.
Or you need to use a route $route['search/(:any)'] = 'search/index/$1';
Or you can look at remap
Remember not to trust user input, especially when you are throwing it into your url. The latest version of CI supports $_GET variables now, so you may want to look into using that or flashdata. A searh term as simple as O' Brien will give you a fatal error ("The URI you submitted has disallowed characters.").
class Search extends CI_Controller{
function _remap($param) {
$this->index($param);
}
function index($param){
echo $param;
}
}
You should then be able to access that as: /search/123123 :and the page would echo out "123123" or whatever you put in place of that.
function _remap($parameter){
$this->_index($parameter);
}
Give it a try and tell us how it went.
Most of these solutions will only work if you only have a single function called index() in your controller. If you have this in your routes:
$route['search/(:any)'] = 'search/index/$1';
With the above in your routes, what will happen is that your search function will work but then if you add any other functions to that same controller they'll all be redirected to /search/index/$1.
The only solution I can think of that allows you to use the URL you want while still being able to add any other functions to your search controller is to add a sort of messy conditional to your routes file. Here's what it will look like and what it does:
$request = $_SERVER['REQUEST_URI']; // Only add this for readability
if(!strpos($request, 'search/another_function') || !strpos($request, 'search/more_functions')) {
$route['search/(:any)'] = 'search/index/$1';
}
What this is doing is basically saying "if the requested URL doesn't contain the name of any of my search controller functions then it must be meant for the index so we'll activate the route rule for index".
This will allow you to take requests for search/any_other_functions_you_have without issue and only activate the rule for hiding the index function when a request URI doesn't match any of them.
One side effect of this is that you'll never get a 404. For example, if someone enters a URL like "yourdomain.com/search/something" and they expect it to show a non-search result page they won't get a 404 alerting them to the fact that there is no page like that and instead the app will assume what they typed is a search term. However, it sounds like this isn't much of an issue for you and I don't see it being such a terrible thing for one controller to be unabe to return 404s.
You need to understand the way code igniter urls work, its basically like this:
http://www.mysite.com/{controller}/{function}
So what your url is actually looking a function called "keyword" in your search controller.
You have multiple options. The easiest will be to simply change the url to:
http://www.mysite.com/search/result/keyword
Then this should work perfectly:
class Search extends CI_Controller{
function result($param){
echo $param;
}
}
If you really want to use the url as you had it, you can use the same snippet of code as above but also open up "application/config/routes.php" and add this to the bottom.
$route['search/(:any)'] = "search/result";
Alternatively if you want to continue using the index function you can change it to this
$route['search/(:any)'] = "search/index";
And change your class to something like this:
class Search extends CI_Controller{
function index($param=FALSE){
if($param == FALSE) {
//Show search box
} else {
//Show search results
}
}
}
Don't forget to update your answer if you figure it out yourself or accept somebodies answer if it answers it :)
I've just started CI and here was my solution and implemented it on my website. So far it works for me and my search queries have been indexed by google as links
Class Search extends CI_Controller{
function index(){
$search_item = $this->input->post('search_box'); // this is from the input field
redirect(base_url()."search/q/".url_title($search_item));
}
// i've redirected it to the "search" controller then :
function q($search_item = null){// process search
// load the view here with the data
}
}
This is my solution:
From CI userGuide
public function _remap($method)
{
if ($method == 'some_method')
{
$this->$method();
}
else
{
$this->default_method();
}
}
So I've created my controller in this way:
class Shortener extends CI_Controller {
function shortener() {
parent::__construct();
}
function index($getVar) {
echo "Get var: " . $getVar;
}
function config() {
echo "another function";
}
function _remap($method) {
if($method == "config") {
$this->$method();
}
else {
$this->index($method);
}
}
}
Hope this can be helpful to someone...
BUG: if you call /shortener _remap function pass "index" to index() function...it can be solved adding an if condition or something else
You should use the CI URI Class. http://codeigniter.com/user_guide/libraries/uri.html
class Search extends CI_Controller{
function index($param){
//echo the search-keyword
echo $this->uri->segment(2);
}
}
This easiest way is just to use uri segments:
class Search extends CI_Controller{
function index(){
$param=$this->uri->segment(2);
echo $param;
}
}
Or like Madmartigan said, use routes, which is probably the better way of doing this.
I had to also check if some variable was passed or not - so here is the solution that I took.
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Story extends CI_Controller{
function story() {
parent::__construct();
}
function _remap($parameter){
$this->_index($parameter);
}
public function _index($story_id) {
if($story_id == 'index'){
//No variable passed
redirect('auth', 'refresh');
}else{
$data['title'] = "Story";
$this->load->view('story', $data);
}
}
}
Hope this helps someone!
Thank you. This code works for me. If parameter is a number
Or you need to use a route $route['search/(:any)'] = 'search/index/$1';
However, If the parameter is a string (http://[::1]/note/getnote/index/fg => http://[::1]/note/getnote/fg). I use _remap() like this code.
<?php
class Getnote extends CI_Controller
{
public function __construct()
{
parent::__construct();
$this->load->library('image_lib');
}
public function index(){
}
public function _remap($keyname)
{
$this->load->model('Laydb');
$data = $this->Laydb->getNote($keyname);
$proListArray['patitle'] = "Edit notepad";
$this->load->view('top', $proListArray);
$this->load->view('editblog', $data);
$this->load->view('bottom');
}
}
class Search extends CI_Controller{
function index($param){
echo $param;
}
}
In routes.php
$routes['search/(:any)'] = 'search/index/$1';
It's all
I finally found a workaround since I cant simply put post variables into the URL.
What I did was create another function, then redirect it to that function.
class Search extends CI_Controller{
function index(){
$search_item = $this->input-post('search_item');
redirect("search/q/".url_title($search_item));
}
function q($key){
// process search
}
}