retornar valor da base de dados na combo

Eu tenho a seguinte activeDropDownList a ser carregada através de um ficheiro json,quando gravo fica o valor na base de dados.Até aqui tudo bem.O pior é que quando faço um update a combo não fica com o valor que foi guardado na base de dados mas sim o valor inicial da lista.

view com a combo:


<div class="row">

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

        <?php echo CHtml::activeDropDownList($model,'country', $this->getPaises()); ?>

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

    </div>

controller com o getPaises:


public function getPaises(){

        

        $string = file_get_contents(Yii::getPathOfAlias('webroot.assets') . DIRECTORY_SEPARATOR ."country.json");

        return CJSON::decode($string,true);

        


    }

ficheiro json:


{"AC":"Ascension Island","AD":"Andorra","AE":"United Arab Emirates",....

afinal não está a gravar na base de dados…Porquê?

Onde e como você está salvando/atualizando esses dados?

Nos models, não estás usando scenarios não é?

Sou novo no yii,nem sei muito bem o que são scenarios,já tentei com um listdata de outro model mas é o mesmo o activeDropDownList não grava no model o valor,aqui vai a função update:


public function actionUpdate($id) {

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


        if (isset($_POST['User'])) {

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

            if ($model->save()) {

                Yii::app()->user->setFlash('success', Yii::t('app', 'Data saved'));

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

            }

        }


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

            'mostraPass' => false,

            'model' => $model

        ));

    }



Rules do model user:


public function rules() {

        // NOTE: you should only define rules for those attributes that

        // will receive user inputs.

        return array(

            array('nome, username, email', 'required'),

            array('pass', 'required', 'on' => 'create'),

            array('receivenews', 'numerical', 'integerOnly' => true),

            array('username,email', 'unique'),

            array('nome, email', 'length', 'max' => 145),

            array('username', 'length', 'max' => 45),

            array('pass', 'length', 'max' => 95),

            array('pass', 'required', 'on' => 'create'),

            array('iduser, nome, username, pass,country,receivenews, lastLogin, email, createDate', 'safe', 'on' => 'search'),

        );

    }

zipzap,

O valor está sendo gravado corretamente, o problema deve ser no resgate do valor.

Adiciona um:


echo $model->country;

Faça isso no _form, ai você já mata 50% do problema.

Verifica com o firebug se o <select> está com os value="" corretos.

Já tinha feito isso.

No firebug o select parece-me bem:


<select id="User_country" name="User[country]">

<option value="AC">Ascension Island</option>

<option value="AD">Andorra</option>

<option value="AE">United Arab Emirates</option>

<option value="AF">Afghanistan</option>

<option value="AG">Antigua and Barbuda</option>

<option value="AI">Anguilla</option>

<option value="AL">Albania</option>

<option value="AM">Armenia</option>

....

</select>

no $model->attributes = $_POST[‘User’];

vem a null quando grava

Algum exemplo da activeDropDownList a funcionar??

Afinal a combo está certa porque vi o valor de $_post[‘User’].

Só que depois o valor não fica no model->attributes

Já percebi qual o problema.O atributo é not null na base de dados e eu esqueci de incluir required na função rules do model.

agora estou com outro problema do view do user.

É que aparece o valor escrito na base de dados.

Por exemplo aparece BB quando deveria aparecer o país Barbados.

tenho de fazer uma pesquisa no ficheiro json pelo indice que é escrito na base de dados?

Basta fazer com que os values dos seus options sejam o nome, ao invés da sigla do país.

Sim mas como fazer isso se o json está desta forma? E ao fazer isso não vai a combobox apresentar as siglas em vez dos países?

Posta aqui o código que exibe na tela o seu dropdown.

Mas está em cima!!

Foi mal! >.<

O seu JSON está assim:


{"AC":"Ascension Island","AD":"Andorra","AE":"United Arab Emirates",....

Tens de gerar um JS onde a sigla seja o nome e o nome se mantenha como nome.

Para gerar o JSON é fácil, depois é só atualizar o arquivo.

Uma função +/- assim deve resolver…


// Obs: Não testei, talvez tenha algum erro bobo


$return = array();

$array = CJSON::decode(file_get_contents(Yii::getPathOfAlias('webroot.assets') . DIRECTORY_SEPARATOR ."country.json"));


foreach $array as $country {

$return[$country] = $country;

}


echo CJSON::encode($return);

Pegue o que for impresso no "echo" e atualize seu arquivo e faça o teste. Lembre-se de fazer um backup do arquivo original.

Eu compreendo a tua solução mas diz-me se posso fazer desta maneira.

Definir uma variável publica e preencher com o decode do jason:




public $paises;


public function getPaises(){

        

        $this->paises = file_get_contents(Yii::getPathOfAlias('webroot.assets') . DIRECTORY_SEPARATOR ."country.json");

        return CJSON::decode($this->paises,true);

        


    }



depois criar um método que devolve o valor pelo parâmetro do index:




  public function getPais($sigla){

	        $this->getPaises();

		$teste=$this->paises[$sigla];

                return $teste;

	}



e utilizar esta função no view…

Claro que pode, dei só a ideia inicial, a lógica que vamos utilizar é individual de cada um.

Deu certo agora?

Sim deu.O unico senão é fazer sempre uma leitura do json por cada vez que precisa do valor ,mas não me parece lento.Muito obrigado.