Archive for the ‘CodeIgniter’ Category

Pagination Class for ASP.NET MVC

Wednesday, August 13th, 2008

A class for creating different types of pagination link in Asp.Net Mvc.

Pagination For Asp.Net Mvc

Pagination For Asp.Net Mvc

Introduction

I was looking for a pagination class to use in Asp.Net Mvc. I found ASP.NET MVC: PagedList<T> and ASP.NET MVC – Pagination View User Control. But I felt for an easier and customizable pagination class. I have developed many projects using CodeIgniter framework and that time I found their pagination class is pretty better and easier. So, I have decided to prepare a pagination class like this for Asp.Net Mvc.

Using the Code

Controller

In your controller, to get your current (i.e. selected) page number put this code snippet.

string pageString = "";
 
try
{
    pageString = Request.Url.Segments[3];
}
catch (Exception)
{
    pageString = null;
}
 
int page = (String.IsNullOrEmpty(pageString)) ? 1 : Int32.Parse(pageString);

Here 3 is the segment which holds the page number. It can vary as per your URL.

Then use the pagination class as shown in the following example.

Pagination pagination = new Pagination();
 
pagination.BaseUrl      = "/Users/List/";
pagination.TotalRows    = totalRows;
pagination.CurPage      = page;
pagination.PerPage      = 10;
 
string pageLinks = pagination.GetPageLinks();
 
int start   = (page - 1) * pagination.PerPage;
int offset  = pagination.PerPage;

In BaseUrl you can write full path like "http://www.sitename.com/Controller/Action/" or relative path like "/Controller/Action/". Here "start" is the number from which row should be counted and "offset" is the number of rows should be returned. “totalRows” is the total number of rows.

Now you can use this "pageLinks" string which is the generated page link.

Next, set your data in the ViewData like the following.

ViewData["title"]       = "Pagination in Asp.Net Mvc";
ViewData["totalRows"]   = totalRows;
ViewData["result"]      = result;
ViewData["pageLinks"]   = pageLinks;

Here, "totalRows" is the total number of rows and "result" is the desired resultset.

View

In view page, you can show the page link as follows:

<% if ((string)ViewData["pageLinks"] != "")
   { %>
   <%= ViewData["pageLinks"] %>
   <br /><br />
<% } %>

Model

You can create a model and make two methods to get total rows and the data from table using LINQ, as shown in the following example.

public int GetTotalUsers()
{
    return new MyDataContext().Users.Count();
}
 
public List GetUsers(int start, int offset)
{
    var users = new MyDataContext().Users.Skip(start)
                                                 .Take(offset);
 
    return users.ToList();
}

Configuration Settings

General Properites
BaseUrl Full or relative URL to the controller/action (Mandatory).
TotalRows Total number of rows in your resultset (Mandatory).
CurPage Current page number, default 1 (Mandatory).
PerPage Number of items you want to show per page (Optional).
NumLinks Number of “digit” links before and after the current page number (Optional).
ItemType Item type enumeration value (Optional).
Link Properites
FirstLink The text to be shown in the “first” link on the left.
NextLink The text to be shown in the “next” page link.
PrevLink The text to be shown in the “previous” page link.
LastLink The text to be shown in the “last” link on the right.
Tag Properties
FullTagOpen The opening tag placed on the left side of the entire result.
FullTagClose The closing tag placed on the right side of the entire result.
FirstTagOpen The opening tag for the “first” link.
FirstTagClose The closing tag for the “first” link.
LastTagOpen The opening tag for the “last” link.
LastTagClose The closing tag for the “last” link.
CurTagOpen The opening tag for the “current” link.
CurTagClose The closing tag for the “current” link.
NextTagOpen The opening tag for the “next” link.
NextTagClose The closing tag for the “next” link.
PrevTagOpen The opening tag for the “previous” link.
PrevTagClose The closing tag for the “previous” link.
NumTagOpen The opening tag for the “digit” link.
NumTagClose The closing tag for the “digit” link.
ItemTagOpen The opening tag for the “Item”.
ItemTagClose The closing tag for the “Item”.

You can set configuration settings in three ways.

1. Set as regular property is set. Example:

objPagination.PerPage  = 10;
objPagination.PrevLink = "Prev";
objPagination.NextLink = "Next";

2. Put a Pagination.xml file in "Content" folder and create object of Pagination class as:

Pagination objPagination = new Pagination(true);

Pagination.xml file should be as following pattern as example.

<?xml version="1.0" encoding="utf-8" ?>
<Pagination>
    <NumLinks><![CDATA[5]]></NumLinks>
    <FullTagOpen><![CDATA[<p class='pagination'>]]></FullTagOpen>
    <FullTagClose><![CDATA[</p>]]></FullTagClose>
    <CurTagOpen><![CDATA[<span class='current'>]]></CurTagOpen>
    <CurTagClose><![CDATA[</span>]]></CurTagClose>
</Pagination>

3. Create a any xml file like the above Pagination.xml file and call the method LoadPaginationXml with the file full path as argument. Example:

objPagination.LoadPaginationXml("C:\MyProject\MyPagination.xml");

