Ir para conteúdo

POWERED BY:

Arquivado

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

Bruno Carazato

cakephp chamar uma funcao da view no controller

Recommended Posts

Bom, sei que fazendo isso quebro a hierarquia e estrutura do cake mas tenho que fazer por alguns motivos.

tenho uma funcao na minha view e preciso chama-la por um mesmo botao que faz uma filtragem no meu controller, porem nao posso colocar a funcao no controler pq eu preciso de um javascript pra ela.... alguma ideia?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Que tipo de filtragem? Dependendo do que for você pode utilizar ajax.

É uma filtragem que consulta meu banco de dados....

Eu precisava que o mesmo botao que faz isso chame essa funcao php que ta na view

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu precisava que o mesmo botao que faz isso chame essa funcao php que ta na view

Estranho é ter uma função php na view :assobiando:

 

Como Marcos Xavier disse, utilize ajax e chame no Controller, o Cake até aceita um request, import etc na view, mas isso que você ta querendo, se chama POG

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estranho é ter uma função php na view :assobiando:

 

Como Marcos Xavier disse, utilize ajax e chame no Controller, o Cake até aceita um request, import etc na view, mas isso que você ta querendo, se chama POG

uma solucao alternativa que resolveria meu problema é passar o valor de uma variavel do php pro javascript, vi esse tutorial

http://www.mauricioprogramador.com.br/posts/passar-variavel-php-para-javascript

 

porém nao funciona pois o meu javascript carrega antes da variavel php ter o valor

Compartilhar este post


Link para o post
Compartilhar em outros sites

porém nao funciona pois o meu javascript carrega antes da variavel php ter o valor

Só declarar @var no Controller

//Controller
$this->set('msg','Seja bem-vindo ao site!');
//View

<html>
 <head>
  <title>Passar Variável PHP para Javascript</title>
 </head>
 <body>

  <script type="text/javascript">
   var mensagem = "<?php echo $msg;?>";
   alert(mensagem);
  </script>

 </body>
</html>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom vou postar um exemplo pra ver se ajuda.

Supondo que você tem o controller ExemploController e na view tem um botao que ao clicar enviará uma requisição com o parâmetro id.

//método no ExemploController
public function funcaoAjax() {
        $this->request->onlyAllow('ajax');
        $this->autoRender = false;

        if(!$this->request->is('ajax')){
            return false;
        }
        
        $this->response->type('json');
        $id   = (int)$this->request->data['id'];
        $data = $this->NomeDoModel->find('first');
        if($data){
           $data = $this->response->body(json_encode(array('retorno'=>'sucesso')));
        }else{
        	$data = $this->response->body(json_encode(array('retorno'=>'erro')));
        }
        return $data ;
}

//no js da view
$('#idDoBotao').on('click', function(){
			id = $(this).val();//ou outro elemento
			$.ajax({
				type:"post", 
				url:"/exemplo/funcaoajax",
				data: '&id='+id,
				success:function (data) {
					alert(data.retorno);// aqui voce faz o que precisa
					
				}
			});

});

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiramente agradeço muito a atencao de vocês... Vou ser específico pois assim podem me ajudar mais facil.

 

 

Minha funcao a que tanto me refiro é pra add marcadores ao mapa, estou usando o openmaps

 

Meu controller:

    public function mapas(){
        if ($this->request->is('post') and ($this->request->data['filtro'] != 0)) {
            $pesquisas = $this->pesquisar($this->request->data['filtro']);
           
        } else{
            $pesquisas = $this->Pessoas->find('all', array(
                'conditions' => array('Pessoas.lat !=' => 'null'),
                'fields' =>array('cat', 'lat', 'longi')
            ));
        }
        $cDout = $this->Pessoas->find()->where(['cat LIKE' => 'dout'])->count();
        $cMest = $this->Pessoas->find()->where(['cat LIKE' => 'mest'])->count();
        $cPhd = $this->Pessoas->find()->where(['cat LIKE' => 'phd'])->count();
        $cGrad = $this->Pessoas->find()->where(['cat LIKE' => 'grad'])->count();
        $cMba  = $this->Pessoas->find()->where(['cat LIKE' => 'mba'])->count();
        $total  = $this->Pessoas->find()->count();
        $this->set(compact('pesquisas', 'cDout', 'cMest', 'cPhd', 'cGrad', 'cMba', 'total'));
    }

