17 de janeiro de 2021 - Frederico Marinho

Webservice do Prestashop 1.6 compatível com PHP 7.2

Recentemente atualizei o servidor de diversas lojas virtuais que temos aqui na Divera e, apesar de alguns ajustes necessários na interface de algumas delas, praticamente todas passaram pelo processo sem dificuldades. Para minha surpresa, alguns clientes começaram a relatar dificuldade de fazer a sincronização com seus sistemas ERP. Foi aí que notei que existe sim uma incompatibilidade do Prestashop 1.6 com versões superiores ao PHP 7.0. A boa notícia é que é bem simples de resolver.

Se preferir, pode também instalar diferentes versões do PHP pra ter menos dor de cabeça, mas quanto à segurança, estabilidade e velocidade do site, melhor ter uma versão mais atualizada. Fica a seu critério.

O intuito desse post não é explicar como usar a API do prestashop, mas explica apenas como tornar a versão 1.6 dessa plataforma de e-commerce compatível com o PHP 7.2.

Corrigindo o método GET

Usando o RESTClient para fazer uma chamada GET no Webservice recebium erro 500 Internet Server Error no header.

No Preview da respostas recebi o seguinte erro durante a mesmo chamada GET do método de produtos:

PHP Warning #2 count(): Parameter must be an array or an object that implements Countable
 /classes/webservice/WebserviceRequest.php, line 794

A mensagem é bem clara, explica o erro, em qual arquivo e até a linha. Bem, então vamos lá!

O bloco de código com erro é esse:

if (count(self::$shopIDs)) {
     return true;
 }

O problema aqui é que o PHP 7.2 não aceita mais contagem de variáveis que não tenham sido inicializadas. E pode não parecer tão óbvio, mas provavelmente esse erro só vai acontecer caso o prestashop não esteja configurado para ser utilizado no modo multi-loja. Não posso afirmar porque não testei, mas pelo código provavelmente o erro só acontece no modo single mesmo.

Bom, resolver esse problema é bastante simples, basta apenas verificar se a variável foi inicializada. Podemos usar isset(), que é a função própria pra isso ou mesmo o @ que é uma espécie de atalho para a função.

if (isset(count(self::$shopIDs))) {
     return true;
 }

Eu prefiro usar a versão reduzida da função:

if (@count(self::$shopIDs)) {
     return true;
 }

Apenas fazendo esse ajuste o método GET do webservice já vai funcionar corretamente!

Corrigindo os métodos PUT, POST e DELETE

Diferente do método GET que está no arquivo WebserviceRequest.php, os demais métodos estão direto no ObjectModel.php, dentro da pasta classes. Os erros nesses métodos acontecem exatamente da mesma forma que no GET, então basta localizarmos o mesmo padrão de código nesse arquivo e corrigí-los.

Você vai encontrar o seguinte código:

if (count($this->id_shop_list) > 0) {
    $id_shop_list = $this->id_shop_list;
}

Basta substituí-lo por:

if (@count($this->id_shop_list) > 0) {
    $id_shop_list = $this->id_shop_list;
}

nas linhas 478, 644, 708, 762, que estão respectivamente nos métodos add (post), update (put) e delete.

É isso. Com essas correções sua integração via REST/Json já vai estar funcionando normalmente. Se tiver dificuldades, pode me chamar no instagram.

1

Prestashop / Webservice/API api / api prestashop / prestashop 1.6 / rest/json / restclient /

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *