123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436 |
- <?php
- /*
- * Copyright (C) 2017 Oscss-Shop <support@oscss-shop.fr>.
- *
- * This program is free software; you can redistribute it and/or modifyion 2.0 (the "License");
- * it under the terms of the GNU General Public License as published bypliance with the License.
- * the Free Software Foundation; either version 3 of the License, or
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
- * or see https://www.gnu.org/
- */
- include_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php';
- if (!class_exists('PrestaShopWebservice')) // We keep this because some modules add this lib too into a different path. This is to avoid "Cannot declare class PrestaShopWebservice" errors.
- {
- include_once DOL_DOCUMENT_ROOT.'/admin/dolistore/class/PSWebServiceLibrary.class.php';
- }
- /**
- * Class Dolistore
- */
- class Dolistore
- {
- /**
- * beginning of pagination
- * @var int
- */
- public $start;
- /**
- * end of pagination
- * @var int
- */
- public $end;
- public $per_page; // pagination: display per page
- public $categorie; // the current categorie
- public $search; // the search keywords
- // setups
- public $url; // the url of this page
- public $shop_url; // the url of the shop
- public $lang; // the integer representing the lang in the store
- public $debug_api; // usefull if no dialog
- /**
- * Constructor
- *
- * @param boolean $debug Enable debug of request on screen
- */
- public function __construct($debug = false)
- {
- global $conf, $langs;
- $this->url = DOL_URL_ROOT.'/admin/modules.php?mode=marketplace';
- $this->shop_url = 'https://www.dolistore.com/index.php?controller=product&id_product=';
- $this->debug_api = $debug;
- $langtmp = explode('_', $langs->defaultlang);
- $lang = $langtmp[0];
- $lang_array = array('en'=>1, 'fr'=>2, 'es'=>3, 'it'=>4, 'de'=>5); // Into table ps_lang of Prestashop - 1
- if (!in_array($lang, array_keys($lang_array))) $lang = 'en';
- $this->lang = $lang_array[$lang];
- }
- /**
- * Load data from remote Dolistore market place.
- * This fills ->categories
- *
- * @return void
- */
- public function getRemoteCategories()
- {
- global $conf;
- try {
- $this->api = new PrestaShopWebservice($conf->global->MAIN_MODULE_DOLISTORE_API_SRV, $conf->global->MAIN_MODULE_DOLISTORE_API_KEY, $this->debug_api);
- dol_syslog("Call API with MAIN_MODULE_DOLISTORE_API_SRV = ".$conf->global->MAIN_MODULE_DOLISTORE_API_SRV);
- // $conf->global->MAIN_MODULE_DOLISTORE_API_KEY is for the login of basic auth. There is no password as it is public data.
- // Here we set the option array for the Webservice : we want categories resources
- $opt = array();
- $opt['resource'] = 'categories';
- $opt['display'] = '[id,id_parent,nb_products_recursive,active,is_root_category,name,description]';
- $opt['sort'] = 'id_asc';
- // Call
- dol_syslog("Call API with opt = ".var_export($opt, true));
- $xml = $this->api->get($opt);
- $this->categories = $xml->categories->children();
- } catch (PrestaShopWebserviceException $e) {
- // Here we are dealing with errors
- $trace = $e->getTrace();
- if ($trace[0]['args'][0] == 404) die('Bad ID');
- elseif ($trace[0]['args'][0] == 401) die('Bad auth key');
- else
- {
- print 'Can not access to '.$conf->global->MAIN_MODULE_DOLISTORE_API_SRV.'<br>';
- print $e->getMessage();
- }
- }
- }
- /**
- * Load data from remote Dolistore market place.
- * This fills ->products
- *
- * @param array $options Options. If 'categorie' is defined, we filter products on this category id
- * @return void
- */
- public function getRemoteProducts($options = array('start' => 0, 'end' => 10, 'per_page' => 50, 'categorie' => 0, 'search' => ''))
- {
- global $conf;
- $this->start = $options['start'];
- $this->end = $options['end'];
- $this->per_page = $options['per_page'];
- $this->categorie = $options['categorie'];
- $this->search = $options['search'];
- if ($this->end == 0) {
- $this->end = $this->per_page;
- }
- try {
- $this->api = new PrestaShopWebservice($conf->global->MAIN_MODULE_DOLISTORE_API_SRV, $conf->global->MAIN_MODULE_DOLISTORE_API_KEY, $this->debug_api);
- dol_syslog("Call API with MAIN_MODULE_DOLISTORE_API_SRV = ".$conf->global->MAIN_MODULE_DOLISTORE_API_SRV);
- // $conf->global->MAIN_MODULE_DOLISTORE_API_KEY is for the login of basic auth. There is no password as it is public data.
- // Here we set the option array for the Webservice : we want products resources
- $opt = array();
- $opt['resource'] = 'products';
- $opt2 = array();
- // make a search to limit the id returned.
- if ($this->search != '') {
- $opt2['url'] = $conf->global->MAIN_MODULE_DOLISTORE_API_SRV.'/api/search?query='.$this->search.'&language='.$this->lang; // It seems for search, key start with
- // Call
- dol_syslog("Call API with opt2 = ".var_export($opt2, true));
- $xml = $this->api->get($opt2);
- $products = array();
- foreach ($xml->products->children() as $product) {
- $products[] = (int) $product['id'];
- }
- $opt['filter[id]'] = '['.implode('|', $products).']';
- } elseif ($this->categorie != 0) { // We filter on category, so we first get list of product id in this category
- // $opt2['url'] is set by default to $this->url.'/api/'.$options['resource'];
- $opt2['resource'] = 'categories';
- $opt2['id'] = $this->categorie;
- // Call
- dol_syslog("Call API with opt2 = ".var_export($opt2, true));
- $xml = $this->api->get($opt2);
- $products = array();
- foreach ($xml->category->associations->products->children() as $product) {
- $products[] = (int) $product->id;
- }
- $opt['filter[id]'] = '['.implode('|', $products).']';
- }
- $opt['display'] = '[id,name,id_default_image,id_category_default,reference,price,condition,show_price,date_add,date_upd,description_short,description,module_version,dolibarr_min,dolibarr_max]';
- $opt['sort'] = 'id_desc';
- $opt['filter[active]'] = '[1]';
- $opt['limit'] = "$this->start,$this->end";
- // $opt['filter[id]'] contais list of product id that are result of search
- // Call API to get the detail
- dol_syslog("Call API with opt = ".var_export($opt, true));
- $xml = $this->api->get($opt);
- $this->products = $xml->products->children();
- } catch (PrestaShopWebserviceException $e) {
- // Here we are dealing with errors
- $trace = $e->getTrace();
- if ($trace[0]['args'][0] == 404) die('Bad ID');
- elseif ($trace[0]['args'][0] == 401) die('Bad auth key');
- else
- {
- print 'Can not access to '.$conf->global->MAIN_MODULE_DOLISTORE_API_SRV.'<br>';
- print $e->getMessage();
- }
- }
- }
- // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
- /**
- * Return tree of Dolistore categories. $this->categories must have been loaded before.
- *
- * @param int $parent Id of parent category
- * @return string
- */
- public function get_categories($parent = 0)
- {
- // phpcs:enable
- if (!isset($this->categories)) die('not possible');
- if ($parent != 0) {
- $html = '<ul>';
- } else {
- $html = '';
- }
- $nbofcateg = count($this->categories);
- for ($i = 0; $i < $nbofcateg; $i++)
- {
- $cat = $this->categories[$i];
- if ($cat->is_root_category == 1 && $parent == 0) {
- $html .= '<li class="root"><h3 class="nomargesupinf"><a class="nomargesupinf link2cat" href="?mode=marketplace&categorie='.$cat->id.'" '
- .'title="'.dol_escape_htmltag(strip_tags($cat->description->language[$this->lang - 1])).'"'
- .'>'.$cat->name->language[$this->lang - 1].' <sup>'.$cat->nb_products_recursive.'</sup></a></h3>';
- $html .= self::get_categories($cat->id);
- $html .= "</li>\n";
- } elseif (trim($cat->id_parent) == $parent && $cat->active == 1 && trim($cat->id_parent) != 0) { // si cat est de ce niveau
- $select = ($cat->id == $this->categorie) ? ' selected' : '';
- $html .= '<li><a class="link2cat'.$select.'" href="?mode=marketplace&categorie='.$cat->id.'"'
- .' title="'.dol_escape_htmltag(strip_tags($cat->description->language[$this->lang - 1])).'" '
- .'>'.$cat->name->language[$this->lang - 1].' <sup>'.$cat->nb_products_recursive.'</sup></a>';
- $html .= self::get_categories($cat->id);
- $html .= "</li>\n";
- } else {
- }
- }
- if ($html == '<ul>') {
- return '';
- }
- if ($parent != 0) {
- return $html.'</ul>';
- } else {
- return $html;
- }
- }
- // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
- /**
- * Return list of product formated for output
- *
- * @return string HTML output
- */
- public function get_products()
- {
- // phpcs:enable
- global $langs, $conf;
- $html = "";
- $parity = "pair";
- $last_month = time() - (30 * 24 * 60 * 60);
- foreach ($this->products as $product) {
- $parity = ($parity == "impair") ? 'pair' : 'impair';
- // check new product ?
- $newapp = '';
- if ($last_month < strtotime($product->date_add)) {
- $newapp .= '<span class="newApp">'.$langs->trans('New').'</span> ';
- }
- // check updated ?
- if ($last_month < strtotime($product->date_upd) && $newapp == '') {
- $newapp .= '<span class="updatedApp">'.$langs->trans('Updated').'</span> ';
- }
- // add image or default ?
- if ($product->id_default_image != '') {
- $image_url = DOL_URL_ROOT.'/admin/dolistore/ajax/image.php?id_product='.$product->id.'&id_image='.$product->id_default_image;
- $images = '<a href="'.$image_url.'" class="fancybox" rel="gallery'.$product->id.'" title="'.$product->name->language[$this->lang - 1].', '.$langs->trans('Version').' '.$product->module_version.'">'.
- '<img src="'.$image_url.'&quality=home_default" style="max-height:250px;max-width: 210px;" alt="" /></a>';
- } else {
- $images = '<img src="'.DOL_URL_ROOT.'/admin/dolistore/img/NoImageAvailable.png" />';
- }
- // free or pay ?
- if ($product->price > 0) {
- $price = '<h3>'.price(price2num($product->price, 'MT'), 0, $langs, 1, -1, -1, 'EUR').' '.$langs->trans("HT").'</h3>';
- $download_link = '<a target="_blank" href="'.$this->shop_url.$product->id.'"><img width="32" src="'.DOL_URL_ROOT.'/admin/dolistore/img/follow.png" /></a>';
- } else {
- $price = '<h3>'.$langs->trans('Free').'</h3>';
- $download_link = '<a target="_blank" href="'.$this->shop_url.$product->id.'"><img width="32" src="'.DOL_URL_ROOT.'/admin/dolistore/img/Download-128.png" /></a>';
- $download_link .= '<br><br><a target="_blank" href="'.$this->shop_url.$product->id.'"><img width="32" src="'.DOL_URL_ROOT.'/admin/dolistore/img/follow.png" /></a>';
- }
- //checking versions
- if ($this->version_compare($product->dolibarr_min, DOL_VERSION) <= 0) {
- if ($this->version_compare($product->dolibarr_max, DOL_VERSION) >= 0) {
- //compatible
- $version = '<span class="compatible">'.$langs->trans('CompatibleUpTo', $product->dolibarr_max,
- $product->dolibarr_min, $product->dolibarr_max).'</span>';
- $compatible = '';
- } else {
- //never compatible, module expired
- $version = '<span class="notcompatible">'.$langs->trans('NotCompatible', DOL_VERSION,
- $product->dolibarr_min, $product->dolibarr_max).'</span>';
- $compatible = 'NotCompatible';
- }
- } else {
- //need update
- $version = '<span class="compatibleafterupdate">'.$langs->trans('CompatibleAfterUpdate', DOL_VERSION,
- $product->dolibarr_min, $product->dolibarr_max).'</span>';
- $compatible = 'NotCompatible';
- }
- //.'<br><a class="inline-block valignmiddle" target="_blank" href="'.$this->shop_url.$product->id.'"><span class="details button">'.$langs->trans("SeeInMarkerPlace").'</span></a>
- //output template
- $html .= '<tr class="app '.$parity.' '.$compatible.'">
- <td class="center" width="210"><div class="newAppParent">'.$newapp.$images.'</div></td>
- <td class="margeCote"><h2 class="appTitle">'.$product->name->language[$this->lang - 1]
- .'<br/><small>'.$version.'</small></h2>
- <small> '.dol_print_date(dol_stringtotime($product->date_upd), 'dayhour').' - '.$langs->trans('Ref').': '.$product->reference.' - '.$langs->trans('Id').': '.$product->id.'</small><br><br>'.$product->description_short->language[$this->lang - 1].'</td>
- <td style="display:none;" class="long_description">'.$product->description->language[$this->lang - 1].'</td>
- <td class="margeCote center">'.$price.'
- </td>
- <td class="margeCote">'.$download_link.'</td>
- </tr>';
- }
- return $html;
- }
- // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
- /**
- * get previous link
- *
- * @param string $text symbol previous
- * @return string html previous link
- */
- public function get_previous_link($text = '<<')
- {
- // phpcs:enable
- return '<a href="'.$this->get_previous_url().'" class="button">'.$text.'</a>';
- }
- // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
- /**
- * get next link
- *
- * @param string $text symbol next
- * @return string html next link
- */
- public function get_next_link($text = '>>')
- {
- // phpcs:enable
- return '<a href="'.$this->get_next_url().'" class="button">'.$text.'</a>';
- }
- // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
- /**
- * get previous url
- *
- * @return string previous url
- */
- public function get_previous_url()
- {
- // phpcs:enable
- $param_array = array();
- if ($this->start < $this->per_page) {
- $sub = 0;
- } else {
- $sub = $this->per_page;
- }
- $param_array['start'] = $this->start - $sub;
- $param_array['end'] = $this->end - $sub;
- if ($this->categorie != 0) {
- $param_array['categorie'] = $this->categorie;
- }
- $param = http_build_query($param_array);
- return $this->url."&".$param;
- }
- // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
- /**
- * get next url
- *
- * @return string next url
- */
- public function get_next_url()
- {
- // phpcs:enable
- $param_array = array();
- if (count($this->products) < $this->per_page) {
- $add = 0;
- } else {
- $add = $this->per_page;
- }
- $param_array['start'] = $this->start + $add;
- $param_array['end'] = $this->end + $add;
- if ($this->categorie != 0) {
- $param_array['categorie'] = $this->categorie;
- }
- $param = http_build_query($param_array);
- return $this->url."&".$param;
- }
- // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
- /**
- * version compare
- *
- * @param string $v1 version 1
- * @param string $v2 version 2
- * @return int result of compare
- */
- public function version_compare($v1, $v2)
- {
- // phpcs:enable
- $v1 = explode('.', $v1);
- $v2 = explode('.', $v2);
- $ret = 0;
- $level = 0;
- $count1 = count($v1);
- $count2 = count($v2);
- $maxcount = max($count1, $count2);
- while ($level < $maxcount) {
- $operande1 = isset($v1[$level]) ? $v1[$level] : 'x';
- $operande2 = isset($v2[$level]) ? $v2[$level] : 'x';
- $level++;
- if (strtoupper($operande1) == 'X' || strtoupper($operande2) == 'X' || $operande1 == '*' || $operande2 == '*') {
- break;
- }
- if ($operande1 < $operande2) {
- $ret = -$level;
- break;
- }
- if ($operande1 > $operande2) {
- $ret = $level;
- break;
- }
- }
- //print join('.',$versionarray1).'('.count($versionarray1).') / '.join('.',$versionarray2).'('.count($versionarray2).') => '.$ret.'<br>'."\n";
- return $ret;
- }
- }
|