瀏覽代碼

Merge remote-tracking branch 'upstream/develop' into Squiz.ControlStructures.ControlSignature.SpaceAfterKeyword

Frédéric FRANCE 5 年之前
父節點
當前提交
b58060f899

+ 1 - 1
htdocs/core/class/extrafields.class.php

@@ -43,7 +43,7 @@ class ExtraFields
     public $db;
 
 	/**
-     * @var string type of element (for what object is the extrafield)
+     * @var array Array with type of element (for what object is the extrafield)
 	 * @deprecated
      */
     public $attribute_elementtype;

+ 8 - 1176
htdocs/core/class/extralanguages.class.php

@@ -18,7 +18,7 @@
 /**
  * 	\file 		htdocs/core/class/extralanguages.class.php
  *	\ingroup    core
- *	\brief      File of class to manage extra fields
+ *	\brief      File of class to manage extra languages for some fields
  */
 
 
@@ -69,7 +69,8 @@ class ExtraLanguages
 
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
 	/**
-	 * 	Load array this->attributes with list of fields per object that need an alternate translation.
+	 * 	Load array this->attributes with list of fields per object that need an alternate translation. The object and field must be managed with
+	 *  the widgetForTranslation() method.
 	 *  You can set variable MAIN_USE_ALTERNATE_TRANSLATION_FOR=elementA:fieldname,fieldname2;elementB:...
 	 *  Example: MAIN_USE_ALTERNATE_TRANSLATION_FOR=societe:name,town;contact:firstname,lastname
 	 *
@@ -119,16 +120,16 @@ class ExtraLanguages
 	 *
 	 * @param  string  $key            			Key of attribute
 	 * @param  string  $value          			Preselected value to show (for date type it must be in timestamp format, for amount or price it must be a php numeric value)
+	 * @param  string  $extrafieldsobjectkey	If defined (for example $object->table_element), use the new method to get extrafields data
 	 * @param  string  $moreparam      			To add more parametes on html input tag
 	 * @param  string  $keysuffix      			Prefix string to add after name and id of field (can be used to avoid duplicate names)
 	 * @param  string  $keyprefix      			Suffix string to add before name and id of field (can be used to avoid duplicate names)
 	 * @param  string  $morecss        			More css (to defined size of field. Old behaviour: may also be a numeric)
 	 * @param  int     $objectid       			Current object id
-	 * @param  string  $extrafieldsobjectkey	If defined (for example $object->table_element), use the new method to get extrafields data
 	 * @param  string  $mode                    1=Used for search filters
 	 * @return string
 	 */
-	public function showInputField($key, $value, $moreparam = '', $keysuffix = '', $keyprefix = '', $morecss = '', $objectid = 0, $extrafieldsobjectkey = '', $mode = 0)
+	public function showInputField($key, $value, $extrafieldsobjectkey, $moreparam = '', $keysuffix = '', $keyprefix = '', $morecss = '', $objectid = 0, $mode = 0)
 	{
 		global $conf, $langs, $form;
 
@@ -145,596 +146,6 @@ class ExtraLanguages
 			$keyprefix = $keyprefix.'options_';
 		}
 
