[PrestaShop] – Realizando Requisições AJAX para URLs do Painel

Neste artigo falarei sobre um problema que encontrei quando comecei a desenvolver módulos para a plataforma Prestashop: como realizar requisições AJAX para meus controllers que herdam a classe AdminController.  Apesar de requisições AJAX não serem, em geral, algo complicado de se fazer, essa tarefa se torna um pouco mais complicada quando o destino da requisição é um controller do tipo mencionado.

Primeiramente, para que a requisição seja processada, é necessário que haja um registro na tabela tab referente ao controller para o qual desejamos enviar a requisição. Você pode criar esse registro através da função abaixo:

$tab = new Tab();
$tab->module = <nomedomodulo>;
$tab->active = 0; 
$tab->class_name = <nomedocontroller>;  //AdminCustomProducts por exemplo
$tab->id_parent = Tab::getIdFromClassName(<nomedomodulo>);

foreach (Language::getLanguages(true) as $lang)
{
    $tab->name[$lang['id_lang']] = <nomedaaba>;
}

$tab->add();

Na linha 3, se você deixar a aba como ativa, ela será exibida no menu do Prestashop. Se você estiver criando um controller apenas para se comunicar via AJAX, deixe como 0. Se você deixar active=1, uma aba aparecerá no painel administrativo do usuário com um link para esse novo controller. Na linha 9, o nome da aba é o texto que será apresentado ao usuário no link para o seu controller. Caso você use active=0, esse campo não é importante, e pode conter qualquer valor.

A segunda dificuldade é que toda URL do painel precisa conter um token de segurança válido para que a requisição chegue até o controller desejado. Para que esse token seja acessível via Javascript, eu costumo deixá-lo como atributo de algum div em meu template.

<div id='meumodulo_wrapper' data-token='{$token}'>
	...
</div>

No controller responsável por gerar o template acima, o token de segurança deve ser adicionado à variável “$token“.

$this->smarty->assign(array(
    'token' => Tools::getAdminTokenLite('nomedocontroller')
));

Assim, a requisição ajax pode ser feita da forma a seguir.

$.ajax({
    type : 'POST',
    dataType : 'json',
    url : 'ajax-tab.php',
    data : {
        //parâmetros obrigatórios
        ajax : true,
        controller : 'nomedocontroller',
        action : 'nomedometodo',
        token : $('#meumodulo_wrapper').attr('data-token'),

        //demais dados a serem utilizados pelo controller
        foo : 'bar'
    },
})
.done(function(){})
.fail(function(){});

Isso fará com que a requisição chegue até o método “ajaxProcessnomedometodo()“ do controller “nomedocontroller.php“.  Note que o nome do método é case-sensitive. Por fim, implemente esse método em seu controller.

function ajaxProcessnomedometodo()
{	
    echo json_encode(array(
        'success' => true,
        'received_data' => Tools::getValue('foo')
    ));
}