Getting Started With CodeIgniter – 4

Constructing the Home Page

This is what my home page looks like now. 

A Note About Graphics and Design

I’ll step you through how I did this using CodeIgniter. By the way, I did all the graphic elements myself or with the use of graphics tools. I am not a graphic designer so I fumble my way around the design of a site. I get hold of any easy to use graphics tools that are available. I’ve done another post that lists the tools l used.

While we are on the subject, the colours used on this site are not my choice – the site owner chose them.

Now back to CodeIgniter.

The General Idea

  1. I created a home page and called it viewhome.php, then placed it in the views folder within CodeIgniter’s directory structure. Actually, I placed it in a sub-directory of the views folder which I called /publicuser.

    Although many pages will be for public consumption, there will also be admin and member pages, so I’m planning ahead and having three sub-directories in the views folder to keep them separate.

    I also created some include files to use as the header and footer parts of the page. These were named include-header.php and include-footer.php and placed in the same sub-directory. 

  2. A file called home.php was also created as a controller for viewhome.php and this was placed in the controller folder within a /publicuser sub-directory.
  3. There is also a model file called systemdata.php.  This was placed directly into in the model folder.  The systemdata.php file is named to indicate that it manages all the system level data. So, at this point I had my basic MVC set-up.
  4. I placed my CSS file in the CSS sub directory of the assets folder that I mentioned in an earlier post. Javascript files were put into the js sub directory or the assets directory, and so on as previously described. All graphics files were also placed in either the images or site-images sub directories.
  5. In the model file called systemdata.php, I placed all the system wide referencees to data – including references to CSS and Javascripts – so that I could refer to them from any controller.

OK – that was the basic idea. Now for the precise steps to achieve it.

config.php

The idea of the config file is to place all the data that can perhaps vary from installation to installation, or perhaps that you want to define once and forget about. This is certainly true of stuff like the name and location of various external files like images, css files and javascript files.

In reality there would be many more (flash, pdf etc), but this is just to give you an idea.

I keep all such external assets in the assets sub-directory off the application folder. The naming of the assets directory is my choice, you can call it what you like – it is not part of the CodeIgniter installation. It’s existence is up to you.

A Note About base_url

In the config file I have two values for base_url. This makes it easy to switch from running the code on your local machine to running on your server. You just comment out the base_url value that you are not using.

[php]
$config[‘base_url’] = "http://localhost//chaingang3/";
//$config[‘base_url’] = "http://www.example.com/test1";

$config[‘css’] = "/system/application/assets/css/my.css";
$config[‘scripts’] = "/system/application/assets/scripts/";
$config[‘site_images’] = "/system/application/assets/site-images/";
$config[‘images’] = "/system/application/assets/images/";
[/php]

routes.php

I want the home.php controller to be called when someone visits my site’s home page (www.example.com or www.example.com/index.html). In order to effect this, you have to change a parameter in the routes.php file which you will find in the config sub-directory.

When CodeIgniter is first installed, the routes.php file will say :
[php]
$route[‘default_controller’] = "welcome";
[/php]

Change routes.php by commenting out the old line and replacing it with the name of your entry controller. Mine is called home.php, so
[php]
//$route[‘default_controller’] = "welcome";
$route[‘default_controller’] = "publicuser/home";
[/php]

The Model

I have to start with, one model that I’ve called systemdata.php as it contains just that. Within this model, I am not accessing a database for the moment, but mostly just the config data that we just placed in the config file.

It’s pretty convoluted but we have managed to separate the data from the view from the control.
If you end up wanting to change the location of the images say, you can do it in one place – in the config file.

[php]
class Systemdata extends Model {

function Systemdata(){
parent::Model();
}
function get_css_filespec(){
return $this->config->item(‘css’);
}
function get_scripts_filespec(){
return $this->config->item(‘scripts’);
}
function get_base_url(){
return $this->config->item(‘base_url’);
}
function get_images_filespec(){
return $this->config->item(‘images’);
}
function get_site_images_filespec(){
return $this->config->item(‘site_images’);
}
}
[/php]

The View

My home page is called viewhome.php. The only reason I call it viewhome.php and not home.php say, is because I get mixed up with what is a view, and what is a controller otherwise. I therefore have a convention that says, call the controller the plain name (in this case home.php), then place “view” in front of that name to arrive at the name of the view. Works for me.

So viewhome.php is a home page and has the following basic format (note I have pared this down as much as possible so as to only include the essential CodeIgniter information). Also note that I use PHP short-tags <%%>

[php]
<head>
<link rel="stylesheet"
type="text/css" href="<%=$base_url%><%=$css%>" />
<script type="text/javascript"
src="<%=$base_url%><%=$scripts%>myscripts.js"></script>
</head>
<body>
<%=$this->load->view("publicuser/include-header");%>

<h1>My New Website</h1>
<p>
Lots of interesting information
</p>

<%=$this->load->view("publicuser/include-footer");%>
</body>
[/php]

The Controller

Here is the controller, in my case home.php. Again I have cut it down to the bare minimum.

I load the helpers url and html and the database class but these are for later and not pertinent to what I am showing you now.

Next I load the model systemdata, then proceed to use it to extract the filenames and locations that I set up in the config file.

There is enough in this article to get you to a very simple home page, and get you set up to create everything else you need in a more complex web application. It was this basic structure that I found hard to get started.

[php]
class Home
extends Controller {
var $data;

function Home(){
parent::Controller();

$this->load->helper(‘url’);
$this->load->helper(‘html’);
$this->load->database();
$this->load->model(‘systemdata’);

$this->data[‘css’] = $this->systemdata->get_css_filespec();
$this->data[‘scripts’] = $this->systemdata->get_scripts_filespec();

$this->data[‘base_url’] = $this->systemdata->get_base_url();
$this->data[‘site_images’] = $this->systemdata->get_site_images_filespec();
$this->data[‘images’] = $this->systemdata->get_images_filespec();
$this->data[‘scheme’] = $this->systemdata->get_scheme();
}

function index(){
$this->load->view(‘publicuser/viewhome’, $this->data);
}

}
[/php]

Running The Site

I test the site locally – that is how the config file has been set up – the root has been defined to be the root of my webserver, as in :
[php]
$config[‘base_url’] = "http://localhost//chaingang3/";

[/php]

To run the site type the following into your browser address window :
[php]
http://localhost/chaingang3/index.php

[/php]

As I’ve mentioned before, I tend to use one controller per view. It helps me keep control. But other people have other ways. The best thing is to read the CodeIgniter forums and see what everyone has to say. I found this article on controllers particularly helpful.

Comments

  1. Ah! I will check that and correct when I get a chance. Thanks for spotting it. Liz

  2. Hi Liz,
    I couldn’t make this simple example work, so I ‘reinstalled’ the framowork reconfiguring it from scratch, then I make copy-and-paste of your code rewriting all the class you suggested having no resuls…

    At last I searched for the error and I found that in home.php controller you try to get the path of the ‘scheme’ with the code “$this->data[‘scheme’] = $this->systemdata->get_scheme();” when it is not defined in systemdata.php model.

    Hopeful this will help someone else who will follow your tutorial.
    ilbassa

  3. In what way does the CSS fail?

  4. This has been particularly helpful 🙂

    Only thing that i’ve had trouble with is actually making the css file work…

    I’m kind of a noob with CI, Although i followed your instructions as much as i could, Now i’m at a loss of what to do…