-		if (!empty($extrafieldsobjectkey))
-		{
-			$label = $this->attributes[$extrafieldsobjectkey]['label'][$key];
-			$type = $this->attributes[$extrafieldsobjectkey]['type'][$key];
-			$size = $this->attributes[$extrafieldsobjectkey]['size'][$key];
-			$default = $this->attributes[$extrafieldsobjectkey]['default'][$key];
-			$computed = $this->attributes[$extrafieldsobjectkey]['computed'][$key];
-			$unique = $this->attributes[$extrafieldsobjectkey]['unique'][$key];
-			$required = $this->attributes[$extrafieldsobjectkey]['required'][$key];
-			$param = $this->attributes[$extrafieldsobjectkey]['param'][$key];
-			$perms = dol_eval($this->attributes[$extrafieldsobjectkey]['perms'][$key], 1);
-			$langfile = $this->attributes[$extrafieldsobjectkey]['langfile'][$key];
-			$list = dol_eval($this->attributes[$extrafieldsobjectkey]['list'][$key], 1);
-			$totalizable = $this->attributes[$extrafieldsobjectkey]['totalizable'][$key];
-			$help = $this->attributes[$extrafieldsobjectkey]['help'][$key];
-			$hidden = (empty($list) ? 1 : 0); // If empty, we are sure it is hidden, otherwise we show. If it depends on mode (view/create/edit form or list, this must be filtered by caller)
-		}
-		else // Old usage
-		{
-			$label = $this->attribute_label[$key];
-			$type = $this->attribute_type[$key];
-			$size = $this->attribute_size[$key];
-			$elementtype = $this->attribute_elementtype[$key]; // Seems not used
-			$default = $this->attribute_default[$key];
-			$computed = $this->attribute_computed[$key];
-			$unique = $this->attribute_unique[$key];
-			$required = $this->attribute_required[$key];
-			$param = $this->attribute_param[$key];
-			$langfile = $this->attribute_langfile[$key];
-			$list = $this->attribute_list[$key];
-			$totalizable = $this->attribute_totalizable[$key];
-			$hidden = (empty($list) ? 1 : 0); // If empty, we are sure it is hidden, otherwise we show. If it depends on mode (view/create/edit form or list, this must be filtered by caller)
-		}
-
-		if ($computed)
-		{
-			if (!preg_match('/^search_/', $keyprefix)) return '<span class="opacitymedium">'.$langs->trans("AutomaticallyCalculated").'</span>';
-			else return '';
-		}
-
-		if (empty($morecss))
-		{
-			if ($type == 'date')
-			{
-				$morecss = 'minwidth100imp';
-			}
-			elseif ($type == 'datetime' || $type == 'link')
-			{
-				$morecss = 'minwidth200imp';
-			}
-			elseif (in_array($type, array('int', 'integer', 'double', 'price')))
-			{
-				$morecss = 'maxwidth75';
-			}
-			elseif ($type == 'password')
-			{
-				$morecss = 'maxwidth100';
-			}
-			elseif ($type == 'url')
-			{
-				$morecss = 'minwidth400';
-			}
-			elseif ($type == 'boolean')
-			{
-				$morecss = '';
-			}
-			else {
-				if (round($size) < 12)
-				{
-					$morecss = 'minwidth100';
-				}
-				elseif (round($size) <= 48)
-				{
-					$morecss = 'minwidth200';
-				}
-				else {
-					$morecss = 'minwidth400';
-				}
-			}
-		}
-
-		if (in_array($type, array('date', 'datetime')))
-		{
-			$tmp = explode(',', $size);
-			$newsize = $tmp[0];
-
-			$showtime = in_array($type, array('datetime')) ? 1 : 0;
-
-			// Do not show current date when field not required (see selectDate() method)
-			if (!$required && $value == '') $value = '-1';
-
-			// TODO Must also support $moreparam
-			$out = $form->selectDate($value, $keyprefix.$key.$keysuffix, $showtime, $showtime, $required, '', 1, (($keyprefix != 'search_' && $keyprefix != 'search_options_') ? 1 : 0), 0, 1);
-		}
-		elseif (in_array($type, array('int', 'integer')))
-		{
-			$tmp = explode(',', $size);
-			$newsize = $tmp[0];
-			$out = '<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" maxlength="'.$newsize.'" value="'.dol_escape_htmltag($value).'"'.($moreparam ? $moreparam : '').'>';
-		}
-		elseif (preg_match('/varchar/', $type))
-		{
-			$out = '<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" maxlength="'.$size.'" value="'.dol_escape_htmltag($value).'"'.($moreparam ? $moreparam : '').'>';
-		}
-		elseif (in_array($type, array('mail', 'phone', 'url')))
-		{
-			$out = '<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.dol_escape_htmltag($value).'" '.($moreparam ? $moreparam : '').'>';
-		}
-		elseif ($type == 'text')
-		{
-			if (!preg_match('/search_/', $keyprefix))		// If keyprefix is search_ or search_options_, we must just use a simple text field
-			{
-				require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
-				$doleditor = new DolEditor($keyprefix.$key.$keysuffix, $value, '', 200, 'dolibarr_notes', 'In', false, false, false, ROWS_5, '90%');
-				$out = $doleditor->Create(1);
-			}
-			else {
-				$out = '<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.dol_escape_htmltag($value).'" '.($moreparam ? $moreparam : '').'>';
-			}
-		}
-		elseif ($type == 'html')
-		{
-			if (!preg_match('/search_/', $keyprefix))		// If keyprefix is search_ or search_options_, we must just use a simple text field
-			{
-				require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
-				$doleditor = new DolEditor($keyprefix.$key.$keysuffix, $value, '', 200, 'dolibarr_notes', 'In', false, false, !empty($conf->fckeditor->enabled) && $conf->global->FCKEDITOR_ENABLE_SOCIETE, ROWS_5, '90%');
-				$out = $doleditor->Create(1);
-			}
-			else {
-				$out = '<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.dol_escape_htmltag($value).'" '.($moreparam ? $moreparam : '').'>';
-			}
-		}
-		elseif ($type == 'boolean')
-		{
-			if (empty($mode))
-			{
-				$checked = '';
-				if (!empty($value)) {
-					$checked = ' checked value="1" ';
-				} else {
-					$checked = ' value="1" ';
-				}
-				$out = '<input type="checkbox" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" '.$checked.' '.($moreparam ? $moreparam : '').'>';
-			}
-			else {
-				$out .= $form->selectyesno($keyprefix.$key.$keysuffix, $value, 1, false, 1);
-			}
-		}
-		elseif ($type == 'price')
-		{
-			if (!empty($value)) {		// $value in memory is a php numeric, we format it into user number format.
-				$value = price($value);
-			}
-			$out = '<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.$value.'" '.($moreparam ? $moreparam : '').'> '.$langs->getCurrencySymbol($conf->currency);
-		}
-		elseif ($type == 'double')
-		{
-			if (!empty($value)) {		// $value in memory is a php numeric, we format it into user number format.
-				$value = price($value);
-			}
-			$out = '<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.$value.'" '.($moreparam ? $moreparam : '').'> ';
-		}
-		elseif ($type == 'select')
-		{
-			$out = '';
-			if (!empty($conf->use_javascript_ajax) && !empty($conf->global->MAIN_EXTRAFIELDS_USE_SELECT2))
-			{
-				include_once DOL_DOCUMENT_ROOT.'/core/lib/ajax.lib.php';
-				$out .= ajax_combobox($keyprefix.$key.$keysuffix, array(), 0);
-			}
-
-			$out .= '<select class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" '.($moreparam ? $moreparam : '').'>';
-			$out .= '<option value="0">&nbsp;</option>';
-			foreach ($param['options'] as $key => $val)
-			{
-				if ((string) $key == '') continue;
-				list($val, $parent) = explode('|', $val);
-				$out .= '<option value="'.$key.'"';
-				$out .= (((string) $value == (string) $key) ? ' selected' : '');
-				$out .= (!empty($parent) ? ' parent="'.$parent.'"' : '');
-				$out .= '>';
-				if ($langfile && $val) $out .= $langs->trans($val);
-				else $out .= $val;
-				$out .= '</option>';
-			}
-			$out .= '</select>';
-		}
-		elseif ($type == 'sellist')
-		{
-			$out = '';
-			if (!empty($conf->use_javascript_ajax) && !empty($conf->global->MAIN_EXTRAFIELDS_USE_SELECT2))
-			{
-				include_once DOL_DOCUMENT_ROOT.'/core/lib/ajax.lib.php';
-				$out .= ajax_combobox($keyprefix.$key.$keysuffix, array(), 0);
-			}
-
-			$out .= '<select class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" '.($moreparam ? $moreparam : '').'>';
-			if (is_array($param['options']))
-			{
-				$param_list = array_keys($param['options']);
-				$InfoFieldList = explode(":", $param_list[0]);
-				$parentName = '';
-				$parentField = '';
-				// 0 : tableName
-				// 1 : label field name
-				// 2 : key fields name (if differ of rowid)
-				// 3 : key field parent (for dependent lists)
-				// 4 : where clause filter on column or table extrafield, syntax field='value' or extra.field=value
-                // 5 : id category type
-                // 6 : ids categories list separated by comma for category root
-				$keyList = (empty($InfoFieldList[2]) ? 'rowid' : $InfoFieldList[2].' as rowid');
-
-
-				if (count($InfoFieldList) > 4 && !empty($InfoFieldList[4]))
-				{
-					if (strpos($InfoFieldList[4], 'extra.') !== false)
-					{
-						$keyList = 'main.'.$InfoFieldList[2].' as rowid';
-					} else {
-						$keyList = $InfoFieldList[2].' as rowid';
-					}
-				}
-				if (count($InfoFieldList) > 3 && !empty($InfoFieldList[3]))
-				{
-					list($parentName, $parentField) = explode('|', $InfoFieldList[3]);
-					$keyList .= ', '.$parentField;
-				}
-
-                $filter_categorie = false;
-                if (count($InfoFieldList) > 5) {
-                    if ($InfoFieldList[0] == 'categorie') {
-                        $filter_categorie = true;
-                    }
-                }
-
-                if ($filter_categorie === false) {
-                    $fields_label = explode('|', $InfoFieldList[1]);
-                    if (is_array($fields_label)) {
-                        $keyList .= ', ';
-                        $keyList .= implode(', ', $fields_label);
-                    }
-
-                    $sqlwhere = '';
-                    $sql = 'SELECT '.$keyList;
-                    $sql .= ' FROM '.MAIN_DB_PREFIX.$InfoFieldList[0];
-                    if (!empty($InfoFieldList[4])) {
-                        // can use curent entity filter
-                        if (strpos($InfoFieldList[4], '$ENTITY$') !== false) {
-                            $InfoFieldList[4] = str_replace('$ENTITY$', $conf->entity, $InfoFieldList[4]);
-                        }
-                        // can use SELECT request
-                        if (strpos($InfoFieldList[4], '$SEL$') !== false) {
-                            $InfoFieldList[4] = str_replace('$SEL$', 'SELECT', $InfoFieldList[4]);
-                        }
-
-                        // current object id can be use into filter
-                        if (strpos($InfoFieldList[4], '$ID$') !== false && !empty($objectid)) {
-                            $InfoFieldList[4] = str_replace('$ID$', $objectid, $InfoFieldList[4]);
-                        } else {
-                            $InfoFieldList[4] = str_replace('$ID$', '0', $InfoFieldList[4]);
-                        }
-                        //We have to join on extrafield table
-                        if (strpos($InfoFieldList[4], 'extra') !== false) {
-                            $sql .= ' as main, '.MAIN_DB_PREFIX.$InfoFieldList[0].'_extrafields as extra';
-                            $sqlwhere .= ' WHERE extra.fk_object=main.'.$InfoFieldList[2].' AND '.$InfoFieldList[4];
-                        } else {
-                            $sqlwhere .= ' WHERE '.$InfoFieldList[4];
-                        }
-                    } else {
-                        $sqlwhere .= ' WHERE 1=1';
-                    }
-                    // Some tables may have field, some other not. For the moment we disable it.
-                    if (in_array($InfoFieldList[0], array('tablewithentity'))) {
-                        $sqlwhere .= ' AND entity = '.$conf->entity;
-                    }
-                    $sql .= $sqlwhere;
-                    //print $sql;
-
-                    $sql .= ' ORDER BY '.implode(', ', $fields_label);
-
-                    dol_syslog(get_class($this).'::showInputField type=sellist', LOG_DEBUG);
-                    $resql = $this->db->query($sql);
-                    if ($resql) {
-                        $out .= '<option value="0">&nbsp;</option>';
-                        $num = $this->db->num_rows($resql);
-                        $i = 0;
-                        while ($i < $num) {
-                            $labeltoshow = '';
-                            $obj = $this->db->fetch_object($resql);
-
-                            // Several field into label (eq table:code|libelle:rowid)
-                            $notrans = false;
-                            $fields_label = explode('|', $InfoFieldList[1]);
-                            if (is_array($fields_label) && count($fields_label) > 1) {
-                                $notrans = true;
-                                foreach ($fields_label as $field_toshow) {
-                                    $labeltoshow .= $obj->$field_toshow.' ';
-                                }
-                            } else {
-                                $labeltoshow = $obj->{$InfoFieldList[1]};
-                            }
-                            $labeltoshow = dol_trunc($labeltoshow, 45);
-
-                            if ($value == $obj->rowid) {
-                            	if (!$notrans) {
-	                                foreach ($fields_label as $field_toshow) {
-	                                    $translabel = $langs->trans($obj->$field_toshow);
-	                                    $labeltoshow = dol_trunc($translabel, 18).' ';
-	                                }
-                            	}
-                                $out .= '<option value="'.$obj->rowid.'" selected>'.$labeltoshow.'</option>';
-                            } else {
-                                if (!$notrans) {
-                                    $translabel = $langs->trans($obj->{$InfoFieldList[1]});
-                                    $labeltoshow = dol_trunc($translabel, 18);
-                                }
-                                if (empty($labeltoshow)) $labeltoshow = '(not defined)';
-
-                                if (!empty($InfoFieldList[3]) && $parentField) {
-                                    $parent = $parentName.':'.$obj->{$parentField};
-                                }
-
-                                $out .= '<option value="'.$obj->rowid.'"';
-                                $out .= ($value == $obj->rowid ? ' selected' : '');
-                                $out .= (!empty($parent) ? ' parent="'.$parent.'"' : '');
-                                $out .= '>'.$labeltoshow.'</option>';
-                            }
-
-                            $i++;
-                        }
-                        $this->db->free($resql);
-                    } else {
-                        print 'Error in request '.$sql.' '.$this->db->lasterror().'. Check setup of extra parameters.<br>';
-                    }
-                } else {
-					require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
-                    $data = $form->select_all_categories(Categorie::$MAP_ID_TO_CODE[$InfoFieldList[5]], '', 'parent', 64, $InfoFieldList[6], 1, 1);
-                    $out .= '<option value="0">&nbsp;</option>';
-                    foreach ($data as $data_key => $data_value) {
-                        $out .= '<option value="'.$data_key.'"';
-                        $out .= ($value == $data_key ? ' selected' : '');
-                        $out .= '>'.$data_value.'</option>';
-                    }
-                }
-			}
-			$out .= '</select>';
-		}
-		elseif ($type == 'checkbox')
-		{
-			$value_arr = explode(',', $value);
-			$out = $form->multiselectarray($keyprefix.$key.$keysuffix, (empty($param['options']) ?null:$param['options']), $value_arr, '', 0, '', 0, '100%');
-		}
-		elseif ($type == 'radio')
-		{
-			$out = '';
-			foreach ($param['options'] as $keyopt => $val)
-			{
-				$out .= '<input class="flat '.$morecss.'" type="radio" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" '.($moreparam ? $moreparam : '');
-				$out .= ' value="'.$keyopt.'"';
-				$out .= ' id="'.$keyprefix.$key.$keysuffix.'_'.$keyopt.'"';
-				$out .= ($value == $keyopt ? 'checked' : '');
-				$out .= '/><label for="'.$keyprefix.$key.$keysuffix.'_'.$keyopt.'">'.$val.'</label><br>';
-			}
-		}
-		elseif ($type == 'chkbxlst')
-		{
-			if (is_array($value)) {
-				$value_arr = $value;
-			}
-			else {
-				$value_arr = explode(',', $value);
-			}
-
-			if (is_array($param['options'])) {
-				$param_list = array_keys($param['options']);
-				$InfoFieldList = explode(":", $param_list[0]);
-				$parentName = '';
-				$parentField = '';
-				// 0 : tableName
-				// 1 : label field name
-				// 2 : key fields name (if differ of rowid)
-				// 3 : key field parent (for dependent lists)
-				// 4 : where clause filter on column or table extrafield, syntax field='value' or extra.field=value
-                // 5 : id category type
-                // 6 : ids categories list separated by comma for category root
-				$keyList = (empty($InfoFieldList[2]) ? 'rowid' : $InfoFieldList[2].' as rowid');
-
-				if (count($InfoFieldList) > 3 && !empty($InfoFieldList[3])) {
-					list ($parentName, $parentField) = explode('|', $InfoFieldList[3]);
-					$keyList .= ', '.$parentField;
-				}
-				if (count($InfoFieldList) > 4 && !empty($InfoFieldList[4])) {
-					if (strpos($InfoFieldList[4], 'extra.') !== false) {
-						$keyList = 'main.'.$InfoFieldList[2].' as rowid';
-					} else {
-						$keyList = $InfoFieldList[2].' as rowid';
-					}
-				}
-
-                $filter_categorie = false;
-                if (count($InfoFieldList) > 5) {
-                    if ($InfoFieldList[0] == 'categorie') {
-                        $filter_categorie = true;
-                    }
-                }
-
-                if ($filter_categorie === false) {
-                    $fields_label = explode('|', $InfoFieldList[1]);
-                    if (is_array($fields_label)) {
-                        $keyList .= ', ';
-                        $keyList .= implode(', ', $fields_label);
-                    }
-
-                    $sqlwhere = '';
-                    $sql = 'SELECT '.$keyList;
-                    $sql .= ' FROM '.MAIN_DB_PREFIX.$InfoFieldList[0];
-                    if (!empty($InfoFieldList[4])) {
-                        // can use SELECT request
-                        if (strpos($InfoFieldList[4], '$SEL$') !== false) {
-                            $InfoFieldList[4] = str_replace('$SEL$', 'SELECT', $InfoFieldList[4]);
-                        }
-
-                        // current object id can be use into filter
-                        if (strpos($InfoFieldList[4], '$ID$') !== false && !empty($objectid)) {
-                            $InfoFieldList[4] = str_replace('$ID$', $objectid, $InfoFieldList[4]);
-                        } elseif (preg_match("#^.*list.php$#", $_SERVER["PHP_SELF"])) {
-                            // Pattern for word=$ID$
-                            $word = '\b[a-zA-Z0-9-\.-_]+\b=\$ID\$';
-
-                            // Removing space arount =, ( and )
-                            $InfoFieldList[4] = preg_replace('# *(=|\(|\)) *#', '$1', $InfoFieldList[4]);
-
-                            $nbPreg = 1;
-                            // While we have parenthesis
-                            while ($nbPreg != 0) {
-                                // Init des compteurs
-                                $nbPregRepl = $nbPregSel = 0;
-                                // On retire toutes les parenthèses sans = avant
-                                $InfoFieldList[4] = preg_replace('#([^=])(\([^)^(]*('.$word.')[^)^(]*\))#', '$1 $3 ', $InfoFieldList[4], -1, $nbPregRepl);
-                                // On retire les espaces autour des = et parenthèses
-                                $InfoFieldList[4] = preg_replace('# *(=|\(|\)) *#', '$1', $InfoFieldList[4]);
-                                // On retire toutes les parenthèses avec = avant
-                                $InfoFieldList[4] = preg_replace('#\b[a-zA-Z0-9-\.-_]+\b=\([^)^(]*('.$word.')[^)^(]*\)#', '$1 ', $InfoFieldList[4], -1, $nbPregSel);
-                                // On retire les espaces autour des = et parenthèses
-                                $InfoFieldList[4] = preg_replace('# *(=|\(|\)) *#', '$1', $InfoFieldList[4]);
-
-                                // Calcul du compteur général pour la boucle
-                                $nbPreg = $nbPregRepl + $nbPregSel;
-                            }
-
-                            // Si l'on a un AND ou un OR, avant ou après
-                            preg_match('#(AND|OR|) *('.$word.') *(AND|OR|)#', $InfoFieldList[4], $matchCondition);
-                            while (!empty($matchCondition[0])) {
-                                // If the two sides differ but are not empty
-                                if (!empty($matchCondition[1]) && !empty($matchCondition[3]) && $matchCondition[1] != $matchCondition[3]) {
-                                    // Nobody sain would do that without parentheses
-                                    $InfoFieldList[4] = str_replace('$ID$', '0', $InfoFieldList[4]);
-                                } else {
-                                    if (!empty($matchCondition[1])) {
-                                        $boolCond = (($matchCondition[1] == "AND") ? ' AND TRUE ' : ' OR FALSE ');
-                                        $InfoFieldList[4] = str_replace($matchCondition[0], $boolCond.$matchCondition[3], $InfoFieldList[4]);
-                                    } elseif (!empty($matchCondition[3])) {
-                                        $boolCond = (($matchCondition[3] == "AND") ? ' TRUE AND ' : ' FALSE OR');
-                                        $InfoFieldList[4] = str_replace($matchCondition[0], $boolCond, $InfoFieldList[4]);
-                                    } else {
-                                        $InfoFieldList[4] = " TRUE ";
-                                    }
-                                }
-
-                                // Si l'on a un AND ou un OR, avant ou après
-                                preg_match('#(AND|OR|) *('.$word.') *(AND|OR|)#', $InfoFieldList[4], $matchCondition);
-                            }
-                        } else {
-                            $InfoFieldList[4] = str_replace('$ID$', '0', $InfoFieldList[4]);
-                        }
-
-                        // We have to join on extrafield table
-                        if (strpos($InfoFieldList[4], 'extra.') !== false) {
-                            $sql .= ' as main, '.MAIN_DB_PREFIX.$InfoFieldList[0].'_extrafields as extra';
-                            $sqlwhere .= ' WHERE extra.fk_object=main.'.$InfoFieldList[2].' AND '.$InfoFieldList[4];
-                        } else {
-                            $sqlwhere .= ' WHERE '.$InfoFieldList[4];
-                        }
-                    } else {
-                        $sqlwhere .= ' WHERE 1=1';
-                    }
-                    // Some tables may have field, some other not. For the moment we disable it.
-                    if (in_array($InfoFieldList[0], array('tablewithentity'))) {
-                        $sqlwhere .= ' AND entity = '.$conf->entity;
-                    }
-                    // $sql.=preg_replace('/^ AND /','',$sqlwhere);
-                    // print $sql;
-
-                    $sql .= $sqlwhere;
-                    dol_syslog(get_class($this).'::showInputField type=chkbxlst', LOG_DEBUG);
-                    $resql = $this->db->query($sql);
-                    if ($resql) {
-                        $num = $this->db->num_rows($resql);
-                        $i = 0;
-
-                        $data = array();
-
-                        while ($i < $num) {
-                            $labeltoshow = '';
-                            $obj = $this->db->fetch_object($resql);
-
-                            $notrans = false;
-                            // Several field into label (eq table:code|libelle:rowid)
-                            $fields_label = explode('|', $InfoFieldList[1]);
-                            if (is_array($fields_label)) {
-                                $notrans = true;
-                                foreach ($fields_label as $field_toshow) {
-                                    $labeltoshow .= $obj->$field_toshow.' ';
-                                }
-                            } else {
-                                $labeltoshow = $obj->{$InfoFieldList[1]};
-                            }
-                            $labeltoshow = dol_trunc($labeltoshow, 45);
-
-                            if (is_array($value_arr) && in_array($obj->rowid, $value_arr)) {
-                                foreach ($fields_label as $field_toshow) {
-                                    $translabel = $langs->trans($obj->$field_toshow);
-                                    if ($translabel != $obj->$field_toshow) {
-                                        $labeltoshow = dol_trunc($translabel, 18).' ';
-                                    } else {
-                                        $labeltoshow = dol_trunc($obj->$field_toshow, 18).' ';
-                                    }
-                                }
-
-                                $data[$obj->rowid] = $labeltoshow;
-                            } else {
-                                if (!$notrans) {
-                                    $translabel = $langs->trans($obj->{$InfoFieldList[1]});
-                                    if ($translabel != $obj->{$InfoFieldList[1]}) {
-                                        $labeltoshow = dol_trunc($translabel, 18);
-                                    } else {
-                                        $labeltoshow = dol_trunc($obj->{$InfoFieldList[1]}, 18);
-                                    }
-                                }
-                                if (empty($labeltoshow))
-                                    $labeltoshow = '(not defined)';
-
-                                if (is_array($value_arr) && in_array($obj->rowid, $value_arr)) {
-                                    $data[$obj->rowid] = $labeltoshow;
-                                }
-
-                                if (!empty($InfoFieldList[3]) && $parentField) {
-                                    $parent = $parentName.':'.$obj->{$parentField};
-                                }
-
-                                $data[$obj->rowid] = $labeltoshow;
-                            }
-
-                            $i++;
-                        }
-                        $this->db->free($resql);
-
-                        $out = $form->multiselectarray($keyprefix.$key.$keysuffix, $data, $value_arr, '', 0, '', 0, '100%');
-                    } else {
-                        print 'Error in request '.$sql.' '.$this->db->lasterror().'. Check setup of extra parameters.<br>';
-                    }
-                } else {
-					require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
-                    $data = $form->select_all_categories(Categorie::$MAP_ID_TO_CODE[$InfoFieldList[5]], '', 'parent', 64, $InfoFieldList[6], 1, 1);
-                    $out = $form->multiselectarray($keyprefix.$key.$keysuffix, $data, $value_arr, '', 0, '', 0, '100%');
-                }
-			}
-		}
-		elseif ($type == 'link')
-		{
-			$param_list = array_keys($param['options']); // $param_list='ObjectName:classPath'
-			$showempty = (($required && $default != '') ? 0 : 1);
-			$out = $form->selectForForms($param_list[0], $keyprefix.$key.$keysuffix, $value, $showempty, '', '', $morecss);
-		}
-		elseif ($type == 'password')
-		{
-			// If prefix is 'search_', field is used as a filter, we use a common text field.
-			$out = '<input style="display:none" type="text" name="fakeusernameremembered">'; // Hidden field to reduce impact of evil Google Chrome autopopulate bug.
-			$out .= '<input autocomplete="new-password" type="'.($keyprefix == 'search_' ? 'text' : 'password').'" class="flat '.$morecss.'" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.$value.'" '.($moreparam ? $moreparam : '').'>';
-		}
-		if (!empty($hidden)) {
-			$out = '<input type="hidden" value="'.$value.'" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'"/>';
-		}
-		/* Add comments
-		 if ($type == 'date') $out.=' (YYYY-MM-DD)';
-		 elseif ($type == 'datetime') $out.=' (YYYY-MM-DD HH:MM:SS)';
-		 */
-		/*if (! empty($help) && $keyprefix != 'search_options_') {
-			$out .= $form->textwithpicto('', $help, 1, 'help', '', 0, 3);
-		}*/
 		return $out;
 	}
 
