37require_once DOL_DOCUMENT_ROOT.
'/core/class/commonobject.class.php';
38require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
39require_once DOL_DOCUMENT_ROOT.
'/ticket/class/ticket.class.php';
40require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.class.php';
41require_once DOL_DOCUMENT_ROOT.
'/contact/class/contact.class.php';
42require_once DOL_DOCUMENT_ROOT.
'/knowledgemanagement/class/knowledgerecord.class.php';
51 const TYPE_PRODUCT =
'product';
52 const TYPE_SUPPLIER =
'supplier';
53 const TYPE_CUSTOMER =
'customer';
54 const TYPE_MEMBER =
'member';
55 const TYPE_CONTACT =
'contact';
56 const TYPE_USER =
'user';
57 const TYPE_PROJECT =
'project';
58 const TYPE_ACCOUNT =
'bank_account';
59 const TYPE_BANK_LINE =
'bank_line';
60 const TYPE_WAREHOUSE =
'warehouse';
61 const TYPE_ACTIONCOMM =
'actioncomm';
62 const TYPE_WEBSITE_PAGE =
'website_page';
63 const TYPE_TICKET =
'ticket';
64 const TYPE_KNOWLEDGEMANAGEMENT =
'knowledgemanagement';
69 public $picto =
'category';
75 protected $MAP_ID = array(
89 'knowledgemanagement' => 13
97 public static $MAP_ID_TO_CODE = array(
109 11 =>
'website_page',
111 13 =>
'knowledgemanagement'
119 public $MAP_CAT_FK = array(
122 'contact' =>
'socpeople',
123 'bank_account' =>
'account',
131 public $MAP_CAT_TABLE = array(
132 'customer' =>
'societe',
133 'supplier' =>
'fournisseur',
134 'bank_account' =>
'account',
142 public $MAP_OBJ_CLASS = array(
143 'product' =>
'Product',
144 'customer' =>
'Societe',
145 'supplier' =>
'Fournisseur',
146 'member' =>
'Adherent',
147 'contact' =>
'Contact',
149 'account' =>
'Account',
150 'bank_account' =>
'Account',
151 'project' =>
'Project',
152 'warehouse' =>
'Entrepot',
153 'actioncomm' =>
'ActionComm',
154 'website_page' =>
'WebsitePage',
155 'ticket' =>
'Ticket',
156 'knowledgemanagement' =>
'KnowledgeRecord'
164 public static $MAP_TYPE_TITLE_AREA = array(
165 'product' =>
'ProductsCategoriesArea',
166 'customer' =>
'CustomersCategoriesArea',
167 'supplier' =>
'SuppliersCategoriesArea',
168 'member' =>
'MembersCategoriesArea',
169 'contact' =>
'ContactsCategoriesArea',
170 'user' =>
'UsersCategoriesArea',
171 'account' =>
'AccountsCategoriesArea',
172 'bank_account' =>
'AccountsCategoriesArea',
173 'project' =>
'ProjectsCategoriesArea',
174 'warehouse' =>
'StocksCategoriesArea',
175 'actioncomm' =>
'ActioncommCategoriesArea',
176 'website_page' =>
'WebsitePageCategoriesArea',
177 'ticket' =>
'TicketCategoriesArea',
178 'knowledgemanagement' =>
'KnowledgemanagementCategoriesArea'
185 public $MAP_OBJ_TABLE = array(
186 'customer' =>
'societe',
187 'supplier' =>
'societe',
188 'member' =>
'adherent',
189 'contact' =>
'socpeople',
190 'account' =>
'bank_account',
191 'project' =>
'projet',
192 'warehouse' =>
'entrepot',
193 'knowledgemanagement' =>
'knowledgemanagement_knowledgerecord'
199 public $element =
'category';
204 public $table_element =
'categorie';
263 public $cats = array();
268 public $motherof = array();
273 public $childs = array();
290 public $fields = array(
291 "rowid" => array(
"type" =>
"integer",
"label" =>
"TechnicalID",
"enabled" =>
"1",
'position' => 10,
'notnull' => 1,
"visible" =>
"-1",),
292 "fk_parent" => array(
"type" =>
"integer",
"label" =>
"Fkparent",
"enabled" =>
"1",
'position' => 20,
'notnull' => 1,
"visible" =>
"-1",
"css" =>
"maxwidth500 widthcentpercentminusxx",),
293 "label" => array(
"type" =>
"varchar(180)",
"label" =>
"Label",
"enabled" =>
"1",
'position' => 25,
'notnull' => 1,
"visible" =>
"-1",
"alwayseditable" =>
"1",
"css" =>
"minwidth300",
"cssview" =>
"wordbreak",
"csslist" =>
"tdoverflowmax150",),
294 "ref_ext" => array(
"type" =>
"varchar(255)",
"label" =>
"Refext",
"enabled" =>
"1",
'position' => 30,
'notnull' => 0,
"visible" =>
"0",
"alwayseditable" =>
"1",),
295 "type" => array(
"type" =>
"integer",
"label" =>
"Type",
"enabled" =>
"1",
'position' => 35,
'notnull' => 1,
"visible" =>
"-1",
"alwayseditable" =>
"1",),
296 "description" => array(
"type" =>
"text",
"label" =>
"Description",
"enabled" =>
"1",
'position' => 40,
'notnull' => 0,
"visible" =>
"-1",
"alwayseditable" =>
"1",),
297 "color" => array(
"type" =>
"varchar(8)",
"label" =>
"Color",
"enabled" =>
"1",
'position' => 45,
'notnull' => 0,
"visible" =>
"-1",
"alwayseditable" =>
"1",),
298 "position" => array(
"type" =>
"integer",
"label" =>
"Position",
"enabled" =>
"1",
'position' => 50,
'notnull' => 0,
"visible" =>
"-1",
"alwayseditable" =>
"1",),
299 "fk_soc" => array(
"type" =>
"integer:Societe:societe/class/societe.class.php",
"label" =>
"ThirdParty",
"picto" =>
"company",
"enabled" =>
"1",
'position' => 55,
'notnull' => 0,
"visible" =>
"-1",
"alwayseditable" =>
"1",
"css" =>
"maxwidth500 widthcentpercentminusxx",
"csslist" =>
"tdoverflowmax150",),
300 "visible" => array(
"type" =>
"integer",
"label" =>
"Visible",
"enabled" =>
"1",
'position' => 60,
'notnull' => 1,
"visible" =>
"-1",
"alwayseditable" =>
"1",),
301 "import_key" => array(
"type" =>
"varchar(14)",
"label" =>
"ImportId",
"enabled" =>
"1",
'position' => 900,
'notnull' => 0,
"visible" =>
"-2",
"alwayseditable" =>
"1",),
302 "date_creation" => array(
"type" =>
"datetime",
"label" =>
"Datecreation",
"enabled" =>
"1",
'position' => 70,
'notnull' => 0,
"visible" =>
"-1",
"alwayseditable" =>
"1",),
303 "tms" => array(
"type" =>
"timestamp",
"label" =>
"DateModification",
"enabled" =>
"1",
'position' => 75,
'notnull' => 1,
"visible" =>
"-1",
"alwayseditable" =>
"1",),
304 "fk_user_creat" => array(
"type" =>
"integer:User:user/class/user.class.php",
"label" =>
"UserAuthor",
"enabled" =>
"1",
'position' => 80,
'notnull' => 0,
"visible" =>
"-2",
"alwayseditable" =>
"1",
"css" =>
"maxwidth500 widthcentpercentminusxx",
"csslist" =>
"tdoverflowmax150",),
305 "fk_user_modif" => array(
"type" =>
"integer:User:user/class/user.class.php",
"label" =>
"UserModif",
"enabled" =>
"1",
'position' => 85,
'notnull' => -1,
"visible" =>
"-2",
"alwayseditable" =>
"1",
"css" =>
"maxwidth500 widthcentpercentminusxx",
"csslist" =>
"tdoverflowmax150",),
319 if (is_object($hookmanager)) {
320 $hookmanager->initHooks(array(
'category'));
321 $parameters = array();
322 $reshook = $hookmanager->executeHooks(
'constructCategory', $parameters, $this);
323 if ($reshook >= 0 && !empty($hookmanager->resArray)) {
324 foreach ($hookmanager->resArray as $mapList) {
325 $mapId = $mapList[
'id'];
326 $mapCode = $mapList[
'code'];
327 self::$MAP_ID_TO_CODE[$mapId] = $mapCode;
328 $this->MAP_ID[$mapCode] = $mapId;
329 $this->MAP_CAT_FK[$mapCode] = isset($mapList[
'cat_fk']) ? $mapList[
'cat_fk'] :
null;
330 $this->MAP_CAT_TABLE[$mapCode] = isset($mapList[
'cat_table']) ? $mapList[
'cat_table'] :
null;
331 $this->MAP_OBJ_CLASS[$mapCode] = $mapList[
'obj_class'];
332 $this->MAP_OBJ_TABLE[$mapCode] = $mapList[
'obj_table'];
347 foreach ($this->MAP_ID as $mapCode => $mapId) {
351 'cat_fk' => (empty($this->MAP_CAT_FK[$mapCode]) ? $mapCode : $this->MAP_CAT_FK[$mapCode]),
352 'cat_table' => (empty($this->MAP_CAT_TABLE[$mapCode]) ? $mapCode : $this->MAP_CAT_TABLE[$mapCode]),
353 'obj_class' => (empty($this->MAP_OBJ_CLASS[$mapCode]) ? $mapCode : $this->MAP_OBJ_CLASS[$mapCode]),
354 'obj_table' => (empty($this->MAP_OBJ_TABLE[$mapCode]) ? $mapCode : $this->MAP_OBJ_TABLE[$mapCode])
370 public function fetch($id, $label =
'', $type =
null, $ref_ext =
'')
373 if (empty($id) && empty($label) && empty($ref_ext)) {
374 $this->error =
"No category to search for";
377 if (!is_null($type) && !is_numeric($type)) {
378 $type = $this->MAP_ID[$type];
381 $sql =
"SELECT rowid, fk_parent, entity, label, description, color, position, fk_soc, visible, type, ref_ext";
382 $sql .=
", date_creation, tms, fk_user_creat, fk_user_modif";
383 $sql .=
" FROM ".MAIN_DB_PREFIX.
"categorie";
385 $sql .=
" WHERE rowid = ".((int) $id);
386 } elseif (!empty($ref_ext)) {
387 $sql .=
" WHERE ref_ext LIKE '".$this->db->escape($ref_ext).
"'";
389 $sql .=
" WHERE label = '".$this->db->escape($label).
"' AND entity IN (".
getEntity(
'category').
")";
390 if (!is_null($type)) {
391 $sql .=
" AND type = ".((int) $type);
395 dol_syslog(get_class($this).
"::fetch", LOG_DEBUG);
396 $resql = $this->db->query($sql);
398 if ($this->db->num_rows($resql) > 0 && $res = $this->db->fetch_array($resql)) {
399 $this->
id = $res[
'rowid'];
401 $this->fk_parent = (int) $res[
'fk_parent'];
402 $this->label = $res[
'label'];
404 $this->color = $res[
'color'];
406 $this->socid = (int) $res[
'fk_soc'];
407 $this->visible = (int) $res[
'visible'];
408 $this->
type = $res[
'type'];
409 $this->ref_ext = $res[
'ref_ext'];
410 $this->entity = (int) $res[
'entity'];
411 $this->date_creation = $this->db->jdate($res[
'date_creation']);
412 $this->date_modification = $this->db->jdate($res[
'tms']);
413 $this->user_creation_id = (int) $res[
'fk_user_creat'];
414 $this->user_modification_id = (int) $res[
'fk_user_modif'];
420 $this->db->free($resql);
429 $this->error =
"No category found";
434 $this->error = $this->db->lasterror;
435 $this->errors[] = $this->db->lasterror;
450 public function create($user, $notrigger = 0)
452 global $conf, $langs, $hookmanager;
453 $langs->load(
'categories');
457 if (!is_numeric($type)) {
458 $type = $this->MAP_ID[$type];
463 dol_syslog(get_class($this).
'::create', LOG_DEBUG);
466 $this->label = trim($this->label);
468 $this->color = trim($this->color);
470 $this->import_key = trim($this->import_key);
471 $this->ref_ext = trim($this->ref_ext);
472 if (empty($this->visible)) {
475 $this->fk_parent = ($this->fk_parent !=
"" ? intval($this->fk_parent) : 0);
478 $this->error = $langs->trans(
"ImpossibleAddCat", $this->label);
479 $this->error .=
" : ".$langs->trans(
"CategoryExistsAtSameLevel");
486 $sql =
"INSERT INTO ".MAIN_DB_PREFIX.
"categorie (";
487 $sql .=
"fk_parent,";
489 $sql .=
" description,";
491 $sql .=
" position,";
497 $sql .=
" import_key,";
500 $sql .=
" date_creation,";
501 $sql .=
" fk_user_creat";
502 $sql .=
") VALUES (";
503 $sql .= (int) $this->fk_parent.
",";
504 $sql .=
"'".$this->db->escape($this->label).
"', ";
505 $sql .=
"'".$this->db->escape($this->
description).
"', ";
506 $sql .=
"'".$this->db->escape($this->color).
"', ";
509 $sql .= ($this->socid > 0 ? $this->socid :
'null').
", ";
511 $sql .=
"'".$this->db->escape($this->visible).
"', ";
512 $sql .= ((int) $type).
", ";
513 $sql .= (!empty($this->import_key) ?
"'".$this->db->escape($this->import_key).
"'" :
'null').
", ";
514 $sql .= (!empty($this->ref_ext) ?
"'".$this->db->escape($this->ref_ext).
"'" :
'null').
", ";
515 $sql .= (int) $conf->entity.
", ";
516 $sql .=
"'".$this->db->idate($now).
"', ";
517 $sql .= (int) $user->id;
520 $res = $this->db->query($sql);
522 $id = $this->db->last_insert_id(MAIN_DB_PREFIX.
"categorie");
537 if (!$error && !$notrigger) {
539 $result = $this->
call_trigger(
'CATEGORY_CREATE', $user);
550 $this->db->rollback();
554 $this->db->rollback();
558 $this->error = $this->db->error();
559 $this->db->rollback();
580 $this->label = trim($this->label);
582 $this->ref_ext = trim($this->ref_ext);
583 $this->fk_parent = ($this->fk_parent !=
"" ? intval($this->fk_parent) : 0);
584 $this->visible = ($this->visible !=
"" ? intval($this->visible) : 0);
587 $this->error = $langs->trans(
"ImpossibleUpdateCat");
588 $this->error .=
" : ".$langs->trans(
"CategoryExistsAtSameLevel");
594 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"categorie";
595 $sql .=
" SET label = '".$this->db->escape($this->label).
"',";
596 $sql .=
" description = '".$this->db->escape($this->
description).
"',";
597 $sql .=
" ref_ext = '".$this->db->escape($this->ref_ext).
"',";
598 $sql .=
" color = '".$this->db->escape($this->color).
"'";
599 $sql .=
", position = ".(int) $this->
position;
601 $sql .=
", fk_soc = ".($this->socid > 0 ? $this->socid :
'null');
603 $sql .=
", visible = ".(int) $this->visible;
604 $sql .=
", fk_parent = ".(int) $this->fk_parent;
605 $sql .=
", fk_user_modif = ".(int) $user->id;
606 $sql .=
" WHERE rowid = ".((int) $this->
id);
608 dol_syslog(get_class($this).
"::update", LOG_DEBUG);
609 if ($this->db->query($sql)) {
620 if (!$error && !$notrigger) {
622 $result = $this->
call_trigger(
'CATEGORY_MODIFY', $user);
633 $this->db->rollback();
637 $this->db->rollback();
650 public function delete($user, $notrigger = 0)
655 $this->fk_parent = ($this->fk_parent !=
"" ? intval($this->fk_parent) : 0);
661 if (!$error && !$notrigger) {
663 $result = $this->
call_trigger(
'CATEGORY_DELETE', $user);
672 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"categorie";
673 $sql .=
" SET fk_parent = ".((int) $this->fk_parent);
674 $sql .=
" WHERE fk_parent = ".((int) $this->
id);
676 if (!$this->db->query($sql)) {
677 $this->error = $this->db->lasterror();
682 $arraydelete = array(
683 'categorie_account' =>
'fk_categorie',
684 'categorie_actioncomm' =>
'fk_categorie',
685 'categorie_contact' =>
'fk_categorie',
686 'categorie_fournisseur' =>
'fk_categorie',
687 'categorie_knowledgemanagement' => array(
'field' =>
'fk_categorie',
'enabled' => isModEnabled(
'knowledgemanagement')),
688 'categorie_member' =>
'fk_categorie',
689 'categorie_user' =>
'fk_categorie',
690 'categorie_product' =>
'fk_categorie',
691 'categorie_project' =>
'fk_categorie',
692 'categorie_societe' =>
'fk_categorie',
693 'categorie_ticket' => array(
'field' =>
'fk_categorie',
'enabled' => isModEnabled(
'ticket')),
694 'categorie_warehouse' =>
'fk_categorie',
695 'categorie_website_page' => array(
'field' =>
'fk_categorie',
'enabled' => isModEnabled(
'website')),
696 'category_bankline' =>
'fk_categ',
697 'categorie_lang' =>
'fk_category',
698 'categorie' =>
'rowid',
700 foreach ($arraydelete as $key => $value) {
701 if (is_array($value)) {
702 if (empty($value[
'enabled'])) {
705 $value = $value[
'field'];
707 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.$key;
708 $sql .=
" WHERE ".$value.
" = ".((int) $this->
id);
709 if (!$this->db->query($sql)) {
710 $this->errors[] = $this->db->lasterror();
711 dol_syslog(
"Error sql=".$sql.
" ".$this->error, LOG_ERR);
721 dol_syslog(get_class($this).
"::delete erreur ".$this->error, LOG_ERR);
729 $this->db->rollback();
750 if ($this->
id == -1) {
755 $type = $obj->element;
758 dol_syslog(get_class($this).
'::add_type', LOG_DEBUG);
762 $sql =
"INSERT INTO ".MAIN_DB_PREFIX.
"categorie_".(empty($this->MAP_CAT_TABLE[$type]) ? $type : $this->MAP_CAT_TABLE[$type]);
763 $sql .=
" (fk_categorie, fk_".(empty($this->MAP_CAT_FK[$type]) ? $type : $this->MAP_CAT_FK[$type]).
")";
764 $sql .=
" VALUES (".((int) $this->
id).
", ".((int) $obj->id).
")";
766 if ($this->db->query($sql)) {
768 $sql =
'SELECT fk_parent FROM '.MAIN_DB_PREFIX.
'categorie';
769 $sql .=
" WHERE rowid = ".((int) $this->
id);
771 dol_syslog(get_class($this).
"::add_type", LOG_DEBUG);
772 $resql = $this->db->query($sql);
774 if ($this->db->num_rows($resql) > 0) {
775 $objparent = $this->db->fetch_object($resql);
777 if (!empty($objparent->fk_parent)) {
779 $cat->id = $objparent->fk_parent;
780 if (!$cat->containsObject($type, $obj->id)) {
781 $result = $cat->add_type($obj, $type);
783 $this->error = $cat->error;
791 $this->error = $this->db->lasterror();
795 $this->db->rollback();
801 $this->context = array(
'linkto' => $obj);
812 $this->db->rollback();
816 $this->db->rollback();
817 if ($this->db->lasterrno() ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
818 $this->error = $this->db->lasterrno();
821 $this->error = $this->db->lasterror();
844 if ($type ==
'societe') {
846 dol_syslog(get_class($this).
"::del_type(): type 'societe' is deprecated, please use 'customer' instead", LOG_WARNING);
847 } elseif ($type ==
'fournisseur') {
849 dol_syslog(get_class($this).
"::del_type(): type 'fournisseur' is deprecated, please use 'supplier' instead", LOG_WARNING);
854 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"categorie_".(empty($this->MAP_CAT_TABLE[$type]) ? $type : $this->MAP_CAT_TABLE[$type]);
855 $sql .=
" WHERE fk_categorie = ".((int) $this->
id);
856 $sql .=
" AND fk_".(empty($this->MAP_CAT_FK[$type]) ? $type : $this->MAP_CAT_FK[$type]).
" = ".((
int) $obj->id);
858 dol_syslog(get_class($this).
'::del_type', LOG_DEBUG);
859 if ($this->db->query($sql)) {
861 $this->context = array(
'unlinkoff' => $obj);
862 $result = $this->
call_trigger(
'CATEGORY_UNLINK', $user);
872 $this->db->rollback();
876 $this->db->rollback();
877 $this->error = $this->db->lasterror();
899 public function getObjectsInCateg($type, $onlyids = 0, $limit = 0, $offset = 0, $sortfield =
'', $sortorder =
'ASC', $filter =
'', $filtermode =
'AND', $filterlang =
'')
905 $classnameforobj = $this->MAP_OBJ_CLASS[$type];
906 $obj =
new $classnameforobj($this->db);
908 $sql =
"SELECT c.fk_".(empty($this->MAP_CAT_FK[$type]) ? $type : $this->MAP_CAT_FK[$type]).
" as fk_object";
909 $sql .=
" FROM ".MAIN_DB_PREFIX.
"categorie_".(empty($this->MAP_CAT_TABLE[$type]) ? $type : $this->MAP_CAT_TABLE[$type]).
" as c";
910 $sql .=
", ".MAIN_DB_PREFIX.(empty($this->MAP_OBJ_TABLE[$type]) ? $type : $this->MAP_OBJ_TABLE[$type]).
" as o";
911 if (!empty($filterlang)) {
912 $sql .=
", ".MAIN_DB_PREFIX.(empty($this->MAP_OBJ_TABLE[$type]) ? $type : $this->MAP_OBJ_TABLE[$type]).
"_lang as ol";
914 $sql .=
" WHERE o.entity IN (".getEntity($obj->element).
")";
915 $sql .=
" AND c.fk_categorie = ".((int) $this->
id);
917 if ((array_key_exists($type, $this->MAP_OBJ_TABLE) && $this->MAP_OBJ_TABLE[$type] ==
"actioncomm") || $type ==
"actioncomm") {
918 $sql .=
" AND c.fk_".(empty($this->MAP_CAT_FK[$type]) ? $type : $this->MAP_CAT_FK[$type]).
" = o.id";
920 $sql .=
" AND c.fk_".(empty($this->MAP_CAT_FK[$type]) ? $type : $this->MAP_CAT_FK[$type]).
" = o.rowid";
922 if (!empty($filterlang)) {
923 $sql .=
" AND ol.fk_".(empty($this->MAP_OBJ_TABLE[$type]) ? $type : $this->MAP_OBJ_TABLE[$type]).
" = o.rowid";
924 $sql .=
" AND ol.lang = '".$this->db->escape($filterlang).
"'";
927 if (($type ==
'customer' || $type ==
'supplier') && $user->socid > 0) {
928 $sql .=
" AND o.rowid = ".((int) $user->socid);
934 $this->errors[] = $errormessage;
935 dol_syslog(__METHOD__.
' '.implode(
',', $this->errors), LOG_ERR);
939 $sql .= $this->db->order($sortfield, $sortorder);
940 if ($limit > 0 || $offset > 0) {
941 $sql .= $this->db->plimit($limit + 1, $offset);
944 dol_syslog(get_class($this).
"::getObjectsInCateg", LOG_DEBUG);
946 $resql = $this->db->query($sql);
948 while ($rec = $this->db->fetch_array($resql)) {
950 $objs[] = $rec[
'fk_object'];
952 $classnameforobj = $this->MAP_OBJ_CLASS[$type];
954 $obj =
new $classnameforobj($this->db);
955 $obj->fetch($rec[
'fk_object']);
963 $this->error = $this->db->error().
' sql='.$sql;
978 $sql =
"SELECT COUNT(*) as nb FROM ".MAIN_DB_PREFIX.
"categorie_".(empty($this->MAP_CAT_TABLE[$type]) ? $type : $this->MAP_CAT_TABLE[$type]);
979 $sql .=
" WHERE fk_categorie = ".((int) $this->
id).
" AND fk_".(empty($this->MAP_CAT_FK[$type]) ? $type : $this->MAP_CAT_FK[$type]).
" = ".((
int) $object_id);
981 dol_syslog(get_class($this).
"::containsObject", LOG_DEBUG);
983 $resql = $this->db->query($sql);
985 return $this->db->fetch_object($resql)->nb;
987 $this->error = $this->db->error();
1003 public function getListForItem($id, $type =
'customer', $sortfield =
"s.rowid", $sortorder =
'ASC', $limit = 0, $page = 0)
1005 $categories = array();
1010 $subcol_name =
"fk_".$type;
1011 if ($type ==
"customer") {
1012 $sub_type =
"societe";
1013 $subcol_name =
"fk_soc";
1015 if ($type ==
"supplier") {
1016 $sub_type =
"fournisseur";
1017 $subcol_name =
"fk_soc";
1019 if ($type ==
"contact") {
1020 $subcol_name =
"fk_socpeople";
1023 $idoftype = array_search($type, self::$MAP_ID_TO_CODE);
1025 $sql =
"SELECT s.rowid";
1026 $sql .=
" FROM ".MAIN_DB_PREFIX.
"categorie as s, ".MAIN_DB_PREFIX.
"categorie_".$sub_type.
" as sub";
1027 $sql .=
' WHERE s.entity IN ('.getEntity(
'category').
')';
1028 $sql .=
' AND s.type='.((int) $idoftype);
1029 $sql .=
' AND s.rowid = sub.fk_categorie';
1030 $sql .=
" AND sub.".$subcol_name.
" = ".((int) $id);
1032 $sql .= $this->db->order($sortfield, $sortorder);
1035 $nbtotalofrecords =
'';
1037 $result = $this->db->query($sql);
1038 $nbtotalofrecords = $this->db->num_rows($result);
1039 if (($page * $limit) > $nbtotalofrecords) {
1049 $offset = $limit * $page;
1051 $sql .= $this->db->plimit($limit + 1, $offset);
1054 $result = $this->db->query($sql);
1057 $num = $this->db->num_rows($result);
1058 $min = min($num, ($limit <= 0 ? $num : $limit));
1060 $obj = $this->db->fetch_object($result);
1061 $category_static =
new Categorie($this->db);
1062 if ($category_static->fetch($obj->rowid)) {
1063 $categories[$i][
'id'] = $category_static->id;
1064 $categories[$i][
'fk_parent'] = $category_static->fk_parent;
1065 $categories[$i][
'label'] = $category_static->label;
1066 $categories[$i][
'description'] = $category_static->description;
1067 $categories[$i][
'color'] = $category_static->color;
1068 $categories[$i][
'position'] = $category_static->position;
1069 $categories[$i][
'socid'] = $category_static->socid;
1070 $categories[$i][
'ref_ext'] = $category_static->ref_ext;
1071 $categories[$i][
'visible'] = $category_static->visible;
1072 $categories[$i][
'type'] = $category_static->type;
1073 $categories[$i][
'entity'] = $category_static->entity;
1074 $categories[$i][
'array_options'] = $category_static->array_options;
1077 if (
getDolGlobalInt(
'MAIN_MULTILANGS') && isset($category_static->multilangs)) {
1078 $categories[$i][
'multilangs'] = $category_static->multilangs;
1084 $this->error = $this->db->lasterror();
1087 if (!count($categories)) {
1103 $sql =
"SELECT rowid FROM ".MAIN_DB_PREFIX.
"categorie";
1104 $sql .=
" WHERE fk_parent = ".((int) $this->
id);
1105 $sql .=
" AND entity IN (".getEntity(
'category').
")";
1107 $res = $this->db->query($sql);
1110 while ($rec = $this->db->fetch_array($res)) {
1112 $cat->fetch($rec[
'rowid']);
1131 $this->motherof = array();
1134 $sql =
"SELECT fk_parent as id_parent, rowid as id_son";
1135 $sql .=
" FROM ".MAIN_DB_PREFIX.
"categorie";
1136 $sql .=
" WHERE fk_parent != 0";
1137 $sql .=
" AND entity IN (".getEntity(
'category').
")";
1139 dol_syslog(get_class($this).
"::load_motherof", LOG_DEBUG);
1140 $resql = $this->db->query($sql);
1142 while ($obj = $this->db->fetch_object($resql)) {
1143 $this->motherof[$obj->id_son] = $obj->id_parent;
1177 if (!is_numeric($type)) {
1178 $type = $this->MAP_ID[$type];
1180 if (is_null($type)) {
1181 $this->error =
'BadValueForParameterType';
1185 if (is_string($fromid)) {
1186 $fromid = explode(
',', $fromid);
1187 } elseif (is_numeric($fromid)) {
1189 $fromid = array($fromid);
1193 } elseif (!is_array($fromid)) {
1197 $this->cats = array();
1202 $current_lang = $langs->getDefaultLang();
1205 $sql =
"SELECT DISTINCT c.rowid, c.label, c.ref_ext, c.description, c.color, c.position, c.fk_parent, c.visible";
1207 $sql .=
", t.label as label_trans, t.description as description_trans";
1209 $sql .=
" FROM ".MAIN_DB_PREFIX.
"categorie as c";
1211 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"categorie_lang as t ON t.fk_category=c.rowid AND t.lang='".$this->db->escape($current_lang).
"'";
1213 $sql .=
" WHERE c.entity IN (".getEntity(
'category').
")";
1214 $sql .=
" AND c.type = ".(int) $type;
1216 dol_syslog(get_class($this).
"::get_full_arbo get category list", LOG_DEBUG);
1217 $resql = $this->db->query($sql);
1220 $nbcateg = $this->db->num_rows($resql);
1222 while ($obj = $this->db->fetch_object($resql)) {
1223 $this->cats[$obj->rowid][
'rowid'] = $obj->rowid;
1224 $this->cats[$obj->rowid][
'id'] = $obj->rowid;
1225 $this->cats[$obj->rowid][
'fk_parent'] = $obj->fk_parent;
1226 $this->cats[$obj->rowid][
'label'] = !empty($obj->label_trans) ? $obj->label_trans : $obj->label;
1227 $this->cats[$obj->rowid][
'description'] = !empty($obj->description_trans) ? $obj->description_trans : $obj->description;
1228 $this->cats[$obj->rowid][
'color'] = $obj->color;
1229 $this->cats[$obj->rowid][
'position'] = $obj->position;
1230 $this->cats[$obj->rowid][
'visible'] = $obj->visible;
1231 $this->cats[$obj->rowid][
'ref_ext'] = $obj->ref_ext;
1232 $this->cats[$obj->rowid][
'picto'] =
'category';
1234 $this->cats[$obj->rowid][
'fullpath'] =
'';
1235 $this->cats[$obj->rowid][
'fulllabel'] =
'';
1244 dol_syslog(get_class($this).
"::get_full_arbo call to buildPathFromId", LOG_DEBUG);
1245 foreach ($this->cats as $key => $val) {
1251 if (count($fromid) > 0) {
1252 $keyfiltercatid =
'('.implode(
'|', $fromid).
')';
1255 $keyfilter1 =
'^'.$keyfiltercatid.
'$';
1256 $keyfilter2 =
'_'.$keyfiltercatid.
'$';
1257 $keyfilter3 =
'^'.$keyfiltercatid.
'_';
1258 $keyfilter4 =
'_'.$keyfiltercatid.
'_';
1259 foreach (array_keys($this->cats) as $key) {
1260 $fullpath = (string) $this->cats[$key][
'fullpath'];
1261 $test = (preg_match(
'/'.$keyfilter1.
'/', $fullpath) || preg_match(
'/'.$keyfilter2.
'/', $fullpath)
1262 || preg_match(
'/'.$keyfilter3.
'/', $fullpath) || preg_match(
'/'.$keyfilter4.
'/', $fullpath));
1264 if (($test && !$include) || (!$test && $include)) {
1265 unset($this->cats[$key]);
1270 dol_syslog(get_class($this).
"::get_full_arbo dol_sort_array", LOG_DEBUG);
1272 $this->cats =
dol_sort_array($this->cats,
'fulllabel',
'asc', 1, 0, 1);
1291 if (!empty($this->cats[$id_categ][
'fullpath'])) {
1293 dol_syslog(get_class($this).
"::buildPathFromId fullpath and fulllabel already defined", LOG_WARNING);
1303 $this->cats[$id_categ][
'fullpath'] =
'_'.$id_categ;
1304 $this->cats[$id_categ][
'fulllabel'] = $this->cats[$id_categ][
'label'];
1306 $cursor_categ = $id_categ;
1308 while ((empty($protection) || $i < $protection) && !empty($this->motherof[$cursor_categ])) {
1310 $this->cats[$id_categ][
'fullpath'] =
'_'.$this->motherof[$cursor_categ].$this->cats[$id_categ][
'fullpath'];
1311 $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'];
1314 $cursor_categ = $this->motherof[$cursor_categ];
1319 $nbunderscore = substr_count($this->cats[$id_categ][
'fullpath'],
'_');
1320 $this->cats[$id_categ][
'level'] = ($nbunderscore ? $nbunderscore :
null);
1337 if (!is_numeric($type)) {
1338 $type = $this->MAP_ID[$type];
1341 $sql =
"SELECT rowid FROM ".MAIN_DB_PREFIX.
"categorie";
1342 $sql .=
" WHERE entity IN (".getEntity(
'category').
")";
1343 if (!is_null($type)) {
1344 $sql .=
" AND type = ".(int) $type;
1347 $sql .=
" AND fk_parent = 0";
1350 $res = $this->db->query($sql);
1353 while ($rec = $this->db->fetch_array($res)) {
1355 $cat->fetch($rec[
'rowid']);
1356 $cats[$rec[
'rowid']] = $cat;
1387 $type = $this->type;
1389 if (!is_numeric($type)) {
1390 $type = $this->MAP_ID[$type];
1396 $sql =
"SELECT c.rowid";
1397 $sql .=
" FROM ".MAIN_DB_PREFIX.
"categorie as c ";
1398 $sql .=
" WHERE c.entity IN (".getEntity(
'category').
")";
1399 $sql .=
" AND c.type = ".((int) $type);
1400 $sql .=
" AND c.fk_parent = ".((int) $this->fk_parent);
1401 $sql .=
" AND c.label = '".$this->db->escape($this->label).
"'";
1403 dol_syslog(get_class($this).
"::already_exists", LOG_DEBUG);
1405 $resql = $this->db->query($sql);
1407 if ($this->db->num_rows($resql) > 0) {
1408 $obj = $this->db->fetch_object($resql);
1413 if (!empty($obj) && $obj->rowid > 0 && $obj->rowid != $this->id) {
1414 dol_syslog(get_class($this).
"::already_exists category with name=".$this->label.
" and parent ".$this->fk_parent.
" exists: rowid=".$obj->rowid.
" current_id=".$this->id, LOG_DEBUG);
1418 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);
1421 $this->error = $this->db->error();
1438 public function print_all_ways($sep =
'>>', $url =
'', $nocolor = 0, $addpicto = 0)
1444 foreach ($all_ways as $way) {
1448 foreach ($way as $cat) {
1451 if (empty($nocolor)) {
1452 $forced_color =
'colortoreplace';
1453 if ($i == count($way)) {
1455 $forced_color =
'categtextwhite';
1458 $forced_color =
'categtextblack';
1465 $link =
'<a href="'.DOL_URL_ROOT.
'/categories/viewcat.php?id='.$cat->id.
'&type='.$cat->type.
'" class="'.$forced_color.
'">';
1467 $w[] = $link.(($addpicto && $i == 1) ?
img_object(
'',
'category',
'class="paddingright"') :
'').$cat->label.$linkend;
1468 } elseif ($url ==
'none') {
1469 $link =
'<span class="'.$forced_color.
'">';
1470 $linkend =
'</span>';
1471 $w[] = $link.(($addpicto && $i == 1) ?
img_object(
'',
'category',
'class="paddingright"') :
'').$cat->label.$linkend;
1473 $w[] =
'<a class="'.$forced_color.
'" href="'.DOL_URL_ROOT.
'/'.$url.
'?catid='.$cat->id.
'">'.($addpicto ?
img_object(
'',
'category') :
'').$cat->label.
'</a>';
1476 $newcategwithpath = preg_replace(
'/colortoreplace/', $forced_color, implode(
'<span class="inline-block valignmiddle paddingleft paddingright '.$forced_color.
'">'.$sep.
'</span>', $w));
1478 $ways[] = $newcategwithpath;
1496 $sql =
"SELECT fk_parent FROM ".MAIN_DB_PREFIX.
"categorie";
1497 $sql .=
" WHERE rowid = ".((int) $this->
id);
1499 $res = $this->db->query($sql);
1502 while ($rec = $this->db->fetch_array($res)) {
1503 if ($rec[
'fk_parent'] > 0) {
1505 $cat->fetch($rec[
'fk_parent']);
1529 if (is_array($parents)) {
1530 foreach ($parents as $parent) {
1531 $all_ways = $parent->get_all_ways();
1532 foreach ($all_ways as $way) {
1540 if (count($ways) == 0) {
1541 $ways[0][0] = $this;
1561 if (is_numeric($type)) {
1562 $type = Categorie::$MAP_ID_TO_CODE[$type];
1565 if ($type === Categorie::TYPE_BANK_LINE) {
1567 $sql =
"SELECT c.label, c.rowid";
1568 $sql .=
" FROM ".MAIN_DB_PREFIX.
"category_bankline as a, ".MAIN_DB_PREFIX.
"category_bank as c";
1569 $sql .=
" WHERE a.lineid=".((int) $id).
" AND a.fk_categ = c.rowid";
1570 $sql .=
" AND c.entity IN (".getEntity(
'category').
")";
1571 $sql .=
" ORDER BY c.label";
1573 $res = $this->db->query($sql);
1575 while ($obj = $this->db->fetch_object($res)) {
1576 if ($mode ==
'id') {
1577 $cats[] = $obj->rowid;
1578 } elseif ($mode ==
'label') {
1579 $cats[] = $obj->label;
1582 $cat->id = $obj->rowid;
1583 $cat->label = $obj->label;
1592 $sql =
"SELECT ct.fk_categorie, c.label, c.rowid";
1593 $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";
1594 $sql .=
" WHERE ct.fk_categorie = c.rowid AND ct.fk_".(empty($this->MAP_CAT_FK[$type]) ? $type : $this->MAP_CAT_FK[$type]).
" = ".(
int) $id;
1598 $sql .=
" AND c.entity IN (".getEntity(
'category').
")";
1600 $res = $this->db->query($sql);
1602 while ($obj = $this->db->fetch_object($res)) {
1603 if ($mode ==
'id') {
1604 $cats[] = $obj->rowid;
1605 } elseif ($mode ==
'label') {
1606 $cats[] = $obj->label;
1609 $cat->fetch($obj->fk_categorie);
1633 public function rechercher($id, $nom, $type, $exact =
false, $case =
false)
1636 if (is_numeric($type)) {
1637 dol_syslog(__METHOD__.
': using numeric types is deprecated.', LOG_WARNING);
1643 if (is_numeric($type)) {
1645 $map_type = array_flip($this->MAP_ID);
1646 $type = $map_type[$type];
1647 dol_syslog(get_class($this).
"::rechercher(): numeric types are deprecated, please use string instead", LOG_WARNING);
1651 $sql =
"SELECT rowid FROM ".MAIN_DB_PREFIX.
"categorie";
1652 $sql .=
" WHERE type = ".((int) $this->MAP_ID[$type]);
1653 $sql .=
" AND entity IN (".getEntity(
'category').
")";
1656 $nom =
'%'.$this->db->escape(str_replace(
'*',
'%', $nom)).
'%';
1659 $sql .=
" AND label LIKE '".$this->db->escape($nom).
"'";
1661 $sql .=
" AND label LIKE BINARY '".$this->db->escape($nom).
"'";
1665 $sql .=
" AND rowid = ".((int) $id);
1668 $res = $this->db->query($sql);
1670 while ($rec = $this->db->fetch_array($res)) {
1672 $cat->fetch($rec[
'rowid']);
1678 $this->error = $this->db->error().
' sql='.$sql;
1691 include_once DOL_DOCUMENT_ROOT .
'/core/lib/files.lib.php';
1692 include_once DOL_DOCUMENT_ROOT .
'/core/lib/images.lib.php';
1694 $sdir .=
'/' .
get_exdir($this->
id, 2, 0, 0, $this,
'category') . $this->
id .
"/photos/";
1697 if (file_exists($dir_osencoded)) {
1698 $handle = opendir($dir_osencoded);
1699 if (is_resource($handle)) {
1700 while (($file = readdir($handle)) !==
false) {
1702 $file = mb_convert_encoding($file,
'UTF-8',
'ISO-8859-1');
1723 $langs->load(
'categories');
1727 $datas[
'label'] = $langs->trans(
"ShowCategory").
': '.($this->
ref ? $this->
ref : $this->label);
1745 public function getNomUrl($withpicto = 0, $option =
'', $maxlength = 0, $moreparam =
'', $notooltip = 0, $morecss =
'', $save_lastsearch_value = 0)
1747 global $conf, $langs, $hookmanager;
1749 if (!empty($conf->dol_no_mouse_hover)) {
1756 'objecttype' => $this->element,
1757 'option' => $option,
1759 $classfortooltip =
'classfortooltip';
1762 $classfortooltip =
'classforajaxtooltip';
1763 $dataparams =
' data-params="'.dol_escape_htmltag(json_encode($params)).
'"';
1769 $url = DOL_URL_ROOT.
'/categories/viewcat.php?id='.$this->
id.
'&type='.$this->
type.$moreparam.
'&backtopage='.urlencode($_SERVER[
'PHP_SELF'].($moreparam ?
'?'.$moreparam :
''));
1771 if ($option !==
'nolink') {
1773 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
1774 if ($save_lastsearch_value == -1 && isset($_SERVER[
"PHP_SELF"]) && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
1775 $add_save_lastsearch_values = 1;
1777 if ($url && $add_save_lastsearch_values) {
1778 $url .=
'&save_lastsearch_values=1';
1783 $forced_color =
'categtextwhite';
1786 $forced_color =
'categtextblack';
1791 if (empty($notooltip)) {
1793 $label = $langs->trans(
"ShowMyObject");
1794 $linkclose .=
' alt="'.dol_escape_htmltag($label, 1).
'"';
1796 $linkclose .= ($label ?
' title="'.dol_escape_htmltag($label, 1).
'"' :
' title="tocomplete"');
1797 $linkclose .= $dataparams.
' class="'.$classfortooltip.
' '.$forced_color.($morecss ?
' '.$morecss :
'').
'"';
1799 $linkclose = ($morecss ?
' class="'.$forced_color.($morecss ?
' '.$morecss :
'').
'"' :
'');
1802 if ($option ==
'nolink' || empty($url)) {
1803 $linkstart =
'<span';
1805 $linkstart =
'<a href="'.$url.
'"';
1807 $linkstart .= $linkclose.
'>';
1808 if ($option ==
'nolink' || empty($url)) {
1809 $linkend =
'</span>';
1814 $result .= $linkstart;
1817 $result .=
img_object(($notooltip ?
'' : $label), ($this->picto ? $this->picto :
'generic'), ($notooltip ? (($withpicto != 2) ?
'class="paddingright"' :
'') :
'class="'.(($withpicto != 2) ?
'paddingright ' :
'').
'"'), 0, 0, $notooltip ? 0 : 1);
1820 if ($withpicto != 2) {
1821 $result .=
dol_trunc(($this->
ref ? $this->
ref : $this->label), $maxlength);
1824 $result .= $linkend;
1827 $hookmanager->initHooks(array($this->element .
'dao'));
1828 $parameters = array(
'id' => $this->
id,
'getnomurl' => &$result);
1829 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
1831 $result = $hookmanager->resPrint;
1833 $result .= $hookmanager->resPrint;
1850 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1852 $dir = $sdir.
'/'.
get_exdir($this->
id, 2, 0, 0, $this,
'category').$this->id.
"/";
1855 if (!file_exists($dir)) {
1859 if (file_exists($dir)) {
1860 if (is_array($file[
'name'])) {
1861 $nbfile = count($file[
'name']);
1862 for ($i = 0; $i < $nbfile; $i++) {
1863 $originImage = $dir.$file[
'name'][$i];
1868 if (file_exists($originImage)) {
1874 $originImage = $dir.$file[
'name'];
1879 if (file_exists($originImage)) {
1898 include_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1903 $dirthumb = $dir.
'thumbs/';
1905 if (file_exists($dir)) {
1906 $handle = opendir($dir);
1907 if (is_resource($handle)) {
1908 while (($file = readdir($handle)) !==
false) {
1909 if (
dol_is_file($dir.$file) && preg_match(
'/(\.jpeg|\.jpg|\.bmp|\.gif|\.png|\.tiff)$/i', $dir.$file)) {
1914 $photo_vignette =
'';
1916 if (preg_match(
'/(\.jpeg|\.jpg|\.bmp|\.gif|\.png|\.tiff)$/i', $photo, $regs)) {
1917 $photo_vignette = preg_replace(
'/'.$regs[0].
'/i',
'', $photo).
'_small'.$regs[0];
1922 $obj[
'photo'] = $photo;
1923 if ($photo_vignette && is_file($dirthumb.$photo_vignette)) {
1924 $obj[
'photo_vignette'] =
'thumbs/'.$photo_vignette;
1926 $obj[
'photo_vignette'] =
"";
1929 $tabobj[$nbphoto - 1] = $obj;
1932 if ($nbmax && $nbphoto >= $nbmax) {
1955 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1957 $dir = dirname($file).
'/';
1958 $dirthumb = $dir.
'/thumbs/';
1959 $filename = preg_replace(
'/'.preg_quote($dir,
'/').
'/i',
'', $file);
1966 if (preg_match(
'/(\.jpeg|\.jpg|\.bmp|\.gif|\.png|\.tiff)$/i', $filename, $regs)) {
1967 $photo_vignette = preg_replace(
'/'.$regs[0].
'/i',
'', $filename).
'_small'.$regs[0];
1968 if (file_exists($dirthumb.$photo_vignette)) {
1984 $infoImg = getimagesize($file);
1985 $this->imgWidth = $infoImg[0];
1986 $this->imgHeight = $infoImg[1];
2001 $langs_available = $langs->get_available_languages();
2002 $current_lang = $langs->getDefaultLang();
2004 foreach ($langs_available as $key => $value) {
2005 $sql =
"SELECT rowid";
2006 $sql .=
" FROM ".MAIN_DB_PREFIX.
"categorie_lang";
2007 $sql .=
" WHERE fk_category=".((int) $this->
id);
2008 $sql .=
" AND lang = '".$this->db->escape($key).
"'";
2010 $result = $this->db->query($sql);
2012 if ($key == $current_lang) {
2014 if ($this->db->num_rows($result)) {
2015 $sql2 =
"UPDATE ".MAIN_DB_PREFIX.
"categorie_lang";
2016 $sql2 .=
" SET label = '".$this->db->escape($this->label).
"',";
2017 $sql2 .=
" description = '".$this->db->escape($this->
description).
"'";
2018 $sql2 .=
" WHERE fk_category = ".((int) $this->
id).
" AND lang = '".$this->db->escape($key).
"'";
2019 } elseif (isset($this->multilangs[$key])) {
2020 $sql2 =
"INSERT INTO ".MAIN_DB_PREFIX.
"categorie_lang (fk_category, lang, label, description)";
2021 $sql2 .=
" VALUES(".((int) $this->
id).
", '".$this->db->escape($key).
"', '".$this->db->escape($this->label).
"'";
2022 $sql2 .=
", '".$this->db->escape($this->multilangs[$key][
"description"]).
"')";
2024 dol_syslog(get_class($this).
'::setMultiLangs', LOG_DEBUG);
2025 if ($sql2 && !$this->db->query($sql2)) {
2026 $this->error = $this->db->lasterror();
2029 } elseif (isset($this->multilangs[$key])) {
2030 if ($this->db->num_rows($result)) {
2031 $sql2 =
"UPDATE ".MAIN_DB_PREFIX.
"categorie_lang";
2032 $sql2 .=
" SET label='".$this->db->escape($this->multilangs[$key][
"label"]).
"',";
2033 $sql2 .=
" description='".$this->db->escape($this->multilangs[$key][
"description"]).
"'";
2034 $sql2 .=
" WHERE fk_category=".((int) $this->
id).
" AND lang='".$this->db->escape($key).
"'";
2036 $sql2 =
"INSERT INTO ".MAIN_DB_PREFIX.
"categorie_lang (fk_category, lang, label, description)";
2037 $sql2 .=
" VALUES(".((int) $this->
id).
", '".$this->db->escape($key).
"', '".$this->db->escape($this->multilangs[$key][
"label"]).
"'";
2038 $sql2 .=
",'".$this->db->escape($this->multilangs[$key][
"description"]).
"')";
2042 if ($this->multilangs[$key][
"label"] || $this->multilangs[$key][
"description"] || $this->multilangs[$key][
"note"]) {
2043 dol_syslog(get_class($this).
'::setMultiLangs', LOG_DEBUG);
2045 if (!$this->db->query($sql2)) {
2046 $this->error = $this->db->lasterror();
2054 $result = $this->
call_trigger(
'CATEGORY_SET_MULTILANGS', $user);
2056 $this->error = $this->db->lasterror();
2074 $current_lang = $langs->getDefaultLang();
2076 $sql =
"SELECT lang, label, description";
2077 $sql .=
" FROM ".MAIN_DB_PREFIX.
"categorie_lang";
2078 $sql .=
" WHERE fk_category=".((int) $this->
id);
2080 $result = $this->db->query($sql);
2082 while ($obj = $this->db->fetch_object($result)) {
2084 if ($obj->lang == $current_lang) {
2085 $this->label = $obj->label;
2088 $this->multilangs[$obj->lang][
"label"] = $obj->label;
2089 $this->multilangs[$obj->lang][
"description"] = $obj->description;
2093 $this->error = $langs->trans(
"Error").
" : ".$this->db->error().
" - ".$sql;
2119 dol_syslog(get_class($this).
"::initAsSpecimen");
2123 $this->fk_parent = 0;
2124 $this->label =
'SPECIMEN';
2125 $this->specimen = 1;
2128 $this->
type = self::TYPE_PRODUCT;
2160 if ($type ==
'bank_account') {
2164 return " LEFT JOIN ".MAIN_DB_PREFIX.
"categorie_".$type.
" as cp ON ".$rowIdName.
" = cp.fk_".$type;
2178 if ($type ==
'bank_account') {
2181 if ($type ==
'customer') {
2184 if ($type ==
'supplier') {
2185 $type =
'fournisseur';
2188 if (empty($searchList) && !is_array($searchList)) {
2192 $searchCategorySqlList = array();
2193 foreach ($searchList as $searchCategory) {
2194 if (intval($searchCategory) == -2) {
2195 $searchCategorySqlList[] =
" cp.fk_categorie IS NULL";
2196 } elseif (intval($searchCategory) > 0) {
2197 $searchCategorySqlList[] =
" ".$rowIdName.
" IN (SELECT fk_".$type.
" FROM ".MAIN_DB_PREFIX.
"categorie_".$type.
" WHERE fk_categorie = ".((int) $searchCategory).
")";
2201 if (!empty($searchCategorySqlList)) {
2202 return " AND (".implode(
' AND ', $searchCategorySqlList).
")";
2215 dol_syslog(get_class($this).
"::count_all_categories", LOG_DEBUG);
2216 $sql =
"SELECT COUNT(rowid) FROM ".MAIN_DB_PREFIX.
"categorie";
2217 $sql .=
" WHERE entity IN (".getEntity(
'category').
")";
2219 $res = $this->db->query($sql);
2221 $obj = $this->db->fetch_object($res);
Class to manage categories.
getListForItem($id, $type='customer', $sortfield="s.rowid", $sortorder='ASC', $limit=0, $page=0)
List categories of an element id.
get_image_size($file)
Load size of image file.
load_motherof()
Load the array this->motherof that is array(id_son=>id_parent, ...)
get_full_arbo($type, $fromid=0, $include=0)
Rebuilding the category tree as an array Return an array of table('id','id_mere',....
getLibStatut($mode)
Return label of contact status.
delete_photo($file)
Efface la photo de la categorie et sa vignette.
containing($id, $type, $mode='object')
Return list of categories (object instances or labels) linked to element of id $id and type $type Sho...
getTooltipContentArray($params)
getTooltipContentArray
countNbOfCategories()
Count all categories.
del_type($obj, $type)
Delete object from category.
buildPathFromId($id_categ, $protection=1000)
For category id_categ and its children available in this->cats, define property fullpath and fulllabe...
static getFilterSelectQuery($type, $rowIdName, $searchList)
Return the additional SQL SELECT query for filtering a list by a category.
create($user, $notrigger=0)
Add category into database.
rechercher($id, $nom, $type, $exact=false, $case=false)
Returns categories whose id or name match add wildcards in the name unless $exact = true.
getMultiLangs()
Load array this->multilangs.
getObjectsInCateg($type, $onlyids=0, $limit=0, $offset=0, $sortfield='', $sortorder='ASC', $filter='', $filtermode='AND', $filterlang='')
Return list of fetched instance of elements having this category.
isAnyPhotoAvailable($sdir)
Return if at least one photo is available.
already_exists()
Check if a category with same label already exists for this cat's parent or root and for this cat's t...
get_filles()
Return direct children ids of a category into an array.
initAsSpecimen()
Initialise an instance with random values.
get_all_categories($type=null, $parent=false)
Returns all categories.
static getFilterJoinQuery($type, $rowIdName)
Return the additional SQL JOIN query for filtering a list by a category.
containsObject($type, $object_id)
Check for the presence of an object in a category.
get_main_categories($type=null)
Returns the top level categories (which are not child)
__construct($db)
Constructor.
static replaceThirdparty(DoliDB $dbs, $origin_id, $dest_id)
Function used to replace a thirdparty id with another one.
setMultiLangs(User $user, $notrigger=0)
Update ou cree les traductions des infos produits.
getMapList()
Get map list.
get_meres()
Returns an array containing the list of parent categories.
add_type($obj, $type='')
Link an object to the category.
update(User $user, $notrigger=0)
Update category.
liste_photos($dir, $nbmax=0)
Return an array with all photos inside the directory.
get_all_ways()
Returns in a table all possible paths to get to the category starting with the major categories repre...
getNomUrl($withpicto=0, $option='', $maxlength=0, $moreparam='', $notooltip=0, $morecss='', $save_lastsearch_value=0)
Return name and link of category (with picto) Use ->id, ->ref, ->label, ->color.
print_all_ways($sep='>>', $url='', $nocolor=0, $addpicto=0)
Returns the path of the category, with the names of the categories separated by $sep (" >> " by defau...
add_photo($sdir, $file)
Add the image uploaded as $file to the directory $sdir/<category>-<id>/photos/.
fetch($id, $label='', $type=null, $ref_ext='')
Load category into memory from database.
Parent class of all other business classes (invoices, contracts, proposals, orders,...
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...
deleteExtraFields()
Delete all extra fields values for the current object.
addThumbs($file)
Build thumb.
static commonReplaceThirdparty(DoliDB $dbs, $origin_id, $dest_id, array $tables, $ignoreerrors=0)
Function used to replace a thirdparty id with another one.
insertExtraFields($trigger='', $userused=null)
Add/Update all extra fields values for the current object.
call_trigger($triggerName, $user)
Call trigger based on this instance.
Class to manage Dolibarr database access.
Class to manage Dolibarr users.
print $script_file $mode $langs defaultlang(is_numeric($duration_value) ? " delay=". $duration_value :"").(is_numeric($duration_value2) ? " after cd cd cd description as description
Only used if Module[ID]Desc translation string is not found.
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.
dol_move_uploaded_file($src_file, $dest_file, $allowoverwrite, $disablevirusscan=0, $uploaderrorcode=0, $nohook=0, $varfiles='addedfile', $upload_dir='')
Check validity of a file upload from an GUI page, and move it to its final destination.
dol_is_file($pathoffile)
Return if path is a file.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
dol_osencode($str)
Return a string encoded into OS filesystem encoding.
forgeSQLFromUniversalSearchCriteria($filter, &$errorstr='', $noand=0, $nopar=0, $noerror=0)
forgeSQLFromUniversalSearchCriteria
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_sort_array(&$array, $index, $order='asc', $natsort=0, $case_sensitive=0, $keepindex=0)
Advanced sort array by the value of a given key, which produces ascending (default) or descending out...
colorIsLight($stringcolor)
Return true if the color is light.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_trunc($string, $size=40, $trunc='right', $stringencoding='UTF-8', $nodot=0, $display=0)
Truncate a string to a particular length adding '…' if string larger than length.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
sanitizeVal($out='', $check='alphanohtml', $filter=null, $options=null)
Return a sanitized or empty value after checking value against a rule.
utf8_check($str)
Check if a string is in UTF8.
get_exdir($num, $level, $alpha, $withoutslash, $object, $modulepart='')
Return a path to have a the directory according to object where files are stored.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
getEntity($element, $shared=1, $currentobject=null)
Get list of entity id to use.
dol_mkdir($dir, $dataroot='', $newmask='')
Creation of a directory (this can create recursive subdir)
image_format_supported($file, $acceptsvg=0)
Return if a filename is file name of a supported image format.
if(preg_match('/crypted:/i', $dolibarr_main_db_pass)||!empty($dolibarr_main_db_encrypted_pass)) $conf db type