通过模块预先购买具有功能和图像的新产品
prestashop a new product with features and images through a module
除功能和图片外,产品信息已成功添加。这是我的代码:
$product = new Product();
$image = new Image();
$langId = (int) (Configuration::get('PS_LANG_DEFAULT'));
$name = Tools::getValue('pr_name');
$product->id_supplier = $arr['pr_supp'][0];
$product->id_manufacturer = Tools::getValue('pr_manuf');
$product->description_short = Tools::getValue('pr_short_desc');
$product->description = Tools::getValue('pr_desc');
$product->quantity = Tools::getValue('pr_cant');
$product->name = array($langId => $name);
$product->price = Tools::getValue('pr_pret_ach');
$product->wholesale_price = Tools::getValue('pr_pret_angro');
$product->active = false;
//$product->is_virtual = true;
// $product->cache_has_attachments = true;
$product->id_category_default= $arr['categorii'][0];
$product->reference = $this->context->cookie->id_customer;
$product->link_rewrite = array($langId => Tools::link_rewrite($name));
//some test values
$product->product_features = array(
'id' => '123',
'id_feature_value' => '111'
);
$product->add();
//trying to save images (got just images src from another server)
$image->id_product = (int)$product->id;
$i=0;
while($i <= $num){
$imgs[$i] = Tools::getValue('image-'.$i);
AdminImportController::copyImg2($product->id, $imgs[$i], 'products');
$i++;
}
这里是 copyImg2
的代码(这只是默认函数 copyImg
的克隆):
public static function copyImg2($id_entity, $id_image = null, $url, $entity = 'products', $regenerate = true)
{
$tmpfile = tempnam(_PS_TMP_IMG_DIR_, 'ps_import');
$watermark_types = explode(',', Configuration::get('WATERMARK_TYPES'));
switch ($entity)
{
default:
case 'products':
$image_obj = new Image($id_image);
$path = $image_obj->getPathForCreation();
break;
case 'categories':
$path = _PS_CAT_IMG_DIR_.(int)$id_entity;
break;
case 'manufacturers':
$path = _PS_MANU_IMG_DIR_.(int)$id_entity;
break;
case 'suppliers':
$path = _PS_SUPP_IMG_DIR_.(int)$id_entity;
break;
}
$url = str_replace(' ', '%20', trim($url));
// Evaluate the memory required to resize the image: if it's too much, you can't resize it.
if (!ImageManager::checkImageMemoryLimit($url))
return false;
// 'file_exists' doesn't work on distant file, and getimagesize makes the import slower.
// Just hide the warning, the processing will be the same.
if (Tools::copy($url, $tmpfile))//this always returning false
{
ImageManager::resize($tmpfile, $path.'.jpg');
$images_types = ImageType::getImagesTypes($entity);
//domo
$res = array();
$nr = 0;
if ($regenerate)
foreach ($images_types as $image_type)
{
$res[0] = ImageManager::resize($tmpfile, $path.'-'.stripslashes($image_type['name']).'.jpg', $image_type['width'], $image_type['height']);
if (in_array($image_type['id_image_type'], $watermark_types))
Hook::exec('actionWatermark', array('id_image' => $id_image, 'id_product' => $id_entity));
$nr++;
}
}
else
{
unlink($tmpfile);
return 'false';
}
unlink($tmpfile);
return $res;
}
public static function copy($source, $destination, $stream_context = null)
{
if (is_null($stream_context) && !preg_match('/^https?:\/\//', $source))
return @copy($source, $destination);
return @file_put_contents($destination, Tools::file_get_contents($source, false, $stream_context));
}
另一个问题是如何保存特征。这是 $product
对象的 print_r()
:
....
[category] =>
[webserviceParameters:protected] => Array
(
[objectMethods] => Array
(
[add] => addWs
[update] => updateWs
)
[objectNodeNames] => products
[fields] => Array
(
[id_manufacturer] => Array
(
[xlink_resource] => manufacturers
)
[id_default_image] => Array
(
[getter] => getCoverWs
[setter] => setCoverWs
[xlink_resource] => Array
(
[resourceName] => images
[subResourceName] => products
)
)
[id_default_combination] => Array
(
[getter] => getWsDefaultCombination
[setter] => setWsDefaultCombination
[xlink_resource] => Array
(
[resourceName] => combinations
)
)
[id_tax_rules_group] => Array
(
[xlink_resource] => Array
(
[resourceName] => tax_rule_groups
)
)
)
[associations] => Array
(
[categories] => Array
(
[resource] => category
[fields] => Array
(
[id] => Array
(
[required] => 1
)
)
)
[images] => Array
(
[resource] => image
[fields] => Array
(
[id] => Array
(
)
)
)
//here may be the features, but i don't know how to put it there
[product_features] => Array
(
[resource] => product_feature
[fields] => Array
(
[id] => Array
(
[required] => 1
)
[custom] => Array
(
[required] =>
)
[id_feature_value] => Array
(
[required] => 1
[xlink_resource] => product_feature_values
)
)
)
谈论图像:
先做一个foreach循环重复这个:
$img = new Image();
$img->id_product = $product->id;
$img->add();
你可以在这里做更多的事情。语言等。在此之后更新:
$this->copyImg($product->id, $img->id, $yourImagePath)
除功能和图片外,产品信息已成功添加。这是我的代码:
$product = new Product();
$image = new Image();
$langId = (int) (Configuration::get('PS_LANG_DEFAULT'));
$name = Tools::getValue('pr_name');
$product->id_supplier = $arr['pr_supp'][0];
$product->id_manufacturer = Tools::getValue('pr_manuf');
$product->description_short = Tools::getValue('pr_short_desc');
$product->description = Tools::getValue('pr_desc');
$product->quantity = Tools::getValue('pr_cant');
$product->name = array($langId => $name);
$product->price = Tools::getValue('pr_pret_ach');
$product->wholesale_price = Tools::getValue('pr_pret_angro');
$product->active = false;
//$product->is_virtual = true;
// $product->cache_has_attachments = true;
$product->id_category_default= $arr['categorii'][0];
$product->reference = $this->context->cookie->id_customer;
$product->link_rewrite = array($langId => Tools::link_rewrite($name));
//some test values
$product->product_features = array(
'id' => '123',
'id_feature_value' => '111'
);
$product->add();
//trying to save images (got just images src from another server)
$image->id_product = (int)$product->id;
$i=0;
while($i <= $num){
$imgs[$i] = Tools::getValue('image-'.$i);
AdminImportController::copyImg2($product->id, $imgs[$i], 'products');
$i++;
}
这里是 copyImg2
的代码(这只是默认函数 copyImg
的克隆):
public static function copyImg2($id_entity, $id_image = null, $url, $entity = 'products', $regenerate = true)
{
$tmpfile = tempnam(_PS_TMP_IMG_DIR_, 'ps_import');
$watermark_types = explode(',', Configuration::get('WATERMARK_TYPES'));
switch ($entity)
{
default:
case 'products':
$image_obj = new Image($id_image);
$path = $image_obj->getPathForCreation();
break;
case 'categories':
$path = _PS_CAT_IMG_DIR_.(int)$id_entity;
break;
case 'manufacturers':
$path = _PS_MANU_IMG_DIR_.(int)$id_entity;
break;
case 'suppliers':
$path = _PS_SUPP_IMG_DIR_.(int)$id_entity;
break;
}
$url = str_replace(' ', '%20', trim($url));
// Evaluate the memory required to resize the image: if it's too much, you can't resize it.
if (!ImageManager::checkImageMemoryLimit($url))
return false;
// 'file_exists' doesn't work on distant file, and getimagesize makes the import slower.
// Just hide the warning, the processing will be the same.
if (Tools::copy($url, $tmpfile))//this always returning false
{
ImageManager::resize($tmpfile, $path.'.jpg');
$images_types = ImageType::getImagesTypes($entity);
//domo
$res = array();
$nr = 0;
if ($regenerate)
foreach ($images_types as $image_type)
{
$res[0] = ImageManager::resize($tmpfile, $path.'-'.stripslashes($image_type['name']).'.jpg', $image_type['width'], $image_type['height']);
if (in_array($image_type['id_image_type'], $watermark_types))
Hook::exec('actionWatermark', array('id_image' => $id_image, 'id_product' => $id_entity));
$nr++;
}
}
else
{
unlink($tmpfile);
return 'false';
}
unlink($tmpfile);
return $res;
}
public static function copy($source, $destination, $stream_context = null)
{
if (is_null($stream_context) && !preg_match('/^https?:\/\//', $source))
return @copy($source, $destination);
return @file_put_contents($destination, Tools::file_get_contents($source, false, $stream_context));
}
另一个问题是如何保存特征。这是 $product
对象的 print_r()
:
....
[category] =>
[webserviceParameters:protected] => Array
(
[objectMethods] => Array
(
[add] => addWs
[update] => updateWs
)
[objectNodeNames] => products
[fields] => Array
(
[id_manufacturer] => Array
(
[xlink_resource] => manufacturers
)
[id_default_image] => Array
(
[getter] => getCoverWs
[setter] => setCoverWs
[xlink_resource] => Array
(
[resourceName] => images
[subResourceName] => products
)
)
[id_default_combination] => Array
(
[getter] => getWsDefaultCombination
[setter] => setWsDefaultCombination
[xlink_resource] => Array
(
[resourceName] => combinations
)
)
[id_tax_rules_group] => Array
(
[xlink_resource] => Array
(
[resourceName] => tax_rule_groups
)
)
)
[associations] => Array
(
[categories] => Array
(
[resource] => category
[fields] => Array
(
[id] => Array
(
[required] => 1
)
)
)
[images] => Array
(
[resource] => image
[fields] => Array
(
[id] => Array
(
)
)
)
//here may be the features, but i don't know how to put it there
[product_features] => Array
(
[resource] => product_feature
[fields] => Array
(
[id] => Array
(
[required] => 1
)
[custom] => Array
(
[required] =>
)
[id_feature_value] => Array
(
[required] => 1
[xlink_resource] => product_feature_values
)
)
)
谈论图像:
先做一个foreach循环重复这个:
$img = new Image();
$img->id_product = $product->id;
$img->add();
你可以在这里做更多的事情。语言等。在此之后更新:
$this->copyImg($product->id, $img->id, $yourImagePath)