@@ -744,595 +155,16 @@ class ExtraLanguages
 	 *
 	 * @param   string	$key            		Key of attribute
 	 * @param   string	$value          		Value to show
-	 * @param	string	$moreparam				To add more parameters on html input tag (only checkbox use html input for output rendering)
 	 * @param	string	$extrafieldsobjectkey	If defined (for example $object->table_element), function uses the new method to get extrafields data
+	 * @param	string	$moreparam				To add more parameters on html input tag (only checkbox use html input for output rendering)
 	 * @return	string							Formated value
 	 */
-	public function showOutputField($key, $value, $moreparam = '', $extrafieldsobjectkey = '')
-	{
-		global $conf, $langs;
-
-		if (!empty($extrafieldsobjectkey))
-		{
-			$label = $this->attributes[$extrafieldsobjectkey]['label'][$key];
-			$type = $this->attributes[$extrafieldsobjectkey]['type'][$key];
-			$size = $this->attributes[$extrafieldsobjectkey]['size'][$key];
-			$default = $this->attributes[$extrafieldsobjectkey]['default'][$key];
-			$computed = $this->attributes[$extrafieldsobjectkey]['computed'][$key];
-			$unique = $this->attributes[$extrafieldsobjectkey]['unique'][$key];
-			$required = $this->attributes[$extrafieldsobjectkey]['required'][$key];
-			$param = $this->attributes[$extrafieldsobjectkey]['param'][$key];
-			$perms = dol_eval($this->attributes[$extrafieldsobjectkey]['perms'][$key], 1);
-			$langfile = $this->attributes[$extrafieldsobjectkey]['langfile'][$key];
-			$list = dol_eval($this->attributes[$extrafieldsobjectkey]['list'][$key], 1);
-			$help = $this->attributes[$extrafieldsobjectkey]['help'][$key];
-			$hidden = (empty($list) ? 1 : 0); // If $list empty, we are sure it is hidden, otherwise we show. If it depends on mode (view/create/edit form or list, this must be filtered by caller)
-		}
-		else // Old usage
-		{
-			//dol_syslog("Warning: parameter 'extrafieldsobjectkey' is missing", LOG_WARNING);
-			$label = $this->attribute_label[$key];
-			$type = $this->attribute_type[$key];
-			$size = $this->attribute_size[$key];
-			$default = $this->attribute_default[$key];
-			$computed = $this->attribute_computed[$key];
-			$unique = $this->attribute_unique[$key];
-			$required = $this->attribute_required[$key];
-			$param = $this->attribute_param[$key];
-			$perms = dol_eval($this->attribute_perms[$key], 1);
-			$langfile = $this->attribute_langfile[$key];
-			$list = dol_eval($this->attribute_list[$key], 1);
-			$help = ''; // Not supported with old syntax
-			$hidden = (empty($list) ? 1 : 0); // If $list empty, we are sure it is hidden, otherwise we show. If it depends on mode (view/create/edit form or list, this must be filtered by caller)
-		}
-
-		if ($hidden) return ''; // This is a protection. If field is hidden, we should just not call this method.
-
-		//if ($computed) $value =		// $value is already calculated into $value before calling this method
-
-		$showsize = 0;
-		if ($type == 'date')
-		{
-			$showsize = 10;
-			$value = dol_print_date($value, 'day');
-		}
-		elseif ($type == 'datetime')
-		{
-			$showsize = 19;
-			$value = dol_print_date($value, 'dayhour');
-		}
-		elseif ($type == 'int')
-		{
-			$showsize = 10;
-		}
-		elseif ($type == 'double')
-		{
-			if (!empty($value)) {
-				//$value=price($value);
-				$sizeparts = explode(",", $size);
-				$number_decimals = $sizeparts[1];
-				$value = price($value, 0, $langs, 0, 0, $number_decimals, '');
-			}
-		}
-		elseif ($type == 'boolean')
-		{
-			$checked = '';
-			if (!empty($value)) {
-				$checked = ' checked ';
-			}
-			$value = '<input type="checkbox" '.$checked.' '.($moreparam ? $moreparam : '').' readonly disabled>';
-		}
-		elseif ($type == 'mail')
-		{
-			$value = dol_print_email($value, 0, 0, 0, 64, 1, 1);
-		}
-		elseif ($type == 'url')
-		{
-			$value = dol_print_url($value, '_blank', 32, 1);
-		}
-		elseif ($type == 'phone')
-		{
-			$value = dol_print_phone($value, '', 0, 0, '', '&nbsp;', 'phone');
-		}
-		elseif ($type == 'price')
-		{
-			$value = price($value, 0, $langs, 0, 0, -1, $conf->currency);
-		}
-		elseif ($type == 'select')
-		{
-			if ($langfile && $param['options'][$value]) $value = $langs->trans($param['options'][$value]);
-			else $value = $param['options'][$value];
-		}
-		elseif ($type == 'sellist')
-		{
-			$param_list = array_keys($param['options']);
-			$InfoFieldList = explode(":", $param_list[0]);
-
-			$selectkey = "rowid";
-			$keyList = 'rowid';
-
-			if (count($InfoFieldList) >= 3)
-			{
-				$selectkey = $InfoFieldList[2];
-				$keyList = $InfoFieldList[2].' as rowid';
-			}
-
-			$fields_label = explode('|', $InfoFieldList[1]);
-			if (is_array($fields_label)) {
-				$keyList .= ', ';
-				$keyList .= implode(', ', $fields_label);
-			}
-
-			$sql = 'SELECT '.$keyList;
-			$sql .= ' FROM '.MAIN_DB_PREFIX.$InfoFieldList[0];
-			if (strpos($InfoFieldList[4], 'extra') !== false)
-			{
-				$sql .= ' as main';
-			}
-			if ($selectkey == 'rowid' && empty($value)) {
-				$sql .= " WHERE ".$selectkey."=0";
-			} elseif ($selectkey == 'rowid') {
-				$sql .= " WHERE ".$selectkey."=".$this->db->escape($value);
-			} else {
-				$sql .= " WHERE ".$selectkey."='".$this->db->escape($value)."'";
-			}
-
-			//$sql.= ' AND entity = '.$conf->entity;
-
-			dol_syslog(get_class($this).':showOutputField:$type=sellist', LOG_DEBUG);
-			$resql = $this->db->query($sql);
-			if ($resql)
-			{
-				$value = ''; // value was used, so now we reste it to use it to build final output
-
-				$obj = $this->db->fetch_object($resql);
-
-				// Several field into label (eq table:code|libelle:rowid)
-				$fields_label = explode('|', $InfoFieldList[1]);
-
-				if (is_array($fields_label) && count($fields_label) > 1)
-				{
-					foreach ($fields_label as $field_toshow)
-					{
-						$translabel = '';
-						if (!empty($obj->$field_toshow)) {
-							$translabel = $langs->trans($obj->$field_toshow);
-						}
-						if ($translabel != $field_toshow) {
-							$value .= dol_trunc($translabel, 18).' ';
-						} else {
-							$value .= $obj->$field_toshow.' ';
-						}
-					}
-				}
-				else {
-					$translabel = '';
-					if (!empty($obj->{$InfoFieldList[1]})) {
-						$translabel = $langs->trans($obj->{$InfoFieldList[1]});
-					}
-					if ($translabel != $obj->{$InfoFieldList[1]}) {
-						$value = dol_trunc($translabel, 18);
-					} else {
-						$value = $obj->{$InfoFieldList[1]};
-					}
-				}
-			}
-			else dol_syslog(get_class($this).'::showOutputField error '.$this->db->lasterror(), LOG_WARNING);
-		}
-		elseif ($type == 'radio')
-		{
-			$value = $param['options'][$value];
-		}
-		elseif ($type == 'checkbox')
-		{
-			$value_arr = explode(',', $value);
-			$value = '';
-			$toprint = array();
-			if (is_array($value_arr))
-			{
-				foreach ($value_arr as $keyval=>$valueval) {
-					$toprint[] = '<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.$param['options'][$valueval].'</li>';
-				}
-			}
-			$value = '<div class="select2-container-multi-dolibarr" style="width: 90%;"><ul class="select2-choices-dolibarr">'.implode(' ', $toprint).'</ul></div>';
-		}
-		elseif ($type == 'chkbxlst')
-		{
-			$value_arr = explode(',', $value);
-
-			$param_list = array_keys($param['options']);
-			$InfoFieldList = explode(":", $param_list[0]);
-
-			$selectkey = "rowid";
-			$keyList = 'rowid';
-
-			if (count($InfoFieldList) >= 3) {
-				$selectkey = $InfoFieldList[2];
-				$keyList = $InfoFieldList[2].' as rowid';
-			}
-
-			$fields_label = explode('|', $InfoFieldList[1]);
-			if (is_array($fields_label)) {
-				$keyList .= ', ';
-				$keyList .= implode(', ', $fields_label);
-			}
-
-			$sql = 'SELECT '.$keyList;
-			$sql .= ' FROM '.MAIN_DB_PREFIX.$InfoFieldList[0];
-			if (strpos($InfoFieldList[4], 'extra') !== false) {
-				$sql .= ' as main';
-			}
-			// $sql.= " WHERE ".$selectkey."='".$this->db->escape($value)."'";
-			// $sql.= ' AND entity = '.$conf->entity;
-
-			dol_syslog(get_class($this).':showOutputField:$type=chkbxlst', LOG_DEBUG);
-			$resql = $this->db->query($sql);
-			if ($resql) {
-				$value = ''; // value was used, so now we reste it to use it to build final output
-				$toprint = array();
-				while ($obj = $this->db->fetch_object($resql)) {
-					// Several field into label (eq table:code|libelle:rowid)
-					$fields_label = explode('|', $InfoFieldList[1]);
-					if (is_array($value_arr) && in_array($obj->rowid, $value_arr)) {
-						if (is_array($fields_label) && count($fields_label) > 1) {
-							foreach ($fields_label as $field_toshow) {
-								$translabel = '';
-								if (!empty($obj->$field_toshow)) {
-									$translabel = $langs->trans($obj->$field_toshow);
-								}
-								if ($translabel != $field_toshow) {
-									$toprint[] = '<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.dol_trunc($translabel, 18).'</li>';
-								} else {
-									$toprint[] = '<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.$obj->$field_toshow.'</li>';
-								}
-							}
-						} else {
-							$translabel = '';
-							if (!empty($obj->{$InfoFieldList[1]})) {
-								$translabel = $langs->trans($obj->{$InfoFieldList[1]});
-							}
-							if ($translabel != $obj->{$InfoFieldList[1]}) {
-								$toprint[] = '<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.dol_trunc($translabel, 18).'</li>';
-							} else {
-								$toprint[] = '<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.$obj->{$InfoFieldList[1]}.'</li>';
-							}
-						}
-					}
-				}
-				$value = '<div class="select2-container-multi-dolibarr" style="width: 90%;"><ul class="select2-choices-dolibarr">'.implode(' ', $toprint).'</ul></div>';
-			} else {
-				dol_syslog(get_class($this).'::showOutputField error '.$this->db->lasterror(), LOG_WARNING);
-			}
-		}
-		elseif ($type == 'link')
-		{
-			$out = '';
-
-			// Only if something to display (perf)
-			if ($value)		// If we have -1 here, pb is into insert, not into ouptut (fix insert instead of changing code here to compensate)
-			{
-				$param_list = array_keys($param['options']); // $param_list='ObjectName:classPath'
-
-				$InfoFieldList = explode(":", $param_list[0]);
-				$classname = $InfoFieldList[0];
-				$classpath = $InfoFieldList[1];
-				if (!empty($classpath))
-				{
-					dol_include_once($InfoFieldList[1]);
-					if ($classname && class_exists($classname))
-					{
-						$object = new $classname($this->db);
-						$object->fetch($value);
-						$value = $object->getNomUrl(3);
-					}
-				}
-				else {
-					dol_syslog('Error bad setup of extrafield', LOG_WARNING);
-					return 'Error bad setup of extrafield';
-				}
-			}
-		}
-		elseif ($type == 'text')
-		{
-			$value = dol_htmlentitiesbr($value);
-		}
-		elseif ($type == 'html')
-		{
-			$value = dol_htmlentitiesbr($value);
-		}
-		elseif ($type == 'password')
-		{
-			$value = dol_trunc(preg_replace('/./i', '*', $value), 8, 'right', 'UTF-8', 1);
-		}
-		else {
-			$showsize = round($size);
-			if ($showsize > 48) $showsize = 48;
-		}
-
-		//print $type.'-'.$size;
-		$out = $value;
-
-		return $out;
-	}
-
-	/**
-	 * Return tag to describe alignement to use for this extrafield
-	 *
-	 * @param   string	$key            		Key of attribute
-	 * @param	string	$extrafieldsobjectkey	If defined, use the new method to get extrafields data
-	 * @return	string							Formated value
-	 */
-	public function getAlignFlag($key, $extrafieldsobjectkey = '')
+	public function showOutputField($key, $value, $extrafieldsobjectkey, $moreparam = '')
 	{
 		global $conf, $langs;
 
-		if (!empty($extrafieldsobjectkey)) $type = $this->attributes[$extrafieldsobjectkey]['type'][$key];
-		else $type = $this->attribute_type[$key];
-
-		$align = '';
-
-        if ($type == 'date')
-		{
-			$align = "center";
-		}
-		elseif ($type == 'datetime')
-		{
-			$align = "center";
-		}
-		elseif ($type == 'int')
-		{
-			$align = "right";
-		}
-		elseif ($type == 'price')
-		{
-			$align = "right";
-		}
-		elseif ($type == 'double')
-		{
-			$align = "right";
-		}
-		elseif ($type == 'boolean')
-		{
-			$align = "center";
-		}
-		elseif ($type == 'radio')
-		{
-			$align = "center";
-		}
-		elseif ($type == 'checkbox')
-		{
-			$align = "center";
-		}
-		elseif ($type == 'price')
-		{
-			$align = "right";
-		}
-
-		return $align;
-	}
-
-	/**
-	 * Return HTML string to print separator extrafield
-	 *
-	 * @param   string	$key            Key of attribute
-	 * @param	string	$object			Object
-	 * @param	int		$colspan		Value of colspan to use (it must includes the first column with title)
-	 * @return 	string					HTML code with line for separator
-	 */
-	public function showSeparator($key, $object, $colspan = 2)
-	{
-		global $langs;
-
-		$out = '<tr id="trextrafieldseparator'.$key.'" class="trextrafieldseparator trextrafieldseparator'.$key.'"><td colspan="'.$colspan.'"><strong>';
-		$out .= $langs->trans($this->attributes[$object->table_element]['label'][$key]);
-		$out .= '</strong></td></tr>';
-
-        $extrafield_param = $this->attributes[$object->table_element]['param'][$key];
-        if (!empty($extrafield_param) && is_array($extrafield_param)) {
-            $extrafield_param_list = array_keys($extrafield_param['options']);
-
-            if (count($extrafield_param_list) > 0) {
-                $extrafield_collapse_display_value = intval($extrafield_param_list[0]);
-                if ($extrafield_collapse_display_value == 1 || $extrafield_collapse_display_value == 2) {
-                	// Set the collapse_display status to cookie in priority or if ignorecollapsesetup is 1, if cookie and ignorecollapsesetup not defined, use the setup.
-                	$collapse_display = ((isset($_COOKIE['DOLCOLLAPSE_'.$object->table_element.'_extrafields_'.$key]) || GETPOST('ignorecollapsesetup', 'int')) ? ($_COOKIE['DOLCOLLAPSE_'.$object->table_element.'_extrafields_'.$key] ? true : false) : ($extrafield_collapse_display_value == 2 ? false : true));
-                    $extrafields_collapse_num = $this->attributes[$object->table_element]['pos'][$key];
-
-                    $out .= '<!-- Add js script to manage the collpase/uncollapse of extrafields separators '.$key.' -->';
-                    $out .= '<script type="text/javascript">';
-                    $out .= 'jQuery(document).ready(function(){';
-                    if ($collapse_display === false) {
-                        $out .= '   jQuery("#trextrafieldseparator'.$key.' td").prepend("<span class=\"cursorpointer fa fa-plus-square\"></span>&nbsp;");'."\n";
-                        $out .= '   jQuery(".trextrafields_collapse'.$extrafields_collapse_num.'").hide();'."\n";
-                    } else {
-                    	$out .= '   jQuery("#trextrafieldseparator'.$key.' td").prepend("<span class=\"cursorpointer fa fa-minus-square\"></span>&nbsp;");'."\n";
-                    	$out .= '   document.cookie = "DOLCOLLAPSE_'.$object->table_element.'_extrafields_'.$key.'=1; path='.$_SERVER["PHP_SELF"].'"'."\n";
-                    }
-                    $out .= '   jQuery("#trextrafieldseparator'.$key.'").click(function(){'."\n";
-                    $out .= '       jQuery(".trextrafields_collapse'.$extrafields_collapse_num.'").toggle(300, function(){'."\n";
-                    $out .= '           if (jQuery(".trextrafields_collapse'.$extrafields_collapse_num.'").is(":hidden")) {'."\n";
-                    $out .= '               jQuery("#trextrafieldseparator'.$key.' td span").addClass("fa-plus-square").removeClass("fa-minus-square");'."\n";
-                    $out .= '               document.cookie = "DOLCOLLAPSE_'.$object->table_element.'_extrafields_'.$key.'=0; path='.$_SERVER["PHP_SELF"].'"'."\n";
-                    $out .= '           } else {'."\n";
-                    $out .= '               jQuery("#trextrafieldseparator'.$key.' td span").addClass("fa-minus-square").removeClass("fa-plus-square");'."\n";
-                    $out .= '               document.cookie = "DOLCOLLAPSE_'.$object->table_element.'_extrafields_'.$key.'=1; path='.$_SERVER["PHP_SELF"].'"'."\n";
-                    $out .= '           }'."\n";
-                    $out .= '       });';
-                    $out .= '   });';
-                    $out .= '});';
-                    $out .= '</script>';
-                }
-            }
-        }
+		$out = $this->attributes[$extrafieldsobjectkey][$key];
 
 		return $out;
 	}
