Jump to content

Edit History

RafaEno

RafaEno


He ido a la solución del asunto, el codigo de GitHub

Buenas, ya se que ha pasado mucho tiempo pero acabo de iniciar con Prestashop y he tenido el mismo problema que tienes tu y lo he podido solucionar.

Después de mirar el código del fichero WebserviceOutputBuilder.php encontré que si un recurso tiene asociaciones no se captura correctamente ya que intenta obtener un valor de un array que es null y obviamente no puede acceder a la posición del 'id'.

El error lo encontré en el siguiente método:

protected function renderFlatAssociation($object, $depth, $associations, $ws_params)

Este es el fragmento que produce el error:

if ($field_name == 'id' && !isset($field['sqlId'])) {
	$field['sqlId'] = 'id';
	$field['value'] = $object_assoc['id']; // No se comprueba que sea distinto de null
} elseif (!isset($field['sqlId'])) {
	$field['sqlId'] = $field_name;
	$field['value'] = $object_assoc[$field_name]; // Igual aquí
}

La solución es cambiar esa condición, quedando como lo siguiente:

// Este fragmente de código lo he sacado de una versión más moderna de Prestashop, en concreto la 8.0.0
if ($field_name == 'id' && !isset($field['sqlId'])) {
	$field['sqlId'] = 'id';
	$field['value'] = isset($object_assoc['id']) ? $object_assoc['id'] : null; // Ahora se comprueba que no sea null
} elseif (!isset($field['sqlId'])) {
	$field['sqlId'] = $field_name;
	$field['value'] = isset($object_assoc[$field_name]) ? $object_assoc[$field_name] : null; // Aquí igual
}

Como puedes ver el cambio es mínimo, pero esto me ha solucionado el problema y me devuelve el schema de cualquier recurso que tiene asociaciones.

Espero te sea de ayuda, me disculpo si algo esta mal. Como he dicho soy nuevo en Prestashop, un saludo.

RafaEno

RafaEno


He ido a la solución del asunto, el codigo de GitHub

Buenas, ya se que ha pasado mucho tiempo pero acabo de iniciar con Prestashop y he tenido el mismo problema que tienes tu y lo he podido solucionar.

Después de mirar el código del fichero WebserviceOutputBuilder.php encontré que si un recurso tiene asociaciones no se captura correctamente ya que intenta obtener un valor de un array que es null y obviamente no puede acceder a la posición del 'id'.

El error lo encontré en el siguiente método:

protected function renderFlatAssociation($object, $depth, $associations, $ws_params)

Este es el fragmento que produce el error:

if ($field_name == 'id' && !isset($field['sqlId'])) {
	$field['sqlId'] = 'id';
	$field['value'] = $object_assoc['id']; // No se comprueba que sea distinto de null
} elseif (!isset($field['sqlId'])) {
	$field['sqlId'] = $field_name;
	$field['value'] = $object_assoc['id']; // Igual aquí
}

La solución es cambiar esa condición, quedando como lo siguiente:

// Este fragmente de código lo he sacado de una versión más moderna de Prestashop, en concreto la 8.0.0
if ($field_name == 'id' && !isset($field['sqlId'])) {
	$field['sqlId'] = 'id';
	$field['value'] = isset($object_assoc['id']) ? $object_assoc['id'] : null; // Ahora se comprueba que no sea null
} elseif (!isset($field['sqlId'])) {
	$field['sqlId'] = $field_name;
	$field['value'] = isset($object_assoc[$field_name]) ? $object_assoc[$field_name] : null; // Aquí igual
}

Como puedes ver el cambio es mínimo, pero esto me ha solucionado el problema y me devuelve el schema de cualquier recurso que tiene asociaciones.

Espero te sea de ayuda, me disculpo si algo esta mal. Como he dicho soy nuevo en Prestashop, un saludo.

RafaEno

RafaEno


Me confundi con algunas cosas y he rectificado

Buenas, ya se que ha pasado mucho tiempo pero acabo de iniciar con Prestashop y he tenido el mismo problema que tienes tu y lo he podido solucionar.

Después de mirar el código del fichero WebserviceOutputBuilder.php encontré que si un recurso tiene asociaciones no se captura correctamente el parámetro que le mandamos con https:/tu-prestashop.com/api/recurso?schema=blank.

El error lo encontré en el siguiente método:

