Manutenção Em Sistema Existente


(Xeviousbr) #1

Eu recebi a incumbência de fazer uma manutenção num CRM em Yii.

A minha primeira tarefa é colocar um campo a mais numa tabela.

Campo Profissão em Contatos

Em protected\models\Contato.php

acrescentei na função attributeLabels() a linha

‘Profissao’ => ‘Profissão’,

E em protected\views\contato\_form.php

Acrescentei

<?php echo $form->textFieldRow($model,‘Profissao’,array(‘class’=>‘span10’,‘maxlength’=>30)); ?>

Dentro de um dos Spam’s

Mas quando vou onde deveria ser mostrado a lista de contatos da erro.

A propriedade "Contato.Profissao" não está definida.

…framework\db\ar\CActiveRecord.php(145)

Não sei se preciso regerar os Models depois de uma alteração.

(também não sei fazer isto)

Me parece que existe código que não foi gerado automaticamente e não sei se ao regerar os models não seria sobreescrito.

Qualquer ajuda é bem vinda.

Tenho alguma experiência com PHP mas sem FrameWork nem OO mas conheço OO pois programo em C#


(Renanlara17) #2

Comecei a trabalhar com Yii há pouco tempo, não sei se estou dizendo besteira mas pelo o que eu já conheço, ao instanciar uma classe model o Yii automaticamente cria as variaveis com os nomes das colunas da tabela.

Verifique se o nome da coluna é "Profissao" mesmo(case sensitive).


(Adrian Lucas) #3

Xevious no seu BD o nome está com letra maiúscula Profissao? Acrescenta também a variável no rules no próprio model, como exemplo abaixo.




public function rules() {

	array('profissao', 'length', 'max' => 100),

	array('profissao', 'safe', 'on' => 'search'),

}




(Lukasz Fokin) #4

Cara, isso geralmente acontece se você chamar esse atributo e ele não existir no seu BD.

Verifica isso, qq coisa posta aqui novamente.


(Xeviousbr) #5

O nome do campo esta correto

aqui um exemplo de como esta na função attributeLabels de protected\models\Contato.php


public function attributeLabels()

    {

        return array(

            'Empresa' => 'Conta',

            'Empresa_Fantasia' => 'Conta',

            'Contato' => 'Contato',

            'Email' => 'E-mail',

            'Telefone' => 'Telefone',

            'Celular' => 'Celular',

            'Data' => 'Data de Cadastro',

            'Fone_Comercial_Ramal' => 'Ramal',

            'Cargo' => 'Cargo',

            'Aniversario' => 'Nascimento',

            'Profissao' => 'Profissão',

        );

    }

Acabei de testar acrescentando essas linhas no rules e deu na mesma

A propriedade "Contato.Profissao" não está definida.

na página contato/update/3810/

Eu testei novamente se esta utilizando a base que estou trabalhando e é ela mesma

De qualquer maneira muito obrigado pelo rápido retorno

é muito chato passar um dia inteiro sem conseguir acrescentar um campo simples numa página, mas estou com fé que hoje consigo ir adiante, qualquer ajuda é bem vinda ;)


(Lukasz Fokin) #6

Xevious, tem como vc postar seu controller, model e view pra poder analisar melhor?


(Xeviousbr) #7

Achei que ficaria muito ‘bagunçado’ então coloquei no meu DropBox, o link é este


www.dropbox.com/s/hfi7m4osxzknphe/CRM.rar

Contem só os arquivos alterados por mim (já que o sistema esta funcionando normal em produção)

/controllers/ContatoController.php

/models/Contato.php

/views/contato/_form.php

Os pontos de alteração que fiz estão indicadas pelo comentário [color="#008000"]Minha alteração esta aqui[/color]

Não cheguei a fazer nenhuma alteração no Controller

dei uma olhada e só vi código relacionado a tratamentos especificos e este campo não precisa de tratamento nenhum, nem mesmo é obrigatório a única coisa é que ele teria o tamanho limite de 30 caracteres.

Aquelas linhas que me sugeriu que colocasse estão no rules em contato.php, mas creio que elas não causariam problema mesmo que fossem inapropriadas, porque creio que o "rules" só seria tratado no momento da gravação e meu problema é anterior, a página nem abre, por causa do erro.

Pelo que vi, o campo não esta sendo considerado no Model e então em todas partes que tratam do campo pelo model da erro.

Não vi no model uma relação dos campos da tabela (como esperaria numa classe PDO por exemplo), apenas vi um comentário no cabeçario do fonte relacionando os campos e então adicionei este novo campo ali também.

Minha necessidade é simplérrima.

Adicionar um campo tipo texto, sem nenhum critério de validação, nem mesmo seria obrigatório, com o máximo de 30 caracteres, ele não seria listado só gravar e ler ele e depois exportar, mas isso … fica pro próximo capítulo :)


(Adrian Lucas) #8

Xevious faz o seguinte:

Deixa o rules assim:





    public function rules()

    {

        return array(

            array('Empresa_Fantasia, Contato, Email, Profissao', 'required', 'on'=>'register'),

            array('Empresa_Fantasia', 'checkEmpresa_Fantasia', 'on'=>'register'),

            array('Cod_Crm', 'required', 'on'=>'register', 'message'=>'Houve um erro ao cadastrar! Contatar o administrador.'),

            array('Aniversario','type','type'=>'date', 'dateFormat'=>'dd/MM/yyyy', 'message'=>'{attribute} deve ter o formato dd/mm/yyyy'),

			array('Profissao', 'length', 'max' => 250),

            array('Email', 'email'),

            array('Cargo, Empresa, Fone_Comercial_Ramal, Telefone, Celular, Aniversario', 'default', 'setOnEmpty'=>true),

            array('Cargo, Empresa', 'numerical', 'integerOnly'=>true),

            array('Fone_Comercial_Ramal', 'length', 'max'=>10),

            array('Contato, Email, Empresa_Fantasia', 'length', 'max'=>255),

            array('Telefone, Celular', 'length', 'max'=>20),  

            array('Empresa_Fantasia, Contato, Cod_Tipo_Conta, Email, Telefone, Profissao', 'safe', 'on'=>'search'),  

        );

    }



Caso ainda continue dando erro, posta o script do BD para também analisarmos.


(Lukasz Fokin) #9

Cara, por incrível que pareça eu coloquei seus arquivos aqui em um projeto que tenho, criei uma tabela com base nos atributos da model e funcionou normal. Tirei até um print.

Tenta dar uma reiniciada do seu apache e mysql. Pode não ser um problema da aplicação.