Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Hisoka.

Dúvida com Codeigniter

Recommended Posts

Boa tarde!!

Eu tenho o seguinte cenário: Tenho a função X no controller A, que acessa um model e realiza uma função no banco. Porém, tenho outro controller, o controller B. Que executa a função Y. A função Y executa a mesma operação da função X, que é um select. O codeigniter não permite que eu chame a função X no Controller B, até onde sei.

Ai pesquisando, li sobre helper, library, plugin e tal. Tentei fazer isso com o helper, mas o helper não acessa o banco. Library eu n entendi mt bem como funciona, mas vi que é parecido com Helper (que até onde entendi, você coloca funções comuns a varias classes). Minha dúvida é o que uso para chamar a função X, tanto no controller A quanto no controller B de forma que eu não tenha que escrever o mesmo código duas vezes.

Lembrando, essa função X é um select.

Outra coisa tbm, antes que alguem mande o link do manual do codeigniter, eu ja li e lá n esta mt claro, referente a esse meu cenário.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Algo está errado aí, a função que você chama nos dois controllers se trata de um método não é mesmo?

Você deve estar separando errado as funcionalidades de cada camada do MVC, essa função (não sei como ela é), mas como faz um SELECT quer dizer que manipula um dado, então deve estar no Model, e esse Model deve ser uma abstração de alguma coisa da vida real, como um log, usuário, cliente ou qualquer outra coisa, então não há limite nenhum em chamar essa função nos dois controllers, se for colocado em model.

Crie um model adequado para a função e chame ela nos controllers, para ficar mais claro para nós entendermos sua questão, coloque um pedaço do seu código.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Algo está errado aí, a função que você chama nos dois controllers se trata de um método não é mesmo?

Você deve estar separando errado as funcionalidades de cada camada do MVC, essa função (não sei como ela é), mas como faz um SELECT quer dizer que manipula um dado, então deve estar no Model, e esse Model deve ser uma abstração de alguma coisa da vida real, como um log, usuário, cliente ou qualquer outra coisa, então não há limite nenhum em chamar essa função nos dois controllers, se for colocado em model.

Crie um model adequado para a função e chame ela nos controllers, para ficar mais claro para nós entendermos sua questão, coloque um pedaço do seu código.

Boa tarde Everson!

É exatamente isso!! Um método. Por exemplo:

Model

 function setor_ativo(){
        
            $this->db->select('*');    
            $this->db->from('setor');
            $this->db->where('statussetor', 'ativo');
       
            $retorno = $this->db->get();

            return $retorno;
        
    }

Controller:

 function alterar_perfil(){
        
        $this->load->model('usuario/usuario_model');

        $variaveis['consulta'] = $consulta = $this->usuario_model->exibe_usuario();
        
        $variaveis['setor_ativo'] = $setor_ativo = $this->usuario_model->setor_ativo();
        
       $this->load->view('perfil_pessoal/perfil_pessoal_view', $variaveis);
        
    }

Tem uma regra, onde só devem ser exibidos os setores que estiverem com status 'Ativo'. Esse mesmo método eu chamo na função listar_usuario(). O que eu qria na vdd era jogar todo esse código que esta dentro da função acima dentro de uma única função e chama-lo tanto na listar_usuario() quanto na alterar_perfil(). Um exemplo, vo fazer usando helper.

 function alterar_perfil(){
        
        $this->load->helper('setor/setor_ativo');
        
    }

Algo assim.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde, entendi eu acho, mas você pode chamar a função do model em qualquer controller, por exemplo, em cada controller cria um atributo para guardar o model e no construtor atribua o model a esse atributo, exemplo

public $modelUsuario;

public function __construct()
{
    $this->modelUsuario = $this->load->model('usuario/usuario_model');
}

E em cada action dos controller chame a função do setor ativo

function alterar_perfil()
{
    $setor_ativo = $this->modelUsuario->setor_ativo();

    $variaveis['setor_ativo'] = $setor_ativo;
}

function atualizar_perfil()
{
    $setor_ativo = $this->modelUsuario->setor_ativo();

    $variaveis['setor_ativo'] = $setor_ativo;
}

Não entendi muito bem se é isso que você quer, mas não há problemas em fazer isso

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde, entendi eu acho, mas você pode chamar a função do model em qualquer controller, por exemplo, em cada controller cria um atributo para guardar o model e no construtor atribua o model a esse atributo, exemplo

public $modelUsuario;

public function __construct()
{
    $this->modelUsuario = $this->load->model('usuario/usuario_model');
}

E em cada action dos controller chame a função do setor ativo

function alterar_perfil()
{
    $setor_ativo = $this->modelUsuario->setor_ativo();

    $variaveis['setor_ativo'] = $setor_ativo;
}

function atualizar_perfil()
{
    $setor_ativo = $this->modelUsuario->setor_ativo();

    $variaveis['setor_ativo'] = $setor_ativo;
}

