CakePhp: a resposta do controlador para solicitação de Ajax está errada
-
26-09-2019 - |
Pergunta
Estou usando o jQuery para fazer uma solicitação AJAX para alguma ação do controlador. Esta solicitação é ativada a partir de um botão na exibição da ação de edição no mesmo controlador.
Meu problema: a solicitação AJAX está retornando todo o código da visualização Editar (com todos os formulários e entradas) em vez do número esperado. Se eu colocar o mesmo botão AJAX na exibição da ação Adicionar, ele funciona perfeito (ele retorna o número).
As ações de edição e adição permanecem geradas por padrão (com bola).
Esta é a função jQuery para fazer o pedido de Ajax
$.ajax({
type: 'POST',
url: 'checkTargets',
data: {target: tgt_array, channel: channel_type},
success:function(data){
$('#num_subscribers > span').html(data);
},
error:function(){
$('#num_subscribers > span').html("The subscribers could not be loaded");
},
timeout: 5000
});
}
Esta é a ação
function checkTargets() {
if ($this->RequestHandler->isAjax()) {
if(!empty($this->params['form'])) {
$data = $this->params['form'];
if ($data['channel'] === 'SMS') {
$channel = 'sms';
} else {
$channel = 'pin';
}
$targets = $this->processPostTargets($data['target']);
$this->RequestHandler->respondAs('text');
//This echo a NUMBER
echo ClassRegistry::init('Selection')->countSubscribersInTarget($channel, $targets);
Configure:: write('debug', 0);
$this->autoRender = false;
exit();
}
}
}
Por que isso está acontecendo?
Obrigado
Solução 2
Eu corrigi o problema. Era o param da URL na função .ajax (um erro noob)
Deve ser um caminho completo para a ação referenciada no controlador.
Esta pergunta me ajudou a entender o problema:Melhores práticas para usar o URL de ação enquanto chama Ajax no CakePHP
Corrigido solicitação AJAX:
$.ajax({
type: 'POST',
url: '/myapp/campaigns/checkTargets',
data: {target: tgt_array, channel: channel_type},
success:function(data){
$('#num_subscribers > span').html(data);
},
error:function(){
$('#num_subscribers > span').html("The subscribers could not be loaded");
},
timeout: 5000
});
obrigado e desculpe meu inglês
Outras dicas
Apenas uma sugestão sem ter acesso a tudo, você já tentou isso?
$this->autoRender = false;
$this->layout = 'ajax';
Além disso, sugiro simplificar:
$.post("/controller/checkTargets", function(data) {
alert(data);
}
function checkTargets() {
$this->autoRender = false;
$this->layout = 'ajax';
echo "Im working";
}
e vá a partir daí.