Boa tarde.
Estou a finalizar a estrutura da minha aplicação e há algo que me está a dificultar.
Queria no id do recibo que aparece-se da seguinte forma.
ANOID. EX 201201
Qual seria a melhor forma de o fazer?
Cumprimentos
Boa tarde.
Estou a finalizar a estrutura da minha aplicação e há algo que me está a dificultar.
Queria no id do recibo que aparece-se da seguinte forma.
ANOID. EX 201201
Qual seria a melhor forma de o fazer?
Cumprimentos
Olá,
Nesse recibo, voce pode concatenar o ano atual com o campo ID.
Sim, isso eu sei, minha dúvida está em como.
Devo criar uma função no controlador?
Se sim como deveria ser a função?
Não precisa criar função, caso queira fazer de forma rápida, se faz assim:
$id_recido = date('Y') . $model->primaryKey;
Eu recomendo adicionar essa criação concatenação no seu Model, depois de salvar o Recibo.
Exemplo:
class Recibo extends CActiveRecord {
[...]
public function beforeSave() {
if ($this->isNewRecord) {
$this->id_recibo = date('Y') . $this->primaryKey;
}
return parent::beforeSave();
}
[...]
}
Desta forma, quando um cliente ou você mesmo adicionar um novo recibo ele vai pegar o ID cadastrado, e concatena com o ano corrente e adicionar a sua tupla.
Obrigado, era exactamente essa a minha dúvida, pensei que teria que criar uma função no form para que antes de inserir a query concatena-se o ano ao id.
Cumprimentos e muito obrigado
Excelente abordagem, serve pra muitas outras situações.
Bem após experimentar em condições verifiquei que apenas adiciona o ano no banco de dados, o id não chega a ser adicionado.
alguma ideia para resolver?
Cumprimentos
Utiliza os mesmos critério, porém na seguinte função
public function afterSave() {
if ($this->isNewRecord) {
$this->id_recibo = date('Y') . $this->primaryKey;
}
return true();
}
Continua igual, embora na url passe o ano+id quando se clica em create, no banco de dados apenas mantém o ano.
Você definiu alguma chave primaria para a tabela?
Sim defini o id_recibo como chave primária.
Cumprimentos
Então faz assim
public function beforeSave() {
if ($this->isNewRecord) {
$this->id_recibo = date('Y') . '' . $this->id_recibo;
}
return parent::beforeSave();
}
Acontece exactamente o mesmo que anteriormente.
Já tentei inclusive usar o mysql_insert_id para ir buscar o ultimo id, e incrementar 1 mas nem assim funcionou.
Cumprimentos
Tentou assim também?
public function afterSave() {
if ($this->isNewRecord) {
$this->id_recibo = date('Y') . '' . $this->id_recibo;
}
return true();
}
Acontece o mesmo, o que é estranho.
O que me parece o seu id_recibo é um auto_increment então a melhor forma é você criar outro campo e fazer a concatenação do ID com o ano, como o Gustavo Andrade falou acima. Tenta assim
public function beforeSave() {
if ($this->isNewRecord) {
$this->numero = date('Y') . ''.$this->id_recibo;
}
return parent::beforeSave();
}
Já tinha tentado assim, mas mesmo assim não vai buscar o id e adicionar a bd
No sei controller, você não ta usando $model->save(false)?
Veja se consegue visualizar o ID adicionado.
public function beforeSave() {
if ($this->isNewRecord) {
echo '<pre>';
print_r($this->attributes);
echo '</pre>';
exit();
}
return parent::beforeSave();
}
Não não estou a usar.
Gerei os forms no gii extended.
Array
(
[nome_cliente] => teste
[telefone_cliente] => 34343
[morada_cliente] => asdasdas
[marca_equipamento] => blaaa
[nr_serie] => 2132313131
[avaria] => asdasdas
[data_recb] => 2013-01-26
[data_entrega] => 2013-01-17
[garantia] => Sim
[preco] => 1231
[observacoes] => asdasda
[modelo_equipamento] => blaaa
[estado] => Recebido
[id_recibo] =>
[id_ficha] =>
)
Posta seu model, acho que falta a variável na
function rules() {…array(‘id_recibo’, ‘safe’)…}.