Browsing posts in: PHP

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    |       2,065 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:


May 31, 2008    |       1,968 comments

CodeIgniter: Templates e Internacionalização

Encontrei uma maneira rápida e fácil de usar várias línguas com templates. Acho que não é um sistema de templates de verdade, mas por enquanto, está dando conta do recado. Depois da configuração inicial do meu CodeIgniter, decidi implementar um sistema de várias linguas. Seguindo esse tutorial, notei que cada página (view) traduzida é na verdade um arquivo independente, Não achei isso legal, pois se meu designer precisa mudar uma tag ou uma propriedade, ele teria que mudar em todas as views.

O truque é simples, e certamente deve haver outra forma mais elegante de fazer isso. O artigo acima diz que se eu tenho uma visão “myview”, eu não preciso adicionar um sufixo caso eu esteja na minha língua padrão, mas em outras línguas, eu preciso do sufixo do código da língua, por exemplo _pt, _en, etc. Mas no meu caso, todas as línguas deverão ter seu próprio sufixo, até mesmo a língua padrão, e a minha view sem sufixo é na verdade o template da página.

O código abaixo mostra o meu controlador chamando meu template:

[cc lang=”php”]
load_view(‘myview’); // Aqui eu carrego o meu template que será interceptado
}
}

/* End of file welcome.php */
/* Location: ./system/application/controllers/welcome.php */
[/cc]

Minha pequena modificação começa aqui. Eu não preciso chamar myview_pt pelo controlador (nesse caso eu teria que fazer uma checagem de qual lingua o usuario selecionou), porque o controlador modificado do artigo citado faz isso automaticamente. Então eu apenas crio myview_en.php e myview_pt.php (assumingo que tenho apenas essas duas línguas), e o conteudo desses arquivos seria algo mais ou menos assim:

[cc lang=”php”]
lang->load(‘myview’, ‘english’); ?>

[/cc]

Na primeira linha, “myview” é um arquivo localizado em system/language/english/myview_lang.php

Dessa forma eu coloco todo o meu html e css no myview.php e trabalho simulando um template. Espero que alguem venha comentar esse post dizendo “Olha, é assim que se faz corretamente”, mas até lá eu vou trabalando dessa forma pois assim pelo menos está resolvendo meu problema.

Até a próxima!

Did you like this? Share it:

Pages:1234