Back-End

3 dez, 2012

CodeIgniter com SQLite + Multi-Select, Radio e Checkboxes

Publicidade

Tenho recebido alguns e-mail de leitores com algumas dúvidas e pedindo para  euesclarecer alguns pontos. Vou atendê-los nesse artigo, que abordará a integração entre CodeIgniter e SQLite e como gerenciar caixas de checagem e radio buttons com o CodeIgniter.

A primeira parte trata da conexão com um banco de dados SQLite. Existem bugs conhecidos para as versões anteriores a 2.1.1. Como estamos trabalhando com a versão 2.1.3, não deve acontecer erros.  Para este exemplo, vamos manter o banco em uma pasta chamada “banco-de-dados” na pasta application. O nome do banco de dados utilizado é radios.sqlite.

Para gerenciar as tabelas, você vai precisar de um editor semelhante ao phpLiteAdmin, que pode ser baixado aqui. Baixe o script phpliteadmin.php para a pasta raíz da aplicação. Você deve editar os seguintes parâmetros do arquivo phpliteadmin.php.

$directory = false;

Este parâmetro define que será usada a array $databases como configuração do(s) banco(s) de dados utilizados. Então, na array $databases utilize da seguinte maneira:

$databases = array(
array(
“path”=> “application/banco-de-dados/radios.sqlite”,
“name”=> “Radios”
)
);

Agora, ao acessar o endereço do site /phpliteadmin.php você verá a tela de login. A senha padrão é admin e também pode ser alterada no arquivo phpliteadmin.php. Depois de fazer o login, você deverá ver um tela conforme a seguir:

Então, basta adicionar os dados para a tabela conforme mostrado a na figura 2. Estou utilizando apenas dois campos, cor e checado.

Feito isto, vamos às configurações do CodeIgniter. Apesar do framework dispor de um drive SQLite, utilizaremos em nosso exemplo a biblioteca PDO.

O arquivo de configuração de conexão com bancos de dados deve ficar do seguinte modo:

$db['default']['hostname'] = ‘sqlite:’.APPPATH.’banco-de-dados/radios.sqlite’;
$db['default']['username'] = ”;
$db['default']['password'] = ”;
$db['default']['database'] = ”;
$db['default']['dbdriver'] = ‘pdo’;
$db['default']['dbprefix'] = ”;
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = ”;
$db['default']['char_set'] = ‘utf8′;
$db['default']['dbcollat'] = ‘utf8_general_ci’;
$db['default']['swap_pre'] = ”;
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;

No arquivo de configuração autoload.php, na seção libraryes, adicione a biblioteca database e na lista de helpers adicione url, html, form.

Como não foi alterado o arquivo routes.php, estamos utilizando o default_controller padrão do CodeIgniter que é o Welcome. Altere o arquivo application/controllers/welcome.php conforme o seguinte código-fonte.

db->get(‘cores’)->result();
$this->load->view(‘welcome_message’,$data);
}
}

Note que não há nada de diferente em relação aos outros bancos de dados, como o MySQL por exemplo, os procedimentos com o Active Record são os mesmos.

O próximo passo é modificar a view welcome em application/views/welcome_message.php, alterando o conteúdo da div body conforme o seguinte código-fonte.

cor] = $cor->cor;
}

$selecionadas = array();
foreach($cores as $cor){
if($cor->checado==1){
$selecionadas[$cor->cor] = $cor->cor;
}
}
echo form_multiselect(‘cores[]‘,$local_cores,$selecionadas);
echo form_fieldset_close();

echo form_fieldset(‘Radio’);
$add = 0;
foreach($cores as $radio){
$add++;
$data = array(
‘name’ => ‘radio_cores[]‘,
‘id’ => ‘radio_cores’.$add,
‘value’ => $radio->cor,
‘checked’ => $radio->checado
);
echo form_radio($data);
echo form_label($radio->cor, ‘radio_cores’.$add);
}
echo form_fieldset_close();

echo form_fieldset(‘Checkbox’);
$add = 0;
foreach($cores as $check){
$add++;
$data = array(
‘name’ => ‘check_cores[]‘,
‘id’ => ‘check_cores’.$add,
‘value’ => $check->cor,
‘checked’ => $check->checado
);
echo form_checkbox($data);
echo form_label($check->cor, ‘check_cores’.$add);
}
echo form_fieldset_close();

echo form_submit(“”,”Gravar”);
echo form_close();
?>

O resultado final deverá ser semelhante ao mostrado na figura 3:

Vejamos as principais diferenças entre o multi-select, radio e checkbox. No caso do multi-select precisamos informar ao helper form dois ou três parâmetros, sendo os seguintes: o nome do campo, uma array associativa com os valores que preencherão os options e opcionalmente uma array com quais options devem vir selecionados.

Isto foi feito no seguinte trecho de código:

$local_cores = array();
foreach($cores as $cor){
$local_cores[$cor->cor] = $cor->cor;
}

$selecionadas = array();
foreach($cores as $cor){
if($cor->checado==1){
$selecionadas[$cor->cor] = $cor->cor;
}
}
echo form_multiselect(‘cores[]‘,$local_cores,$selecionadas);

Já para os checkboxes e radiobuttons, a tarefa é mais fácil, pois basta utilizar o valor atribuído ao campo checado para verificar se o checkbox ou o radiobuttom devem estar ou não checados. Isto foi feito da seguinte forma:

$add = 0;
foreach($cores as $check){
$add++;
$data = array(
‘name’ => ‘check_cores[]‘,
‘id’ => ‘check_cores’.$add,
‘value’ => $check->cor,
‘checked’ => $check->checado
);
echo form_checkbox($data);
echo form_label($check->cor, ‘check_cores’.$add);
}

Observações importantes sobre campos radio e checkbox

  • Não é possível ter dois elementos com a mesma ID em um documento HTML, por isso utilizei uma variável auxiliar com um contador para que a ID nunca se repita;
  • O nome do campo deve ser acrescido de [] conforme feito em check_cores[]. Isto indica que o campo irá passar uma array de valores e não somente o último valor selecionado – isto vale para selects, checkboxes e radiobuttons;
  • Campos do tipo radiobuttom só admitem um valor checado, por isso, sempre será o último valor checado recebido do banco de dados. Se houver mais que um valor checado, os primeiros serão ignorados. Este exemplo está errado do ponto de vista semântico, se houver a necessidade de usar mais que um, utilize checkbox.

E então para visualizar os dados recebidos no controller, apenas crie um o método gravar no controller welcome.php conforme mostrado a seguir:

public function gravar(){
echo “

”;
    print_r($_POST);
    echo “

”;
}

Espero que tenha sido útil!