-
-	/**
-	 * Fill array_options property of object by extrafields value (using for data sent by forms)
-	 *
-	 * @param   array	$extralabels    Deprecated (old $array of extrafields, now set this to null)
-	 * @param   object	$object         Object
-	 * @param	string	$onlykey		Only the following key is filled. When we make update of only one extrafield ($action = 'update_extras'), calling page must set this to avoid to have other extrafields being reset.
-	 * @return	int						1 if array_options set, 0 if no value, -1 if error (field required missing for example)
-	 */
-	public function setOptionalsFromPost($extralabels, &$object, $onlykey = '')
-	{
-		global $_POST, $langs;
-
-		$nofillrequired = 0; // For error when required field left blank
-		$error_field_required = array();
-
-		if (is_array($this->attributes[$object->table_element]['label'])) $extralabels = $this->attributes[$object->table_element]['label'];
-
-		if (is_array($extralabels))
-		{
-			// Get extra fields
-			foreach ($extralabels as $key => $value)
-			{
-				if (!empty($onlykey) && $key != $onlykey) continue;
-
-				$key_type = $this->attributes[$object->table_element]['type'][$key];
-				if ($key_type == 'separate') continue;
-
-				$enabled = 1;
-				if (isset($this->attributes[$object->table_element]['list'][$key]))
-				{
-					$enabled = dol_eval($this->attributes[$object->table_element]['list'][$key], 1);
-				}
-				$perms = 1;
-				if (isset($this->attributes[$object->table_element]['perms'][$key]))
-				{
-					$perms = dol_eval($this->attributes[$object->table_element]['perms'][$key], 1);
-				}
-				if (empty($enabled)) continue;
-				if (empty($perms)) continue;
-
-				if ($this->attributes[$object->table_element]['required'][$key])	// Value is required
-				{
-					// Check if empty without using GETPOST, value can be alpha, int, array, etc...
-				    if ((!is_array($_POST["options_".$key]) && empty($_POST["options_".$key]) && $this->attributes[$object->table_element]['type'][$key] != 'select' && $_POST["options_".$key] != '0')
-				        || (!is_array($_POST["options_".$key]) && empty($_POST["options_".$key]) && $this->attributes[$object->table_element]['type'][$key] == 'select')
-						|| (is_array($_POST["options_".$key]) && empty($_POST["options_".$key])))
-					{
-						//print 'ccc'.$value.'-'.$this->attributes[$object->table_element]['required'][$key];
-						$nofillrequired++;
-						$error_field_required[] = $langs->transnoentitiesnoconv($value);
-					}
-				}
-
-				if (in_array($key_type, array('date')))
-				{
-					// Clean parameters
-					// TODO GMT date in memory must be GMT so we should add gm=true in parameters
-					$value_key = dol_mktime(0, 0, 0, $_POST["options_".$key."month"], $_POST["options_".$key."day"], $_POST["options_".$key."year"]);
-				}
-				elseif (in_array($key_type, array('datetime')))
-				{
-					// Clean parameters
-					// TODO GMT date in memory must be GMT so we should add gm=true in parameters
-					$value_key = dol_mktime($_POST["options_".$key."hour"], $_POST["options_".$key."min"], 0, $_POST["options_".$key."month"], $_POST["options_".$key."day"], $_POST["options_".$key."year"]);
-				}
-				elseif (in_array($key_type, array('checkbox', 'chkbxlst')))
-				{
-					$value_arr = GETPOST("options_".$key, 'array'); // check if an array
-					if (!empty($value_arr)) {
-						$value_key = implode($value_arr, ',');
-					} else {
-						$value_key = '';
-					}
-				}
-				elseif (in_array($key_type, array('price', 'double')))
-				{
-					$value_arr = GETPOST("options_".$key, 'alpha');
-					$value_key = price2num($value_arr);
-				}
-				else {
-					$value_key = GETPOST("options_".$key);
-					if (in_array($key_type, array('link')) && $value_key == '-1') $value_key = '';
-				}
-
-				$object->array_options["options_".$key] = $value_key;
-			}
-
-			if ($nofillrequired) {
-				$langs->load('errors');
-				setEventMessages($langs->trans('ErrorFieldsRequired').' : '.implode(', ', $error_field_required), null, 'errors');
-				return -1;
-			}
-			else {
-				return 1;
-			}
-		}
-		else {
-			return 0;
-		}
-	}
-
-	/**
-	 * return array_options array of data of extrafields value of object sent by a search form
-	 *
-	 * @param  array|string		$extrafieldsobjectkey  	array of extrafields (old usage) or value of object->table_element (new usage)
-	 * @param  string			$keyprefix      		Prefix string to add into name and id of field (can be used to avoid duplicate names)
-	 * @param  string			$keysuffix      		Suffix string to add into name and id of field (can be used to avoid duplicate names)
-	 * @return array|int								array_options set or 0 if no value
-	 */
-	public function getOptionalsFromPost($extrafieldsobjectkey, $keyprefix = '', $keysuffix = '')
-	{
-		global $_POST;
-
-		if (is_string($extrafieldsobjectkey) && is_array($this->attributes[$extrafieldsobjectkey]['label']))
-		{
-			$extralabels = $this->attributes[$extrafieldsobjectkey]['label'];
-		}
-		else {
-			$extralabels = $extrafieldsobjectkey;
-		}
-
-		if (is_array($extralabels))
-		{
-			$array_options = array();
-
-			// Get extra fields
-			foreach ($extralabels as $key => $value)
-			{
-				$key_type = '';
-				if (is_string($extrafieldsobjectkey))
-				{
-					$key_type = $this->attributes[$extrafieldsobjectkey]['type'][$key];
-				}
-
-				if (in_array($key_type, array('date', 'datetime')))
-				{
-					if (!GETPOSTISSET($keysuffix."options_".$key.$keyprefix."year")) continue; // Value was not provided, we should not set it.
-					// Clean parameters
-					$value_key = dol_mktime(GETPOST($keysuffix."options_".$key.$keyprefix."hour", 'int'), GETPOST($keysuffix."options_".$key.$keyprefix."min", 'int'), 0, GETPOST($keysuffix."options_".$key.$keyprefix."month", 'int'), GETPOST($keysuffix."options_".$key.$keyprefix."day", 'int'), GETPOST($keysuffix."options_".$key.$keyprefix."year", 'int'));
-				}
-				elseif (in_array($key_type, array('checkbox', 'chkbxlst')))
-				{
-					if (!GETPOSTISSET($keysuffix."options_".$key.$keyprefix)) continue; // Value was not provided, we should not set it.
-					$value_arr = GETPOST($keysuffix."options_".$key.$keyprefix);
-					// Make sure we get an array even if there's only one checkbox
-					$value_arr = (array) $value_arr;
-					$value_key = implode(',', $value_arr);
-				}
-				elseif (in_array($key_type, array('price', 'double', 'int')))
-				{
-					if (!GETPOSTISSET($keysuffix."options_".$key.$keyprefix)) continue; // Value was not provided, we should not set it.
-					$value_arr = GETPOST($keysuffix."options_".$key.$keyprefix);
-					$value_key = price2num($value_arr);
-				}
-				else {
-					if (!GETPOSTISSET($keysuffix."options_".$key.$keyprefix)) continue; // Value was not provided, we should not set it.
-					$value_key = GETPOST($keysuffix."options_".$key.$keyprefix);
-				}
-
-				$array_options[$keysuffix."options_".$key] = $value_key; // No keyprefix here. keyprefix is used only for read.
-			}
-
-			return $array_options;
-		}
-
-		return 0;
-	}
 }