Different types of pagination

By this pagination class you can build different types of page link for your page. Just call the method GetPageLinks with your desired PaginationType as argument. Example:

objPagination.GetPageLinks(PaginationType.FirstPreviousNextLastItemRight);

If you want to display item set item type as follows:

objPagination.ItemType = ItemTypes.Page;

Conclusion

I think thats enough to use this pagination class easily. Bye for this time.

Download

You can download the Pagination class from here.

PaginationClass

You can download sample project from here.

PaginationInAspNetMvc

convert this post to pdf.

Captcha Plugin in CodeIgniter

Friday, May 23rd, 2008

CAPTCHACompletely Automated Public Turing test to tell Computers and Humans Apart. It is used in webpages to protect your page from automatic posting from outside of the site. CodeIgniter framework has a plugin named “captcha_pi.php” in plugins folder. Here I’ve demonstrated an example how to use this captcha plugin in your website built in CodeIgniter framework.

Make a controller named "captcha.php" and place in “controllers” folder. This controller is as follows:

<?php
class Captcha extends Controller
{
  public function __construct()
  {
    parent::Controller();
 
    $this->load->model('captcha_model');
 
    session_start();
  }
 
  public function index()
  {
    if(empty($_POST))
    {
      $captcha = $this->captcha_model->generateCaptcha();
 
      $_SESSION['captchaWord'] = $captcha['word'];
 
      $data['captcha'] = $captcha;
 
      $this->load->view('show_view', $data);
    }
    else
    {
      //check captcha matches
      if(strcasecmp($_SESSION['captchaWord'],
                   $_POST['confirmCaptcha']) == 0)
      {
        $this->load->view('success_view');
      }
      else
      {
        $this->load->view('failure_view');
      }
    }
  }
}
?>

Here I’ve made a model named "captcha_model" that has a method generateCaptcha(), which generates the captcha using CodeIgniter captcha plugin and returns the array. Captcha word is saved in session and after submitting the form this session word is compared with the posted word for matching.

If matches which is in (strcasecmp($_SESSION['captchaWord'], $_POST['confirmCaptcha']) == 0), then success is shown. Otherwise failure is shown. Here I’ve used strcasecmp() function of php to compare the word as case-insensitively. If u want user to enter the captcha words as they are shown (i.e. capital letter in capital and small letter in small), then you can use strcmp() function.

The captcha_model.php is as follows:

<?php
class Captcha_model extends Model
{
  private $vals = array();
 
  private $baseUrl  = 'http://localhost/captchademo/';
  private $basePath = 'D:/apache2triad/htdocs/captchademo/';
 
  private $captchaImagePath = 'tmp/captcha/';
  private $captchaImageUrl  = 'tmp/captcha/';
  private $captchaFontPath  = 'c:/windows/fonts/verdana.ttf';
 
  public function __construct($configVal = array())
  {
    parent::Model();
 
    $this->load->plugin('captcha');
 
    if(!empty($config))
      $this->initialize($configVal);
    else
      $this->vals = array(
                 'word'             => '',
                 'word_length'   => 6,
                 'img_path'       => $this->basePath
                                 .  $this->captchaImagePath,
                 'img_url'        => $this->baseUrl
                                 . $this->captchaImageUrl,
                 'font_path'      => $this->captchaFontPath,
                 'img_width'      => '150',
                 'img_height'     => 50,
                 'expiration'      => 3600
               );
  }
 
  /**
   * initializes the variables
   *
   * @author     Mohammad Jahedur Rahman
   * @access     public
   * @param     array     config
   */
  public function initialize ($configVal = array())
  {
    $this->vals = $configVal;
  } //end function initialize
 
  //---------------------------------------------------------------
 
  /**
   * generate the captcha
   *
   * @author     Mohammad Jahedur Rahman
   * @access     public
   * @return     array
   */
  public function generateCaptcha ()
  {
    $cap = create_captcha($this->vals);
 
    return $cap;
  } //end function generateCaptcha
}
?>

You have to change the $baseUrl, $basePath, $captchaImagePath, $captchaImageUrl and $captchaFontPath etc. To store the captcha images at first I’ve created a folder “tmp” and sub-folder “captcha” in the main directory where index.php exists. If u run on server be sure this two folder are given write permission.

By default, Captcha plugin generates 8 words in length. But I desire to very this length. So, I’ve made a little change in this plugin. In line 156 of "captcha_pi.php" there was

$defaults = array('word' => '', 'img_path' => '',
                 'img_url' => '', 'img_width' => '150',
                 'img_height' => '30', 'font_path' => '',
                 'expiration' => 7200);

which I made

$defaults = array('word' => '', 'word_length' => 8,
                 'img_path' => '', 'img_url' => '',
                 'img_width' => '150', 'img_height' => '30',
                 'font_path' => '', 'expiration' => 7200);

Next, in line 226, there was

for ($i = 0; $i < 8; $i++)

which I made

for ($i = 0; $i < $word_length; $i++)

Now if u pass word_length as parameter then it will generate captcha image of word length as you specify.

Captcha

You can download the whole package from here.

captchademo

convert this post to pdf.