You can generate the product URL from the product ID:
$productUrl = 'http://mydomain.com/index.php?controller=product&id_product=' . $productId;
If Friendly URL is turned on then the URL will be rewritten.
Pergunta
I have two stores using Prestashop. I would like to import a products URLs list from the first to the second.
I can access to the product list by using http://example.com/api/products
I can also access to the product information by using
http://example.com/api/products/{ProductID}
By this way I can access to all products data but I can't find product URL.
Is there a way to retrieve a product URL from Prestashop ?
Solução
You can generate the product URL from the product ID:
$productUrl = 'http://mydomain.com/index.php?controller=product&id_product=' . $productId;
If Friendly URL is turned on then the URL will be rewritten.
Outras dicas
For those who are looking to generate the absolute url inside their store, you can do the following :
$product = new Product(Tools::getValue('id_product'));
$link = new Link();
$url = $link->getProductLink($product);
Will result with something like :
http://your.prestashop-website.com/fr/1-T-shirts-a-manches-courtes-delaves.html
In prestashop > 1.6 you can proceed :
And the job is done, here is my code:
protected $webserviceParameters = array(
'objectMethods' => array(
'add' => 'addWs',
'update' => 'updateWs'
),
'objectNodeNames' => 'ProductForWs',
'fields' => array(
'id_default_image' => array(
'getter' => 'getCoverWs',
'setter' => 'setCoverWs',
'xlink_resource' => array(
'resourceName' => 'images',
'subResourceName' => 'products'
)
)
),
'associations' => array(
'url' => array('resource' => 'url',
'fields' => array(
'url' => array('required' => true)
),
'setter' => false
)
),
);
public static $definition = array(
'table' => 'product',
'primary' => 'id_product',
'fields' => array(
'name' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isCatalogName', 'required' => true, 'size' => 128),
'url' => array('type' => self::TYPE_STRING),
'associations' => array(),
),
);
public function getWsUrl(){
$link = new Link();
$product = new Product($this->id);
return array(array("url" => $link->getProductLink($product)));
}
The WebServiceOutputBuilder will call your function and return the url path as an association. Like:
<associations>
<url nodeType="url" api="url">
<url>
<url>
<![CDATA[ http://prestashop.dev/14-prod.html ]]>
</url>
</url>
</url>
</associations>
On PrestaShop™ 1.4.5.1 I use
public function getProductLink($id)
{
global $cookie;
$productUrl = "http://".$_SERVER['HTTP_HOST'].'/product.php?id_product=' . $id;
return $productUrl;
}
In add to @robin-delaporte you can use this overriding Product class and automatically get for all languages in your prestashop.
protected $webserviceParameters = array(
'objectMethods' => array(
'add' => 'addWs',
'update' => 'updateWs'
),
'objectNodeNames' => 'ProductForWs',
'fields' => array(
'id_default_image' => array(
'getter' => 'getCoverWs',
'setter' => 'setCoverWs',
'xlink_resource' => array(
'resourceName' => 'images',
'subResourceName' => 'products'
)
)
),
'associations' => array(
'url' => array(
'resource' => 'url',
'fields' => array(
'url' => array()
),
'setter' => false
),
),
);
public function getWsUrl(){
$languages = Language::getLanguages(true, $this->context->shop->id);
$link = new Link();
$product = new Product($this->id);
if (!count($languages))
return array(array("url" => $link->getProductLink($product)));;
$default_rewrite = array();
$rewrite_infos = Product::getUrlRewriteInformations($this->id);
foreach ($rewrite_infos as $infos)
$default_rewrite[$infos['id_lang']] = $link->getProductLink($this->id, $infos['link_rewrite'], $infos['category_rewrite'], $infos['ean13'], (int)$infos['id_lang']);
return $default_rewrite;
}
Define $your_product_id in the controller file of the tpl file, then call it from the tpl file as follows
yourcontroller.php
public function hookTheHookYouWant()
{
$set_product = $this->context->smarty->assign(array(
'product_id' => 27,
));
$set_product = $this->context->smarty->fetch($this->local_path.'views/templates/front/yourtplfile.tpl');
return $set_product;
}
}
yourtplfile.tpl
{url entity='product' id=$product_id}