diff --git a/composer.json b/composer.json
index bd81e101cfc..a943fbe0aa3 100644
--- a/composer.json
+++ b/composer.json
@@ -59,4 +59,4 @@
"ext-zip" : "ODT, Excel and file compression support",
"ext-xml" : "Excel support"
}
-}
\ No newline at end of file
+}
diff --git a/htdocs/core/class/commonobjectline.class.php b/htdocs/core/class/commonobjectline.class.php
index 0d4cfbe4f34..806e0f2a663 100644
--- a/htdocs/core/class/commonobjectline.class.php
+++ b/htdocs/core/class/commonobjectline.class.php
@@ -100,4 +100,255 @@ abstract class CommonObjectLine extends CommonObject
// Currently we need function at end of file CommonObject for all object lines. Should find a way to avoid duplicate code.
// For the moment we use the extends on CommonObject until PHP min is 5.4 so use Traits.
+
+ /**
+ * Function to show lines of extrafields with output datas.
+ * This function is responsible to output the
and | according to correct number of columns received into $params['colspan']
+ *
+ * @param Extrafields $extrafields Extrafield Object
+ * @param string $mode Show output ('view') or input ('create' or 'edit') for extrafield
+ * @param array $params Optional parameters. Example: array('style'=>'class="oddeven"', 'colspan'=>$colspan)
+ * @param string $keysuffix Suffix string to add after name and id of field (can be used to avoid duplicate names)
+ * @param string $keyprefix Prefix string to add before name and id of field (can be used to avoid duplicate names)
+ * @param string $onetrtd All fields in same tr td. Used by objectline_create.tpl.php for example.
+ * @return string
+ */
+ public function showOptionals($extrafields, $mode = 'view', $params = null, $keysuffix = '', $keyprefix = '', $onetrtd = 0)
+ {
+ global $db, $conf, $langs, $action, $form, $hookmanager;
+
+ if (!is_object($form)) $form = new Form($db);
+
+ $out = '';
+
+ $parameters = array();
+ $reshook = $hookmanager->executeHooks('showOptionals', $parameters, $this, $action); // Note that $action and $object may have been modified by hook
+ if (empty($reshook))
+ {
+ if (is_array($extrafields->attributes[$this->table_element]['label']) && count($extrafields->attributes[$this->table_element]['label']) > 0)
+ {
+ $out .= "\n";
+ $out .= ' ';
+ $out .= "\n";
+
+ $extrafields_collapse_num = '';
+ $e = 0;
+ foreach ($extrafields->attributes[$this->table_element]['label'] as $key=>$label)
+ {
+ // Show only the key field in params
+ if (is_array($params) && array_key_exists('onlykey', $params) && $key != $params['onlykey']) continue;
+
+ // Test on 'enabled' ('enabled' is different than 'list' = 'visibility')
+ $enabled = 1;
+ if ($enabled && isset($extrafields->attributes[$this->table_element]['enabled'][$key]))
+ {
+ $enabled = dol_eval($extrafields->attributes[$this->table_element]['enabled'][$key], 1);
+ }
+ if (empty($enabled)) continue;
+
+ $visibility = 1;
+ if ($visibility && isset($extrafields->attributes[$this->table_element]['list'][$key]))
+ {
+ $visibility = dol_eval($extrafields->attributes[$this->table_element]['list'][$key], 1);
+ }
+
+ $perms = 1;
+ if ($perms && isset($extrafields->attributes[$this->table_element]['perms'][$key]))
+ {
+ $perms = dol_eval($extrafields->attributes[$this->table_element]['perms'][$key], 1);
+ }
+
+ if (($mode == 'create') && abs($visibility) != 1 && abs($visibility) != 3) continue; // <> -1 and <> 1 and <> 3 = not visible on forms, only on list
+ elseif (($mode == 'edit') && abs($visibility) != 1 && abs($visibility) != 3 && abs($visibility) != 4) continue; // <> -1 and <> 1 and <> 3 = not visible on forms, only on list and <> 4 = not visible at the creation
+ elseif ($mode == 'view' && empty($visibility)) continue;
+ if (empty($perms)) continue;
+ // Load language if required
+ if (!empty($extrafields->attributes[$this->table_element]['langfile'][$key])) {
+ $langs->load($extrafields->attributes[$this->table_element]['langfile'][$key]);
+ }
+
+ switch ($mode) {
+ case "view":
+ $value = $this->array_options["options_".$key.$keysuffix]; // Value may be clean or formated later
+ break;
+ case "create":
+ case "edit":
+ // We get the value of property found with GETPOST so it takes into account:
+ // default values overwrite, restore back to list link, ... (but not 'default value in database' of field)
+ $check = 'alphanohtml';
+ if (in_array($extrafields->attributes[$this->table_element]['type'][$key], array('html', 'text'))) {
+ $check = 'restricthtml';
+ }
+ $getposttemp = GETPOST($keyprefix.'options_'.$key.$keysuffix, $check, 3); // GETPOST can get value from GET, POST or setup of default values overwrite.
+ // GETPOST("options_" . $key) can be 'abc' or array(0=>'abc')
+ if (is_array($getposttemp) || $getposttemp != '' || GETPOSTISSET($keyprefix.'options_'.$key.$keysuffix))
+ {
+ if (is_array($getposttemp)) {
+ // $getposttemp is an array but following code expects a comma separated string
+ $value = implode(",", $getposttemp);
+ } else {
+ $value = $getposttemp;
+ }
+ } else {
+ $value = $this->array_options["options_".$key]; // No GET, no POST, no default value, so we take value of object.
+ }
+ //var_dump($keyprefix.' - '.$key.' - '.$keysuffix.' - '.$keyprefix.'options_'.$key.$keysuffix.' - '.$this->array_options["options_".$key.$keysuffix].' - '.$getposttemp.' - '.$value);
+ break;
+ }
+
+ if ($extrafields->attributes[$this->table_element]['type'][$key] == 'separate')
+ {
+ $extrafields_collapse_num = '';
+ $extrafield_param = $extrafields->attributes[$this->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) {
+ $extrafields_collapse_num = $extrafields->attributes[$this->table_element]['pos'][$key];
+ }
+ }
+ }
+
+ $out .= $extrafields->showSeparator($key, $this, 0, 'line');
+ } else {
+ $class = (!empty($extrafields->attributes[$this->table_element]['hidden'][$key]) ? 'hideobject ' : '');
+ $csstyle = '';
+ if (is_array($params) && count($params) > 0) {
+ if (array_key_exists('class', $params)) {
+ $class .= $params['class'].' ';
+ }
+ if (array_key_exists('style', $params)) {
+ $csstyle = $params['style'];
+ }
+ }
+
+ // add html5 elements
+ $domData = ' data-element="extrafield"';
+ $domData .= ' data-targetelement="'.$this->element.'"';
+ $domData .= ' data-targetid="'.$this->id.'"';
+
+ $html_id = (empty($this->id) ? '' : 'extrarow-'.$this->element.'_'.$key.'_'.$this->id);
+
+ // Convert date into timestamp format (value in memory must be a timestamp)
+ if (in_array($extrafields->attributes[$this->table_element]['type'][$key], array('date', 'datetime')))
+ {
+ $datenotinstring = $this->array_options['options_'.$key];
+ if (!is_numeric($this->array_options['options_'.$key])) // For backward compatibility
+ {
+ $datenotinstring = $this->db->jdate($datenotinstring);
+ }
+ $value = (GETPOSTISSET($keyprefix.'options_'.$key.$keysuffix)) ? dol_mktime(GETPOST($keyprefix.'options_'.$key.$keysuffix."hour", 'int', 3), GETPOST($keyprefix.'options_'.$key.$keysuffix."min", 'int', 3), 0, GETPOST($keyprefix.'options_'.$key.$keysuffix."month", 'int', 3), GETPOST($keyprefix.'options_'.$key.$keysuffix."day", 'int', 3), GETPOST($keyprefix.'options_'.$key.$keysuffix."year", 'int', 3)) : $datenotinstring;
+ }
+ // Convert float submited string into real php numeric (value in memory must be a php numeric)
+ if (in_array($extrafields->attributes[$this->table_element]['type'][$key], array('price', 'double')))
+ {
+ $value = (GETPOSTISSET($keyprefix.'options_'.$key.$keysuffix) || $value) ? price2num($value) : $this->array_options['options_'.$key];
+ }
+
+ // HTML, text, select, integer and varchar: take into account default value in database if in create mode
+ if (in_array($extrafields->attributes[$this->table_element]['type'][$key], array('html', 'text', 'varchar', 'select', 'int')))
+ {
+ if ($action == 'create') $value = (GETPOSTISSET($keyprefix.'options_'.$key.$keysuffix) || $value) ? $value : $extrafields->attributes[$this->table_element]['default'][$key];
+ }
+
+ $labeltoshow = $langs->trans($label);
+ $helptoshow = $langs->trans($extrafields->attributes[$this->table_element]['help'][$key]);
+
+ $out .= '';
+ else $out .= '';
+ $e++;
+ }
+ }
+ $out .= "\n";
+ // Add code to manage list depending on others
+ if (!empty($conf->use_javascript_ajax)) {
+ $out .= '
+ '."\n";
+ }
+
+ $out .= ' '."\n";
+ }
+ }
+
+ $out .= $hookmanager->resPrint;
+
+ return $out;
+ }
}
diff --git a/htdocs/core/class/extrafields.class.php b/htdocs/core/class/extrafields.class.php
index d041aba45f4..e6a11b17c67 100644
--- a/htdocs/core/class/extrafields.class.php
+++ b/htdocs/core/class/extrafields.class.php
@@ -1912,15 +1912,28 @@ class ExtraFields
* @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)
+ * @param string $typeform "card" for from display, "line" for docuement line display (exstraiedls on propal line, order line, etc...)
* @return string HTML code with line for separator
*/
- public function showSeparator($key, $object, $colspan = 2)
+ public function showSeparator($key, $object, $colspan = 2, $typeform='card')
{
global $langs;
- $out = ' |
';
+ $out .= '';
+ $out .= ''.$tagtype_dyn.'>';
+ $out .= ''.$tagtype.'>';
$extrafield_param = $this->attributes[$object->table_element]['param'][$key];
if (!empty($extrafield_param) && is_array($extrafield_param)) {
@@ -1930,27 +1943,27 @@ class ExtraFields
$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];
+ $collapse_display = ((isset($_COOKIE['DOLCOLLAPSE_'.$object->table_element.'_extrafields_'.$key.(!empty($object->id)?'_'.$object->id:'')]) || GETPOST('ignorecollapsesetup', 'int')) ? ($_COOKIE['DOLCOLLAPSE_'.$object->table_element.'_extrafields_'.$key.(!empty($object->id)?'_'.$object->id:'')] ? true : false) : ($extrafield_collapse_display_value == 2 ? false : true));
+ $extrafields_collapse_num = $this->attributes[$object->table_element]['pos'][$key].(!empty($object->id)?'_'.$object->id:'');
$out .= '';
$out .= '