Ir para conteúdo
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();		
  • +1 1

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

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • 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  
    • Por marcelobbt
      Estou tentando fazer uma aplicação em angularjs mas quando adiciono o controller da sempre esse erro:
       
      Uncaught Error: [$injector:modulerr] 
       
      Abaixo minha aplicação:
      HTML
      <div class="row" ng-app="acidenteApp"> <div class="col-sm-12" ng-controller="AcidenteController"> <p> teste de funcionamento {{1+1}}</p> <h2>Cadastrar Acidente</h2> <p><?php echo '<strong>'.$mensal->__get('empresa').'</strong> - '.$mensal->__get('mes').'/'.$mensal->__get('ano'); ?></p> <?php echo form_open('../CadastrarAcidente/'.$mensal->__get('idMensal'), array('class'=>"form-horizontal", 'name'=>'formAcidente', 'id'=>'formAcidente')); ?> <div class="form-group"> <label class="col-sm-2 control-label">Dia do Acidente:</label> <div class="col-sm-10"> <?php echo form_input(array('type'=>"number", 'class'=>"form-control", 'name'=>'diaform','id'=>'diaform'), set_value('diaform')); ?> <p class="help-block">O dia é obrigatório</p> </div> </div> <div class="form-group"> <label class="col-sm-2 control-label">Descrição do Acidente:</label> <div class="col-sm-10"> <?php echo form_textarea(array('class'=>"form-control", 'name'=>'descricaoform','id'=>'descricaoform'), set_value('descricaoform')); ?> </div> </div> <div class="form-group"> <label class="col-sm-2 control-label">Recomendações/Ações Após o Acidente:</label> <div class="col-sm-10"> <?php echo form_textarea(array('class'=>"form-control", 'name'=>'recomendacaoform','id'=>'recomendacaoform'), set_value('recomendacaoform')); ?> </div> </div> <div class="form-group"> <label class="col-sm-2 control-label">Adicionar acidentado:</label> <div class="col-sm-10"> <?php echo form_button(array('name'=>'adicionarAcidentado','id'=>'adicionarAcidentado'), "+"); ?> </div> </div> <div class="form-group"> <div class="col-sm-offset-2 col-sm-10"> <?php echo form_button(array('name'=>'cadastrar', 'ng-disabled'=>'formAcidente.$invalid'),"Cadastrar"); ?> </div> </div> <p><?php echo $erro; ?></p> </div> <script src="<?php echo base_url(); ?>js/angular.min.js"></script> <script src="<?php echo base_url(); ?>js/acidente.js"></script> </div> Abaixo o arquivo javascript acidente.js
       
      // criar angular app var acidenteApp = angular.module('acidenteApp', []); acidenteApp.controller('AcidenteController', function AcidenteController($scope) { console.log('teste'); });  
    • Por matmper
      Eu fiz uma pequena função em GalleriesController.php para redimensionar imagens na view, pesando menos os arquivos e melhorando o page speed, funciona normal, porém, eu preciso importar de um jeito menos demorado, que exija menos servidor e de maneira mais dinâmica, estilo importar essa função na view.
       
      Essa função recebeu uma rota:
      Router::connect('/imagem/*', array('controller' => 'Galleries', 'action' => 'index', 'admin' => false));  
      Então, atualmente eu estou chamando assim:
      <img src="./imagem/350/350/85/portfolio---<?= $p['Portfolio']['gallery_1'] ?>" />  
      função index
      //recebe width, height, qualidade e caminho public function index($w, $h, $q, $img){ $img = str_replace("---","/", $img); $img = WideImage::load(FULL_BASE_URL.$this->webroot . IMAGES_URL . $img); $img = $img->resize($w, $h, 'outside'); $img = $img->crop('center', 'center', $w, $h); $img = $img->output('jpg', $q); return $img; }  
×

Informação importante

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