Só apresenta informação se determinado departamento for escolhido

Boa tarde Pessoal!

Neste momento tenho uma pequena aplicação a funcionar. Essa aplicação cobre todos os departamentos de uma empresa. O que pretendo é o seguinte:

Por exemplo, se pertencer ao departamento de Produção, quando fôr a gerir, listar materiais, etc… só mostra os materiais desse departamento. Se pertencer ao departamento financeiro, só aparece listado os materiais do departamento financeiro e assim por diante.

Por exemplo, numa CGridView, se nao filtrar os dados vai-me listar todos os materiais,




CHtml::listData(Materiais::model()->findAll(), 'Id', 'Nome')



, mas só quero que apareça os materiais para o departamento a que pertenço.

Será que em todos os models terei que criar querys para depois enviar os resultados? Se

fôr assim vai dar muito trabalho ter que mudar em todos os models e views.

Preciso de ideias para resolver isto. :blink:

Abraço!

Na hora de inserir o material você deve ter um campo na tabela por exemplo, departamento_id, que fará a relação com uma tabela por exemplo departamento, algo como:


// no model Material

public function relations()

{

	return array(

		'departamento'=>array(self::BELONGS_TO, 'Departamento', 'departamento_id'),

	);

}

Não sei se é exatamente isso que você quer, mas qualquer coisa se eu puder ajudar, estou ai. Abraços.

Ok Anderson! Agora imagina que vou adicionar um utilizador. Vou ter uma Dropdowlist só com os materiais que foram associados para esse departamento. Terei sempre que fazer uma query para filtrar os dados, certo?




                <?php 

                        echo CHtml::activeDropDownList(

                                $model,'localId', 

                                CHtml::listData(Locais::model()->findAll(),'Id','Nome')

                                );   

                ?>



Assim se nao filtrar vao aparecer todos os materiais, como é que faço para filtrar? Será que tenho que fazer assim:





                <?php 

                    $qry = 'select * from materiais where departamentoId=X ';

                        

                    echo CHtml::activeDropDownList(

                    $model,'localId', 

                    CHtml::listData(Locais::model()->findAllBySql($qry),'Id','Nome')

                    );   

                ?>




Deve haver uma forma mais fácil.

Já estou a ver que vou ter que alterar muitas views…

Abraço!

Olá Vilas,

Basta você acrescentar uma condição (condition) em relations: (melhor seria no model Departamento: Departamento possui vários Materiais




// no model Departamento

public function relations()

{

        return array(

                'material'=>array(self::HAS_MANY, 'Material', 'departamentoId'),

                ‘condition’=>’material.departamentoId=’.Departamento.Id,

                ‘order’=>’material.Id’), //opcional para ordenar

        );

}



Agora você pode chamar o relacionamento para montar seu dropdownlist:




echo CHtml::activeDropDownList(

$departamento,'localId',

CHtml::listData(Locais::model()->materiais,'Id','Nome')



Ou você pode acessar os materiais do departamento assim:


$materiais=$departamento->materiais;

foreach($materiais as $material)

    echo $material->nome; 



Espero que isso ajude-o a esclarecer.

Ese tutorial poderá ajudar: http://www.yiiframework.com/doc/blog/1.1/en/post.model

Abraço.

Olá Eduardo! Se calhar compliquei muito. Olha como fiz…

Primeiro criei esta classe




class UserDetail {

    

        public $userLocal;

    

    

        public function getUserLocal()

        {

            $username = Yii::app()->user->name;

            $user = Users::model()->find('username=:username', array(':username'=>$username));

            $this->userLocal = $user->localId;

            return $this->userLocal;

        }

}




Depois em todas as tabelas da minha base de dados adicionei um campo "localId".

e por fim na view:




		<?php 

                                $userLoc = new UserDetail();

             			echo CHtml::activeDropDownList(

				$model,'MaterialId', 

				CHtml::listData(Materiais::model()->findAll(array('condition'=>'localId='.$userLoc->getUserLocal())),'Id','Nome')

				);   

		?>




Com isto, ele vai pegar o local do user logado. Se ele pertencer a um certo local, quando for a inserir qualquer registo numa view, só lista os materiais locais a que pertence esse user.

Se calhar compliquei bastante.

Abraço!