Não entendi muito bem se é isso que você quer, mas não há problemas em fazer isso

Pô cara, bacana sua solução, apesar da minha duvida n ser essa, eu n conhecia esse método. Já quebra um galhão em n ter q ficar chamando os model td hr rs.

Tipo, oq eu fiz aqui até funcionou, ms creio que n seja tão boa pratica escrever o mesmo código 2, 3, 4 vezes podendo escrever so 1. Eu qria saber, se por exemplo, teria como eu criar uma library ou helper assim:

function minha_library_ou_helper(){
        
       $this->load->model('usuario/usuario_model');

       $variaveis['setor_ativo'] = $this->usuario_model->setor_ativo();
        
       return $variaveis['setor_ativo'];
        
    }

E ai dentro da função, que eu chamo na view fica assim:

 function alterar_perfil(){
        
       $variaveis = $this->load->library ou helper('minha_library_ou_helper');
      //aqui eu só pegaria o retorno da função minha_library_ou_helper e jogaria na view
        
       $this->load->view('perfil_pessoal/perfil_pessoal_view', $variaveis);
        
    }

function teste1(){

$variaveis = $this->load->library ou helper('minha_library_ou_helper');

$this->load->view('teste1/teste1', $variaveis);

}

function teste2(){

$variaveis = $this->load->library ou helper('minha_library_ou_helper');

$this->load->view('teste2/teste2', $variaveis);

}

Eu qria retornar o valor do método do helper ou da library direto para os métodos do controllers, entendeu? Qria saber se isso é possível.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi agora, cara da sim, não é difícil criar um helper no CodeIgniter, faça assim na pasta application/helpers, crie um arquivo php, ele deve ser nesse formato nomehelper_helper.php, dentro dele como exemplo coloque seu código

if (!defined('BASEPATH')) 
	exit('No direct script access allowed');

if (!function_exists('getSetorAtivo')) {
    function getSetorAtivo()
    {
    	$CI = get_instance();
    	$CI->load->model('usuario_model');

       	return $CI->usuario_model->setor_ativo();;
    }   
}

E para chamar ele no controller use

$this->load->helper('nomehelper_helper');

$variavel['setor_ativo'] = getSetorAtivo();		

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi agora, cara da sim, não é difícil criar um helper no CodeIgniter, faça assim na pasta application/helpers, crie um arquivo php, ele deve ser nesse formato nomehelper_helper.php, dentro dele como exemplo coloque seu código

if (!defined('BASEPATH')) 
	exit('No direct script access allowed');

if (!function_exists('getSetorAtivo')) {
    function getSetorAtivo()
    {
    	$CI = get_instance();
    	$CI->load->model('usuario_model');

       	return $CI->usuario_model->setor_ativo();;
    }   
}

E para chamar ele no controller use

$this->load->helper('nomehelper_helper');

$variavel['setor_ativo'] = getSetorAtivo();		

Éverson, bom dia!

Cara, perfeito, isso mesmo!!! Funcionou redondo. Como eu qria.

Mt obrigado pela ajuda!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi agora, cara da sim, não é difícil criar um helper no CodeIgniter, faça assim na pasta application/helpers, crie um arquivo php, ele deve ser nesse formato nomehelper_helper.php, dentro dele como exemplo coloque seu código

if (!defined('BASEPATH')) 
	exit('No direct script access allowed');

if (!function_exists('getSetorAtivo')) {
    function getSetorAtivo()
    {
    	$CI = get_instance();
    	$CI->load->model('usuario_model');

       	return $CI->usuario_model->setor_ativo();;
    }   
}

E para chamar ele no controller use

$this->load->helper('nomehelper_helper');

$variavel['setor_ativo'] = getSetorAtivo();		

Cara, esqueci de perguntar uma coisa, tem como chamar o helper direto na view ou um método qualquer?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, esqueci de perguntar uma coisa, tem como chamar o helper direto na view ou um método qualquer?

