Jump to content

Error when creating product with webservice


angel_dope

Recommended Posts

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 by angel_dope (see edit history)
Link to comment
Share on other sites

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

  • 5 months later...
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

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 by angel_dope (see edit history)
Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...