minha view

<?php
    /**
     * @var \Cake\View\View $this
     */
 ?>
<h1>Total de Pessoas = <?=$total?></h1>
<h1>Doutores  = <?=$cDout?></h1>
<h1>Mestres = <?=$cMest?></h1>
<h1>Phds = <?=$cPhd?></h1>
<h1>Graduandos = <?=$cGrad?></h1>
<h1>Mbas = <?=$cMba?></h1>
<?= $this->Form->create('filtros'); ?>
<h3>
    <?=
        $this->Form->input('filtro', array('label' => 'Escolha o Filtro', 'options'=>array(
            0 => 'Todos',
            'cDout' => cDout,
            'cMest' => 'cMest',
            'cPhd' => 'cPhd',
            'cGrad' => 'cGrad',
            2 =>'cMba'
        )));
    ?>
</h3>

<?= $this->Form->button(__('Filtrar')) ?>
<?= $this->Form->end() ?>

<h2>Mapa</h2>
<div id="map" class="map"></div>

<?= $this->Html->script('mapas', ['block'=>'customBottom'])?>

<!--<input TYPE="BUTTON" NAME="submit" value="MARCAR" onclick="addmark();" >
Usei para tentar alguma gambiarra....
-->


<!--
<?php  foreach ($pesquisas as $pesquisa): ?>
   
   //Aqui eu chamaria a minha funcao javascript que esta no arquivo mapas.js para cada objeto "pesquisa", meu objetivo é passar pra ela a latitude e a longitude de cada pessoa.

<?php endforeach; ?>-->

e meu

mapas.js


function addmark($pesquisa){

/* algumas tentativas de controlar o problema
    var latlng = document.getElementById("latlng").value;
    var latlng2 = latlng.split(",");
    var lat=parseFloat(latlng2[0]);
    var lng=parseFloat(latlng2[1]);*/

          var iconFeature = new ol.Feature({
            geometry: new
                ol.geom.Point(ol.proj.transform([$pesquisa.lng, $pesquisa.lat], 'EPSG:4326',   'EPSG:3857'))
            //name: 'Null Island ',
            //population: 4000,
            //rainfall: 500
        });
        vectorSource.addFeature(iconFeature);

}

(function mapa(){
    vectorSource = new ol.source.Vector({
        //create empty vector
    });



    //create the style
    iconStyle = new ol.style.Style({
        image: new ol.style.Icon(/** @type {olx.style.IconOptions} */ ({
            anchor: [0.5, 46],
            anchorXUnits: 'fraction',
            anchorYUnits: 'pixels',
            opacity: 0.75,
            src: 'https://cdn1.iconfinder.com/data/icons/Map-Markers-Icons-Demo-PNG/32/Map-Marker-Marker-Outside-Azure.png'
        }))
    });



    //add the feature vector to the layer vector, and apply a style to whole layer
    vectorLayer = new ol.layer.Vector({
        source: vectorSource,
        style: iconStyle
    });

    var map = new ol.Map({
        layers: [new ol.layer.Tile({ source: new ol.source.OSM() }), vectorLayer],
        target: document.getElementById('map'),
        view: new ol.View({
            center: [3,2],
            zoom: 3
        })
    });
        //create a bunch of icons and add to source vector

        //usei para testar a funcao so 
       //addmark(-47.0697310,-22.8171043);

}

)();

Estou na faculdade e simplesmente me delegaram a funcao de fazer tal coisa no cake e ainda me impuseram uma data (daqui 5 dias) nao tive tempo de aprender o cake em si, tenho somente uma nocao basica do funcionamento,

espero a resposta de vocês,

grato

Compartilhar este post


Link para o post
Compartilhar em outros sites

Compartilhe o resultado final, sua dúvida de hoje pode ser de alguém amanhã, ou seja, não veja só o seu lado.

 

É isso que movimenta o fórum!

 

Abs!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Compartilhe o resultado final, sua dúvida de hoje pode ser de alguém amanhã, ou seja, não veja só o seu lado.

 

É isso que movimenta o fórum!

 

Abs!

Não vi só meu lado, achei que naoo teria necessidade de explicar mas basicamente a saida para meu problema foi colocar inputs tipo hidden e fazer a funcao javascript pegar o value das inputs pelo id delas, assim alem de funcionar nao quebrei a hierarquia do cake

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

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