Nao assume valor guardado na tabela

Boas Pessoal!

Tenho um problema estranho ou talvez não. Tenho este codigo no _form.php




<div class="row">

		<?php echo $form->labelEx($model,'Username'); ?>

		<?php                 

			echo CHtml::activeDropDownList(

				$model,'Username',

                                    CHtml::listData(Users::model()->findAll(array('order'=>'username ASC')),'Id','username')

				);  

		?>

		<?php echo $form->error($model,'Username'); ?>

	</div>



Quando faço atualizar, o campo Username do form não assume o valor que esta gravado na tabela da base de dados, mas sim, o primeiro username que retorna da tabela ordenada da activeDropDownList.

O activeDropDownList nao deveria assumir o valor que está gravado na nossa tabela?

Abraço!

O 3º parâmetro do listData não é Username ao invés de username?

Boas! Não! Está certo é mesmo username. Abraço!

Por que não usa o próprio CActiveForm?


$lista = CHtml::listData(Users::model()->findAll(array('order'=>'username ASC')),'Id','username');

echo $form->dropDownList($model, 'Username', $lista);

Não dá Newerton. É estranho.

1º Crio um novo registo com os dados, Username, etc…

2º Quando faço update ao registo, tenho uma Dropdownbox com todos os users listados de forma ordenada, até aqui tudo bem, só que, o valor a alterar que aparece no campo do Username não corresponde ao que está no model mas sim o primeiro username da Lista ordenada.

Por ex: Gravei o registo com Username "Joao", quando faço atualizar, aparece "Antonio" e não o "Joao".

Mas se eu não ordenar a Dropdownbox, já funciona e já aparece o valor que vem do model que é o "Joao".

Já tento mostrar o valor com "echo $model->Username" para ver se está retornando o ID correto?

Correto. Tentei e se fizer o $model->Username o que aparece é ‘root’. Só que na combobox nao aparece root mas sim o primeiro username da lista ordenada.

Vejam p.f. este link:

Link das imagens da Aplicação

Abraço!

Bono,

Captei a vossa mensagem hehehe

Por que ta usando string na coluna "Id" da tabela "Username"?

Era bom na tabela ‘tbl_messages’ na coluna ‘Username’ fica só números inteiros, ai você pode usar os relacionamento “relations()” dos models.

E que nunca trabalhei com valores em string e inteiro para combobox, sempre o valor do <option> é inteiro, ou sempre string, nunca fiz mesclagem.

Coloca o root com ‘Id’ 9999 ou 1, e veja se funciona somente com números inteiro.

Boa noite Newerton! Não funciona. já alterei e nada. Não me digam que não é possivel… Abraço!

Bono, eu fiz algo parecido só q um pouco diferente. Eu fiz tudo pelo Model e as chamadas fiz pelo Controller e suas respectivas Views.

Meu cenário era identificar a pessoa que postou a notícia.

Autor::model()


public function getListAutor()

{

	$criteria = new CDbCriteria();

	$criteria->select = 'id, nome';

	$criteria->condition = "status = :status";

	$criteria->params = array(":status" => 'A');

	$criteria->order = "name ASC";

		

	return Autor::model()->findAll($criteria);

}

Aqui fiz a consulta que vai listar todos os ids e nome dos autores cujo o status seja igual a A (Ativo) na ordem Crescente.

NoticiasController

Nos métodos actionCreate() e actionUpdate() onde faz respectivamente o INSERT e UPDATE está assim:




public function actionCreate()

{

	$model=new Noticias;


	if(isset($_POST['Noticias']))

	{

		$model->attributes=$_POST['Noticias'];

		if($model->save())

			$this->redirect(array('view','id'=>$model->idNoticia));

	}


	$this->render('create',array(

		'model'=>$model,

		'autor' => Autor::model()->getListAutor(),

	));

}


public function actionUpdate($id)

{

	$model=$this->loadModel($id);


	if(isset($_POST['Noticias']))

	{

		$model->attributes=$_POST['Noticias'];

		if($model->save())

			$this->redirect(array('view','id'=>$model->idNoticia));

	}


	$this->render('update',array(

		'model'=>$model,

		'autor' => Autor::model()->getListAutor(),

	));

}



Repare que no render de actionCreate() e actionUpdate() eu passei o parâmetro autor contendo o método getListAutor() do Autor::model().

Seguindo para a view.

Nas views create.php e update.php acrescentar na linha do renderPartial o model autor.


<?php echo $this->renderPartial('_form', array('model'=>$model, 'autor' => $autor)); ?>

E na view _form.php para adicionar o dropDownList:


<?php echo $form->dropDownList($model, 'idAutor', CHtml::listData($autor, 'id', 'nome')); ?>

Aqui, na hora do update ele retorna na dropDownList o autor que foi selecionado no INSERT.

Problema resolvido!

Cálcio, cheguei a fazer como tu disseste mas também não deu.

Resolução:

Eu estava a gravar na tabela ‘tbl_messages’ no campo ‘Username’ o valor do ‘username’ e não do ‘Id’.

Cálcio e Newrton, obrigado pela ajuda. Abraço!

Que bom que resolveu seu problema.