protected function renderAssociations($object, $depth, $associations, $ws_params)

Este es el fragmento que produce el error:

// Este condigo esta mal, si te fijas en la condición 'null === $this->schemaToDisplay'
// Esta varaible $this->schemaToDisplay es justo el parametro que mandamos, es decir, es 'blank'
// y como puedes ver la condición que se hace es que sea igual a null, y 'blank' no es igual a null
if (method_exists($object, $getter) && null === $this->schemaToDisplay) {
	$association_resources = $object->$getter();
	if (is_array($association_resources) && !empty($association_resources)) {
		foreach ($association_resources as $association_resource) {
			$objects_assoc[] = $association_resource;
		}
	}
} else {
	$objects_assoc[] = '';
}

La solución es cambiar esa condición, quedando como lo siguiente:

// Ahora la condición del parametro que mandas en el schema tiene que cumplir
// que se encuentre en el array que le indicamos, si no esta el Webservice ya se
// encarga de capturar el error y mostrar que opciones son válidas para el parametro
// schema.
if (
	method_exists($object, $getter) && 
	in_array($this->schemaToDisplay, ['blank', 'synopsis', null])
) {
	$association_resources = $object->$getter();
	if (is_array($association_resources) && !empty($association_resources)) {
		foreach ($association_resources as $association_resource) {
			$objects_assoc[] = $association_resource;
		}
	}
} else {
	$objects_assoc[] = '';
}

Como puedes ver el cambio es mínimo, pero esto me ha solucionado el problema y me devuelve el schema de cualquier recurso que tiene asociaciones.

Por que debe ser de esa forma:

  • No funciona con poner solo null !== $this->schemaToDisplay ya que si intentas obtener un recurso y no el schema pues obviamente no le pasas el paramento schema=blank así que en ese instante es igual a null y por tanto saldría el mismo error.

PD: He revisado las versiones (de la 1.7.8.5 en adelante) que hay en GitHub y todas tiene ese fragmento mal, no he llegado a probar si también falla pero tiene toda la pinta.

Espero te sea de ayuda, me disculpo si algo esta mal. Como he dicho soy nuevo en Prestashop, un saludo.

RafaEno

RafaEno

Buenas, ya se que ha pasado mucho tiempo pero acabo de iniciar con Prestashop y he tenido el mismo problema que tienes tu y lo he podido solucionar.

Después de mirar el código del fichero WebserviceOutputBuilder.php encontré que si un recurso tiene asociaciones no se captura correctamente el parámetro que le mandamos con https:/tu-prestashop.com/api/recurso?schema=blank.

El error lo encontré en el siguiente método:

protected function renderAssociations($object, $depth, $associations, $ws_params)

Este es el fragmento que produce el error:

// Este condigo esta mal, si te fijas en la condición 'null === $this->schemaToDisplay'
// Esta varaible $this->schemaToDisplay es justo el parametro que mandamos, es decir, es 'blank'
// y como puedes ver la condición que se hace es que sea igual a null, y 'blank' no es igual a null
if (method_exists($object, $getter) && null === $this->schemaToDisplay) {
	$association_resources = $object->$getter();
	if (is_array($association_resources) && !empty($association_resources)) {
		foreach ($association_resources as $association_resource) {
			$objects_assoc[] = $association_resource;
		}
	}
} else {
	$objects_assoc[] = '';
}

La solución es cambiar esa condición, quedando como lo siguiente:

// Ahora la condición es que el parametro schema que mandamos sea distinto de null
// en este caso se cumple que 'blank' es distinto de null y todo funciona correctamente
// TODO: Se puede controlar mejor pero a mi me basta con que sea distinto de null
if (method_exists($object, $getter) && null !== $this->schemaToDisplay) {
	$association_resources = $object->$getter();
	if (is_array($association_resources) && !empty($association_resources)) {
		foreach ($association_resources as $association_resource) {
			$objects_assoc[] = $association_resource;
		}
	}
} else {
	$objects_assoc[] = '';
}

Como puedes ver el cambio es mínimo, pero esto me ha solucionado el problema y me devuelve el schema de cualquier recurso que tiene asociaciones.

PD: He revisado las versiones (de la 1.7.8.5 en adelante) que hay en GitHub y todas tiene ese fragmento mal, no he llegado a probar si también falla pero tiene toda la pinta.

Espero te sea de ayuda, un saludo.

×
×
  • Create New...