:::: MENU ::::

Dispatcher en PrestaShop

Últimamente estamos avanzando bastante en la conexión de PrestaShop con OpenERP y ya casi lo tenemos funcionando en producción.

Una de las cosas que mas nos ha preocupado ha sido el «Dispatcher» de PrestaShop para la versión 1.4.0.17, ya que detectamos numerosos bugs para el buen uso del mismo con OpenERP. Y mas concretamente en servidores con 1and1.

Por si a alguien le interesa, aquí pongo el código del dispatcher.php que hemos reutilizado, localizado en la carpeta webservice de PrestaShop.

if (isset($_SERVER[''HTTP_AUTHORIZATION'']) && preg_match(''/Basic\\s+(.*)$/i'', $_SERVER[''HTTP_AUTHORIZATION''], $matches))
{
list($name, $password) = explode('':'', base64_decode($matches[1]));
$_SERVER[''PHP_AUTH_USER''] = strip_tags($name);
}


//echo "PHP_AUTH_USER:".$_SERVER[''PHP_AUTH_USER''];
//set http auth headers for apache+php-cgi work around if variable gets renamed by apache
if (isset($_SERVER[''REDIRECT_HTTP_AUTHORIZATION'']) && preg_match(''/Basic\\s+(.*)$/i'', $_SERVER[''REDIRECT_HTTP_AUTHORIZATION''], $matches))
{
list($name, $password) = explode('':'', base64_decode($matches[1]));
$_SERVER[''PHP_AUTH_USER''] = strip_tags($name);
}
ob_start();
require_once(dirname(__FILE__).''/../config/config.inc.php'');

// Use for image management (using the POST method of the browser to simulate the PUT method)
$method = isset($_REQUEST[»ps_method»]) ? $_REQUEST[»ps_method»] : $_SERVER[»REQUEST_METHOD»];

if (isset($_SERVER[»PHP_AUTH_USER»]))
$key = $_SERVER[»PHP_AUTH_USER»];
elseif (isset($_GET[»ws_key»]))
$key = $_GET[»ws_key»];
else
{
header($_SERVER[»SERVER_PROTOCOL»].» 401 Unauthorized»);
header(»WWW-Authenticate: Basic realm=»Welcome to PrestaShop Webservice, please enter the authentication key as the login. No password required.»»);
die;
}

if (isset($_REQUEST[»xml»]))
{
// if a XML is in POST
$input_xml = stripslashes($_REQUEST[»xml»]);
}
else
{
// if no XML
$input_xml = NULL;

// if a XML is in PUT
if ($_SERVER[»REQUEST_METHOD»] == »PUT»)
{
$putresource = fopen(«php://input», «r»);
while ($putData = fread($putresource, 1024))
$input_xml .= $putData;
fclose($putresource);
}
}

$params = $_GET;
unset($params[»url»]);

$class_name = WebserviceKey::getClassFromKey($key);
$bad_class_name = false;
if (!class_exists($class_name))
{

$class_name = »WebserviceRequest»;
$bad_class_name = true;
}
// fetch the request
$request = call_user_func(array($class_name, »getInstance»));
$result = $request->fetch($key, $method, $_GET[»url»], $params, $bad_class_name, $input_xml);
// display result
if (ob_get_length() == 0)
header($result[»content_type»]);
else
header(»Content-Type: application/javascript»); // Useful for debug…
header($result[»status»]);
header($result[»x_powered_by»]);
header($result[»execution_time»]);
if (isset($result[»ps_ws_version»])){
header($result[»ps_ws_version»]);

}

if ($result[»type»] == »xml»)
{
header($result[»content_sha1»]);
echo $result[»content»];
}
elseif ($result[»type»] == »image»)
{
if ($result[»content_type»] == »Content-Type: image/jpeg»)
imagejpeg(WebserviceRequest::getInstance()->_imageResource);
elseif ($result[»content_type»] == »Content-Type: image/gif»)
imagegif(WebserviceRequest::getInstance()->_imageResource);
imagedestroy(WebserviceRequest::getInstance()->_imageResource);
}

ob_end_flush();

También es muy importante agregar al principio y al final del documento .htacces, localizado en la raiz de PrestaShop, lo siguiente:

RewriteBase /

RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization},last]

Saludos a todos. Espero que os haya servido de ayuda.


So, what do you think ?

You must be logged in to post a comment.