+ 2 - 0
htdocs/core/class/html.form.class.php

@@ -364,6 +364,8 @@ class Form
 
 				$s = picto_from_langcode($langcode, 'class="pictoforlang paddingright"');
 				$resultforextrlang .= $s;
+
+				// TODO Use the showInputField() method of ExtraLanguages object
 				if ($typeofdata == 'textarea') {
 					$resultforextrlang .= '<textarea name="field-'.$object->element."-".$fieldname."-".$langcode.'" id="'.$fieldname."-".$langcode.'" class="'.$morecss.'" rows="'.ROWS_2.'" wrap="soft">';
 					$resultforextrlang .= $valuetoshow;

+ 4 - 2
htdocs/index.php

@@ -687,7 +687,7 @@ if (empty($conf->global->MAIN_DISABLE_GLOBAL_WORKBOARD)) {
                     }
                 }
 
-                $openedDashBoard .= '<div class="box-flex-item">'."\n";
+                $openedDashBoard .= '<div class="box-flex-item"><div class="box-flex-item-with-margin">'."\n";
                 $openedDashBoard .= '	<div class="info-box '.$openedDashBoardSize.'">'."\n";
                 $openedDashBoard .= '		<span class="info-box-icon bg-infobox-'.$groupKeyLowerCase.'">'."\n";
                 $openedDashBoard .= '		<i class="fa fa-dol-'.$groupKeyLowerCase.'"></i>'."\n";
