Browsing posts in: CodeIgniter

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    |       6 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:

May 31, 2008    |       18 comments

CodeIgniter Internationalization with Templates

I found an easy way to use i18n with Templates. I think it’ not a REAL template system, but I got the job done. After the first config of my CodeIgniter setup I decided to implement a multilingual system. Following these steps I noticed that every translated page has it’s own view. This is not good, if my designer change one tag, one line, he would have to change every translated view.

The trick is simple, and I guess there is another elegant way to do this. The article I read said if I have a custom view called “myview”, I don’t need to rename this file to work with my default language, but my translated view must have a suffix, myview_pt.php for example. But in my case, even the default language must have the suffix, and the view without the suffix is my template.

The code bellow shows my custom controller, loading my view

[cc lang=”php”]
load_view(‘myview’); // Here I load my template that will be intercepted
}
}

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

My little modification begins here. I don’t need to call myview_pt from controller (checking what language first), because the modified controller from de article automaticaly does that. So, I simply create myview_en.php and myview_pt.php (assuming there is only those two languages), and the content of these files would be something like that:

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

[/cc]

On the first line, “myview” is a language file located on system/language/english/myview_lang.php.

This way I can put my whole html/css stuff on myview.php and work simulating a template. I hope someone could say in the comments “here’s the better way to do this” but until there I’ll use this tricky code to get things working.

That’s all!

Did you like this? Share it:

Pages:1234