From f2fac96a2c6eb79189e67d5273b04b58db4394ad Mon Sep 17 00:00:00 2001 From: Tobias Sekan Date: Fri, 28 Feb 2020 16:00:23 +0100 Subject: [PATCH 1/8] Add helper functions for categories --- htdocs/categories/class/categorie.class.php | 93 +++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/htdocs/categories/class/categorie.class.php b/htdocs/categories/class/categorie.class.php index 39f94db02eb..4d1d92665b6 100644 --- a/htdocs/categories/class/categorie.class.php +++ b/htdocs/categories/class/categorie.class.php @@ -1957,4 +1957,97 @@ class Categorie extends CommonObject return CommonObject::commonReplaceThirdparty($db, $origin_id, $dest_id, $tables, 1); } + + /** + * Return a list with all selected categories of a category filter box + * + * @param string $type The categorie type (e.g Categorie::TYPE_WAREHOUSE) + * @return Array A list with all selected categories (Note: "-2" is typical "without category") + */ + public static function GetPost($type) + { + return GETPOST("search_category_".$type."_list", "array"); + } + + /** + * Return the addtional SQL JOIN query for filtering a list by a category + * + * @param string $type The categorie type (e.g Categorie::TYPE_WAREHOUSE) + * @param string $rowIdName The name of the row id inside the whole sql query (e.g. "e.rowid") + * @return string A additional SQL JOIN query + */ + public static function GetFilterJoinQuery($type, $rowIdName) + { + return " LEFT JOIN ".MAIN_DB_PREFIX."categorie_".$type." as cp" + . " ON ".$rowIdName." = cp.fk_".$type; + } + + /** + * Return the addtional SQL SELECT query for filtering a list by a category + * + * @param string $type The categorie type (e.g Categorie::TYPE_WAREHOUSE) + * @param Array $searchList A list with the selected categories + * @param string $rowIdName The name of the row id inside the whole sql query (e.g. "e.rowid") + * @return string A additional SQL SELECT query + */ + public static function GetFilterSelectQuery($type, $searchList, $rowIdName) + { + if (empty($searchList) && !is_array($searchList)) + { + return ""; + } + + foreach ($searchList as $searchCategory) + { + if (intval($searchCategory) == -2) + { + $searchCategorySqlList[] = " cp.fk_categorie IS NULL"; + } + elseif (intval($searchCategory) > 0) + { + $searchCategorySqlList[] = " ".$rowIdName + ." IN (SELECT fk_".$type." FROM ".MAIN_DB_PREFIX."categorie_".$type + ." WHERE fk_categorie = ".$searchCategory.")"; + } + } + + if (!empty($searchCategorySqlList)) + { + return " AND (".implode(' AND ', $searchCategorySqlList).")"; + } + else + { + return ""; + } + } + + /** + * Return a HTML filter box for a list filter view + * + * @param string $type The categorie type (e.g Categorie::TYPE_WAREHOUSE) + * @param Array $preSelected A list with the elements that should pre-selected + * @param Form $form The form object (need for access form functions) + * @param Translate $langs The translate object (need for access translations) + * @return string A HTML filter box (Note: selected results can get with GETPOST("search_category_".$type."_list")) + */ + public static function GetFilterBox($type, $preSelected, $form, $langs) + { + if (empty($preSelected) || !is_array($preSelected)) + { + $preSelected = array(); + } + + $htmlName = "search_category_".$type."_list"; + + $categoryArray = $form->select_all_categories($type, "", "", 64, 0, 1); + $categoryArray[-2] = "- ".$langs->trans('NotCategorized')." -"; + + $filter = ''; + $filter .= '
'; + $filter .= $langs->trans('Categories').": "; + $filter .= Form::multiselectarray($htmlName, $categoryArray, $preSelected, 0, 0, "minwidth300"); + $filter .= "
"; + + return $filter; + } } From bc8c70990087798c3f72923d2316857569f76cf7 Mon Sep 17 00:00:00 2001 From: Tobias Sekan Date: Fri, 28 Feb 2020 16:03:35 +0100 Subject: [PATCH 2/8] Add category filter for stocks --- htdocs/product/stock/list.php | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/htdocs/product/stock/list.php b/htdocs/product/stock/list.php index 491f0979409..10bbf27bcd9 100644 --- a/htdocs/product/stock/list.php +++ b/htdocs/product/stock/list.php @@ -45,6 +45,11 @@ $search_ref = GETPOST("sref", "alpha") ?GETPOST("sref", "alpha") : GETPOST("sear $search_label = GETPOST("snom", "alpha") ?GETPOST("snom", "alpha") : GETPOST("search_label", "alpha"); $search_status = GETPOST("search_status", "int"); +if (!empty($conf->categorie->enabled)) +{ + $search_category_list = Categorie::GetPost(Categorie::TYPE_WAREHOUSE); +} + // Load variable for pagination $limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : $conf->liste_limit; $sortfield = GETPOST('sortfield', 'alpha'); @@ -137,6 +142,7 @@ if (empty($reshook)) $search_status = ""; $toselect = ''; $search_array_options = array(); + $search_category_list = array(); } if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha') || GETPOST('button_search_x', 'alpha') || GETPOST('button_search.x', 'alpha') || GETPOST('button_search', 'alpha')) @@ -183,10 +189,22 @@ $reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $obje $sql .= $hookmanager->resPrint; $sql = preg_replace('/,\s*$/', '', $sql); $sql .= " FROM ".MAIN_DB_PREFIX.$object->table_element." as e"; + +if (!empty($conf->categorie->enabled)) +{ + $sql .= Categorie::GetFilterJoinQuery(Categorie::TYPE_WAREHOUSE, "e.rowid"); +} + if (is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) $sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (e.rowid = ef.fk_object)"; $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product_stock as ps ON e.rowid = ps.fk_entrepot"; $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product as p ON ps.fk_product = p.rowid"; $sql .= " WHERE e.entity IN (".getEntity('stock').")"; + +if (!empty($conf->categorie->enabled)) +{ + $sql .= Categorie::GetFilterSelectQuery(Categorie::TYPE_WAREHOUSE, $search_category_list, "e.rowid"); +} + if ($search_ref) $sql .= natural_search("e.ref", $search_ref); // ref if ($search_label) $sql .= natural_search("e.lieu", $search_label); // label if ($search_status != '' && $search_status >= 0) $sql .= " AND e.statut = ".$search_status; @@ -313,6 +331,12 @@ if ($search_all) } $moreforfilter = ''; + +if (!empty($conf->categorie->enabled)) +{ + $moreforfilter .= Categorie::GetFilterBox(Categorie::TYPE_WAREHOUSE, $search_category_list, $form, $langs); +} + /*$moreforfilter.='
'; $moreforfilter.= $langs->trans('MyFilter') . ': '; $moreforfilter.= '
';*/ From 948ac4b99ab5293cd30a9279b92c215f3b11a50f Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Fri, 28 Feb 2020 15:10:44 +0000 Subject: [PATCH 3/8] Fixing style errors. --- htdocs/categories/class/categorie.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/categories/class/categorie.class.php b/htdocs/categories/class/categorie.class.php index 4d1d92665b6..323960d2dce 100644 --- a/htdocs/categories/class/categorie.class.php +++ b/htdocs/categories/class/categorie.class.php @@ -1957,7 +1957,7 @@ class Categorie extends CommonObject return CommonObject::commonReplaceThirdparty($db, $origin_id, $dest_id, $tables, 1); } - + /** * Return a list with all selected categories of a category filter box * From a8728f9fcfb87774b239f22035737dc4fb4c0584 Mon Sep 17 00:00:00 2001 From: Tobias Sekan Date: Fri, 28 Feb 2020 16:14:50 +0100 Subject: [PATCH 4/8] Update categorie.class.php --- htdocs/categories/class/categorie.class.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/htdocs/categories/class/categorie.class.php b/htdocs/categories/class/categorie.class.php index 323960d2dce..7731bf8d2b0 100644 --- a/htdocs/categories/class/categorie.class.php +++ b/htdocs/categories/class/categorie.class.php @@ -1961,10 +1961,10 @@ class Categorie extends CommonObject /** * Return a list with all selected categories of a category filter box * - * @param string $type The categorie type (e.g Categorie::TYPE_WAREHOUSE) + * @param string $type The category type (e.g Categorie::TYPE_WAREHOUSE) * @return Array A list with all selected categories (Note: "-2" is typical "without category") */ - public static function GetPost($type) + public static function getPost($type) { return GETPOST("search_category_".$type."_list", "array"); } @@ -1972,11 +1972,11 @@ class Categorie extends CommonObject /** * Return the addtional SQL JOIN query for filtering a list by a category * - * @param string $type The categorie type (e.g Categorie::TYPE_WAREHOUSE) + * @param string $type The category type (e.g Categorie::TYPE_WAREHOUSE) * @param string $rowIdName The name of the row id inside the whole sql query (e.g. "e.rowid") * @return string A additional SQL JOIN query */ - public static function GetFilterJoinQuery($type, $rowIdName) + public static function getFilterJoinQuery($type, $rowIdName) { return " LEFT JOIN ".MAIN_DB_PREFIX."categorie_".$type." as cp" . " ON ".$rowIdName." = cp.fk_".$type; @@ -1985,12 +1985,12 @@ class Categorie extends CommonObject /** * Return the addtional SQL SELECT query for filtering a list by a category * - * @param string $type The categorie type (e.g Categorie::TYPE_WAREHOUSE) + * @param string $type The category type (e.g Categorie::TYPE_WAREHOUSE) * @param Array $searchList A list with the selected categories * @param string $rowIdName The name of the row id inside the whole sql query (e.g. "e.rowid") * @return string A additional SQL SELECT query */ - public static function GetFilterSelectQuery($type, $searchList, $rowIdName) + public static function getFilterSelectQuery($type, $searchList, $rowIdName) { if (empty($searchList) && !is_array($searchList)) { @@ -2024,13 +2024,13 @@ class Categorie extends CommonObject /** * Return a HTML filter box for a list filter view * - * @param string $type The categorie type (e.g Categorie::TYPE_WAREHOUSE) + * @param string $type The category type (e.g Categorie::TYPE_WAREHOUSE) * @param Array $preSelected A list with the elements that should pre-selected * @param Form $form The form object (need for access form functions) * @param Translate $langs The translate object (need for access translations) * @return string A HTML filter box (Note: selected results can get with GETPOST("search_category_".$type."_list")) */ - public static function GetFilterBox($type, $preSelected, $form, $langs) + public static function getFilterBox($type, $preSelected, $form, $langs) { if (empty($preSelected) || !is_array($preSelected)) { From 0e7e6f44e2d8b7f05a116882b4ae5d64f26a61d1 Mon Sep 17 00:00:00 2001 From: Tobias Sekan Date: Fri, 28 Feb 2020 16:16:05 +0100 Subject: [PATCH 5/8] Update list.php --- htdocs/product/stock/list.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/product/stock/list.php b/htdocs/product/stock/list.php index 10bbf27bcd9..03e9940e757 100644 --- a/htdocs/product/stock/list.php +++ b/htdocs/product/stock/list.php @@ -47,7 +47,7 @@ $search_status = GETPOST("search_status", "int"); if (!empty($conf->categorie->enabled)) { - $search_category_list = Categorie::GetPost(Categorie::TYPE_WAREHOUSE); + $search_category_list = Categorie::getPost(Categorie::TYPE_WAREHOUSE); } // Load variable for pagination @@ -192,7 +192,7 @@ $sql .= " FROM ".MAIN_DB_PREFIX.$object->table_element." as e"; if (!empty($conf->categorie->enabled)) { - $sql .= Categorie::GetFilterJoinQuery(Categorie::TYPE_WAREHOUSE, "e.rowid"); + $sql .= Categorie::getFilterJoinQuery(Categorie::TYPE_WAREHOUSE, "e.rowid"); } if (is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) $sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (e.rowid = ef.fk_object)"; @@ -202,7 +202,7 @@ $sql .= " WHERE e.entity IN (".getEntity('stock').")"; if (!empty($conf->categorie->enabled)) { - $sql .= Categorie::GetFilterSelectQuery(Categorie::TYPE_WAREHOUSE, $search_category_list, "e.rowid"); + $sql .= Categorie::getFilterSelectQuery(Categorie::TYPE_WAREHOUSE, $search_category_list, "e.rowid"); } if ($search_ref) $sql .= natural_search("e.ref", $search_ref); // ref @@ -334,7 +334,7 @@ $moreforfilter = ''; if (!empty($conf->categorie->enabled)) { - $moreforfilter .= Categorie::GetFilterBox(Categorie::TYPE_WAREHOUSE, $search_category_list, $form, $langs); + $moreforfilter .= Categorie::getFilterBox(Categorie::TYPE_WAREHOUSE, $search_category_list, $form, $langs); } /*$moreforfilter.='
'; From 0e55495c3e2286d54cd8c35cf0f8c4281dd45da6 Mon Sep 17 00:00:00 2001 From: "Sekan, Tobias" Date: Sun, 1 Mar 2020 14:45:51 +0100 Subject: [PATCH 6/8] adress feedback --- htdocs/categories/class/categorie.class.php | 45 +------------- htdocs/core/class/html.formcategory.class.php | 58 +++++++++++++++++++ htdocs/product/stock/list.php | 15 +++-- 3 files changed, 71 insertions(+), 47 deletions(-) create mode 100644 htdocs/core/class/html.formcategory.class.php diff --git a/htdocs/categories/class/categorie.class.php b/htdocs/categories/class/categorie.class.php index 7731bf8d2b0..12ae532e6d2 100644 --- a/htdocs/categories/class/categorie.class.php +++ b/htdocs/categories/class/categorie.class.php @@ -1958,17 +1958,6 @@ class Categorie extends CommonObject return CommonObject::commonReplaceThirdparty($db, $origin_id, $dest_id, $tables, 1); } - /** - * Return a list with all selected categories of a category filter box - * - * @param string $type The category type (e.g Categorie::TYPE_WAREHOUSE) - * @return Array A list with all selected categories (Note: "-2" is typical "without category") - */ - public static function getPost($type) - { - return GETPOST("search_category_".$type."_list", "array"); - } - /** * Return the addtional SQL JOIN query for filtering a list by a category * @@ -1986,11 +1975,11 @@ class Categorie extends CommonObject * Return the addtional SQL SELECT query for filtering a list by a category * * @param string $type The category type (e.g Categorie::TYPE_WAREHOUSE) - * @param Array $searchList A list with the selected categories * @param string $rowIdName The name of the row id inside the whole sql query (e.g. "e.rowid") + * @param Array $searchList A list with the selected categories * @return string A additional SQL SELECT query */ - public static function getFilterSelectQuery($type, $searchList, $rowIdName) + public static function getFilterSelectQuery($type, $rowIdName, $searchList) { if (empty($searchList) && !is_array($searchList)) { @@ -2020,34 +2009,4 @@ class Categorie extends CommonObject return ""; } } - - /** - * Return a HTML filter box for a list filter view - * - * @param string $type The category type (e.g Categorie::TYPE_WAREHOUSE) - * @param Array $preSelected A list with the elements that should pre-selected - * @param Form $form The form object (need for access form functions) - * @param Translate $langs The translate object (need for access translations) - * @return string A HTML filter box (Note: selected results can get with GETPOST("search_category_".$type."_list")) - */ - public static function getFilterBox($type, $preSelected, $form, $langs) - { - if (empty($preSelected) || !is_array($preSelected)) - { - $preSelected = array(); - } - - $htmlName = "search_category_".$type."_list"; - - $categoryArray = $form->select_all_categories($type, "", "", 64, 0, 1); - $categoryArray[-2] = "- ".$langs->trans('NotCategorized')." -"; - - $filter = ''; - $filter .= '
'; - $filter .= $langs->trans('Categories').": "; - $filter .= Form::multiselectarray($htmlName, $categoryArray, $preSelected, 0, 0, "minwidth300"); - $filter .= "
"; - - return $filter; - } } diff --git a/htdocs/core/class/html.formcategory.class.php b/htdocs/core/class/html.formcategory.class.php new file mode 100644 index 00000000000..91a4d72cf42 --- /dev/null +++ b/htdocs/core/class/html.formcategory.class.php @@ -0,0 +1,58 @@ + + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file htdocs/core/class/html.formcategory.class.php + * \ingroup core + * \brief File of class to build HTML component for category filtering + */ + +require_once DOL_DOCUMENT_ROOT.'/core/class/html.form.class.php'; + +class FormCategory extends Form +{ + /** + * Return a HTML filter box for a list filter view + * + * @param string $type The categorie type (e.g Categorie::TYPE_WAREHOUSE) + * @param Array $preSelected A list with the elements that should pre-selected + * @return string A HTML filter box (Note: selected results can get with GETPOST("search_category_".$type."_list")) + */ + public function GetFilterBox($type, $preSelected) + { + // phpcs:enable + global $langs; + + if (empty($preSelected) || !is_array($preSelected)) + { + $preSelected = array(); + } + + $htmlName = "search_category_".$type."_list"; + + $categoryArray = $this->select_all_categories($type, "", "", 64, 0, 1); + $categoryArray[-2] = "- ".$langs->trans('NotCategorized')." -"; + + $filter = ''; + $filter .= '
'; + $filter .= $langs->trans('Categories').": "; + $filter .= Form::multiselectarray($htmlName, $categoryArray, $preSelected, 0, 0, "minwidth300"); + $filter .= "
"; + + return $filter; + } +} \ No newline at end of file diff --git a/htdocs/product/stock/list.php b/htdocs/product/stock/list.php index 03e9940e757..2b6ec559b71 100644 --- a/htdocs/product/stock/list.php +++ b/htdocs/product/stock/list.php @@ -3,6 +3,7 @@ * Copyright (C) 2004-2016 Laurent Destailleur * Copyright (C) 2005-2014 Regis Houssin * Copyright (C) 2015 Juanjo Menent + * Copyright (C) 2020 Tobias Sekan * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -26,6 +27,12 @@ require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/product/stock/class/entrepot.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcategory.class.php'; + +if (!empty($conf->categorie->enabled)) +{ + require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php'; +} // Load translation files required by the page $langs->loadLangs(array("stocks", "other")); @@ -47,7 +54,7 @@ $search_status = GETPOST("search_status", "int"); if (!empty($conf->categorie->enabled)) { - $search_category_list = Categorie::getPost(Categorie::TYPE_WAREHOUSE); + $search_category_list = GETPOST("search_category_".Categorie::TYPE_WAREHOUSE."_list", "array"); } // Load variable for pagination @@ -164,7 +171,7 @@ if (empty($reshook)) * View */ -$form = new Form($db); +$form = new FormCategory($db); $warehouse = new Entrepot($db); $now = dol_now(); @@ -202,7 +209,7 @@ $sql .= " WHERE e.entity IN (".getEntity('stock').")"; if (!empty($conf->categorie->enabled)) { - $sql .= Categorie::getFilterSelectQuery(Categorie::TYPE_WAREHOUSE, $search_category_list, "e.rowid"); + $sql .= Categorie::getFilterSelectQuery(Categorie::TYPE_WAREHOUSE, "e.rowid", $search_category_list); } if ($search_ref) $sql .= natural_search("e.ref", $search_ref); // ref @@ -334,7 +341,7 @@ $moreforfilter = ''; if (!empty($conf->categorie->enabled)) { - $moreforfilter .= Categorie::getFilterBox(Categorie::TYPE_WAREHOUSE, $search_category_list, $form, $langs); + $moreforfilter .= $form->GetFilterBox(Categorie::TYPE_WAREHOUSE, $search_category_list); } /*$moreforfilter.='
'; From a6b2531fd0ab465a99dcec4d1d616e984aa6e0ba Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Sun, 1 Mar 2020 13:46:49 +0000 Subject: [PATCH 7/8] Fixing style errors. --- htdocs/categories/class/categorie.class.php | 2 +- htdocs/core/class/html.formcategory.class.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/categories/class/categorie.class.php b/htdocs/categories/class/categorie.class.php index 12ae532e6d2..adf26d2b5d6 100644 --- a/htdocs/categories/class/categorie.class.php +++ b/htdocs/categories/class/categorie.class.php @@ -1979,7 +1979,7 @@ class Categorie extends CommonObject * @param Array $searchList A list with the selected categories * @return string A additional SQL SELECT query */ - public static function getFilterSelectQuery($type, $rowIdName, $searchList) + public static function getFilterSelectQuery($type, $rowIdName, $searchList) { if (empty($searchList) && !is_array($searchList)) { diff --git a/htdocs/core/class/html.formcategory.class.php b/htdocs/core/class/html.formcategory.class.php index 91a4d72cf42..2f83915c5c2 100644 --- a/htdocs/core/class/html.formcategory.class.php +++ b/htdocs/core/class/html.formcategory.class.php @@ -55,4 +55,4 @@ class FormCategory extends Form return $filter; } -} \ No newline at end of file +} From 754058b9900384fe69b421c91301e5aac80f0bd4 Mon Sep 17 00:00:00 2001 From: "Sekan, Tobias" Date: Sun, 1 Mar 2020 14:50:22 +0100 Subject: [PATCH 8/8] Fix lint errors --- htdocs/core/class/html.formcategory.class.php | 2 +- htdocs/product/stock/list.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/class/html.formcategory.class.php b/htdocs/core/class/html.formcategory.class.php index 91a4d72cf42..312ec50b67a 100644 --- a/htdocs/core/class/html.formcategory.class.php +++ b/htdocs/core/class/html.formcategory.class.php @@ -32,7 +32,7 @@ class FormCategory extends Form * @param Array $preSelected A list with the elements that should pre-selected * @return string A HTML filter box (Note: selected results can get with GETPOST("search_category_".$type."_list")) */ - public function GetFilterBox($type, $preSelected) + public function getFilterBox($type, $preSelected) { // phpcs:enable global $langs; diff --git a/htdocs/product/stock/list.php b/htdocs/product/stock/list.php index 2b6ec559b71..8f8ca7ad283 100644 --- a/htdocs/product/stock/list.php +++ b/htdocs/product/stock/list.php @@ -341,7 +341,7 @@ $moreforfilter = ''; if (!empty($conf->categorie->enabled)) { - $moreforfilter .= $form->GetFilterBox(Categorie::TYPE_WAREHOUSE, $search_category_list); + $moreforfilter .= $form->getFilterBox(Categorie::TYPE_WAREHOUSE, $search_category_list); } /*$moreforfilter.='
';