Skip to content

Pages HMVC Module Modular Extensions

Derek Jones edited this page Jul 5, 2012 · 4 revisions

Category:Module | Category:Module::Site Migration | Category:Module::Pages

My First Module Contribution: a simple module that can autoload views - Pages! It is useful to help migrate a old-school, page-based website to a CI/HMVC site.

NOTE: this module can be used "as-is" with no modifications as a normal controller - it does not need to be a module; i just like modules. ;-)

To use, create a new module directory called "pages" and put these files into pages/controllers and pages/views:

the parent controller class

<?php

class Page_base extends Controller {

    function Page_base()
    {
        parent::Controller();    
    }
    
    function _remap()
    {
        // use _remap() method to call up view files
        // via uri if they exist in the module's views dir
        // but only if there is no method in the controller
        // this allows "overriding" default view files
        // just by adding methods to this class
        $default_view = 'index';
        $view = $this->uri->rsegment(2,$default_view);
        
        if (method_exists($this,$view))
        {
            $this->$view($this->uri->ruri_string());
            exit();
        }
        else
        {
            $this->load->view($this->uri->rsegment(1).'/'.$view);
        }
    }
    
    
    function page_method_in_parent($in)
    {
        echo $in . ' uri sent into class: ' . __CLASS__;
    }
}

/* End of file page_base.php */
/* Location: ./application/modules/pages/controllers/page_base.php */

the child class

<?php

require_once('Page_base.php');

class Pages extends Page_base {

    function Pages()
    {
        parent::Page_base();
        $this->load->helper('url');
    }
    
    function page_method_in_child($in)
    {
        echo $in . ' uri sent into class: ' . __CLASS__;
    }
}

/* End of file pages.php */
/* Location: ./application/modules/pages/controllers/pages.php */

This is the index.php view file (called by default in the _remap setup)

<?php echo date('Ymd H:i:s'); ?>
<br>this is an INDEX PAGE!<br>
&lt;?php echo anchor('pages/another'&#41;; ?&gt;<br>
&lt;?php echo anchor('pages/page_method_in_child'&#41;; ?&gt;<br>
&lt;?php echo anchor('pages/page_method_in_parent'); ?&gt;
&lt;?php // Location: ./application/modules/pages/views/index.php ?&gt;

Start at this url:

http://domain.com/pages

or even this url:

http://domain.com/pages/index

and it loads the index page ( in the index page is the link: http://domain.com/pages/another )

When you click the anchor link to go to "pages/another" the request goes through _remap and determines that there is no method called "another" in the child controller class or the parent controller class and tries to load the uri segment as a view file. But, unless you put a file named another.php there will be a CI file not found error. Perfect!

At this point you can write a method named "another()" in either the child (pages.php) or parent class (page_base) or put a view file called another.php in the modules/pages/views directory or even in the good-old application/views directory.

Now, click the other links in index.php (demonstrating calling controller methods in the parent and child classes) and see what happens.

Feedback?

Clone this wiki locally