CodeIgniter template library

The thing I hate most about CodeIgniter is that the views folder become messed up after a while. So many files and so difficult to track down a view for a certain area of an application. So, to solve that I figured I should create a library to override the ways of managing views. I wrote this very small library to solve the problem. Now I can easily create different templates (or themes whatever you prefer them to call) inside the views. Also I’ve added a layout file (or you can call the master file) in the template for the base structure of the page. So, I don’t have to repeat the areas like header, footer or menu on every view. The library can be download the library from GitHub.

Here I’ve explained how the library works and how to integrate it within a CodeIgniter application.

The library

So, the library is simple consisting only three methods – get, set and view. They does exactly what they are called, get current template, set active template and loads the view respectively. Also I’ve defined the default template, which is used in case template is not set anywhere, at the top of the library.

define('DEFAULT_TEMPLATE', 'default');

You can set the default template in the config file if you like. Let’s jump into the library codes.

First the global variables and constructor of the library.

var $ci;
public function __construct() 
{
    $this->ci =& get_instance();
}

I prefer to load the CodeIgniter instance inside the constructor instead of inside every function. Nothing fancy about it. Next is the get function.

public function get($default = DEFAULT_TEMPLATE)
{
    $template = $this->ci->session->userdata('active_template');
    if($template && $template !== NULL) {
        return $template;
    }
    return $default;
}

We assume that the template name is set in the session. But if nothing was found in the session, we use the default value defined at the top of the library.

In the set function, we just set the template name in the session.

public function set($default = DEFAULT_TEMPLATE)
{
    $this->ci->session->set_userdata('active_template', $default);
    return $default;
}

Remember, our session library must be loaded. I prefer to load it using autoload.php as I use the session a lot.

Finally in the view function, I’ve checked for the existence of the desired view within the template and if the file exists I’ve loaded the view within the layout (master file I’ve mentioned earlier) of that template.

public function view($view = '', $data = NULL, $alternate_template = FALSE, $template = DEFAULT_TEMPLATE, $print = FALSE)
{
    $template_name = $template;
    if(!$alternate_template) {
        $template_name = $this->get();
    } 
    if(strlen($view) == 0 || !file_exists( APPPATH . 'views/' . $template_name . '/' . $view . '.php')) {
        show_error('Unable to load the template: ' . $template_name . '/' . $view . '.php');
    }
    if(!$print) {
        $this->ci->load->view($template_name . '/' . 'layout', array('data' => $data, 'view' => $template_name . '/' . $view));
    }
}

Here I’ve used the $print variable to determine whether to load the view or not. Sometimes I want to handle AJAX calls which should not be sent to output.

Adding template

To add a new template we need to add a directory within the views directory. Every directory within the views are considered as a template. Inside each template there should be a layout.php file and all other views you need. You can put your views within sub directories if you want but the layout.php must stay right within the template directory. So, if I add a new template called mytemplate the directory structure will be like this:

|_ viewes
    |_ mytemplate
        |_ layout.php
        |_ otherview.php

The layout file

The structure of layout.php depends on however the application looks like. We just need to use  $this->load->view($view, $data); wherever we want to output our view’s content. So, a sample layout.php file might look like this:

<!doctype html>
<html>
<head>
    <title><?php echo (isset($data['title'])? $data['title'] : "My Website Title") ?></title>
</head>
<body>
    <div class="wrapper">
        <?php $this->load->view($view, $data); ?>
    </div>
</body>
</html>

Usage

Well, using the library is very easy. Once the library is placed inside the applications library folder and loaded in the controller (though I prefer using autoload.php), we can load a view using  $this->template->view('view_name', $data); in the controller. Now, to organize the views properly we can make sub directories within the template. Let’s say we have an index view for the home controller and an account view for member controller. We can create two folder called home and member within the template folder and then add the views like home/index.php and member/account.php files. Then from the index function of home controller we should call the view like:

$this->template->view('home/index', $data);

And from the account function of member controller we should call the view like:

$this->template->view('member/account', $data);

That’s about it. Download the files from the GitHub repository and I’ve added a sample controller with sample template structure in there.

Shortcode for Contact Form 7

Shortcodes are widely used feature of WordPress. Many plugin and theme developers use this interesting feature to easily push custom contents inside posts or pages. But what if we could add a custom field within a Contact Form 7 (wpcf7) form? That’s exactly what I tried to do couple of days back and it was really exciting.

In case you don’t know what is wpcf7 or shortcode, please have a look at WordPress codex. Here I’ll explain how I have added the shortcode to the wpcf7 form and later fetched their values.