@@ -734,6 +734,7 @@ if (empty($conf->global->MAIN_DISABLE_GLOBAL_WORKBOARD)) {
 
                 $openedDashBoard .= '		</div><!-- /.info-box-content -->'."\n";
                 $openedDashBoard .= '	</div><!-- /.info-box -->'."\n";
+                $openedDashBoard .= '</div><!-- /.box-flex-item-with-margin -->'."\n";
                 $openedDashBoard .= '</div><!-- /.box-flex-item -->'."\n";
                 $openedDashBoard .= "\n";
             }
@@ -752,7 +753,7 @@ if (empty($conf->global->MAIN_DISABLE_GLOBAL_WORKBOARD)) {
             }
             $text .= '. '.$langs->transnoentitiesnoconv("LateDesc");
 
-            $weatherDashBoard = '<div class="box-flex-item '.$appendClass.'">'."\n";
+            $weatherDashBoard = '<div class="box-flex-item '.$appendClass.'"><div class="box-flex-item-with-margin">'."\n";
             $weatherDashBoard .= '	<div class="info-box '.$openedDashBoardSize.' info-box-weather info-box-weather-level'.$weather->level.'">'."\n";
             $weatherDashBoard .= '		<span class="info-box-icon">';
             $weatherDashBoard .= img_weather('', $weather->level, '', 0, 'valignmiddle width50');
