angel_dope Posted June 1, 2020 Share Posted June 1, 2020 (edited) Hi everyone, I'm trying to create a product using the webservice but I'm getting always the same error: Any idea how I can solve this? I'm running Prestashop 1.7.6.5 Quote RETURN HTTP BODY <?xml version="1.0" encoding="UTF-8"?> <prestashop xmlns:xlink="http://www.w3.org/1999/xlink"> <errors> <error> <code><![CDATA[3]]></code> <message><![CDATA[ Invalid argument supplied for foreach() (/opt/bitnami/apps/prestashop/htdocs/classes/Product.php, line 6827)]]></message> </error> </errors> </prestashop> Edited June 1, 2020 by angel_dope (see edit history) Link to comment Share on other sites More sharing options...
angel_dope Posted June 1, 2020 Author Share Posted June 1, 2020 By the way, this is the code snippet i found in product.php, line 6827 is the one starting with foreach public function modifierWsLinkRewrite() { foreach ($this->name as $id_lang => $name) { if (empty($this->link_rewrite[$id_lang])) { $this->link_rewrite[$id_lang] = Tools::link_rewrite($name); } elseif (!Validate::isLinkRewrite($this->link_rewrite[$id_lang])) { $this->link_rewrite[$id_lang] = Tools::link_rewrite($this->link_rewrite[$id_lang]); } } return true; } Link to comment Share on other sites More sharing options...
Alex Oancea Posted November 3, 2020 Share Posted November 3, 2020 On 6/1/2020 at 4:51 PM, angel_dope said: By the way, this is the code snippet i found in product.php, line 6827 is the one starting with foreach public function modifierWsLinkRewrite() { foreach ($this->name as $id_lang => $name) { if (empty($this->link_rewrite[$id_lang])) { $this->link_rewrite[$id_lang] = Tools::link_rewrite($name); } elseif (!Validate::isLinkRewrite($this->link_rewrite[$id_lang])) { $this->link_rewrite[$id_lang] = Tools::link_rewrite($this->link_rewrite[$id_lang]); } } return true; } Did you managed to find a solution? I'm receiving the same warning and the code is not warning, until I enable the debug mode. With debug mode activated it's working properly. I also tried to add a breakpoint in this function, but I can't get there. Thanks! Link to comment Share on other sites More sharing options...
angel_dope Posted November 4, 2020 Author Share Posted November 4, 2020 (edited) 9 hours ago, Alex Oancea said: Did you managed to find a solution? I'm receiving the same warning and the code is not warning, until I enable the debug mode. With debug mode activated it's working properly. I also tried to add a breakpoint in this function, but I can't get there. Thanks! Hi Alex, I finally made it posting the information straight to the different tables in the database. If you want to do it, you need to use the following tables: - ps_product - ps_product_lang - ps_product_shop - ps_category_product - ps_image* - ps_image_shop *Once created a new line on ps_image, you have to retrieve the id_image field to create the image folders structure for the image, i.e., if the id_image is 749, the folder structure will be [root_folder]\img\p\7\4\9\ and you have to upload the different images to this last folder. I leave you the html form and the php code I use to upload the image file, create the folder structure and resize the image to the different sizes you need for the store. The php file should be on your stores root folder, and you have to upload a square image to prevent loosing information, because the resize function crops the image. With this code you just have to upload one image and it generates copies in the different size the store uses. <form action="https://yourstore.com/upload_image.php" method="post" enctype="multipart/form-data" name="form1"> <input name="userfile[]" type="file" id="userfile[]" required> <input name="id" type="hidden" id="id" value="<%=request.querystring("id")%>"> <input type="submit" name="button" id="button" value="Enviar"> </form> <?php /** * easy image resize function * @param $file - file name to resize * @param $string - The image data, as a string * @param $width - new image width * @param $height - new image height * @param $proportional - keep image proportional, default is no * @param $output - name of the new file (include path if needed) * @param $delete_original - if true the original image will be deleted * @param $use_linux_commands - if set to true will use "rm" to delete the image, if false will use PHP unlink * @param $quality - enter 1-100 (100 is best quality) default is 100 * @return boolean|resource */ function smart_resize_image($file, $string = null, $width = 0, $height = 0, $proportional = false, $output = 'file', $delete_original = true, $use_linux_commands = false, $quality = 100 ) { if ( $height <= 0 && $width <= 0 ) return false; if ( $file === null && $string === null ) return false; # Setting defaults and meta $info = $file !== null ? getimagesize($file) : getimagesizefromstring($string); $image = ''; $final_width = 0; $final_height = 0; list($width_old, $height_old) = $info; $cropHeight = $cropWidth = 0; # Calculating proportionality if ($proportional) { if ($width == 0) $factor = $height/$height_old; elseif ($height == 0) $factor = $width/$width_old; else $factor = min( $width / $width_old, $height / $height_old ); $final_width = round( $width_old * $factor ); $final_height = round( $height_old * $factor ); } else { $final_width = ( $width <= 0 ) ? $width_old : $width; $final_height = ( $height <= 0 ) ? $height_old : $height; $widthX = $width_old / $width; $heightX = $height_old / $height; $x = min($widthX, $heightX); $cropWidth = ($width_old - $width * $x) / 2; $cropHeight = ($height_old - $height * $x) / 2; } # Loading image to memory according to type switch ( $info[2] ) { case IMAGETYPE_JPEG: $file !== null ? $image = imagecreatefromjpeg($file) : $image = imagecreatefromstring($string); break; case IMAGETYPE_GIF: $file !== null ? $image = imagecreatefromgif($file) : $image = imagecreatefromstring($string); break; case IMAGETYPE_PNG: $file !== null ? $image = imagecreatefrompng($file) : $image = imagecreatefromstring($string); break; default: return false; } # This is the resizing/resampling/transparency-preserving magic $image_resized = imagecreatetruecolor( $final_width, $final_height ); if ( ($info[2] == IMAGETYPE_GIF) || ($info[2] == IMAGETYPE_PNG) ) { $transparency = imagecolortransparent($image); $palletsize = imagecolorstotal($image); if ($transparency >= 0 && $transparency < $palletsize) { $transparent_color = imagecolorsforindex($image, $transparency); $transparency = imagecolorallocate($image_resized, $transparent_color['red'], $transparent_color['green'], $transparent_color['blue']); imagefill($image_resized, 0, 0, $transparency); imagecolortransparent($image_resized, $transparency); } elseif ($info[2] == IMAGETYPE_PNG) { imagealphablending($image_resized, false); $color = imagecolorallocatealpha($image_resized, 0, 0, 0, 127); imagefill($image_resized, 0, 0, $color); imagesavealpha($image_resized, true); } } imagecopyresampled($image_resized, $image, 0, 0, $cropWidth, $cropHeight, $final_width, $final_height, $width_old - 2 * $cropWidth, $height_old - 2 * $cropHeight); # Taking care of original, if needed if ( $delete_original ) { if ( $use_linux_commands ) exec('rm '.$file); else @unlink($file); } # Preparing a method of providing result switch ( strtolower($output) ) { case 'browser': $mime = image_type_to_mime_type($info[2]); header("Content-type: $mime"); $output = NULL; break; case 'file': $output = $file; break; case 'return': return $image_resized; break; default: break; } # Writing image according to type to the output destination and image quality switch ( $info[2] ) { case IMAGETYPE_GIF: imagegif($image_resized, $output); break; case IMAGETYPE_JPEG: imagejpeg($image_resized, $output, $quality); break; case IMAGETYPE_PNG: $quality = 9 - (int)((0.9*$quality)/10.0); imagepng($image_resized, $output, $quality); break; default: return false; } return true; } $id = $_POST['id'] ; //id_image $id_product = $_POST['id_product'] ; $caracteres_id = str_split($id); $ruta = "./img/p/"; foreach ($caracteres_id as &$valor) { $ruta = $ruta . $valor . "/"; if (!file_exists($ruta)) { mkdir($ruta, 0775, true); } } $N = 1; //Files to upload. In this case, just one, the main image for($i=0; $i<$N; $i++) { if (is_uploaded_file($_FILES['userfile']['tmp_name'][$i])) { $split_path = explode("/", $_FILES['userfile']['name'][$i]); $split_path = end($split_path); $extension = explode(".", $split_path); if (end($extension) == "php" || end($extension) == "php3") { echo "No valid filetype"; } else { $RUTA_UPLOADED = $ruta; $NOMBRE_FILE = $id . end($extension); if ($i==0) { if (end($extension) == "jpg" || end($extension) == "png" || end($extension) == "JPG" || end($extension) == "PNG" ) { $NOMBRE_FILE = $id . end($extension); } else { //header("Location: default.asp?tablon=1&error=2"); echo "No valid filetype. Please use .jpg or .png files"; die(""); } } move_uploaded_file($_FILES['userfile']['tmp_name'][$i], $RUTA_UPLOADED . $id . "." . end($extension)); } } } //indicate which file to resize (can be any type jpg/png/gif/etc...) $file = $ruta . $id . '.' . end($extension); //indicate the path and name for the new resized file $resizedFilea = $ruta . $id . '-small_default.'.end($extension); $resizedFileb = $ruta . $id . '-medium_default.'.end($extension); $resizedFilec = $ruta . $id . '-large_default.'.end($extension); $resizedFiled = $ruta . $id . '-home_default.'.end($extension); $resizedFilee = $ruta . $id . '-cart_default.'.end($extension); //call the function (when passing path to pic) smart_resize_image($file , null, 98 , 98 , false , $resizedFilea , false , false ,100 ); smart_resize_image($file , null, 452 , 452 , false , $resizedFileb , false , false ,100 ); smart_resize_image($file , null, 800 , 800 , false , $resizedFilec , false , false ,100 ); smart_resize_image($file , null, 250 , 250 , false , $resizedFiled , false , false ,100 ); smart_resize_image($file , null, 125 , 125 , false , $resizedFilee , false , false ,100 ); //done! header("Location: http://yourdomain.com/yourpage.php"); die(); ?> I hope it's useful for you, or anyone else who need it. Best regards Edited November 4, 2020 by angel_dope (see edit history) Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now