From b29f325fcf6993861c5979fe361b407b8e82ad66 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 16 May 2017 23:38:23 +0200 Subject: [PATCH] Work on search criteria persistence --- htdocs/core/lib/functions.lib.php | 78 ++++++++++++++++---------- htdocs/main.inc.php | 39 +++++++++++-- htdocs/projet/class/project.class.php | 27 +++++---- htdocs/societe/class/societe.class.php | 22 +++++--- 4 files changed, 112 insertions(+), 54 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 06ed76c5008f9..141811e382bc5 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -237,8 +237,10 @@ function dol_shutdown() /** - * Return value of a param into GET or POST supervariable - * + * Return value of a param into GET or POST supervariable. + * Use the property $user->default_values[path]['creatform'] and/or $user->default_values[path]['filters'] and/or $user->default_values[path]['sortorder'] + * Note: The property $user->default_values is loaded by the main when loading the user. + * * @param string $paramname Name of parameter to found * @param string $check Type of check * ''=no check (deprecated) @@ -255,6 +257,7 @@ function dol_shutdown() * @param int $filter Filter to apply when $check is set to 'custom'. (See http://php.net/manual/en/filter.filters.php for détails) * @param mixed $options Options to pass to filter_var when $check is set to 'custom'. * @return string|string[] Value found (string or array), or '' if check fails + * * @TODO Set default value for check to alpha. Check all WYSIWYG edition (email and description...) is still ok with rich text. */ function GETPOST($paramname, $check='', $method=0, $filter=NULL, $options=NULL) @@ -270,16 +273,16 @@ function GETPOST($paramname, $check='', $method=0, $filter=NULL, $options=NULL) if (empty($method) || $method == 3 || $method == 4) { + $relativepathstring = $_SERVER["PHP_SELF"]; + if (constant('DOL_URL_ROOT')) $relativepathstring = preg_replace('/^'.preg_quote(constant('DOL_URL_ROOT'),'/').'/', '', $relativepathstring); + $relativepathstring = preg_replace('/^custom\//', '', $relativepathstring); + $relativepathstring = preg_replace('/^\//', '', $relativepathstring); + // Management of default values if (! isset($_GET['sortfield']) && ! empty($conf->global->MAIN_ENABLE_DEFAULT_VALUES)) // If we did a click on a field to sort, we do no apply default values. Same if option MAIN_DISABLE_DEFAULT_VALUES is on { if (! empty($_GET['action']) && $_GET['action'] == 'create' && ! empty($paramname) && ! isset($_GET[$paramname]) && ! isset($_POST[$paramname])) { - $relativepathstring = $_SERVER["PHP_SELF"]; - if (constant('DOL_URL_ROOT')) $relativepathstring = preg_replace('/^'.preg_quote(constant('DOL_URL_ROOT'),'/').'/', '', $relativepathstring); - $relativepathstring = preg_replace('/^custom\//', '', $relativepathstring); - $relativepathstring = preg_replace('/^\//', '', $relativepathstring); - global $user; if (! empty($user->default_values)) // $user->default_values defined from menu default values, and values loaded not at first { //var_dump($user->default_values[$relativepathstring]['createform']); @@ -290,46 +293,46 @@ function GETPOST($paramname, $check='', $method=0, $filter=NULL, $options=NULL) //elseif (preg_match('/list.php$/', $_SERVER["PHP_SELF"]) && ! empty($paramname) && ! isset($_GET[$paramname]) && ! isset($_POST[$paramname])) elseif (! empty($paramname) && ! isset($_GET[$paramname]) && ! isset($_POST[$paramname])) { - $relativepathstring = $_SERVER["PHP_SELF"]; - if (constant('DOL_URL_ROOT')) $relativepathstring = preg_replace('/^'.preg_quote(constant('DOL_URL_ROOT'),'/').'/', '', $relativepathstring); - $relativepathstring = preg_replace('/^custom\//', '', $relativepathstring); - $relativepathstring = preg_replace('/^\//', '', $relativepathstring); - global $user; if (! empty($user->default_values)) // $user->default_values defined from menu default values { //var_dump($user->default_values[$relativepathstring]); if ($paramname == 'sortfield') { - if (isset($user->default_values[$relativepathstring]['sortorder'])) + if (isset($user->default_values[$relativepathstring]['sortorder'])) // We will use the key of $user->default_values[path][sortorder] { + $forbidden_chars_to_replace=array(" ","'","/","\\",":","*","?","\"","<",">","|","[","]",";","="); // we accept _, -, . and , foreach($user->default_values[$relativepathstring]['sortorder'] as $key => $val) { if ($out) $out.=', '; - $out.=dol_string_nospecial($key, ''); + $out.=dol_string_nospecial($key, '', $forbidden_chars_to_replace); } } } elseif ($paramname == 'sortorder') { - if (isset($user->default_values[$relativepathstring]['sortorder'])) + if (isset($user->default_values[$relativepathstring]['sortorder'])) // We will use the val of $user->default_values[path][sortorder] { + $forbidden_chars_to_replace=array(" ","'","/","\\",":","*","?","\"","<",">","|","[","]",";","="); // we accept _, -, . and , foreach($user->default_values[$relativepathstring]['sortorder'] as $key => $val) { if ($out) $out.=', '; - $out.=dol_string_nospecial($val, ''); + $out.=dol_string_nospecial($val, '', $forbidden_chars_to_replace); } } } elseif (isset($user->default_values[$relativepathstring]['filters'][$paramname])) - $out = dol_string_nospecial($user->default_values[$relativepathstring]['filters'][$paramname], ''); + { + $forbidden_chars_to_replace=array(" ","'","/","\\",":","*","?","\"","<",">","|","[","]",";","="); // we accept _, -, . and , + $out = dol_string_nospecial($user->default_values[$relativepathstring]['filters'][$paramname], '', $forbidden_chars_to_replace); + } } } } } - if (empty($check) && $conf->global->MAIN_FEATURES_LEVEL > 0) + if (empty($check) && $conf->global->MAIN_FEATURES_LEVEL >= 2) { - dol_syslog("A GETPOST is called with 1st param = ".$paramname." and 2nd param not defined, when calling page ".$_SERVER["PHP_SELF"], LOG_WARNING); + dol_syslog("Deprecated use of GETPOST, called with 1st param = ".$paramname." and 2nd param not defined, when calling page ".$_SERVER["PHP_SELF"], LOG_WARNING); } if (! empty($check)) @@ -338,7 +341,7 @@ function GETPOST($paramname, $check='', $method=0, $filter=NULL, $options=NULL) if (! is_array($out)) { $maxloop=20; $loopnb=0; // Protection against infinite loop - while (preg_match('/__([A-Z0-9]+_?[A-Z0-9]+)__/i', $out, $reg) && ($loopnb < $maxloop)) // Detect '__ABCDEF__' as key 'ABCDEF' and '__ABC_DEF__' as key 'ABC_DEF' + while (preg_match('/__([A-Z0-9]+_?[A-Z0-9]+)__/i', $out, $reg) && ($loopnb < $maxloop)) // Detect '__ABCDEF__' as key 'ABCDEF' and '__ABC_DEF__' as key 'ABC_DEF'. Detection is also correct when 2 vars are side by side. { $loopnb++; $newout = ''; @@ -420,6 +423,17 @@ function GETPOST($paramname, $check='', $method=0, $filter=NULL, $options=NULL) } } + // Save data into session if key start with 'search_' or is 'smonth', 'syear', 'month', 'year' + if (empty($method) || $method == 3 || $method == 4) + { + //if (preg_match('/^search_/', $paramname) || in_array($paramname, array('sortorder', 'sortfield", 'smonth', 'syear', 'month', 'year'))) + if (preg_match('/^search_/', $paramname) || in_array($paramname, array('sortorder','sortfield'))) + { + //if ($paramname == 'sortorder') var_dump($paramname.' - '.$out); + $user->lastsearch_values_tmp[$relativepathstring][$paramname]=$out; + } + } + return $out; } @@ -3223,8 +3237,8 @@ function print_liste_field_titre($name, $file="", $field="", $begin="", $morepar * @param string $begin ("" by defaut) * @param string $moreparam Add more parameters on sort url links ("" by default) * @param string $moreattrib Add more attributes on th ("" by defaut). To add more css class, use param $prefix. - * @param string $sortfield Current field used to sort - * @param string $sortorder Current sort order + * @param string $sortfield Current field used to sort (Ex: 'd.datep,d.id') + * @param string $sortorder Current sort order (Ex: 'asc,desc') * @param string $prefix Prefix for css. Use space after prefix to add your own CSS tag. * @return string */ @@ -3241,11 +3255,15 @@ function getTitleFieldOfList($name, $thead=0, $file="", $field="", $begin="", $m if ($thead==2) $tag='div'; $tmpsortfield=explode(',',$sortfield); - $sortfield=trim($tmpsortfield[0]); + $sortfield1=trim($tmpsortfield[0]); // If $sortfield is 'd.datep,d.id', it becomes 'd.datep' + $tmpfield=explode(',',$field); + $field1=trim($tmpfield[0]); // If $field is 'd.datep,d.id', it becomes 'd.datep' + + //var_dump('field='.$field.' field1='.$field1.' sortfield='.$sortfield.' sortfield1='.$sortfield1); - // If field is used as sort criteria we use a specific class + // If field is used as sort criteria we use a specific css class liste_titre_sel // Example if (sortfield,field)=("nom","xxx.nom") or (sortfield,field)=("nom","nom") - if ($field && ($sortfield == $field || $sortfield == preg_replace("/^[^\.]+\./","",$field))) $out.= '<'.$tag.' class="'.$prefix.'liste_titre_sel" '. $moreattrib.'>'; + if ($field1 && ($sortfield1 == $field1 || $sortfield1 == preg_replace("/^[^\.]+\./","",$field1))) $out.= '<'.$tag.' class="'.$prefix.'liste_titre_sel" '. $moreattrib.'>'; else $out.= '<'.$tag.' class="'.$prefix.'liste_titre" '. $moreattrib.'>'; if (empty($thead) && $field) // If this is a sort field @@ -3255,15 +3273,15 @@ function getTitleFieldOfList($name, $thead=0, $file="", $field="", $begin="", $m $options=preg_replace('/&+/i','&',$options); if (! preg_match('/^&/',$options)) $options='&'.$options; - if ($field != $sortfield) + if ($field1 != $sortfield1) // We are on another field { if (preg_match('/^DESC/', $sortorder)) $out.= ''; else $out.= ''; } - else + else // We are of first sorting criteria { - if (preg_match('/^ASC/', $sortorder)) $out.= ''; - else $out.= ''; + if (preg_match('/^ASC/', $sortorder)) $out.= ''; + else $out.= ''; } } @@ -3285,7 +3303,7 @@ function getTitleFieldOfList($name, $thead=0, $file="", $field="", $begin="", $m //$sortimg.= ''; //$sortimg.= ''; - if (! $sortorder || $field != $sortfield) + if (! $sortorder || $field1 != $sortfield1) { //$out.= ''.img_down("A-Z",0).''; //$out.= ''.img_up("Z-A",0).''; diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index c2b99f22c1f7f..d632e91d5379c 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -646,6 +646,19 @@ function analyseVarsForSqlAndScriptsInjection(&$var, $type) // Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array $hookmanager->initHooks(array('main')); + if (! empty($_GET['save_lastsearch_values'])) // Keep $_GET here + { + $relativepathstring = preg_replace('/\?.*$/','',$_SERVER["HTTP_REFERER"]); + if (constant('DOL_MAIN_URL_ROOT')) $relativepathstring = preg_replace('/^'.preg_quote(constant('DOL_MAIN_URL_ROOT'),'/').'/', '', $relativepathstring); + $relativepathstring = preg_replace('/^custom\//', '', $relativepathstring); + $relativepathstring = preg_replace('/^\//', '', $relativepathstring); + if (! empty($_SESSION['lastsearch_values_tmp_'.$relativepathstring])) + { + $_SESSION['lastsearch_values_'.$relativepathstring]=$_SESSION['lastsearch_values_tmp_'.$relativepathstring]; + unset($_SESSION['lastsearch_values_tmp_'.$relativepathstring]); + } + } + $action = ''; $reshook = $hookmanager->executeHooks('updateSession', array(), $user, $action); if ($reshook < 0) { @@ -653,7 +666,7 @@ function analyseVarsForSqlAndScriptsInjection(&$var, $type) } } } - + // Is it a new session that has started ? // If we are here, this means authentication was successfull. if (! isset($_SESSION["dol_login"])) @@ -1858,7 +1871,7 @@ function printSearchForm($urlaction, $urlobject, $title, $htmlmorecss, $htmlinpu { /** * Show HTML footer - * Close div /DIV data-role=page + /DIV class=fiche + /DIV /DIV main layout + /BODY + /HTML. + * Close div /DIV class=fiche + /DIV id-right + /DIV id-container + /BODY + /HTML. * If global var $delayedhtmlcontent was filled, we output it just before closing the body. * * @param string $comment A text to add as HTML comment into HTML generated page @@ -1867,12 +1880,30 @@ function printSearchForm($urlaction, $urlobject, $title, $htmlmorecss, $htmlinpu */ function llxFooter($comment='',$zone='private') { - global $conf, $langs; + global $conf, $langs, $user; global $delayedhtmlcontent; // Global html output events ($mesgs, $errors, $warnings) dol_htmloutput_events(); + // Save $user->lastsearch_values if defined (define on list pages when a form field search_xxx exists) + if (is_object($user) && ! empty($user->lastsearch_values_tmp) && is_array($user->lastsearch_values_tmp)) + { + // Clean data + foreach($user->lastsearch_values_tmp as $key => $val) + { + unset($_SESSION['lastsearch_values_tmp_'.$key]); + if (count($val)) + { + if (empty($val['sortfield'])) unset($val['sortfield']); + if (empty($val['sortorder'])) unset($val['sortorder']); + dol_syslog('Save lastsearch_values_tmp_'.$key.'='.json_encode($val, 0, 1)); + $_SESSION['lastsearch_values_tmp_'.$key]=json_encode($val); + unset($_SESSION['lastsearch_values_'.$key]); + } + } + } + // Core error message if (! empty($conf->global->MAIN_CORE_ERROR)) { @@ -1943,7 +1974,7 @@ function llxFooter($comment='',$zone='private') }); }); ' . "\n"; - } + } // Wrapper to manage dropdown if ($conf->use_javascript_ajax) diff --git a/htdocs/projet/class/project.class.php b/htdocs/projet/class/project.class.php index 5efaae1fd7800..6a7b130ac0d12 100644 --- a/htdocs/projet/class/project.class.php +++ b/htdocs/projet/class/project.class.php @@ -922,15 +922,16 @@ function LibStatut($statut, $mode=0) /** * Return clicable name (with picto eventually) * - * @param int $withpicto 0=No picto, 1=Include picto into link, 2=Only picto - * @param string $option Variant ('', 'nolink') - * @param int $addlabel 0=Default, 1=Add label into string, >1=Add first chars into string - * @param string $moreinpopup Text to add into popup - * @param string $sep Separator between ref and label if option addlabel is set - * @param int $notooltip 1=Disable tooltip - * @return string Chaine avec URL + * @param int $withpicto 0=No picto, 1=Include picto into link, 2=Only picto + * @param string $option Variant ('', 'nolink') + * @param int $addlabel 0=Default, 1=Add label into string, >1=Add first chars into string + * @param string $moreinpopup Text to add into popup + * @param string $sep Separator between ref and label if option addlabel is set + * @param int $notooltip 1=Disable tooltip + * @param int $save_lastsearch_value -1=Auto, 0=No save of lastsearch_values when clicking, 1=Save lastsearch_values whenclicking + * @return string String with URL */ - function getNomUrl($withpicto=0, $option='', $addlabel=0, $moreinpopup='', $sep=' - ', $notooltip=0) + function getNomUrl($withpicto=0, $option='', $addlabel=0, $moreinpopup='', $sep=' - ', $notooltip=0, $save_lastsearch_value=-1) { global $conf, $langs, $user; @@ -940,10 +941,8 @@ function getNomUrl($withpicto=0, $option='', $addlabel=0, $moreinpopup='', $sep= $label=''; if ($option != 'nolink') $label = '' . $langs->trans("ShowProject") . ''; - if (! empty($this->ref)) - $label .= ($label?'
':'').'' . $langs->trans('Ref') . ': ' . $this->ref; // The space must be after the : to not being explode when showing the title in img_picto - if (! empty($this->title)) - $label .= ($label?'
':'').'' . $langs->trans('Label') . ': ' . $this->title; // The space must be after the : to not being explode when showing the title in img_picto + $label .= ($label?'
':'').'' . $langs->trans('Ref') . ': ' . $this->ref; // The space must be after the : to not being explode when showing the title in img_picto + $label .= ($label?'
':'').'' . $langs->trans('Label') . ': ' . $this->title; // The space must be after the : to not being explode when showing the title in img_picto if (! empty($this->thirdparty_name)) $label .= ($label?'
':'').'' . $langs->trans('ThirdParty') . ': ' . $this->thirdparty_name; // The space must be after the : to not being explode when showing the title in img_picto if (! empty($this->dateo)) @@ -965,6 +964,10 @@ function getNomUrl($withpicto=0, $option='', $addlabel=0, $moreinpopup='', $sep= { $url = DOL_URL_ROOT . '/projet/card.php?id=' . $this->id; } + // Add param to save lastsearch_values or not + $add_save_lastsearch_values=($save_lastsearch_value == 1 ? 1 : 0); + if ($save_lastsearch_value == -1 && preg_match('/list\.php/',$_SERVER["PHP_SELF"])) $add_save_lastsearch_values=1; + if ($add_save_lastsearch_values) $url.='&save_lastsearch_values=1'; } $linkclose=''; diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index fb48662973115..6aebf0e8786b5 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -1824,13 +1824,14 @@ function del_commercial(User $user, $commid) /** * Return a link on thirdparty (with picto) * - * @param int $withpicto Add picto into link (0=No picto, 1=Include picto with link, 2=Picto only) - * @param string $option Target of link ('', 'customer', 'prospect', 'supplier', 'project') - * @param int $maxlen Max length of name - * @param int $notooltip 1=Disable tooltip - * @return string String with URL - */ - function getNomUrl($withpicto=0, $option='', $maxlen=0, $notooltip=0) + * @param int $withpicto Add picto into link (0=No picto, 1=Include picto with link, 2=Picto only) + * @param string $option Target of link ('', 'customer', 'prospect', 'supplier', 'project') + * @param int $maxlen Max length of name + * @param int $notooltip 1=Disable tooltip + * @param int $save_lastsearch_value -1=Auto, 0=No save of lastsearch_values when clicking, 1=Save lastsearch_values whenclicking + * @return string String with URL + */ + function getNomUrl($withpicto=0, $option='', $maxlen=0, $notooltip=0, $save_lastsearch_value=-1) { global $conf, $langs, $hookmanager; @@ -1929,7 +1930,12 @@ function getNomUrl($withpicto=0, $option='', $maxlen=0, $notooltip=0) $label.= ''; // Add type of canvas - $linkstart.=(!empty($this->canvas)?'&canvas='.$this->canvas:'').'"'; + $linkstart.=(!empty($this->canvas)?'&canvas='.$this->canvas:''); + // Add param to save lastsearch_values or not + $add_save_lastsearch_values=($save_lastsearch_value == 1 ? 1 : 0); + if ($save_lastsearch_value == -1 && preg_match('/list\.php/',$_SERVER["PHP_SELF"])) $add_save_lastsearch_values=1; + if ($add_save_lastsearch_values) $linkstart.='&save_lastsearch_values=1'; + $linkstart.='"'; $linkclose=''; if (empty($notooltip))