I have worked with WordPress 3.9.2 and Contact Form 7 v 3.8.1 to test these features.

There is the method wpcf7_add_shortcode which adds shortcode directly into contact form 7. Well while this function has its virtues, there are some disadvantages. Most of the time we cannot use the function right away because that will give us the “undefined function” error. We have to add a wrapper action to make sure that the wpcf7 plugin is loaded. Continue reading

মন ভাল হোক

কেন হঠাৎ তুমি এলে?

প্রচন্ড আনন্দ বা তীব্র মন খারাপের মুহূর্তে হঠাৎই মুঠোফোন হাতে নেই। পরিচিত সংখ্যাগুলো ছুয়ে দেই তোমার খোঁজে। মহাকালের মাঝে খুবই ক্ষুদ্র এই জীবনে আরও ক্ষুদ্রতম সময়ের জন্য কেনই বা এলে তুমি? চলেই যদি যাবে তবে স্বপ্ন দেখানোর কি কোনও প্রয়োজন ছিল? দুঃখ বা আনন্দের বোধগুলো দিন দিন ভোঁতা হয়ে আসে। শুধুই অবাক হই অপরিচিত অনুভূতিতে।

ধুলো জমা কবিতার বইগুলো আর ডাকে না। ইউটিউবের প্লেলিস্টে গানগুলো জমেই থাকে। অবাক হয়ে দেখি অনুভূতিহীন সময়ের এগিয়ে চলা। আজকাল ঘড়িগুলোও নিঃশব্দ। মুহূর্তগুলো পেরিয়ে যাওয়ার সময় টিক টিক শব্দ করে না আর। হারিয়ে যাওয়ার পথগুলোও হারিয়ে যায় ধূসর কুয়াশায়। পথগুলো খুঁজতে খুঁজতে চোখের দৃষ্টি ঘোলা হয়ে আসে। অনুভূতিহীন বোধে আনন্দ বা দুঃখ আসে না। শুধুই ঘোলা চোখে কুয়াশায় ঢাকা পথগুলো আরও দুর্ভেদ্য মনে হয়।

আসলেই যদি তবে থাকলে না কেন পুরোটা জুড়ে?

 

আকাশের মন ভাল নেই

একদিন দিনশেষে তুমি আমার নও

– হ্যালো! এখনো ঘুমাও নি?
– নাহ। তোমাকে ছাড়া ঘুম আসে না।
– পাগলী কোথাকার। এখন চোখ বন্ধ কর তো। আমি ঘুম পাড়িয়ে দিচ্ছি।

রাত বেড়ে চলে। একটা একটা করে মিনিট পার হয়ে ঘণ্টা। তোমার ভারী হয়ে আসা নিঃশ্বাসের শব্দ শুনি। জেগে থেকে স্বপ্ন বুনি। রাত গভীর হয়। তারাগুলো জ্বলজ্বল করে। মনে হয় হাত বাড়ালেই ধরা দেবে। নানান রঙ্গে স্বপ্নগুলোকে সাজাই।

– এই শুনো না, আমার ফেসবুকের প্রোফাইল পিকটা চেঞ্জ করে দাও তো।
– তুমি করতে পার না?
– আমার এই সব খুব ঝামেলা লাগে। তুমি করে দাও। আর আমার সব ছবি তো তোমার ক্যামেরাতেই। সেখান থেকে খুব সুন্দর একটা দিয়ে দাও।

দিন রাত ফেসবুকে অনলাইন হয়ে বসে থাকি, কখন তুমি আসবে। হয়তো শুধু কয়েক মিনিটের জন্য। হোক না। তবুও যদি আমাকে খুঁজে না পাও?

– এই শুনো না। সরি। আর হবে না এমন। এই নাও এখন একটা হাসি দিলাম তো। এখন রাগ দূর কর প্লীজ।
– হুম। খুব পাজি তুমি। জানো হাসি দিলে আর রাগ করে থাকতে পারব না।
– হি হি। জানিই তো। আমার বুদ্ধি বেশি না?

খুনসুটিতে সময় বেড়ে চলে। লেকের পাড়ে বাদাম ওয়ালা একটু খানি ঝাল লবণ দিয়ে এক ঠোঙা বাদাম দেয়। বাদামের রঙিন খোসাগুলো বাতাসে ওড়ে। বিকেল পেড়িয়ে সন্ধ্যা হয়। দূরের জটলায় ছেলের দল গিটার বাজিয়ে গান ধরে।

