CodeIgniter: Tips & Tricks

Hello, Today I’ll post few modifications I use on every CI project. First, on the “url_helper“, I made this modification oon base_url() function:

[cc lang=”php”]
if ( ! function_exists(‘base_url’))
{
function base_url($link=FALSE)
{
$CI =& get_instance();
$baseUrl = $CI->config->slash_item(‘base_url’);
if ($link===TRUE) $baseUrl .= $CI->config->slash_item(‘index_page’);
return $baseUrl;
}
}
[/cc]

This allow me to use the base_url() function to work with and without the index.php. Sometimes you don’t know where your project will be hosted, and if the host supports mod_rewrite. In this case, on your links (those with index.php/controller) you just put

[cc lang=”php”]

[/cc]

and you will get the index.php or not, depending on your configuration, on config.php. If I use the TRUE parameter, the “index.php” string will be inserted before the controllers. Of course, you can alter the function to something like base_url(‘link’), or base_url(1), or anything you like. I don’t like to mess with the CI Core, so I saved this new helper on application/helpers directory.

Another Tip. This is very simple. Using the form validation, when I have a not required field, it isn’t repopulated with set_value() function if you don’t set any rules for the field. But if you set a blank rule, it will work:

[cc lang=”php”]
$this->form_validation->set_rules(‘field_name’, ”, ”);
[/cc]

When I use upload class, sometimes I have to delete the file when I change the file on database. And then It’s a good thing to use the absolute path when deleting, so I made a small constant declaration to set my root folder, the folder with index.php inside. In the index.php, add this line on bottom of the constant declarations:

[cc lang=”php”]
define(‘FULLPATH’, pathinfo(__FILE__, PATHINFO_DIRNAME));
[/cc]

Now, my FULLPATH constant is set with my base directory. Hope this can be usefull to someone. 😉

Did you like this? Share it:

CodeIgniter: Friendly pagination with search system

After a long pause, here am I. Well, there’s a few tutorials around, including the official CI wiki suggesting a more friendly pagination implementation, with page numbers on the link, because the actual CI pagination works with the offset from the database. The code I use today is from the official wiki, but the search system I implemented myself, So, here we go…

First, on the original file, we have the create_link() function. On mine, there is an argument $search, it will be permanent on every link, just like this: http://www.server.com/products/page/2/notebook-sony

