• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1028
  • Last Modified:

CodeIgniter, dynamic menu and routes

Hi all.
Well, so is my first question in 2015. I'm a CodeIgniter novice and I want to use it to develop a catalogue site for a client.
I have the database  with three tables: products, categories and subcategories. I build the menu using categories and subcategories and using the category_name and the category_name/category_name as slug. Nothing special, I guess.
the question is: what are the methods I have to configure route to accept these slugs? I wuld like some authomatism so when the client add a new category or a new subcategory, the new slug is automatically added to the routes.php.

Iguess I can write a small piece of code in the CMS, so when a new element is added the riutes.php file is updated, bit I wonder if there is some better way to do it.
Thanks to all in advance.
0
Marco Gasi
Asked:
Marco Gasi
  • 5
  • 4
1 Solution
 
RobOwner (Aidellio)Commented:
Hi Marco,

I haven't done this in codeigniter (in cakePHP I used mod_rewrite) but I do know you should be able to use regular expressions in the route

e.g.

$route['product/(:any)'] = "catalog/product_lookup";

Where the url would be passed to your controller function 'product_lookup'.

See here for more info: https://ellislab.com/codeigniter/user-guide/general/routing.html
0
 
Marco GasiFreelancerAuthor Commented:
Hi Rob, thank you for quick reply.
I'll read the link, but I wish to know if this could work: I could use only one controller, one model and one view to display products; here the code could serve different contents accordingly to the parameters: is this the right way?
I could place only one row in the routes.php, let's say something like

$route[<-- regex here -->] = 'products/$1';

where $1 is parameters to pass to the controler->to the model to extract data from database.
But my links are www.example.com/Furnitures/Bedroom so I have to pass both parameters, Furnitures as category and Bedrooms as subcategory to serve a page which lists all products in that subcategory. So in routes.php I place only one $1 which represents all parameters, is it right?
I realize the question is a bit confusing, but I can't tell it better, at this moment
0
 
RobOwner (Aidellio)Commented:
Then you'll have to statically set the routes for the categories as im sure you'll have other non product pages such as

www.example.com/about
www.example.com/contact
...

OR

statically set the about, contact etc pages and a catch all at the bottom relating to your products but really you should have the following structure

www.example.com/products/cat/subcat
0
Free Tool: SSL Checker

Scans your site and returns information about your SSL implementation and certificate. Helpful for debugging and validating your SSL configuration.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
Marco GasiFreelancerAuthor Commented:
Yes, the idea is to set statically static pages such as home and contacts and set dinamically the other. In effect, I can have a structure liek the one yo said (products/cat/subcat). I have to take some time to read manuals about how to manage parameters...
0
 
RobOwner (Aidellio)Commented:
See here for how they're passed to your controller functions: https://ellislab.com/codeigniter/user-guide/general/controllers.html#passinguri
0
 
Marco GasiFreelancerAuthor Commented:
Hi, Rob. I'm sorry for the delay, I haven't abandoned this question but I've been tto busy in other aspects of my project I had to complete more urgently. In the next day I'll come back to this: I have just to do some test to see if I understood the right way before to award points and to close this question.
Cheers
0
 
RobOwner (Aidellio)Commented:
By all means test it.  I'll be here if you have any questions :)
0
 
Marco GasiFreelancerAuthor Commented:
Well, it seems to work:

routes.php:
$route['products/(.+)?/(.+)?'] = 'Products/process_data/$1/$2';

Open in new window


The controller Products.php:
	public function process_data($data)
	{
                /*only to test*/
		echo "<pre>Process data data<br>";
		var_dump($data);
		echo "</pre>";
	}
	
	public function _remap($method, $params = array())
  {
    $map = array();
	foreach ($params as $p)
	{
		$map[] = $p;
	}
       if( $method[0] != '_' && method_exists( $this, $method ))
      {
          return $this->$method( $map );
      }
     show_404();
}

Open in new window


This way I should be able to process all requests. On to the next and thank you for your fruitful help!
Cheers
0
 
Marco GasiFreelancerAuthor Commented:
Thank you again
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

The 14th Annual Expert Award Winners

The results are in! Meet the top members of our 2017 Expert Awards. Congratulations to all who qualified!

  • 5
  • 4
Tackle projects and never again get stuck behind a technical roadblock.
Join Now