সোনার মেয়ে তোমায় দিলাম ভুবন ডাঙ্গার হাসি /
তোমায় দিলাম মধ্য দিনের টিনের চালের বৃষ্টি রাশি /
আরও দিলাম রৌদ্র ধোয়া, সবুজ ছোঁয়া পাতার বাঁশি /
মুখে বললাম না, বললাম না রে ভালবাসি /

– শুনো না। তুমি আমাকে আরেকটা নতুন ফোন কিনে দাও তো। এটায় সবসময় সবাই ফোন করে। আর রাতের বেলা ওয়েটিং দেখলে খালি প্রশ্ন করে।
– যো হুকুম মহারানী। কালই পেয়ে যাবেন।
– ধ্যাৎ খালি দুষ্টামি। শুনো। এটা হবে শুধুই আমাদের কথা বলার জন্য। এই নাম্বার আর কাউকে দেব না।
– আচ্ছা।

কত কথা, কত গল্প, কত নিরর্থক তর্ক ঝগড়া সারা দিন জুড়ে। নৈঃশব্দগুলো প্রচণ্ড ভারী পাথরের মত মনে হয়। চারপাশ থেকে থিকথিকে জেলির মত চেপে ধরে দম বন্ধ করে দিতে চায়।

– এই, তুমি আমাকে এত ভালবাস কেন?
– কই? আমার তো মনে হয় যথেষ্ট ভালবাসতে পারি না। আরও অনেক অনেক অনেক বেশি ভালবাসতে ইচ্ছা হয় তোমাকে।
– ধ্যাৎ। খালি বেশি বেশি নাটুকে কথা বার্তা। এভাবে ভালবাসলে কষ্ট ও বেশি পেতে হয় জানো না?
– তুমি পাশে থাকলে কষ্ট কোথা থেকে আসবে?
– তুমি এত বোকা কেন? বাদ দাও। তুমি বুঝবে না। শুনো, কাল সারাদিন কথা বলতে পারবো না, বাসায় মেহমান আসবে।
– হায়! তাহলে আমার কি হবে!

সারাদিনে ফোন টা বাজে না একবারও। খুবই ব্যস্ত বুঝি? আমি কবিতার বই হাতে বারান্দায় বসে থাকি। শ্রীকান্ত গেয়ে চলে

আমি এত যে তোমায় ভালবেসেছি /
তবু মনে হয় এ যেন গো কিছু নয় /
কেন আরও ভালবেসে যেতে পারে না হৃদয়? /

– “আপনি যে নম্বরটিতে ফোন করেছেন তা এই মুহূর্তে ব্যস্ত আছে। অনুগ্রহ করে কিছুক্ষণ পরে আবার চেষ্টা করুন। ধন্যবাদ। দ্যা নাম্বার ইউ আর …”

যান্ত্রিক কণ্ঠ অবিশ্রান্ত ভাবে তোমার ব্যস্ততার জানান দিয়ে যায়। মিনিট থেকে ঘণ্টা পার হয়ে দিন যায়। ব্যস্ততা বেড়ে চলে।

– হ্যালো।
– হুম বল। এত ফোন দিচ্ছ কেন। দেখছ না ওয়েটিং?
– না আসলে সারাদিন কথা হয়নি তো তাই।
– ব্যস্ত ছিলাম অনেক। এখন খুবই টায়ার্ড লাগছে। ঘুমিয়ে পড়ি। তুমিও ঘুমাও। রাখছি। গুড নাইট।

শুভ হোক তোমার রাত্রি। আমি আজও জেগে থেকে স্বপ্ন বুনি।

অপেক্ষার প্রহরগুলো বড় হয়। দিনগুলো একটু একটু করে দীর্ঘতর হয় প্রতিদিন। লেকের জলে বাদামের লালচে খোসা ভেসে যায়। কবিতার বইগুলোতে ধুলো জমে। শ্রীকান্ত গেয়ে যায়, তবুও চারিদিকে আঠালো নৈঃশব্দ। স্বপ্নগুলো ঘোলাটে হতে হতে হারিয়ে যায়। মোবাইল ফোনে যান্ত্রিক কণ্ঠ ব্যস্ততার অজুহাত দিতেই থাকে। রাত গভীর হয়, তারাগুলো আরও দূরে সরে সরে যেতে থাকে।

ফেসবুকে নোটিফিকেশন আসে “মেঘবালিকা তার প্রতিকৃতি বদল করেছেন”।