@@ -776,6 +777,7 @@ if (empty($conf->global->MAIN_DISABLE_GLOBAL_WORKBOARD)) {
 
             $weatherDashBoard .= '		</div><!-- /.info-box-content -->'."\n";
             $weatherDashBoard .= '	</div><!-- /.info-box -->'."\n";
+            $weatherDashBoard .= '</div><!-- /.box-flex-item-with-margin -->'."\n";
             $weatherDashBoard .= '</div><!-- /.box-flex-item -->'."\n";
             $weatherDashBoard .= "\n";
 

+ 4 - 3
htdocs/theme/eldy/info-box.inc.php

@@ -314,8 +314,8 @@ if (GETPOSTISSET('THEME_AGRESSIVENESS_RATIO')) $conf->global->THEME_AGRESSIVENES
 	display: flex; /* or inline-flex */
 	flex-direction: row;
 	flex-wrap: wrap;
-	width: 100%;
-	margin: 0 0 0 -8px;
+	width: calc(100% + 14px);
+	margin: 0 -8px 0 -8px;
 	/*justify-content: space-between;*/
 }
 
@@ -348,7 +348,8 @@ if (GETPOSTISSET('THEME_AGRESSIVENESS_RATIO')) $conf->global->THEME_AGRESSIVENES
 @media only screen and (max-width: 767px)
 {
 	.box-flex-container {
-	    margin: 0 0 0 0 !important;
+	    margin: 0 0 0 0px !important;
+	    width: 100% !important;
 	}
 
 	.info-box-module {