Trabalhando com datas

Bom,

Graças a ajuda de vcs já estou capturando a data do juidatepicker e inserindo no banco de dados, tanto pelo action update qnto pelo action create.

Mas agora tem outro problema: formatação de data para exibir.

Existe alguma maneira deu formatar a data apartir do model?

Eu tentei fazer o seguinte no controller:




public function loadModel($id)

{

	$model=Projeto::model()->findByPk((int)$id);

	if($model===null)

		throw new CHttpException(404,'The requested page does not exist.');

	$dataInicio = $model->data_inicio;

	$ar = explode('-', $dataInicio);

	$model->data_inicio = $ar[2].'/'.$ar[1].'/'.$ar[0];

	return $model;

}



Mas não esta funcionando em certos lugares como na view, por exemplo, conde eu uso o cgridview:




$this->widget('zii.widgets.grid.CGridView', array(

		'id'=>'projeto-grid',

		'dataProvider'=>$dataProvider,

		'filter'=>$model,

		'columns'=>array(

			array(

			   'class'=>'CLinkColumn',

			   'header'=>'nameLink',

			   'labelExpression'=>'$data->nome',

			   'urlExpression'=>'Yii::app()->controller->createUrl("view", array("id"=>$data->id))',

			),

			'cliente',

			'status',

			'data_inicio',				

		),

	)

); 



que fica no meu index.php dentro da view.

Alguém pode me ajudar?




        array(

            'name'  => 'data',

            'htmlOptions' => array('style'=>'text-align: center;'),

			'filter'=>false,

			'value'=>'date("M/Y",strtotime($data->data))',

		),



o ideal é armazenar a data/hora no formato nativo do banco e manipular na hora de mostrar

Eu consigo fazer isso sem ter q formatar na hora de exibir? Ou seja, ele esta no formato nativo no banco, mas na hora de criar os objetos retornar a data já no formato padrão?

uma forma é criar uma função no seu Model:




	public function getDataFormatada()

	{

		return date("M/Y",strtotime($this->data))

	}



ai vc pode acessar:




echo $model->DataFormatada



Cara, isso aconteceu comigo, não achei ninguem mais no forum falando sobre isso. Eu não consegui identificar o que está de errado no attributes. Pelo menos me deixa mais confortável, afinal, eu não sou maluco :)

Eu não consigo identificar quando esse erro dá … como vou reportar isso??

Pois é cara, eu li que essa funcionalidade $model->attributes=$_POST[‘Projeto’] foi inserida a pouco, na versão 1.1.4.

Vamos aguardar.

Foi mais simples do q eu imaginava.

Dentro da model eu crio uma variável protected e uma função chamada getVariavel.

Ficou assim:




class Projeto extends CActiveRecord

{

(...)

	protected $dataBrasileira;

(...)

        public function getDataBrasileira()

	{

		$projeto = Projeto::model()->findbyPk($this->id);

		$data = $projeto->data_inicio;

		$ar = explode('-', $data);

		$dataBrasileira = $ar[2].'/'.$ar[1].'/'.$ar[0];		

		return $dataBrasileira;

	}

(...)

}



e para usar é só $model->dataBrasileira.

Valeu!

Se vc define a variável como ‘safe’, ela não é atribuída automaticamente quando vc faz


$model->attributes = $_POST['Projeto'] 

Quando é ‘safe’, vc precisa setar a variavel explicitamente


$model->data_inicio = $_POST['Projeto']['data_inicio']; 

Isso acontece pq o ‘loadModel’ só é chamado quando vc está obtendo um único registro dentro de um controller (nas actions ‘view’, ‘show’ e ‘update’)

Quando vc está em uma action ‘manage’, por exemplo, não é feito um ‘loadModel’.

Ao invés de fazer o que vc fez (colocar a customizacao no loadModel), coloque a personalização em um método ‘afterFind’ no model

Projeto model




public function afterFind(){

    $dataInicio = $this->data_inicio;

	$ar = explode('-', $dataInicio);

	$this->data_inicio = $ar[2].'/'.$ar[1].'/'.$ar[0];

}



Tá usando MySQL? Dá uma olhada na extensão abaixo

http://www.yiiframework.com/extension/i18n-datetime-behavior/

$model->attributes é antigo. Tem desde a 1.0.x. Não tem na documentação quando fio inserido, mas acho que foi nas primeiras versões.

quanto a data em ptbr, nosso amigo Ricardo solucionou pra gente: http://www.yiiframework.com/extension/i18n-datetime-behavior/

Tem uma discussão antiga aqui falando sobre isso. Da uma olhada nela.

Muito obrigado por esclarecer minha dúvida matando essa charada!

Valeu!

Valeu camarada!

Opa, não sabia do safe.

Agora eu sei :)