Cara, esquece, já descobri como faz kkkkkkkkk valeu!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por clovis.sardinha
      Pessoal,
      Estou fazendo um relatório no codeigniter, mas não consigo recuperar o retorno da model para a view.  Dou o foreach para utilizar um conjunto de id's que preciso achar em uma tabela, mas o array só recupera o último.
      Controller:
      $destinoterc=$this->triangulomodel->getDestinoterc($origemuser);         $dados['destinoterc']=$destinoterc;         foreach ($destinoterc as &$i){             $origemterc = $i['id'];             $origemtercfinal=$this->triangulomodel->getOrigemterc($origemterc);                                   }         $dados['origterc']= $origemtercfinal;        Model
      public function getOrigemterc($origemterc){ $query =$this->db->query("SELECT * FROM cadastro join tb_cidades on tb_cidades.cid_id=cadastro.cidade_origem where id =$origemterc"); foreach ($query->result_array() as $row) { } return $query->result_array(); }  
      Resultado , só está pegando o último ponteiro da array de origem. Teria que aparecer uns 30 registros.!
      [origterc] => Array ( [0] => Array ( [id_] => 21302 [cidade] => 3233 [cid_nome] => Januaria )  
    • Por JullySL
      Olá, criei um projeto em asp.net mvc 5 com sites multiplos para o cliente escolher o seu modelo de layout.
      Porém estou com um problema de "processamento" ao meu ver e gostaria de otimizar isso.
      Todo método do meu controller estou precisando chamar uma ViewModel nela ele Lê o cliente e todas informações do web site do cliente, gostaria de saber se isso é realmente necessário ou tem uma forma melhor de ser feito? Vou postar um exemplo:
       
      ViewModel:
              public HomeViewModel(string website)
              {
                  var uow = new UnitOfWork();
                  var contratante = uow.ClienteRepositorio.Buscar(c => c.WebSite == website);
                  Tema = contratante.Registro;
                  IdCliente = cliente.Id;
                  MetaKeywords = "teste metakey";
                  MetaDescription = " teste metaDescription";
                  FavIcon = "caminhodafoto";
                  [demais campos]
              }
       
      Controller
      1º método
              public ActionResult Index()
              {
                  var dominio = Tema.TemaAtual();
                  homeViewModel = LerDominio(dominio);

                  return View("~/Views/Tema/"+homeViewModel.Tema+"/Home/Index.cshtml", homeViewModel);
              }

      2º método
      public ActionResult Servicos()
              {
                  var dominio = Tema.TemaAtual();
                  homeViewModel = LerDominio(dominio);
                  return View("~/Views/Tema/"+homeViewModel.Tema+"/Home/Servicos.cshtml");
              }
      Agradeço a ajuda de vcs
    • Por Vinícius022
      Acho que estou com algum problema de herança ou coisa assim, eu não consigo chamar mais de um Container::getModel no meu Controller. Vou colocar o meu __construct aqui e o erro que ele me retorna

      PaginaController.php
      public function __construct()
      {
        parent:: __construct();
        #se eu comentar e deixar apenas um ai ele funciona, mas quando tento fazer com mais de um ele da um erro
        $this->contato       = Container::getModel("Contato");
        $this->noticia       = Container::getModel("Noticias");
        $this->institucional = Container::getModel("Institucional");
        $this->atuacao    = Container::getModel("Atuacao");
        $this->banner    = Container::getModel("Banners");
      }
      Container.php
      public static function getModel($model)
      {
          $objModel = "\\App\\Models\\".$model;
          return new $objModel(DataBase::getDataBase());
      }
      Fatal error: Uncaught TypeError: Argument 1 passed to Core\BaseModel::__construct() must be an instance of PDO.
    • Por Rafael Motta
      Boa tarde pessoal! preciso de uma ajuda, preciso fazer um select dentro de uma procedure no banco de dados e uso PDO, nao to conseguinto chamar a procedure e não faço ideia como faço um select dela, segue abaixo os codigos de exmplo...
       
      a primeira coisa que queria fazer era inserir o seguinte select 
      select COD_RAZAO, NOME, COD_CARTEIRA, NOME_REPRES, coalesce(EMISSAO,'') as EMISSAO, COD_GRUPO from consulta_outras_razoes_ord_fat where COD_CLIENTE = :idCustomer order by emissao desc, cod_razao'  
       
      abaixo CONSULTA_OUTRAS_RAZOES_ORD_FAT é o nome da procedure no banco
      function outrasRazoes($idCustomer) { $pdo = conecta(); try { $sql = "CALL CONSULTA_OUTRAS_RAZOES_ORD_FAT(':idCustomer')"; $consultar = $pdo->prepare($sql); $consultar->bindValue(':idCustomer', $idCustomer, PDO::PARAM_INT); $consultar->execute(); $resultado = $consultar->fetch(PDO::FETCH_OBJ); if ($consultar->rowCount() > 0) { return $resultado; } else { return false; } } catch (PDOException $e) { echo $e->getMessage(); } }  
      abaixo segue a procedure do banco
      begin for select OUTRAS_RAZOES.cod_razao,CLIENTES.NOME, CLIENTES.COD_CARTEIRA, REPRESENTANTES.NOME AS NOME_REPRES, clientes.cod_grupo from clientes inner join outras_razoes on (clientes.codigo = outras_razoes.cod_razao) inner join REPRESENTANTES on (CLIENTES.REPRESENTANTE=REPRESENTANTES.CODIGO) where OUTRAS_RAZOES.cod_cliente=:cod into cod_razao, nome, cod_carteira, nome_repres, cod_grupo do begin select max(notas.emissao) as emissao from notas inner join notas_item on (notas.nota = notas_item.nota) inner join naturezas_operacao on (notas_item.cod_natureza = naturezas_operacao.cod_natureza) and (notas_item.seq = naturezas_operacao.seq) where notas.cod_cliente = :cod_razao and naturezas_operacao.tipo = 1 into emissao; begin suspend; end end end  
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.