How can i "split" a releated url with a - ?
So i`ve a URL like "domain.de/thisismytest"
But i want to have "domain.de/this-is-my-test" ?
Currently i`ve this in my routes.php
$route['this-is-a-test'] = "site/thisisatest";
In my really simple Controller i`ve this Code
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Site extends CI_Controller {
public function index() {
$this->home();
}
public function home() {
$this->load->view("site_header");
$this->load->view("site_nav");
$this->load->view("content_home");
$this->load->view("site_footer");
}
public function thisisatest() {
$this->load->view("site_header");
$this->load->view("site_nav");
$this->load->view("content_thisisatest");
$this->load->view("site_footer");
}
public function about() {
$this->load->view("site_header");
$this->load->view("site_nav");
$this->load->view("content_about");
$this->load->view("site_footer");
}
}
Your configuration seems to be correct. This routing config line:
$route['this-is-a-test'] = "site/thisisatest";
remaps to the Site class and the thisisatest method.
Are you sure that you do not have this routing in config:
$route['thisisatest'] = "site/thisisatest";
? In that case both would point to the same method.
Anyways I think that the problem is that you're referencing the thisisatest URLs somewhere in your views. Check if your not calling site_url('thisisatest') or base_url('thisisatest') or simply domain.de/thisisatest somewhere in the views and replace it with site_url('this-is-a-test').
In your index function you could grab the url segment and processes the string:
$segment = $this->uri->segment(1); // the url segment you need
$segments = explode( '-', $segment );
$yourFunction = implode ( $segments );
check if the function exists
if(method_exists($this,$yourFunction))
$this->$yourFunction();
and in your routes file point to your index:
$route['yourController/(:any)'] = 'yourController/index';
Related
I am using CodeIgniter. I have frontend and backend folder inside controllers and views. I tried server steps even check almost all the solution but still I am not able to access it my default controller
routes.php
$route['default_controller'] = 'frontend/User_control';
$route['404_override'] = '';
$route['translate_uri_dashes'] = FALSE;
/*backend*********************************/
$config['backend'] = 'backend/Access_control';
1) My issue is When I am accessing the Url http://localhost/example_ci_row/
I am getting 404 Page not found
2) How to access the backend URL I tried http://localhost/icube_row/admin
but I am getting the error
frontend User_control
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class User_control extends CI_Controller {
public $current_date;
function __construct()
{
parent::__construct();
$this->load->library('form_validation');
$this->load->helper('form');
}
public function index(){
$this->load->view('frontend/login');
}
}
?>
Backend Access control
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Access_control extends CI_Controller {
function __construct()
{
parent::__construct();
$this->load->library('form_validation');
$this->load->helper('form');
}
public function index(){
$this->load->view('backend/login');
}
}
?>
Edited
It's working when I use below steps. I added the Test.php file in the controller and change the routes then I am getting the login page.
Test.php
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Test extends CI_Controller {
public $current_date;
function __construct()
{
parent::__construct();
$this->load->library('form_validation');
$this->load->helper('form');
}
public function index(){
$this->load->view('frontend/login');
}
}
?>
routes.php
$route['default_controller'] = 'Test';
Hope this will help you :
The built in $route['default_controller'] will not work for sub-folders. you have to extend system router as per your requirements like this :
You need to create a MY_Router.php in application > core > MY_Router.php
<?php
class MY_Router extends CI_Router {
protected function _set_default_controller() {
if (empty($this->default_controller)) {
show_error('Unable to determine what should be displayed. A default route has not been specified in the routing file.');
}
// Is the method being specified?
if (sscanf($this->default_controller, '%[^/]/%s', $class, $method) !== 2) {
$method = 'index';
}
// This is what I added, checks if the class is a directory
if( is_dir(APPPATH.'controllers/'.$class) ) {
// Set the class as the directory
$this->set_directory($class);
// $method is the class
$class = $method;
// Re check for slash if method has been set
if (sscanf($method, '%[^/]/%s', $class, $method) !== 2) {
$method = 'index';
}
}
if ( ! file_exists(APPPATH.'controllers/'.$this->directory.ucfirst($class).'.php')) {
// This will trigger 404 later
return;
}
$this->set_class($class);
$this->set_method($method);
// Assign routed segments, index starting from 1
$this->uri->rsegments = array(
1 => $class,
2 => $method
);
log_message('debug', 'No URI present. Default controller set.');
}
}
This will allow you to use $route['default_controller'] = 'frontend/User_control'; as your default controller
Have you configured the Base URL ?
Application->config->config.php
$config['base_url'] = 'http://localhost/example_ci_row';
I am new in CI.
I want to change function name in addressbar url with add_car to addcar.
Actually my url is created as below
http://localhost/projectName/controller/add_car
But I want following in URL
http://localhost/projectName/controller/addcar
Is it possible? Please help me.
[Note] : My actual method name is add_car.
You can do it by two methods
Method 01
Edit - config/routes.php
$route['controller/addcar'] = 'controller/add_car';
$route['controller/deletecar'] = 'controller/delete_car';
output - www.exapmle.com/controller/addcar
Method 02
change your controller function name as you like.
public function addcar($value='')
{
# code...
}
public function deletecar($value='')
{
# code...
}
Output -www.exapmle.com/controller/addcar
Further Knowledge
If you use $route['addcar'] = 'controller/add_car'; URL looks like
www.exapmle.com/addcar
Change add_car function to addcar in your controller
function add_car(){
//...
}
To
function addcar(){
^
//...
}
Or in routes.php
$route['controller/add_car'] = "controller/addcar";
$route['controller/([a-z]+)_([a-z]+)'] = "controller/$1$2";
Above example will route every requested action containing '_' between two strings to action/method without the '_'.
More about Code Igniter regular expression routes:
https://ellislab.com/codeigniter/user-guide/general/routing.html
You can use this on your route:
$route['addcar'] = 'Add_car/index';
$route['addcar/(:any)'] = 'Add_car/car_lookup/$1';
and your controller
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Add_car extends CI_Controller {
public function __construct()
{
parent::__construct();
}
public function car_lookup($method = NULL)
{
if (method_exists($this, $method))
{
$this->$method();
}
else
{
$this->index(); // call default index
}
}
public function index()
{
echo "index";
}
public function method_a()
{
echo "aaaaa";
}
public function method_b()
{
echo "bbbbb";
}
}
My routes configuration only contains following route:
$route['default_controller'] = "frontend/home";
I would like to rewrite the default route
http://192.168.1.4/sncraft/frontend/home/about
to an url like this
http://192.168.1.4/sncraft/about
The content of the controller is:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Home extends CI_Controller {
public function __Construct(){
parent::__Construct();
$this->load->library('image_lib');
$this->load->model('frontend/front_model');
}
public function index(){
$config = array();
$config["base_url"] = base_url()."frontend/home";
$this->viewForm();
}
public function about(){
$this->load->view('frontend/header');
$this->load->view('frontend/about');
$this->load->view('frontend/footer');
}
}
?>
The key of the $route array is the actual url which leads to the function of the controller (without the base url).
Your route would look like this:
$route['about'] = "frontend/home/about";
I'm assume that your function inside the home-controller is called about().
You find more information here: URI Routing
I'm working on a client website which part of it to retrieve news, this is my first codeigniter application and I have followed CI tutorials, slugs and routing.
The problem I'm having is that everything works fine but when it comes to get a record based on slug I get 404. What I did was removed index.php from my URL and tested it, which works fine.
This is my route.php
$route['default_controller'] = "welcome";
$route['404_override'] = '';
$route['news/(:any)'] = 'news/singe_news/$1';
$route['news'] = 'news';
This is my model news_model.php
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class News_model extends CI_Model {
function get_all(){
$sql="SELECT * FROM news AS news";
$query=$this->db->query($sql);
return $query->result();
}
//// get a single post
function get_single($slug = FALSE) {
if ($slug === FALSE)
{
$query = $this->db->get('news');
return $query->result_array();
}
$query = $this->db->get_where('news', array('slug' => $slug));
return $query->row_array();
}
function news_categories(){
$sql="SELECT * FROM news_categories";
$query=$this->db->query($sql);
return $query->result();
}
}
and this is my controller news.php
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class News extends CI_Controller {
public function index()
{
$this->load->model('news_model');
$data['results']=$this->news_model->get_all();
$this->load->view('public/header', $data);
$this->load->view('public/menu');
$this->load->view('public/news-listing', $data);
$this->load->view('public/footer', $data);
}
public function single_news($slug) {
$this->load->model('news_model');
$data['single_news'] = $this->news_model->get_single();
/// if (empty($data['single_news']))
/// {
/// show_404();
///}
$this->load->view('public/header');
$this->load->view('public/menu');
$this->load->view('public/single-news', $data);
$this->load->view('public/footer');
}
}
So questions I have:
1- Where does $slug come from? I have a view has
2- Is there anything missing?
URLs need to be
domain.com/news/this-is-a-slug
Many thanks and apologies if this may have been asked in different format with different intention on other posts.
Where does $slug come from?
Your URI looks like this: www.example.com/controller/method/arg1/arg2/arg3 (w/o query string)
Is there anything missing?
Well, there is few things you should do:
Use autoload (config/autoload.php) to load your most used models, or if this model is not used widely at least load it at class constructor.
You are not passing $slug argument to model method, this will not work even if you will fix your routing.
$data['single_news'] = $this->news_model->get_single();
Better to show 404 if you can't find a slug, don't refetch all data on fail.
To fix 404 error follow those steps:
Check your .htaccess file for errors
Check uri_protocol setting in config
Try routing like this $route['news/((.+)$)?'] = "news/singe_news/$1"; (this should replace both routes for news)
I am trying to develop a social network where people can visit mysite.com/username. I used the _remap function and I got it working, however it is not loading any of my other controllers. Can someone be of assistance please?
This is my default controller:
if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Welcome extends CI_Controller {
public function index($username = NULL)
{
$this->load->model('user_model');
if ($this->user_model->is_a_username($username)) {
$data['title'] = $username;
$data['main_content'] = 'users/profile_page';
$this->load->view('shared/template',$data);
} else {
$this->home();
}
}
public function _remap($method, $params = array())
{
if (method_exists($this, $method))
{
return call_user_func_array(array($this, $method), $params);
}
show_404();
}
public function home()
{
if ($this->ion_auth->logged_in()) {
$data['title'] = 'Carnect';
$data['main_content'] = 'users/wall_page';
$this->load->view('shared/template',$data); #if logged in show the user's wall
} else {
$data['title'] = 'Carnect';
$data['main_content'] = 'welcome/index';
$this->load->view('shared/template',$data); #if not logged in show the home page
}
}
}
and this is my routes file:
if ( ! defined('BASEPATH')) exit('No direct script access allowed');
$route['default_controller'] = "welcome";
$route['404_override'] = '';
$route['login'] = "auth/login";
$route['logout'] = "auth/logout";
$route['register'] = "auth/create_user";
/*$route['news'] = "news/index";
$route['politics'] = "politics/index";
$route['culture'] = "culture/index";
$route['messages'] = "messages/index";*/
$route['(:any)/(:any)'] = "$1/$2";
$route['(:any)/(:any)/(:any)'] = "$1/$2/$3";
$route['(.*)'] = 'welcome/index/$1';
An example of one of the controllers that will not load..
session_start();
class News extends CI_Controller {
function News()
{
parent::Controller();
}
function index() {
$data['title'] = 'Politics';
$data['main_content'] = 'news/index';
$this->load->view('shared/template',$data);
}
}
I am working on a project that has a similar requirement on those urls.
I did it by adding route like this:
$routes['news'] = 'news/index';
or
$routes['news'] = 'news';
which are exactly lines that you've commented.
Sadly, It isn't possible without those lines (at least I couldn't do it).
If your URL was: example.com/news/index, it would match the rule $routes['(:any)/(:any)'], but if it was example.com/news, it wouldn't match anything and go to your last rule.
CodeIgniter's Routing doesn't take real segments, but the uri segments shown in the url. Therefore, your url example.com/news would be interpreted as a $username = news.
You'd have to do this uri routing for each url which only has 1 uri segment. You'd want to make sure no user has the same username with your controllers or he/she can never visit the user page.
You have to write a rule in application/config/routes.php file just add a following line
$route['(:any)'] = "welcome/index/$1";
You can access by using http://example.com/username if your have added .htaccess rule for removing index.php file from url or you can access like http://example.com/index.php/username