I modified the ident style from CI Pagination.php, I Just can’t work with the Allman ident style (more info info: a href=”http://en.wikipedia.org/wiki/Indent_style”>wikipedia). Analising the whole code, there is no big tricks, I just concatenate the search argumento in the end of links.

Pagination.php:

[cc lang=”php”]
‘;
var $cur_tag_close = ‘‘;
var $next_tag_open = ‘ ‘;
var $next_tag_close = ‘ ‘;
var $prev_tag_open = ‘ ‘;
var $prev_tag_close = ”;
var $num_tag_open = ‘ ‘;
var $num_tag_close = ”;
var $page_query_string = FALSE;
var $query_string_segment = ‘per_page’;

/**
* Constructor
*
* @access public
* @param array initialization parameters
*/
function CI_Pagination($params = array())
{
if (count($params) > 0)
{
$this->initialize($params);
}

log_message(‘debug’, “Pagination Class Initialized”);
}

// ——————————————————————–

/**
* Initialize Preferences
*
* @access public
* @param array initialization parameters
* @return void
*/
function initialize($params = array())
{
if (count($params) > 0)
{
foreach ($params as $key => $val)
{
if (isset($this->$key))
{
$this->$key = $val;
}
}
}
}

// ——————————————————————–

/**
* Generate the pagination links
*
* @access public
* @return string
*/
function create_links($search=”) {

if ($search!=”) $search = ‘/’.$search;

// If our item count or per-page total is zero there is no need to continue.
if ($this->total_rows == 0 OR $this->per_page == 0) {
return ”;
}

// Calculate the total number of pages
$num_pages = ceil($this->total_rows / $this->per_page);
// Is there only one page? Hm… nothing more to do here then.
if ($num_pages == 1) {
return ”;
}

// Determine the current page number.
$CI =& get_instance();

if ($CI->config->item(‘enable_query_strings’) === TRUE OR $this->page_query_string === TRUE){
if ($CI->input->get($this->query_string_segment) != 0){
$this->cur_page = $CI->input->get($this->query_string_segment);
// Prep the current page – no funny business!
$this->cur_page = (int) $this->cur_page;
}
} else {
if ($CI->uri->segment($this->uri_segment) != 0) {
$this->cur_page = $CI->uri->segment($this->uri_segment);
// Prep the current page – no funny business!
$this->cur_page = (int) $this->cur_page;
}
}

if ( ! is_numeric($this->cur_page)) {
$this->cur_page = 0;
}

if ($this->cur_page==0) {
$this->cur_page = 1;
}

// Is the page number beyond the result range?
// If so we show the last page
if ($this->cur_page > $this->total_rows) {
$this->cur_page = ($num_pages – 1) * $this->per_page;
}

$uri_page_number = $this->cur_page;

// Calculate the start and end numbers. These determine
// which number to start and end the digit links with
$start = (($this->cur_page – $this->num_links) > 0) ? $this->cur_page – ($this->num_links – 1) : 1;
$end = (($this->cur_page + $this->num_links) < $num_pages) ? $this->cur_page + $this->num_links : $num_pages;

// Is pagination being used over GET or POST? If get, add a per_page query
// string. If post, add a trailing slash to the base URL if needed
if ($CI->config->item(‘enable_query_strings’) === TRUE OR $this->page_query_string === TRUE) {
$this->base_url = rtrim($this->base_url).’&’.$this->query_string_segment.’=’;
} else {
$this->base_url = rtrim($this->base_url, ‘/’) .’/’;
}

// And herwe go…
$output = ”;

// Render the “First” link
if ($this->cur_page > $this->num_links) {
$output .= $this->first_tag_open.’base_url.$i.$search.'”>’.$this->prev_link.’‘.$this->prev_tag_close;
}

// Write the digit links
for ($loop = $start -1; $loop <= $end; $loop++) { $i = ($loop * $this->per_page) – $this->per_page;
if ($i >= 0) {
if ($this->cur_page == $loop) {
$output .= $this->cur_tag_open.$loop.$this->cur_tag_close; // Current page
} else {
$n = ($i == 0) ? ‘1’ : $loop;
$output .= $this->num_tag_open.’base_url.($this->cur_page + 1).$search.'”>’.$this->next_link.’‘.$this->next_tag_close;
}

// Render the “Last” link
if (($this->cur_page + $this->num_links) < $num_pages) { $i = $num_pages; $output .= $this->last_tag_open.’Did you like this? Share it:


Jan 29, 2009    |       6 comments

CodeIgniter: Paginação mais coerente com sistema de busca

Depois de longa pausa, cá estou. Bom, existem alguns tutoriais e artigos por aí, inclusive no wiki do CodeIgniter explicando como usar uma paginação mais coerente. Digo isso pois a paginação atual do CI trabalha com o offset do SQL, e não com o número da página em si. O código que uso hoje foi retirado do wiki, já o sistema de busca integrado eu mesmo desenvolvi pois não achei nada no wiki.Bom, vamos às modificações:

Primeiro, no arquivo original temos a funcao create_links(). Agora ela terá um arqumento “$search”, que será passado após o numero de paginas, por exemplo http://www.site.com.br/produtos/pagina/2/notebook-sony. Alterei toda a identação da classe de Paginação, não consigo trabalhar com o estilo de Allman (mais info: wikipedia). Analisando o código inteiro, não preciso me prolongar muito, eu simplesmente adicionei um parâmetro na função de criar links, para concatenar o resultado da busca nos links das páginas.

Pagination.php:

[cc lang=”php”]
‘;
var $cur_tag_close = ‘‘;
var $next_tag_open = ‘ ‘;
var $next_tag_close = ‘ ‘;
var $prev_tag_open = ‘ ‘;
var $prev_tag_close = ”;
var $num_tag_open = ‘ ‘;
var $num_tag_close = ”;
var $page_query_string = FALSE;
var $query_string_segment = ‘per_page’;

/**
* Constructor
*
* @access public
* @param array initialization parameters
*/
function CI_Pagination($params = array())
{
if (count($params) > 0)
{
$this->initialize($params);
}

log_message(‘debug’, “Pagination Class Initialized”);
}

// ——————————————————————–

/**
* Initialize Preferences
*
* @access public
* @param array initialization parameters
* @return void
*/
function initialize($params = array())
{
if (count($params) > 0)
{
foreach ($params as $key => $val)
{
if (isset($this->$key))
{
$this->$key = $val;
}
}
}
}

// ——————————————————————–

/**
* Generate the pagination links
*
* @access public
* @return string
*/
function create_links($search=”) {

if ($search!=”) $search = ‘/’.$search;

// If our item count or per-page total is zero there is no need to continue.
if ($this->total_rows == 0 OR $this->per_page == 0) {
return ”;
}

// Calculate the total number of pages
$num_pages = ceil($this->total_rows / $this->per_page);
// Is there only one page? Hm… nothing more to do here then.
if ($num_pages == 1) {
return ”;
}

// Determine the current page number.
$CI =& get_instance();

if ($CI->config->item(‘enable_query_strings’) === TRUE OR $this->page_query_string === TRUE){
if ($CI->input->get($this->query_string_segment) != 0){
$this->cur_page = $CI->input->get($this->query_string_segment);
// Prep the current page – no funny business!
$this->cur_page = (int) $this->cur_page;
}
} else {
if ($CI->uri->segment($this->uri_segment) != 0) {
$this->cur_page = $CI->uri->segment($this->uri_segment);
// Prep the current page – no funny business!
$this->cur_page = (int) $this->cur_page;
}
}

if ( ! is_numeric($this->cur_page)) {
$this->cur_page = 0;
}

if ($this->cur_page==0) {
$this->cur_page = 1;
}

// Is the page number beyond the result range?
// If so we show the last page
if ($this->cur_page > $this->total_rows) {
$this->cur_page = ($num_pages – 1) * $this->per_page;
}

$uri_page_number = $this->cur_page;

// Calculate the start and end numbers. These determine
// which number to start and end the digit links with
$start = (($this->cur_page – $this->num_links) > 0) ? $this->cur_page – ($this->num_links – 1) : 1;
$end = (($this->cur_page + $this->num_links) < $num_pages) ? $this->cur_page + $this->num_links : $num_pages;

// Is pagination being used over GET or POST? If get, add a per_page query
// string. If post, add a trailing slash to the base URL if needed
if ($CI->config->item(‘enable_query_strings’) === TRUE OR $this->page_query_string === TRUE) {
$this->base_url = rtrim($this->base_url).’&’.$this->query_string_segment.’=’;
} else {
$this->base_url = rtrim($this->base_url, ‘/’) .’/’;
}

// And herwe go…
$output = ”;

// Render the “First” link
if ($this->cur_page > $this->num_links) {
$output .= $this->first_tag_open.’base_url.$i.$search.'”>’.$this->prev_link.’‘.$this->prev_tag_close;
}

// Write the digit links
for ($loop = $start -1; $loop <= $end; $loop++) { $i = ($loop * $this->per_page) – $this->per_page;
if ($i >= 0) {
if ($this->cur_page == $loop) {
$output .= $this->cur_tag_open.$loop.$this->cur_tag_close; // Current page
} else {
$n = ($i == 0) ? ‘1’ : $loop;
$output .= $this->num_tag_open.’base_url.($this->cur_page + 1).$search.'”>’.$this->next_link.’‘.$this->next_tag_close;
}

// Render the “Last” link
if (($this->cur_page + $this->num_links) < $num_pages) { $i = $num_pages; $output .= $this->last_tag_open.’Did you like this? Share it:


Pages:1234567