dolibarr  18.0.0-alpha
categorie.class.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (C) 2005 Matthieu Valleton <mv@seeschloss.org>
3  * Copyright (C) 2005 Davoleau Brice <brice.davoleau@gmail.com>
4  * Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
5  * Copyright (C) 2006-2012 Regis Houssin <regis.houssin@inodbox.com>
6  * Copyright (C) 2006-2012 Laurent Destailleur <eldy@users.sourceforge.net>
7  * Copyright (C) 2007 Patrick Raguin <patrick.raguin@gmail.com>
8  * Copyright (C) 2013-2016 Juanjo Menent <jmenent@2byte.es>
9  * Copyright (C) 2013-2018 Philippe Grand <philippe.grand@atoo-net.com>
10  * Copyright (C) 2015 Marcos García <marcosgdf@gmail.com>
11  * Copyright (C) 2015 Raphaël Doursenaud <rdoursenaud@gpcsolutions.fr>
12  * Copyright (C) 2016 Charlie Benke <charlie@patas-monkey.com>
13  * Copyright (C) 2018-2023 Frédéric France <frederic.france@netlogic.fr>
14  * Copyright (C) 2023 Benjamin Falière <benjamin.faliere@altairis.fr>
15  *
16  * This program is free software; you can redistribute it and/or modify
17  * it under the terms of the GNU General Public License as published by
18  * the Free Software Foundation; either version 3 of the License, or
19  * (at your option) any later version.
20  *
21  * This program is distributed in the hope that it will be useful,
22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24  * GNU General Public License for more details.
25  *
26  * You should have received a copy of the GNU General Public License
27  * along with this program. If not, see <https://www.gnu.org/licenses/>.
28  */
29 
36 require_once DOL_DOCUMENT_ROOT.'/core/class/commonobject.class.php';
37 require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
38 require_once DOL_DOCUMENT_ROOT.'/ticket/class/ticket.class.php';
39 require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.class.php';
40 require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
41 require_once DOL_DOCUMENT_ROOT.'/knowledgemanagement/class/knowledgerecord.class.php';
42 
43 
47 class Categorie extends CommonObject
48 {
49  // Categories types (we use string because we want to accept any modules/types in a future)
50  const TYPE_PRODUCT = 'product';
51  const TYPE_SUPPLIER = 'supplier';
52  const TYPE_CUSTOMER = 'customer';
53  const TYPE_MEMBER = 'member';
54  const TYPE_CONTACT = 'contact';
55  const TYPE_USER = 'user';
56  const TYPE_PROJECT = 'project';
57  const TYPE_ACCOUNT = 'bank_account';
58  const TYPE_BANK_LINE = 'bank_line';
59  const TYPE_WAREHOUSE = 'warehouse';
60  const TYPE_ACTIONCOMM = 'actioncomm';
61  const TYPE_WEBSITE_PAGE = 'website_page';
62  const TYPE_TICKET = 'ticket';
63  const TYPE_KNOWLEDGEMANAGEMENT = 'knowledgemanagement';
64 
68  public $picto = 'category';
69 
70 
74  protected $MAP_ID = array(
75  'product' => 0,
76  'supplier' => 1,
77  'customer' => 2,
78  'member' => 3,
79  'contact' => 4,
80  'bank_account' => 5,
81  'project' => 6,
82  'user' => 7,
83  'bank_line' => 8,
84  'warehouse' => 9,
85  'actioncomm' => 10,
86  'website_page' => 11,
87  'ticket' => 12,
88  'knowledgemanagement' => 13
89  );
90 
96  public static $MAP_ID_TO_CODE = array(
97  0 => 'product',
98  1 => 'supplier',
99  2 => 'customer',
100  3 => 'member',
101  4 => 'contact',
102  5 => 'bank_account',
103  6 => 'project',
104  7 => 'user',
105  8 => 'bank_line',
106  9 => 'warehouse',
107  10 => 'actioncomm',
108  11 => 'website_page',
109  12 => 'ticket',
110  13 => 'knowledgemanagement'
111  );
112 
118  public $MAP_CAT_FK = array(
119  'customer' => 'soc',
120  'supplier' => 'soc',
121  'contact' => 'socpeople',
122  'bank_account' => 'account',
123  );
124 
130  public $MAP_CAT_TABLE = array(
131  'customer' => 'societe',
132  'supplier' => 'fournisseur',
133  'bank_account'=> 'account',
134  );
135 
141  public $MAP_OBJ_CLASS = array(
142  'product' => 'Product',
143  'customer' => 'Societe',
144  'supplier' => 'Fournisseur',
145  'member' => 'Adherent',
146  'contact' => 'Contact',
147  'user' => 'User',
148  'account' => 'Account', // old for bank account
149  'bank_account' => 'Account',
150  'project' => 'Project',
151  'warehouse'=> 'Entrepot',
152  'actioncomm' => 'ActionComm',
153  'website_page' => 'WebsitePage',
154  'ticket' => 'Ticket',
155  'knowledgemanagement' => 'KnowledgeRecord'
156  );
157 
163  public static $MAP_TYPE_TITLE_AREA = array(
164  'product' => 'ProductsCategoriesArea',
165  'customer' => 'CustomersCategoriesArea',
166  'supplier' => 'SuppliersCategoriesArea',
167  'member' => 'MembersCategoriesArea',
168  'contact' => 'ContactsCategoriesArea',
169  'user' => 'UsersCategoriesArea',
170  'account' => 'AccountsCategoriesArea', // old for bank account
171  'bank_account' => 'AccountsCategoriesArea',
172  'project' => 'ProjectsCategoriesArea',
173  'warehouse'=> 'StocksCategoriesArea',
174  'actioncomm' => 'ActioncommCategoriesArea',
175  'website_page' => 'WebsitePageCategoriesArea'
176  );
177 
182  public $MAP_OBJ_TABLE = array(
183  'customer' => 'societe',
184  'supplier' => 'societe',
185  'member' => 'adherent',
186  'contact' => 'socpeople',
187  'account' => 'bank_account', // old for bank account
188  'project' => 'projet',
189  'warehouse'=> 'entrepot',
190  'knowledgemanagement' => 'knowledgemanagement_knowledgerecord'
191  );
192 
196  public $element = 'category';
197 
201  public $table_element = 'categorie';
202 
206  public $fk_parent;
207 
211  public $label;
212 
216  public $description;
217 
221  public $color;
222 
226  public $visible;
227 
231  public $socid;
232 
250  public $type;
251 
255  public $cats = array();
256 
260  public $motherof = array();
261 
265  public $childs = array();
266 
267 
273  public function __construct($db)
274  {
275  global $hookmanager;
276 
277  $this->db = $db;
278 
279  if (is_object($hookmanager)) {
280  $hookmanager->initHooks(array('category'));
281  $parameters = array();
282  $reshook = $hookmanager->executeHooks('constructCategory', $parameters, $this); // Note that $action and $object may have been modified by some hooks
283  if ($reshook >= 0 && !empty($hookmanager->resArray)) {
284  foreach ($hookmanager->resArray as $mapList) {
285  $mapId = $mapList['id'];
286  $mapCode = $mapList['code'];
287  self::$MAP_ID_TO_CODE[$mapId] = $mapCode;
288  $this->MAP_ID[$mapCode] = $mapId;
289  $this->MAP_CAT_FK[$mapCode] = $mapList['cat_fk'];
290  $this->MAP_CAT_TABLE[$mapCode] = $mapList['cat_table'];
291  $this->MAP_OBJ_CLASS[$mapCode] = $mapList['obj_class'];
292  $this->MAP_OBJ_TABLE[$mapCode] = $mapList['obj_table'];
293  }
294  }
295  }
296  }
297 
303  public function getMapList()
304  {
305  $mapList = array();
306 
307  foreach ($this->MAP_ID as $mapCode => $mapId) {
308  $mapList[] = array(
309  'id' => $mapId,
310  'code' => $mapCode,
311  'cat_fk' => (empty($this->MAP_CAT_FK[$mapCode]) ? $mapCode : $this->MAP_CAT_FK[$mapCode]),
312  'cat_table' => (empty($this->MAP_CAT_TABLE[$mapCode]) ? $mapCode : $this->MAP_CAT_TABLE[$mapCode]),
313  'obj_class' => (empty($this->MAP_OBJ_CLASS[$mapCode]) ? $mapCode : $this->MAP_OBJ_CLASS[$mapCode]),
314  'obj_table' => (empty($this->MAP_OBJ_TABLE[$mapCode]) ? $mapCode : $this->MAP_OBJ_TABLE[$mapCode])
315  );
316  }
317 
318  return $mapList;
319  }
320 
330  public function fetch($id, $label = '', $type = null, $ref_ext = '')
331  {
332  global $conf;
333 
334  // Check parameters
335  if (empty($id) && empty($label) && empty($ref_ext)) {
336  $this->error = "No category to search for";
337  return -1;
338  }
339  if (!is_null($type) && !is_numeric($type)) {
340  $type = $this->MAP_ID[$type];
341  }
342 
343  $sql = "SELECT rowid, fk_parent, entity, label, description, color, fk_soc, visible, type, ref_ext";
344  $sql .= ", date_creation, tms, fk_user_creat, fk_user_modif";
345  $sql .= " FROM ".MAIN_DB_PREFIX."categorie";
346  if ($id) {
347  $sql .= " WHERE rowid = ".((int) $id);
348  } elseif (!empty($ref_ext)) {
349  $sql .= " WHERE ref_ext LIKE '".$this->db->escape($ref_ext)."'";
350  } else {
351  $sql .= " WHERE label = '".$this->db->escape($label)."' AND entity IN (".getEntity('category').")";
352  if (!is_null($type)) {
353  $sql .= " AND type = ".((int) $type);
354  }
355  }
356 
357  dol_syslog(get_class($this)."::fetch", LOG_DEBUG);
358  $resql = $this->db->query($sql);
359  if ($resql) {
360  if ($this->db->num_rows($resql) > 0) {
361  $res = $this->db->fetch_array($resql);
362 
363  $this->id = $res['rowid'];
364  //$this->ref = $res['rowid'];
365  $this->fk_parent = (int) $res['fk_parent'];
366  $this->label = $res['label'];
367  $this->description = $res['description'];
368  $this->color = $res['color'];
369  $this->socid = (int) $res['fk_soc'];
370  $this->visible = (int) $res['visible'];
371  $this->type = (int) $res['type'];
372  $this->ref_ext = $res['ref_ext'];
373  $this->entity = (int) $res['entity'];
374  $this->date_creation = $this->db->jdate($res['date_creation']);
375  $this->date_modification = $this->db->jdate($res['tms']);
376  $this->user_creation_id = (int) $res['fk_user_creat'];
377  $this->user_modification_id = (int) $res['fk_user_modif'];
378  $this->user_creation = (int) $res['fk_user_creat'];
379  $this->user_modification = (int) $res['fk_user_modif'];
380 
381  // Retrieve all extrafield
382  // fetch optionals attributes and labels
383  $this->fetch_optionals();
384 
385  $this->db->free($resql);
386 
387  // multilangs
388  if (getDolGlobalInt('MAIN_MULTILANGS')) {
389  $this->getMultiLangs();
390  }
391 
392  return 1;
393  } else {
394  $this->error = "No category found";
395  return 0;
396  }
397  } else {
398  dol_print_error($this->db);
399  $this->error = $this->db->lasterror;
400  $this->errors[] = $this->db->lasterror;
401  return -1;
402  }
403  }
404 
414  public function create($user)
415  {
416  global $conf, $langs, $hookmanager;
417  $langs->load('categories');
418 
419  $type = $this->type;
420 
421  if (!is_numeric($type)) {
422  $type = $this->MAP_ID[$type];
423  }
424 
425  $error = 0;
426 
427  dol_syslog(get_class($this).'::create', LOG_DEBUG);
428 
429  // Clean parameters
430  $this->label = trim($this->label);
431  $this->description = trim($this->description);
432  $this->color = trim($this->color);
433  $this->import_key = trim($this->import_key);
434  $this->ref_ext = trim($this->ref_ext);
435  if (empty($this->visible)) {
436  $this->visible = 0;
437  }
438  $this->fk_parent = ($this->fk_parent != "" ? intval($this->fk_parent) : 0);
439 
440  if ($this->already_exists()) {
441  $this->error = $langs->trans("ImpossibleAddCat", $this->label);
442  $this->error .= " : ".$langs->trans("CategoryExistsAtSameLevel");
443  dol_syslog($this->error, LOG_WARNING);
444  return -4;
445  }
446 
447  $this->db->begin();
448  $now = dol_now();
449  $sql = "INSERT INTO ".MAIN_DB_PREFIX."categorie (";
450  $sql .= "fk_parent,";
451  $sql .= " label,";
452  $sql .= " description,";
453  $sql .= " color,";
454  if (!empty($conf->global->CATEGORY_ASSIGNED_TO_A_CUSTOMER)) {
455  $sql .= "fk_soc,";
456  }
457  $sql .= " visible,";
458  $sql .= " type,";
459  $sql .= " import_key,";
460  $sql .= " ref_ext,";
461  $sql .= " entity,";
462  $sql .= " date_creation,";
463  $sql .= " fk_user_creat";
464  $sql .= ") VALUES (";
465  $sql .= (int) $this->fk_parent.",";
466  $sql .= "'".$this->db->escape($this->label)."', ";
467  $sql .= "'".$this->db->escape($this->description)."', ";
468  $sql .= "'".$this->db->escape($this->color)."', ";
469  if (!empty($conf->global->CATEGORY_ASSIGNED_TO_A_CUSTOMER)) {
470  $sql .= ($this->socid > 0 ? $this->socid : 'null').", ";
471  }
472  $sql .= "'".$this->db->escape($this->visible)."', ";
473  $sql .= ((int) $type).", ";
474  $sql .= (!empty($this->import_key) ? "'".$this->db->escape($this->import_key)."'" : 'null').", ";
475  $sql .= (!empty($this->ref_ext) ? "'".$this->db->escape($this->ref_ext)."'" : 'null').", ";
476  $sql .= (int) $conf->entity.", ";
477  $sql .= "'".$this->db->idate($now)."', ";
478  $sql .= (int) $user->id;
479  $sql .= ")";
480 
481  $res = $this->db->query($sql);
482  if ($res) {
483  $id = $this->db->last_insert_id(MAIN_DB_PREFIX."categorie");
484 
485  if ($id > 0) {
486  $this->id = $id;
487 
488  $action = 'create';
489 
490  // Actions on extra fields
491  if (!$error) {
492  $result = $this->insertExtraFields();
493  if ($result < 0) {
494  $error++;
495  }
496  }
497 
498  if (!$error) {
499  // Call trigger
500  $result = $this->call_trigger('CATEGORY_CREATE', $user);
501  if ($result < 0) {
502  $error++;
503  }
504  // End call triggers
505  }
506 
507  if (!$error) {
508  $this->db->commit();
509  return $id;
510  } else {
511  $this->db->rollback();
512  return -3;
513  }
514  } else {
515  $this->db->rollback();
516  return -2;
517  }
518  } else {
519  $this->error = $this->db->error();
520  $this->db->rollback();
521  return -1;
522  }
523  }
524 
533  public function update(User $user)
534  {
535  global $conf, $langs, $hookmanager;
536 
537  $error = 0;
538 
539  // Clean parameters
540  $this->label = trim($this->label);
541  $this->description = trim($this->description);
542  $this->ref_ext = trim($this->ref_ext);
543  $this->fk_parent = ($this->fk_parent != "" ? intval($this->fk_parent) : 0);
544  $this->visible = ($this->visible != "" ? intval($this->visible) : 0);
545 
546  if ($this->already_exists()) {
547  $this->error = $langs->trans("ImpossibleUpdateCat");
548  $this->error .= " : ".$langs->trans("CategoryExistsAtSameLevel");
549  return -1;
550  }
551 
552  $this->db->begin();
553 
554  $sql = "UPDATE ".MAIN_DB_PREFIX."categorie";
555  $sql .= " SET label = '".$this->db->escape($this->label)."',";
556  $sql .= " description = '".$this->db->escape($this->description)."',";
557  $sql .= " ref_ext = '".$this->db->escape($this->ref_ext)."',";
558  $sql .= " color = '".$this->db->escape($this->color)."'";
559  if (!empty($conf->global->CATEGORY_ASSIGNED_TO_A_CUSTOMER)) {
560  $sql .= ", fk_soc = ".($this->socid > 0 ? $this->socid : 'null');
561  }
562  $sql .= ", visible = ".(int) $this->visible;
563  $sql .= ", fk_parent = ".(int) $this->fk_parent;
564  $sql .= ", fk_user_modif = ".(int) $user->id;
565  $sql .= " WHERE rowid = ".((int) $this->id);
566 
567  dol_syslog(get_class($this)."::update", LOG_DEBUG);
568  if ($this->db->query($sql)) {
569  $action = 'update';
570 
571  // Actions on extra fields
572  if (!$error) {
573  $result = $this->insertExtraFields();
574  if ($result < 0) {
575  $error++;
576  }
577  }
578 
579  if (!$error) {
580  // Call trigger
581  $result = $this->call_trigger('CATEGORY_MODIFY', $user);
582  if ($result < 0) {
583  $error++; $this->db->rollback(); return -1;
584  }
585  // End call triggers
586  }
587 
588  $this->db->commit();
589 
590  return 1;
591  } else {
592  $this->db->rollback();
593  dol_print_error($this->db);
594  return -1;
595  }
596  }
597 
605  public function delete($user, $notrigger = 0)
606  {
607  global $conf, $langs;
608 
609  $error = 0;
610 
611  // Clean parameters
612  $this->fk_parent = ($this->fk_parent != "" ? intval($this->fk_parent) : 0);
613 
614  dol_syslog(get_class($this)."::remove");
615 
616  $this->db->begin();
617 
618  if (!$error && !$notrigger) {
619  // Call trigger
620  $result = $this->call_trigger('CATEGORY_DELETE', $user);
621  if ($result < 0) {
622  $error++;
623  }
624  // End call triggers
625  }
626 
627  /* FIX #1317 : Check for child category and move up 1 level*/
628  if (!$error) {
629  $sql = "UPDATE ".MAIN_DB_PREFIX."categorie";
630  $sql .= " SET fk_parent = ".((int) $this->fk_parent);
631  $sql .= " WHERE fk_parent = ".((int) $this->id);
632 
633  if (!$this->db->query($sql)) {
634  $this->error = $this->db->lasterror();
635  $error++;
636  }
637  }
638 
639  $arraydelete = array(
640  'categorie_account' => 'fk_categorie',
641  'categorie_actioncomm' => 'fk_categorie',
642  'categorie_contact' => 'fk_categorie',
643  'categorie_fournisseur' => 'fk_categorie',
644  'categorie_knowledgemanagement' => array('field' => 'fk_categorie', 'enabled' => isModEnabled('knowledgemanagement')),
645  'categorie_member' => 'fk_categorie',
646  'categorie_user' => 'fk_categorie',
647  'categorie_product' => 'fk_categorie',
648  'categorie_project' => 'fk_categorie',
649  'categorie_societe' => 'fk_categorie',
650  'categorie_ticket' => array('field' => 'fk_categorie', 'enabled' => isModEnabled('ticket')),
651  'categorie_warehouse' => 'fk_categorie',
652  'categorie_website_page' => array('field' => 'fk_categorie', 'enabled' => isModEnabled('website')),
653  'bank_class' => 'fk_categ',
654  'categorie_lang' => 'fk_category',
655  'categorie' => 'rowid',
656  );
657  foreach ($arraydelete as $key => $value) {
658  if (is_array($value)) {
659  if (empty($value['enabled'])) {
660  continue;
661  }
662  $value = $value['field'];
663  }
664  $sql = "DELETE FROM ".MAIN_DB_PREFIX.$key;
665  $sql .= " WHERE ".$value." = ".((int) $this->id);
666  if (!$this->db->query($sql)) {
667  $this->errors[] = $this->db->lasterror();
668  dol_syslog("Error sql=".$sql." ".$this->error, LOG_ERR);
669  $error++;
670  }
671  }
672 
673  // Removed extrafields
674  if (!$error) {
675  $result = $this->deleteExtraFields();
676  if ($result < 0) {
677  $error++;
678  dol_syslog(get_class($this)."::delete erreur ".$this->error, LOG_ERR);
679  }
680  }
681 
682  if (!$error) {
683  $this->db->commit();
684  return 1;
685  } else {
686  $this->db->rollback();
687  return -1;
688  }
689  }
690 
691  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
700  public function add_type($obj, $type = '')
701  {
702  // phpcs:enable
703  global $user, $langs, $conf;
704 
705  $error = 0;
706 
707  if ($this->id == -1) {
708  return -2;
709  }
710 
711  if (empty($type)) {
712  $type = $obj->element;
713  }
714 
715  dol_syslog(get_class($this).'::add_type', LOG_DEBUG);
716 
717  $this->db->begin();
718 
719  $sql = "INSERT INTO ".MAIN_DB_PREFIX."categorie_".(empty($this->MAP_CAT_TABLE[$type]) ? $type : $this->MAP_CAT_TABLE[$type]);
720  $sql .= " (fk_categorie, fk_".(empty($this->MAP_CAT_FK[$type]) ? $type : $this->MAP_CAT_FK[$type]).")";
721  $sql .= " VALUES (".((int) $this->id).", ".((int) $obj->id).")";
722 
723  if ($this->db->query($sql)) {
724  if (!empty($conf->global->CATEGORIE_RECURSIV_ADD)) {
725  $sql = 'SELECT fk_parent FROM '.MAIN_DB_PREFIX.'categorie';
726  $sql .= " WHERE rowid = ".((int) $this->id);
727 
728  dol_syslog(get_class($this)."::add_type", LOG_DEBUG);
729  $resql = $this->db->query($sql);
730  if ($resql) {
731  if ($this->db->num_rows($resql) > 0) {
732  $objparent = $this->db->fetch_object($resql);
733 
734  if (!empty($objparent->fk_parent)) {
735  $cat = new Categorie($this->db);
736  $cat->id = $objparent->fk_parent;
737  if (!$cat->containsObject($type, $obj->id)) {
738  $result = $cat->add_type($obj, $type);
739  if ($result < 0) {
740  $this->error = $cat->error;
741  $error++;
742  }
743  }
744  }
745  }
746  } else {
747  $error++;
748  $this->error = $this->db->lasterror();
749  }
750 
751  if ($error) {
752  $this->db->rollback();
753  return -1;
754  }
755  }
756 
757  // Call trigger
758  $this->context = array('linkto'=>$obj); // Save object we want to link category to into category instance to provide information to trigger
759  $result = $this->call_trigger('CATEGORY_LINK', $user);
760  if ($result < 0) {
761  $error++;
762  }
763  // End call triggers
764 
765  if (!$error) {
766  $this->db->commit();
767  return 1;
768  } else {
769  $this->db->rollback();
770  return -2;
771  }
772  } else {
773  $this->db->rollback();
774  if ($this->db->lasterrno() == 'DB_ERROR_RECORD_ALREADY_EXISTS') {
775  $this->error = $this->db->lasterrno();
776  return -3;
777  } else {
778  $this->error = $this->db->lasterror();
779  }
780  return -1;
781  }
782  }
783 
784  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
793  public function del_type($obj, $type)
794  {
795  // phpcs:enable
796  global $user, $langs, $conf;
797 
798  $error = 0;
799 
800  // For backward compatibility
801  if ($type == 'societe') {
802  $type = 'customer';
803  dol_syslog(get_class($this)."::del_type(): type 'societe' is deprecated, please use 'customer' instead", LOG_WARNING);
804  } elseif ($type == 'fournisseur') {
805  $type = 'supplier';
806  dol_syslog(get_class($this)."::del_type(): type 'fournisseur' is deprecated, please use 'supplier' instead", LOG_WARNING);
807  }
808 
809  $this->db->begin();
810 
811  $sql = "DELETE FROM ".MAIN_DB_PREFIX."categorie_".(empty($this->MAP_CAT_TABLE[$type]) ? $type : $this->MAP_CAT_TABLE[$type]);
812  $sql .= " WHERE fk_categorie = ".((int) $this->id);
813  $sql .= " AND fk_".(empty($this->MAP_CAT_FK[$type]) ? $type : $this->MAP_CAT_FK[$type])." = ".((int) $obj->id);
814 
815  dol_syslog(get_class($this).'::del_type', LOG_DEBUG);
816  if ($this->db->query($sql)) {
817  // Call trigger
818  $this->context = array('unlinkoff'=>$obj); // Save object we want to link category to into category instance to provide information to trigger
819  $result = $this->call_trigger('CATEGORY_UNLINK', $user);
820  if ($result < 0) {
821  $error++;
822  }
823  // End call triggers
824 
825  if (!$error) {
826  $this->db->commit();
827  return 1;
828  } else {
829  $this->db->rollback();
830  return -2;
831  }
832  } else {
833  $this->db->rollback();
834  $this->error = $this->db->lasterror();
835  return -1;
836  }
837  }
838 
851  public function getObjectsInCateg($type, $onlyids = 0, $limit = 0, $offset = 0, $sortfield = '', $sortorder = 'ASC')
852  {
853  global $user;
854 
855  $objs = array();
856 
857  $classnameforobj = $this->MAP_OBJ_CLASS[$type];
858  $obj = new $classnameforobj($this->db);
859 
860  $sql = "SELECT c.fk_".(empty($this->MAP_CAT_FK[$type]) ? $type : $this->MAP_CAT_FK[$type]);
861  $sql .= " FROM ".MAIN_DB_PREFIX."categorie_".(empty($this->MAP_CAT_TABLE[$type]) ? $type : $this->MAP_CAT_TABLE[$type])." as c";
862  $sql .= ", ".MAIN_DB_PREFIX.(empty($this->MAP_OBJ_TABLE[$type]) ? $type : $this->MAP_OBJ_TABLE[$type])." as o";
863  $sql .= " WHERE o.entity IN (".getEntity($obj->element).")";
864  $sql .= " AND c.fk_categorie = ".((int) $this->id);
865  $sql .= " AND c.fk_".(empty($this->MAP_CAT_FK[$type]) ? $type : $this->MAP_CAT_FK[$type])." = o.rowid";
866  // Protection for external users
867  if (($type == 'customer' || $type == 'supplier') && $user->socid > 0) {
868  $sql .= " AND o.rowid = ".((int) $user->socid);
869  }
870  if ($limit > 0 || $offset > 0) {
871  $sql .= $this->db->plimit($limit + 1, $offset);
872  }
873  $sql .= $this->db->order($sortfield, $sortorder);
874 
875  dol_syslog(get_class($this)."::getObjectsInCateg", LOG_DEBUG);
876  $resql = $this->db->query($sql);
877  if ($resql) {
878  while ($rec = $this->db->fetch_array($resql)) {
879  if ($onlyids) {
880  $objs[] = $rec['fk_'.(empty($this->MAP_CAT_FK[$type]) ? $type : $this->MAP_CAT_FK[$type])];
881  } else {
882  $classnameforobj = $this->MAP_OBJ_CLASS[$type];
883 
884  $obj = new $classnameforobj($this->db);
885  $obj->fetch($rec['fk_'.(empty($this->MAP_CAT_FK[$type]) ? $type : $this->MAP_CAT_FK[$type])]);
886 
887  $objs[] = $obj;
888  }
889  }
890  return $objs;
891  } else {
892  $this->error = $this->db->error().' sql='.$sql;
893  return -1;
894  }
895  }
896 
905  public function containsObject($type, $object_id)
906  {
907  $sql = "SELECT COUNT(*) as nb FROM ".MAIN_DB_PREFIX."categorie_".(empty($this->MAP_CAT_TABLE[$type]) ? $type : $this->MAP_CAT_TABLE[$type]);
908  $sql .= " WHERE fk_categorie = ".((int) $this->id)." AND fk_".(empty($this->MAP_CAT_FK[$type]) ? $type : $this->MAP_CAT_FK[$type])." = ".((int) $object_id);
909  dol_syslog(get_class($this)."::containsObject", LOG_DEBUG);
910  $resql = $this->db->query($sql);
911  if ($resql) {
912  return $this->db->fetch_object($resql)->nb;
913  } else {
914  $this->error = $this->db->error().' sql='.$sql;
915  return -1;
916  }
917  }
918 
930  public function getListForItem($id, $type = 'customer', $sortfield = "s.rowid", $sortorder = 'ASC', $limit = 0, $page = 0)
931  {
932  global $conf;
933 
934  $categories = array();
935 
936  $type = sanitizeVal($type, 'aZ09');
937 
938  $sub_type = $type;
939  $subcol_name = "fk_".$type;
940  if ($type == "customer") {
941  $sub_type = "societe";
942  $subcol_name = "fk_soc";
943  }
944  if ($type == "supplier") {
945  $sub_type = "fournisseur";
946  $subcol_name = "fk_soc";
947  }
948  if ($type == "contact") {
949  $subcol_name = "fk_socpeople";
950  }
951 
952  $idoftype = array_search($type, self::$MAP_ID_TO_CODE);
953 
954  $sql = "SELECT s.rowid";
955  $sql .= " FROM ".MAIN_DB_PREFIX."categorie as s, ".MAIN_DB_PREFIX."categorie_".$sub_type." as sub";
956  $sql .= ' WHERE s.entity IN ('.getEntity('category').')';
957  $sql .= ' AND s.type='.((int) $idoftype);
958  $sql .= ' AND s.rowid = sub.fk_categorie';
959  $sql .= " AND sub.".$subcol_name." = ".((int) $id);
960 
961  $sql .= $this->db->order($sortfield, $sortorder);
962 
963  $offset = 0;
964  $nbtotalofrecords = '';
965  if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) {
966  $result = $this->db->query($sql);
967  $nbtotalofrecords = $this->db->num_rows($result);
968  if (($page * $limit) > $nbtotalofrecords) { // if total resultset is smaller then paging size (filtering), goto and load page 0
969  $page = 0;
970  $offset = 0;
971  }
972  }
973 
974  if ($limit) {
975  if ($page < 0) {
976  $page = 0;
977  }
978  $offset = $limit * $page;
979 
980  $sql .= $this->db->plimit($limit + 1, $offset);
981  }
982 
983  $result = $this->db->query($sql);
984  if ($result) {
985  $i = 0;
986  $num = $this->db->num_rows($result);
987  $min = min($num, ($limit <= 0 ? $num : $limit));
988  while ($i < $min) {
989  $obj = $this->db->fetch_object($result);
990  $category_static = new Categorie($this->db);
991  if ($category_static->fetch($obj->rowid)) {
992  $categories[$i]['id'] = $category_static->id;
993  $categories[$i]['fk_parent'] = $category_static->fk_parent;
994  $categories[$i]['label'] = $category_static->label;
995  $categories[$i]['description'] = $category_static->description;
996  $categories[$i]['color'] = $category_static->color;
997  $categories[$i]['socid'] = $category_static->socid;
998  $categories[$i]['ref_ext'] = $category_static->ref_ext;
999  $categories[$i]['visible'] = $category_static->visible;
1000  $categories[$i]['type'] = $category_static->type;
1001  $categories[$i]['entity'] = $category_static->entity;
1002  $categories[$i]['array_options'] = $category_static->array_options;
1003 
1004  // multilangs
1005  if (getDolGlobalInt('MAIN_MULTILANGS') && isset($category_static->multilangs)) {
1006  $categories[$i]['multilangs'] = $category_static->multilangs;
1007  }
1008  }
1009  $i++;
1010  }
1011  } else {
1012  $this->error = $this->db->lasterror();
1013  return -1;
1014  }
1015  if (!count($categories)) {
1016  return 0;
1017  }
1018 
1019  return $categories;
1020  }
1021 
1022  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1028  public function get_filles()
1029  {
1030  // phpcs:enable
1031  $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."categorie";
1032  $sql .= " WHERE fk_parent = ".((int) $this->id);
1033  $sql .= " AND entity IN (".getEntity('category').")";
1034 
1035  $res = $this->db->query($sql);
1036  if ($res) {
1037  $cats = array();
1038  while ($rec = $this->db->fetch_array($res)) {
1039  $cat = new Categorie($this->db);
1040  $cat->fetch($rec['rowid']);
1041  $cats[] = $cat;
1042  }
1043  return $cats;
1044  } else {
1045  dol_print_error($this->db);
1046  return -1;
1047  }
1048  }
1049 
1050  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1056  protected function load_motherof()
1057  {
1058  // phpcs:enable
1059  $this->motherof = array();
1060 
1061  // Load array[child]=parent
1062  $sql = "SELECT fk_parent as id_parent, rowid as id_son";
1063  $sql .= " FROM ".MAIN_DB_PREFIX."categorie";
1064  $sql .= " WHERE fk_parent != 0";
1065  $sql .= " AND entity IN (".getEntity('category').")";
1066 
1067  dol_syslog(get_class($this)."::load_motherof", LOG_DEBUG);
1068  $resql = $this->db->query($sql);
1069  if ($resql) {
1070  while ($obj = $this->db->fetch_object($resql)) {
1071  $this->motherof[$obj->id_son] = $obj->id_parent;
1072  }
1073  return 1;
1074  } else {
1075  dol_print_error($this->db);
1076  return -1;
1077  }
1078  }
1079 
1080  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1100  public function get_full_arbo($type, $markafterid = 0, $include = 0)
1101  {
1102  // phpcs:enable
1103  global $conf, $langs;
1104 
1105  if (!is_numeric($type)) {
1106  $type = $this->MAP_ID[$type];
1107  }
1108  if (is_null($type)) {
1109  $this->error = 'BadValueForParameterType';
1110  return -1;
1111  }
1112 
1113  if (is_string($markafterid)) {
1114  $markafterid = explode(',', $markafterid);
1115  } elseif (is_numeric($markafterid)) {
1116  if ($markafterid > 0) {
1117  $markafterid = array($markafterid);
1118  } else {
1119  $markafterid = array();
1120  }
1121  } elseif (!is_array($markafterid)) {
1122  $markafterid = array();
1123  }
1124 
1125  $this->cats = array();
1126 
1127  // Init this->motherof that is array(id_son=>id_parent, ...)
1128  $this->load_motherof();
1129  $current_lang = $langs->getDefaultLang();
1130 
1131  // Init $this->cats array
1132  $sql = "SELECT DISTINCT c.rowid, c.label, c.ref_ext, c.description, c.color, c.fk_parent, c.visible"; // Distinct reduce pb with old tables with duplicates
1133  if (getDolGlobalInt('MAIN_MULTILANGS')) {
1134  $sql .= ", t.label as label_trans, t.description as description_trans";
1135  }
1136  $sql .= " FROM ".MAIN_DB_PREFIX."categorie as c";
1137  if (getDolGlobalInt('MAIN_MULTILANGS')) {
1138  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."categorie_lang as t ON t.fk_category=c.rowid AND t.lang='".$this->db->escape($current_lang)."'";
1139  }
1140  $sql .= " WHERE c.entity IN (".getEntity('category').")";
1141  $sql .= " AND c.type = ".(int) $type;
1142 
1143  dol_syslog(get_class($this)."::get_full_arbo get category list", LOG_DEBUG);
1144  $resql = $this->db->query($sql);
1145  if ($resql) {
1146  $i = 0;
1147  while ($obj = $this->db->fetch_object($resql)) {
1148  $this->cats[$obj->rowid]['rowid'] = $obj->rowid;
1149  $this->cats[$obj->rowid]['id'] = $obj->rowid;
1150  $this->cats[$obj->rowid]['fk_parent'] = $obj->fk_parent;
1151  $this->cats[$obj->rowid]['label'] = !empty($obj->label_trans) ? $obj->label_trans : $obj->label;
1152  $this->cats[$obj->rowid]['description'] = !empty($obj->description_trans) ? $obj->description_trans : $obj->description;
1153  $this->cats[$obj->rowid]['color'] = $obj->color;
1154  $this->cats[$obj->rowid]['visible'] = $obj->visible;
1155  $this->cats[$obj->rowid]['ref_ext'] = $obj->ref_ext;
1156  $this->cats[$obj->rowid]['picto'] = 'category';
1157  $i++;
1158  }
1159  } else {
1160  dol_print_error($this->db);
1161  return -1;
1162  }
1163 
1164  // We add the fullpath property to each elements of first level (no parent exists)
1165  dol_syslog(get_class($this)."::get_full_arbo call to buildPathFromId", LOG_DEBUG);
1166  foreach ($this->cats as $key => $val) {
1167  //print 'key='.$key.'<br>'."\n";
1168  $this->buildPathFromId($key, 0); // Process a branch from the root category key (this category has no parent)
1169  }
1170 
1171  // Include or exclude leaf including $markafterid from tree
1172  if (count($markafterid) > 0) {
1173  $keyfiltercatid = '('.implode('|', $markafterid).')';
1174 
1175  //print "Look to discard category ".$markafterid."\n";
1176  $keyfilter1 = '^'.$keyfiltercatid.'$';
1177  $keyfilter2 = '_'.$keyfiltercatid.'$';
1178  $keyfilter3 = '^'.$keyfiltercatid.'_';
1179  $keyfilter4 = '_'.$keyfiltercatid.'_';
1180  foreach ($this->cats as $key => $val) {
1181  $test = (preg_match('/'.$keyfilter1.'/', $val['fullpath']) || preg_match('/'.$keyfilter2.'/', $val['fullpath'])
1182  || preg_match('/'.$keyfilter3.'/', $val['fullpath']) || preg_match('/'.$keyfilter4.'/', $val['fullpath']));
1183 
1184  if (($test && !$include) || (!$test && $include)) {
1185  unset($this->cats[$key]);
1186  }
1187  }
1188  }
1189 
1190  dol_syslog(get_class($this)."::get_full_arbo dol_sort_array", LOG_DEBUG);
1191  $this->cats = dol_sort_array($this->cats, 'fulllabel', 'asc', true, false);
1192 
1193  return $this->cats;
1194  }
1195 
1206  private function buildPathFromId($id_categ, $protection = 1000)
1207  {
1208  //dol_syslog(get_class($this)."::buildPathFromId id_categ=".$id_categ." protection=".$protection, LOG_DEBUG);
1209 
1210  if (!empty($this->cats[$id_categ]['fullpath'])) {
1211  // Already defined
1212  dol_syslog(get_class($this)."::buildPathFromId fullpath and fulllabel already defined", LOG_WARNING);
1213  return -1;
1214  }
1215 
1216  // First build full array $motherof
1217  //$this->load_motherof(); // Disabled because already done by caller of buildPathFromId
1218 
1219  // $this->cats[$id_categ] is supposed to be already an array. We just want to complete it with property fullpath and fulllabel
1220 
1221  // Define fullpath and fulllabel
1222  $this->cats[$id_categ]['fullpath'] = '_'.$id_categ;
1223  $this->cats[$id_categ]['fulllabel'] = $this->cats[$id_categ]['label'];
1224  $i = 0; $cursor_categ = $id_categ;
1225  //print 'Work for id_categ='.$id_categ.'<br>'."\n";
1226  while ((empty($protection) || $i < $protection) && !empty($this->motherof[$cursor_categ])) {
1227  //print '&nbsp; cursor_categ='.$cursor_categ.' i='.$i.' '.$this->motherof[$cursor_categ].'<br>'."\n";
1228  $this->cats[$id_categ]['fullpath'] = '_'.$this->motherof[$cursor_categ].$this->cats[$id_categ]['fullpath'];
1229  $this->cats[$id_categ]['fulllabel'] = (empty($this->cats[$this->motherof[$cursor_categ]]) ? 'NotFound' : $this->cats[$this->motherof[$cursor_categ]]['label']).' >> '.$this->cats[$id_categ]['fulllabel'];
1230  //print '&nbsp; Result for id_categ='.$id_categ.' : '.$this->cats[$id_categ]['fullpath'].' '.$this->cats[$id_categ]['fulllabel'].'<br>'."\n";
1231  $i++;
1232  $cursor_categ = $this->motherof[$cursor_categ];
1233  }
1234  //print 'Result for id_categ='.$id_categ.' : '.$this->cats[$id_categ]['fullpath'].'<br>'."\n";
1235 
1236  // We count number of _ to have level
1237  $nbunderscore = substr_count($this->cats[$id_categ]['fullpath'], '_');
1238  $this->cats[$id_categ]['level'] = ($nbunderscore ? $nbunderscore : null);
1239 
1240  return 1;
1241  }
1242 
1243 
1244  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1252  public function get_all_categories($type = null, $parent = false)
1253  {
1254  // phpcs:enable
1255  if (!is_numeric($type)) {
1256  $type = $this->MAP_ID[$type];
1257  }
1258 
1259  $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."categorie";
1260  $sql .= " WHERE entity IN (".getEntity('category').")";
1261  if (!is_null($type)) {
1262  $sql .= " AND type = ".(int) $type;
1263  }
1264  if ($parent) {
1265  $sql .= " AND fk_parent = 0";
1266  }
1267 
1268  $res = $this->db->query($sql);
1269  if ($res) {
1270  $cats = array();
1271  while ($rec = $this->db->fetch_array($res)) {
1272  $cat = new Categorie($this->db);
1273  $cat->fetch($rec['rowid']);
1274  $cats[$rec['rowid']] = $cat;
1275  }
1276  return $cats;
1277  } else {
1278  dol_print_error($this->db);
1279  return -1;
1280  }
1281  }
1282 
1283  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1290  public function get_main_categories($type = null)
1291  {
1292  // phpcs:enable
1293  return $this->get_all_categories($type, true);
1294  }
1295 
1296  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1302  public function already_exists()
1303  {
1304  // phpcs:enable
1305  $type = $this->type;
1306 
1307  if (!is_numeric($type)) {
1308  $type = $this->MAP_ID[$type];
1309  }
1310 
1311  /* We have to select any rowid from llx_categorie which category's mother and label
1312  * are equals to those of the calling category
1313  */
1314  $sql = "SELECT c.rowid";
1315  $sql .= " FROM ".MAIN_DB_PREFIX."categorie as c ";
1316  $sql .= " WHERE c.entity IN (".getEntity('category').")";
1317  $sql .= " AND c.type = ".((int) $type);
1318  $sql .= " AND c.fk_parent = ".((int) $this->fk_parent);
1319  $sql .= " AND c.label = '".$this->db->escape($this->label)."'";
1320 
1321  dol_syslog(get_class($this)."::already_exists", LOG_DEBUG);
1322  $resql = $this->db->query($sql);
1323  if ($resql) {
1324  if ($this->db->num_rows($resql) > 0) { // Checking for empty resql
1325  $obj = $this->db->fetch_array($resql);
1326  /* If object called create, obj cannot have is id.
1327  * If object called update, he mustn't have the same label as an other category for this mother.
1328  * So if the result have the same id, update is not for label, and if result have an other one,
1329  * update may be for label.
1330  */
1331  if ($obj[0] > 0 && $obj[0] != $this->id) {
1332  dol_syslog(get_class($this)."::already_exists category with name=".$this->label." and parent ".$this->fk_parent." exists: rowid=".$obj[0]." current_id=".$this->id, LOG_DEBUG);
1333  return 1;
1334  }
1335  }
1336  dol_syslog(get_class($this)."::already_exists no category with same name=".$this->label." and same parent ".$this->fk_parent." than category id=".$this->id, LOG_DEBUG);
1337  return 0;
1338  } else {
1339  $this->error = $this->db->error();
1340  return -1;
1341  }
1342  }
1343 
1344 
1345  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1356  public function print_all_ways($sep = '&gt;&gt;', $url = '', $nocolor = 0, $addpicto = 0)
1357  {
1358  // phpcs:enable
1359  $ways = array();
1360 
1361  $allways = $this->get_all_ways(); // Load array of categories
1362  foreach ($allways as $way) {
1363  $w = array();
1364  $i = 0;
1365  $forced_color = '';
1366  foreach ($way as $cat) {
1367  $i++;
1368 
1369  if (empty($nocolor)) {
1370  $forced_color = 'colortoreplace';
1371  if ($i == count($way)) { // Last category in hierarchy
1372  // Check contrast with background and correct text color
1373  $forced_color = 'categtextwhite';
1374  if ($cat->color) {
1375  if (colorIsLight($cat->color)) {
1376  $forced_color = 'categtextblack';
1377  }
1378  }
1379  }
1380  }
1381 
1382  if ($url == '') {
1383  $link = '<a href="'.DOL_URL_ROOT.'/categories/viewcat.php?id='.$cat->id.'&type='.$cat->type.'" class="'.$forced_color.'">';
1384  $linkend = '</a>';
1385  $w[] = $link.(($addpicto && $i == 1) ? img_object('', 'category', 'class="paddingright"') : '').$cat->label.$linkend;
1386  } elseif ($url == 'none') {
1387  $link = '<span class="'.$forced_color.'">';
1388  $linkend = '</span>';
1389  $w[] = $link.(($addpicto && $i == 1) ? img_object('', 'category', 'class="paddingright"') : '').$cat->label.$linkend;
1390  } else {
1391  $w[] = '<a class="'.$forced_color.'" href="'.DOL_URL_ROOT.'/'.$url.'?catid='.$cat->id.'">'.($addpicto ? img_object('', 'category') : '').$cat->label.'</a>';
1392  }
1393  }
1394  $newcategwithpath = preg_replace('/colortoreplace/', $forced_color, implode('<span class="inline-block valignmiddle paddingleft paddingright '.$forced_color.'">'.$sep.'</span>', $w));
1395 
1396  $ways[] = $newcategwithpath;
1397  }
1398 
1399  return $ways;
1400  }
1401 
1402 
1403  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1409  public function get_meres()
1410  {
1411  // phpcs:enable
1412  $parents = array();
1413 
1414  $sql = "SELECT fk_parent FROM ".MAIN_DB_PREFIX."categorie";
1415  $sql .= " WHERE rowid = ".((int) $this->id);
1416 
1417  $res = $this->db->query($sql);
1418 
1419  if ($res) {
1420  while ($rec = $this->db->fetch_array($res)) {
1421  if ($rec['fk_parent'] > 0) {
1422  $cat = new Categorie($this->db);
1423  $cat->fetch($rec['fk_parent']);
1424  $parents[] = $cat;
1425  }
1426  }
1427  return $parents;
1428  } else {
1429  dol_print_error($this->db);
1430  return -1;
1431  }
1432  }
1433 
1434  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1441  public function get_all_ways()
1442  {
1443  // phpcs:enable
1444  $ways = array();
1445 
1446  $parents = $this->get_meres();
1447  if (is_array($parents)) {
1448  foreach ($parents as $parent) {
1449  $allways = $parent->get_all_ways();
1450  foreach ($allways as $way) {
1451  $w = $way;
1452  $w[] = $this;
1453  $ways[] = $w;
1454  }
1455  }
1456  }
1457 
1458  if (count($ways) == 0) {
1459  $ways[0][0] = $this;
1460  }
1461 
1462  return $ways;
1463  }
1464 
1475  public function containing($id, $type, $mode = 'object')
1476  {
1477  $cats = array();
1478 
1479  if (is_numeric($type)) {
1480  $type = Categorie::$MAP_ID_TO_CODE[$type];
1481  }
1482 
1483  if ($type === Categorie::TYPE_BANK_LINE) { // TODO Remove this with standard category code after migration of llx_bank_categ into llx_categorie
1484  // Load bank categories
1485  $sql = "SELECT c.label, c.rowid";
1486  $sql .= " FROM ".MAIN_DB_PREFIX."bank_class as a, ".MAIN_DB_PREFIX."bank_categ as c";
1487  $sql .= " WHERE a.lineid=".((int) $id)." AND a.fk_categ = c.rowid";
1488  $sql .= " AND c.entity IN (".getEntity('category').")";
1489  $sql .= " ORDER BY c.label";
1490 
1491  $res = $this->db->query($sql);
1492  if ($res) {
1493  while ($obj = $this->db->fetch_object($res)) {
1494  if ($mode == 'id') {
1495  $cats[] = $obj->rowid;
1496  } elseif ($mode == 'label') {
1497  $cats[] = $obj->label;
1498  } else {
1499  $cat = new Categorie($this->db);
1500  $cat->id = $obj->rowid;
1501  $cat->label = $obj->label;
1502  $cats[] = $cat;
1503  }
1504  }
1505  } else {
1506  dol_print_error($this->db);
1507  return -1;
1508  }
1509  } else {
1510  $sql = "SELECT ct.fk_categorie, c.label, c.rowid";
1511  $sql .= " FROM ".MAIN_DB_PREFIX."categorie_".(empty($this->MAP_CAT_TABLE[$type]) ? $type : $this->MAP_CAT_TABLE[$type])." as ct, ".MAIN_DB_PREFIX."categorie as c";
1512  $sql .= " WHERE ct.fk_categorie = c.rowid AND ct.fk_".(empty($this->MAP_CAT_FK[$type]) ? $type : $this->MAP_CAT_FK[$type])." = ".(int) $id;
1513  // This seems useless because the table already contains id of category of 1 unique type. So commented.
1514  // So now it works also with external added categories.
1515  //$sql .= " AND c.type = ".((int) $this->MAP_ID[$type]);
1516  $sql .= " AND c.entity IN (".getEntity('category').")";
1517 
1518  $res = $this->db->query($sql);
1519  if ($res) {
1520  while ($obj = $this->db->fetch_object($res)) {
1521  if ($mode == 'id') {
1522  $cats[] = $obj->rowid;
1523  } elseif ($mode == 'label') {
1524  $cats[] = $obj->label;
1525  } else {
1526  $cat = new Categorie($this->db);
1527  $cat->fetch($obj->fk_categorie);
1528  $cats[] = $cat;
1529  }
1530  }
1531  } else {
1532  dol_print_error($this->db);
1533  return -1;
1534  }
1535  }
1536 
1537  return $cats;
1538  }
1539 
1551  public function rechercher($id, $nom, $type, $exact = false, $case = false)
1552  {
1553  // Deprecation warning
1554  if (is_numeric($type)) {
1555  dol_syslog(__METHOD__.': using numeric types is deprecated.', LOG_WARNING);
1556  }
1557 
1558  $cats = array();
1559 
1560  // For backward compatibility
1561  if (is_numeric($type)) {
1562  // We want to reverse lookup
1563  $map_type = array_flip($this->MAP_ID);
1564  $type = $map_type[$type];
1565  dol_syslog(get_class($this)."::rechercher(): numeric types are deprecated, please use string instead", LOG_WARNING);
1566  }
1567 
1568  // Generation requete recherche
1569  $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."categorie";
1570  $sql .= " WHERE type = ".((int) $this->MAP_ID[$type]);
1571  $sql .= " AND entity IN (".getEntity('category').")";
1572  if ($nom) {
1573  if (!$exact) {
1574  $nom = '%'.$this->db->escape(str_replace('*', '%', $nom)).'%';
1575  }
1576  if (!$case) {
1577  $sql .= " AND label LIKE '".$this->db->escape($nom)."'";
1578  } else {
1579  $sql .= " AND label LIKE BINARY '".$this->db->escape($nom)."'";
1580  }
1581  }
1582  if ($id) {
1583  $sql .= " AND rowid = ".((int) $id);
1584  }
1585 
1586  $res = $this->db->query($sql);
1587  if ($res) {
1588  while ($rec = $this->db->fetch_array($res)) {
1589  $cat = new Categorie($this->db);
1590  $cat->fetch($rec['rowid']);
1591  $cats[] = $cat;
1592  }
1593 
1594  return $cats;
1595  } else {
1596  $this->error = $this->db->error().' sql='.$sql;
1597  return -1;
1598  }
1599  }
1600 
1607  public function getTooltipContentArray($params)
1608  {
1609  global $langs;
1610 
1611  $datas = [];
1612 
1613  $datas['label'] = $langs->trans("ShowCategory").': '.($this->ref ? $this->ref : $this->label);
1614 
1615  return $datas;
1616  }
1617 
1628  public function getNomUrl($withpicto = 0, $option = '', $maxlength = 0, $moreparam = '')
1629  {
1630  global $langs, $hookmanager;
1631 
1632  $result = '';
1633  $params = [
1634  'id' => $this->id,
1635  'objecttype' => $this->element,
1636  'option' => $option,
1637  ];
1638  $classfortooltip = 'classfortooltip';
1639  $dataparams = '';
1640  if (getDolGlobalInt('MAIN_ENABLE_AJAX_TOOLTIP')) {
1641  $classfortooltip = 'classforajaxtooltip';
1642  $dataparams = ' data-params='.json_encode($params);
1643  // $label = $langs->trans('Loading');
1644  }
1645  $label = implode($this->getTooltipContentArray($params));
1646 
1647  // Check contrast with background and correct text color
1648  $forced_color = 'categtextwhite';
1649  if ($this->color) {
1650  if (colorIsLight($this->color)) {
1651  $forced_color = 'categtextblack';
1652  }
1653  }
1654  $link = '<a href="'.DOL_URL_ROOT.'/categories/viewcat.php?id='.$this->id.'&type='.$this->type.$moreparam.'&backtopage='.urlencode($_SERVER['PHP_SELF'].($moreparam ? '?'.$moreparam : ''));
1655  $link .= '"'.$dataparams.' title="'.dol_escape_htmltag($label, 1).'" class="'.$classfortooltip.' '.$forced_color.'">';
1656  $linkend = '</a>';
1657 
1658  $picto = 'category';
1659 
1660 
1661  if ($withpicto) {
1662  $result .= ($link.img_object($label, $picto, $dataparams.' class="'.$classfortooltip.'"').$linkend);
1663  }
1664  if ($withpicto && $withpicto != 2) {
1665  $result .= ' ';
1666  }
1667  if ($withpicto != 2) {
1668  $result .= $link.dol_trunc(($this->ref ? $this->ref : $this->label), $maxlength).$linkend;
1669  }
1670  global $action;
1671  $hookmanager->initHooks(array($this->element . 'dao'));
1672  $parameters = array('id'=>$this->id, 'getnomurl' => &$result);
1673  $reshook = $hookmanager->executeHooks('getNomUrl', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
1674  if ($reshook > 0) {
1675  $result = $hookmanager->resPrint;
1676  } else {
1677  $result .= $hookmanager->resPrint;
1678  }
1679  return $result;
1680  }
1681 
1682 
1683  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1691  public function add_photo($sdir, $file)
1692  {
1693  // phpcs:enable
1694  require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
1695 
1696  $dir = $sdir.'/'.get_exdir($this->id, 2, 0, 0, $this, 'category').$this->id."/";
1697  $dir .= "photos/";
1698 
1699  if (!file_exists($dir)) {
1700  dol_mkdir($dir);
1701  }
1702 
1703  if (file_exists($dir)) {
1704  if (is_array($file['name']) && count($file['name']) > 0) {
1705  $nbfile = count($file['name']);
1706  for ($i = 0; $i <= $nbfile; $i++) {
1707  $originImage = $dir.$file['name'][$i];
1708 
1709  // Cree fichier en taille origine
1710  dol_move_uploaded_file($file['tmp_name'][$i], $originImage, 1, 0, 0);
1711 
1712  if (file_exists($originImage)) {
1713  // Create thumbs
1714  $this->addThumbs($originImage);
1715  }
1716  }
1717  } else {
1718  $originImage = $dir.$file['name'];
1719 
1720  // Cree fichier en taille origine
1721  dol_move_uploaded_file($file['tmp_name'], $originImage, 1, 0, 0);
1722 
1723  if (file_exists($originImage)) {
1724  // Create thumbs
1725  $this->addThumbs($originImage);
1726  }
1727  }
1728  }
1729  }
1730 
1731  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1739  public function liste_photos($dir, $nbmax = 0)
1740  {
1741  // phpcs:enable
1742  include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
1743 
1744  $nbphoto = 0;
1745  $tabobj = array();
1746 
1747  $dirthumb = $dir.'thumbs/';
1748 
1749  if (file_exists($dir)) {
1750  $handle = opendir($dir);
1751  if (is_resource($handle)) {
1752  while (($file = readdir($handle)) !== false) {
1753  if (dol_is_file($dir.$file) && preg_match('/(\.jpeg|\.jpg|\.bmp|\.gif|\.png|\.tiff)$/i', $dir.$file)) {
1754  $nbphoto++;
1755  $photo = $file;
1756 
1757  // On determine nom du fichier vignette
1758  $photo_vignette = '';
1759  if (preg_match('/(\.jpeg|\.jpg|\.bmp|\.gif|\.png|\.tiff)$/i', $photo, $regs)) {
1760  $photo_vignette = preg_replace('/'.$regs[0].'/i', '', $photo).'_small'.$regs[0];
1761  }
1762 
1763  // Objet
1764  $obj = array();
1765  $obj['photo'] = $photo;
1766  if ($photo_vignette && is_file($dirthumb.$photo_vignette)) {
1767  $obj['photo_vignette'] = 'thumbs/'.$photo_vignette;
1768  } else {
1769  $obj['photo_vignette'] = "";
1770  }
1771 
1772  $tabobj[$nbphoto - 1] = $obj;
1773 
1774  // On continue ou on arrete de boucler
1775  if ($nbmax && $nbphoto >= $nbmax) {
1776  break;
1777  }
1778  }
1779  }
1780 
1781  closedir($handle);
1782  }
1783  }
1784 
1785  return $tabobj;
1786  }
1787 
1788  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1795  public function delete_photo($file)
1796  {
1797  // phpcs:enable
1798  require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
1799 
1800  $dir = dirname($file).'/'; // Chemin du dossier contenant l'image d'origine
1801  $dirthumb = $dir.'/thumbs/'; // Chemin du dossier contenant la vignette
1802  $filename = preg_replace('/'.preg_quote($dir, '/').'/i', '', $file); // Nom du fichier
1803 
1804  // On efface l'image d'origine
1805  dol_delete_file($file, 1);
1806 
1807  // Si elle existe, on efface la vignette
1808  if (preg_match('/(\.jpeg|\.jpg|\.bmp|\.gif|\.png|\.tiff)$/i', $filename, $regs)) {
1809  $photo_vignette = preg_replace('/'.$regs[0].'/i', '', $filename).'_small'.$regs[0];
1810  if (file_exists($dirthumb.$photo_vignette)) {
1811  dol_delete_file($dirthumb.$photo_vignette, 1);
1812  }
1813  }
1814  }
1815 
1816  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1823  public function get_image_size($file)
1824  {
1825  // phpcs:enable
1826  $infoImg = getimagesize($file); // Recuperation des infos de l'image
1827  $this->imgWidth = $infoImg[0]; // Largeur de l'image
1828  $this->imgHeight = $infoImg[1]; // Hauteur de l'image
1829  }
1830 
1838  public function setMultiLangs($user)
1839  {
1840  global $langs;
1841 
1842  $langs_available = $langs->get_available_languages();
1843  $current_lang = $langs->getDefaultLang();
1844 
1845  foreach ($langs_available as $key => $value) {
1846  $sql = "SELECT rowid";
1847  $sql .= " FROM ".MAIN_DB_PREFIX."categorie_lang";
1848  $sql .= " WHERE fk_category=".((int) $this->id);
1849  $sql .= " AND lang = '".$this->db->escape($key)."'";
1850 
1851  $result = $this->db->query($sql);
1852 
1853  if ($key == $current_lang) {
1854  if ($this->db->num_rows($result)) { // si aucune ligne dans la base
1855  $sql2 = "UPDATE ".MAIN_DB_PREFIX."categorie_lang";
1856  $sql2 .= " SET label = '".$this->db->escape($this->label)."',";
1857  $sql2 .= " description = '".$this->db->escape($this->description)."'";
1858  $sql2 .= " WHERE fk_category = ".((int) $this->id)." AND lang = '".$this->db->escape($key)."'";
1859  } else {
1860  $sql2 = "INSERT INTO ".MAIN_DB_PREFIX."categorie_lang (fk_category, lang, label, description)";
1861  $sql2 .= " VALUES(".((int) $this->id).", '".$this->db->escape($key)."', '".$this->db->escape($this->label)."'";
1862  $sql2 .= ", '".$this->db->escape($this->multilangs["$key"]["description"])."')";
1863  }
1864  dol_syslog(get_class($this).'::setMultiLangs', LOG_DEBUG);
1865  if (!$this->db->query($sql2)) {
1866  $this->error = $this->db->lasterror();
1867  return -1;
1868  }
1869  } elseif (isset($this->multilangs["$key"])) {
1870  if ($this->db->num_rows($result)) { // si aucune ligne dans la base
1871  $sql2 = "UPDATE ".MAIN_DB_PREFIX."categorie_lang";
1872  $sql2 .= " SET label='".$this->db->escape($this->multilangs["$key"]["label"])."',";
1873  $sql2 .= " description='".$this->db->escape($this->multilangs["$key"]["description"])."'";
1874  $sql2 .= " WHERE fk_category=".((int) $this->id)." AND lang='".$this->db->escape($key)."'";
1875  } else {
1876  $sql2 = "INSERT INTO ".MAIN_DB_PREFIX."categorie_lang (fk_category, lang, label, description)";
1877  $sql2 .= " VALUES(".((int) $this->id).", '".$this->db->escape($key)."', '".$this->db->escape($this->multilangs["$key"]["label"])."'";
1878  $sql2 .= ",'".$this->db->escape($this->multilangs["$key"]["description"])."')";
1879  }
1880 
1881  // on ne sauvegarde pas des champs vides
1882  if ($this->multilangs["$key"]["label"] || $this->multilangs["$key"]["description"] || $this->multilangs["$key"]["note"]) {
1883  dol_syslog(get_class($this).'::setMultiLangs', LOG_DEBUG);
1884  }
1885  if (!$this->db->query($sql2)) {
1886  $this->error = $this->db->lasterror();
1887  return -1;
1888  }
1889  }
1890  }
1891 
1892  // Call trigger
1893  $result = $this->call_trigger('CATEGORY_SET_MULTILANGS', $user);
1894  if ($result < 0) {
1895  $this->error = $this->db->lasterror();
1896  return -1;
1897  }
1898  // End call triggers
1899 
1900  return 1;
1901  }
1902 
1908  public function getMultiLangs()
1909  {
1910  global $langs;
1911 
1912  $current_lang = $langs->getDefaultLang();
1913 
1914  $sql = "SELECT lang, label, description";
1915  $sql .= " FROM ".MAIN_DB_PREFIX."categorie_lang";
1916  $sql .= " WHERE fk_category=".((int) $this->id);
1917 
1918  $result = $this->db->query($sql);
1919  if ($result) {
1920  while ($obj = $this->db->fetch_object($result)) {
1921  //print 'lang='.$obj->lang.' current='.$current_lang.'<br>';
1922  if ($obj->lang == $current_lang) { // si on a les traduct. dans la langue courante on les charge en infos principales.
1923  $this->label = $obj->label;
1924  $this->description = $obj->description;
1925  }
1926  $this->multilangs["$obj->lang"]["label"] = $obj->label;
1927  $this->multilangs["$obj->lang"]["description"] = $obj->description;
1928  }
1929  return 1;
1930  } else {
1931  $this->error = $langs->trans("Error")." : ".$this->db->error()." - ".$sql;
1932  return -1;
1933  }
1934  }
1935 
1942  public function getLibStatut($mode)
1943  {
1944  return '';
1945  }
1946 
1947 
1955  public function initAsSpecimen()
1956  {
1957  dol_syslog(get_class($this)."::initAsSpecimen");
1958 
1959  // Initialise parametres
1960  $this->id = 0;
1961  $this->fk_parent = 0;
1962  $this->label = 'SPECIMEN';
1963  $this->specimen = 1;
1964  $this->description = 'This is a description';
1965  $this->socid = 1;
1966  $this->type = self::TYPE_PRODUCT;
1967  }
1968 
1977  public static function replaceThirdparty(DoliDB $dbs, $origin_id, $dest_id)
1978  {
1979  $tables = array(
1980  'categorie_societe'
1981  );
1982 
1983  return CommonObject::commonReplaceThirdparty($dbs, $origin_id, $dest_id, $tables, 1);
1984  }
1985 
1994  public static function getFilterJoinQuery($type, $rowIdName)
1995  {
1996  if ($type == 'bank_account') {
1997  $type = 'account';
1998  }
1999 
2000  return " LEFT JOIN ".MAIN_DB_PREFIX."categorie_".$type." as cp ON ".$rowIdName." = cp.fk_".$type;
2001  }
2002 
2012  public static function getFilterSelectQuery($type, $rowIdName, $searchList)
2013  {
2014  if ($type == 'bank_account') {
2015  $type = 'account';
2016  }
2017  if ($type == 'customer') {
2018  $type = 'societe';
2019  }
2020  if ($type == 'supplier') {
2021  $type = 'fournisseur';
2022  }
2023 
2024  if (empty($searchList) && !is_array($searchList)) {
2025  return "";
2026  }
2027 
2028  $searchCategorySqlList = array();
2029  foreach ($searchList as $searchCategory) {
2030  if (intval($searchCategory) == -2) {
2031  $searchCategorySqlList[] = " cp.fk_categorie IS NULL";
2032  } elseif (intval($searchCategory) > 0) {
2033  $searchCategorySqlList[] = " ".$rowIdName." IN (SELECT fk_".$type." FROM ".MAIN_DB_PREFIX."categorie_".$type." WHERE fk_categorie = ".((int) $searchCategory).")";
2034  }
2035  }
2036 
2037  if (!empty($searchCategorySqlList)) {
2038  return " AND (".implode(' AND ', $searchCategorySqlList).")";
2039  } else {
2040  return "";
2041  }
2042  }
2043 
2049  public function countNbOfCategories()
2050  {
2051  dol_syslog(get_class($this)."::count_all_categories", LOG_DEBUG);
2052  $sql = "SELECT COUNT(rowid) FROM ".MAIN_DB_PREFIX."categorie";
2053  $sql .= " WHERE entity IN (".getEntity('category').")";
2054 
2055  $res = $this->db->query($sql);
2056  if ($res) {
2057  $obj = $this->db->fetch_object($res);
2058  return $obj->count;
2059  } else {
2060  dol_print_error($this->db);
2061  return -1;
2062  }
2063  }
2064 }
Categorie\get_full_arbo
get_full_arbo($type, $markafterid=0, $include=0)
Rebuilding the category tree as an array Return an array of table('id','id_mere',....
Definition: categorie.class.php:1100
db
$conf db
API class for accounts.
Definition: inc.php:41
Categorie\delete_photo
delete_photo($file)
Efface la photo de la categorie et sa vignette.
Definition: categorie.class.php:1795
dol_escape_htmltag
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0)
Returns text escaped for inclusion in HTML alt or title tags, or into values of HTML input fields.
Definition: functions.lib.php:1504
Categorie\already_exists
already_exists()
Check if no category with same label already exists for this cat's parent or root and for this cat's ...
Definition: categorie.class.php:1302
description
print *****$script_file(".$version.") pid cd cd cd description as description
Definition: email_expire_services_to_customers.php:83
Categorie\del_type
del_type($obj, $type)
Delete object from category.
Definition: categorie.class.php:793
Categorie\get_image_size
get_image_size($file)
Load size of image file.
Definition: categorie.class.php:1823
Categorie\containsObject
containsObject($type, $object_id)
Check for the presence of an object in a category.
Definition: categorie.class.php:905
Categorie\liste_photos
liste_photos($dir, $nbmax=0)
Return tableau de toutes les photos de la categorie.
Definition: categorie.class.php:1739
Categorie\load_motherof
load_motherof()
Load the array this->motherof that is array(id_son=>id_parent, ...)
Definition: categorie.class.php:1056
Categorie\get_meres
get_meres()
Returns an array containing the list of parent categories.
Definition: categorie.class.php:1409
DoliDB
Class to manage Dolibarr database access.
Definition: DoliDB.class.php:30
Categorie\getLibStatut
getLibStatut($mode)
Return label of contact status.
Definition: categorie.class.php:1942
$sql
if(isModEnabled('facture') &&!empty($user->rights->facture->lire)) if((isModEnabled('fournisseur') &&empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) && $user->hasRight("fournisseur", "facture", "lire"))||(isModEnabled('supplier_invoice') && $user->hasRight("supplier_invoice", "lire"))) if(isModEnabled('don') &&!empty($user->rights->don->lire)) if(isModEnabled('tax') &&!empty($user->rights->tax->charges->lire)) if(isModEnabled('facture') &&isModEnabled('commande') && $user->hasRight("commande", "lire") &&empty($conf->global->WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER)) $sql
Social contributions to pay.
Definition: index.php:745
Categorie\getMultiLangs
getMultiLangs()
Load array this->multilangs.
Definition: categorie.class.php:1908
Categorie\update
update(User $user)
Update category.
Definition: categorie.class.php:533
dol_print_error
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
Definition: functions.lib.php:4994
dol_sort_array
dol_sort_array(&$array, $index, $order='asc', $natsort=0, $case_sensitive=0, $keepindex=0)
Advanced sort array by second index function, which produces ascending (default) or descending output...
Definition: functions.lib.php:8758
CommonObject\addThumbs
addThumbs($file)
Build thumb.
Definition: commonobject.class.php:5761
Categorie\getListForItem
getListForItem($id, $type='customer', $sortfield="s.rowid", $sortorder='ASC', $limit=0, $page=0)
List categories of an element id.
Definition: categorie.class.php:930
Categorie\create
create($user)
Add category into database.
Definition: categorie.class.php:414
Categorie\countNbOfCategories
countNbOfCategories()
Count all categories.
Definition: categorie.class.php:2049
sanitizeVal
sanitizeVal($out='', $check='alphanohtml', $filter=null, $options=null)
Return a sanitized or empty value after checking value against a rule.
Definition: functions.lib.php:877
Categorie
Class to manage categories.
Definition: categorie.class.php:47
CommonObject
Parent class of all other business classes (invoices, contracts, proposals, orders,...
Definition: commonobject.class.php:45
Categorie\get_all_ways
get_all_ways()
Returns in a table all possible paths to get to the category starting with the major categories repre...
Definition: categorie.class.php:1441
dol_is_file
dol_is_file($pathoffile)
Return if path is a file.
Definition: files.lib.php:481
Categorie\fetch
fetch($id, $label='', $type=null, $ref_ext='')
Load category into memory from database.
Definition: categorie.class.php:330
dol_delete_file
dol_delete_file($file, $disableglob=0, $nophperrors=0, $nohook=0, $object=null, $allowdotdot=false, $indexdatabase=1, $nolog=0)
Remove a file or several files with a mask.
Definition: files.lib.php:1261
Categorie\get_all_categories
get_all_categories($type=null, $parent=false)
Returns all categories.
Definition: categorie.class.php:1252
get_exdir
get_exdir($num, $level, $alpha, $withoutslash, $object, $modulepart='')
Return a path to have a the directory according to object where files are stored.
Definition: functions.lib.php:6757
Categorie\add_type
add_type($obj, $type='')
Link an object to the category.
Definition: categorie.class.php:700
dol_move_uploaded_file
dol_move_uploaded_file($src_file, $dest_file, $allowoverwrite, $disablevirusscan=0, $uploaderrorcode=0, $nohook=0, $varfiles='addedfile', $upload_dir='')
Make control on an uploaded file from an GUI page and move it to final destination.
Definition: files.lib.php:1124
getEntity
getEntity($element, $shared=1, $currentobject=null)
Get list of entity id to use.
Definition: functions.lib.php:190
CommonObject\insertExtraFields
insertExtraFields($trigger='', $userused=null)
Add/Update all extra fields values for the current object.
Definition: commonobject.class.php:6229
Categorie\getFilterSelectQuery
static getFilterSelectQuery($type, $rowIdName, $searchList)
Return the addtional SQL SELECT query for filtering a list by a category.
Definition: categorie.class.php:2012
dol_syslog
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
Definition: functions.lib.php:1639
Categorie\getObjectsInCateg
getObjectsInCateg($type, $onlyids=0, $limit=0, $offset=0, $sortfield='', $sortorder='ASC')
Return list of fetched instance of elements having this category.
Definition: categorie.class.php:851
CommonObject\fetch_optionals
fetch_optionals($rowid=null, $optionsArray=null)
Function to get extra fields of an object into $this->array_options This method is in most cases call...
Definition: commonobject.class.php:6080
Categorie\setMultiLangs
setMultiLangs($user)
Update ou cree les traductions des infos produits.
Definition: categorie.class.php:1838
Categorie\print_all_ways
print_all_ways($sep='&gt;&gt;', $url='', $nocolor=0, $addpicto=0)
Returns the path of the category, with the names of the categories separated by $sep (" >> " by defau...
Definition: categorie.class.php:1356
Categorie\getMapList
getMapList()
Get map list.
Definition: categorie.class.php:303
Categorie\getNomUrl
getNomUrl($withpicto=0, $option='', $maxlength=0, $moreparam='')
Return name and link of category (with picto) Use ->id, ->ref, ->label, ->color.
Definition: categorie.class.php:1628
isModEnabled
isModEnabled($module)
Is Dolibarr module enabled.
Definition: functions.lib.php:147
Categorie\rechercher
rechercher($id, $nom, $type, $exact=false, $case=false)
Returns categories whose id or name match add wildcards in the name unless $exact = true.
Definition: categorie.class.php:1551
ref
$object ref
Definition: info.php:78
Categorie\initAsSpecimen
initAsSpecimen()
Initialise an instance with random values.
Definition: categorie.class.php:1955
Categorie\containing
containing($id, $type, $mode='object')
Return list of categories (object instances or labels) linked to element of id $id and type $type Sho...
Definition: categorie.class.php:1475
User
Class to manage Dolibarr users.
Definition: user.class.php:44
Categorie\__construct
__construct($db)
Constructor.
Definition: categorie.class.php:273
CommonObject\deleteExtraFields
deleteExtraFields()
Delete all extra fields values for the current object.
Definition: commonobject.class.php:6189
Categorie\get_main_categories
get_main_categories($type=null)
Returns the top level categories (which are not child)
Definition: categorie.class.php:1290
img_object
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
Definition: functions.lib.php:4361
Categorie\add_photo
add_photo($sdir, $file)
Deplace fichier uploade sous le nom $file dans le repertoire sdir.
Definition: categorie.class.php:1691
dol_now
dol_now($mode='auto')
Return date for now.
Definition: functions.lib.php:2947
CommonObject\call_trigger
call_trigger($triggerName, $user)
Call trigger based on this instance.
Definition: commonobject.class.php:5864
dol_mkdir
dol_mkdir($dir, $dataroot='', $newmask='')
Creation of a directory (this can create recursive subdir)
Definition: functions.lib.php:6811
getDolGlobalInt
getDolGlobalInt($key, $default=0)
Return dolibarr global constant int value.
Definition: functions.lib.php:96
$nbtotalofrecords
$nbtotalofrecords
Count total nb of records.
Definition: list.php:329
colorIsLight
colorIsLight($stringcolor)
Return true if the color is light.
Definition: functions.lib.php:10611
Categorie\get_filles
get_filles()
Return direct childs id of a category into an array.
Definition: categorie.class.php:1028
CommonObject\commonReplaceThirdparty
static commonReplaceThirdparty(DoliDB $dbs, $origin_id, $dest_id, array $tables, $ignoreerrors=0)
Function used to replace a thirdparty id with another one.
Definition: commonobject.class.php:8570
Categorie\buildPathFromId
buildPathFromId($id_categ, $protection=1000)
For category id_categ and its childs available in this->cats, define property fullpath and fulllabel.
Definition: categorie.class.php:1206
type
if(preg_match('/crypted:/i', $dolibarr_main_db_pass)||!empty($dolibarr_main_db_encrypted_pass)) $conf db type
Definition: repair.php:119
Categorie\replaceThirdparty
static replaceThirdparty(DoliDB $dbs, $origin_id, $dest_id)
Function used to replace a thirdparty id with another one.
Definition: categorie.class.php:1977
Categorie\getTooltipContentArray
getTooltipContentArray($params)
getTooltipContentArray
Definition: categorie.class.php:1607
Categorie\getFilterJoinQuery
static getFilterJoinQuery($type, $rowIdName)
Return the addtional SQL JOIN query for filtering a list by a category.
Definition: categorie.class.php:1994