/** * Populate a single simple HTML Form Field (leaf). * * @global string $currentCourseLanguage * @param string $fullKey * @param CourseXMLElement $parent * @return string */ private function appendLeafFormField($fullKey, $parent) { global $currentCourseLanguage; // init vars $keyLbl = (isset($GLOBALS['langCMeta'][$fullKey])) ? $GLOBALS['langCMeta'][$fullKey] : $fullKey; $helptitle = (isset($GLOBALS['langCMeta']['help_' . $fullKey])) ? " data-toggle='tooltip' title='" . q($GLOBALS['langCMeta']['help_' . $fullKey]) . "'" : ''; $fullKeyNoLang = $fullKey; $sameAsCourseLang = false; $lang = ''; if ($this->getAttribute('lang')) { $fullKey .= '_' . $this->getAttribute('lang'); $lang = ' (' . $GLOBALS['langCMeta'][(string) $this->getAttribute('lang')] . ')'; if ($this->getAttribute('lang') == $currentCourseLanguage) { $sameAsCourseLang = true; } else { $helptitle = ''; // in case of multi-lang field, display help text only once (the same as the course lang) } } // proper divs initializations $fieldStart = ""; if (array_key_exists($fullKey, CourseXMLConfig::$breakAccordionStartFields)) { $fieldStart .= "<div class='panel-group'> <div class='panel panel-default'> <div class='panel-heading'> <h3 class='panel-title'> <a data-toggle='collapse' href='#metacollapse-" . CourseXMLConfig::$breakAccordionStartFields[$fullKey] . "'>" . $GLOBALS['langMore'] . "</a> </h3> </div> <div id='metacollapse-" . CourseXMLConfig::$breakAccordionStartFields[$fullKey] . "' class='panel-collapse collapse'> <div class='panel-body'>"; } $cmetalabel = (in_array($fullKey, CourseXMLConfig::$mandatoryFields) || strpos($fullKey, 'course_unit_') === 0 || strpos($fullKey, 'course_numberOfUnits') === 0 || in_array($fullKey, CourseXMLConfig::$overrideClass)) ? 'cmetalabel' : 'cmetalabelinaccordion'; $fieldStart .= "<div class='form-group'><label $helptitle class='control-label col-sm-3'>"; if (in_array($fullKeyNoLang, CourseXMLConfig::$linkedFields) && (!$this->getAttribute('lang') || $sameAsCourseLang)) { $fieldStart .= "<a href='" . CourseXMLConfig::getLinkedValue($fullKey) . "' target='_blank'>" . q($keyLbl . $lang) . "</a>"; } else { $fieldStart .= q($keyLbl . $lang); } if (in_array($fullKey, CourseXMLConfig::$mandatoryFields) || in_array($fullKey, CourseXMLConfig::$asteriskedFields)) { $fieldStart .= "(<span style='color:red'>*</span>)"; } $fieldStart .= ":</label><div class='col-sm-9'>"; $fieldEnd = "</div>"; $fieldEnd .= "</div>"; // break divs if (in_array($fullKey, CourseXMLConfig::$breakAccordionEndFields)) { $fieldEnd .= "</div></div></div></div>"; } // inject if (in_array($fullKey, CourseXMLConfig::$injectFields)) { $fieldEnd .= CourseXMLConfig::getInjectValue($fullKey); } // break tabs if (array_key_exists($fullKey, CourseXMLConfig::$breakFields)) { $fieldEnd .= "</div><div class='tab-pane fade' style='padding-top:20px' id='tabs-" . CourseXMLConfig::$breakFields[$fullKey] . "'>"; } // hidden/auto-generated fields. NOTE: if we need to uncomment the following, introduce hiddenMultiLangFields if (in_array($fullKeyNoLang, CourseXMLConfig::$hiddenFields) /* && (!$this->getAttribute('lang') || $sameAsCourseLang) */) { return; } // boolean fields if (in_array($fullKeyNoLang, CourseXMLConfig::$booleanFields)) { $value = (string) $this; if (empty($value)) { $value = 'false'; } return $fieldStart . selection(array('false' => $GLOBALS['langCMeta']['false'], 'true' => $GLOBALS['langCMeta']['true']), $fullKey, $value, "class='form-control'") . $fieldEnd; } // enumeration fields if (in_array($fullKeyNoLang, CourseXMLConfig::$enumerationFields)) { return $fieldStart . selection(CourseXMLConfig::getEnumerationValues($fullKey), $fullKey, (string) $this, "id='" . $fullKeyNoLang . "' class='form-control'") . $fieldEnd; } // multiple enumeration fields if (in_array($fullKeyNoLang, CourseXMLConfig::$multiEnumerationFields)) { return $fieldStart . multiselection(CourseXMLConfig::getEnumerationValues($fullKey), $fullKey . '[]', explode(',', (string) $this), 'id="multiselect" multiple="true"') . $fieldEnd; } // readonly fields $readonly = ''; if (in_array($fullKey, CourseXMLConfig::$readOnlyMultiLangFields)) { $readonly = 'disabled readonly'; } if (in_array($fullKeyNoLang, CourseXMLConfig::$readOnlyFields) && (!$this->getAttribute('lang') || $sameAsCourseLang)) { $readonly = 'disabled readonly'; } // integer fields if (in_array($fullKeyNoLang, CourseXMLConfig::$integerFields)) { $value = (string) $this; if (empty($value)) { $value = 0; } return $fieldStart . "<input class='form-control' type='text' size='2' name='" . q($fullKey) . "' value='" . intval($value) . "' $readonly>" . $fieldEnd; } // float fields if (in_array($fullKeyNoLang, CourseXMLConfig::$floatFields)) { $value = (string) $this; if (empty($value)) { $value = 0; } return $fieldStart . "<input class='form-control' type='text' size='2' name='" . q($fullKey) . "' value='" . CourseXMLConfig::getFloat($value) . "' $readonly>" . $fieldEnd; } // textarea fields if (in_array($fullKeyNoLang, CourseXMLConfig::$textareaFields)) { return $fieldStart . "<textarea rows='5' class='form-control' name='" . q($fullKey) . "' $readonly>" . q((string) $this) . "</textarea>" . $fieldEnd; } // binary (file-upload) fields if (in_array($fullKeyNoLang, CourseXMLConfig::$binaryFields)) { $html = ''; $is_multiple = in_array($fullKey, CourseXMLConfig::$multipleFields); $is_arrayField = in_array($fullKeyNoLang, CourseXMLConfig::$arrayFields); $multiplicity = ($is_multiple || $is_arrayField) ? '[]' : ''; if (!$is_multiple) { $html .= $fieldStart; $value = (string) $this; $idorclass = ($is_arrayField) ? 'class' : 'id'; if (!empty($value)) { // image already exists $mime = (string) $this->getAttribute('mime'); $html .= "<img " . $idorclass . "='" . $fullKey . "_image' src='data:" . q($mime) . ";base64," . q($value) . "'/> <img " . $idorclass . "='" . $fullKey . "_delete' src='" . $GLOBALS['themeimg'] . "/delete.png'/> <input " . $idorclass . "='" . $fullKey . "_hidden' type='hidden' name='" . q($fullKey) . $multiplicity . "' value='" . q($value) . "'> <input " . $idorclass . "='" . $fullKey . "_hidden_mime' type='hidden' name='" . q($fullKey) . "_mime" . $multiplicity . "' value='" . q($mime) . "'> </span></div> <div class='cmetarow'><span class='$cmetalabel'></span><span class='cmetafield'>"; } else { // add as empty array, in order to keep correspondence $html .= "<input " . $idorclass . "='" . $fullKey . "_hidden' type='hidden' name='" . q($fullKey) . $multiplicity . "'> <input " . $idorclass . "='" . $fullKey . "_hidden_mime' type='hidden' name='" . q($fullKey) . "_mime" . $multiplicity . "'>"; } $html .= "<input type='file' size='30' name='" . q($fullKey) . $multiplicity . "'>"; $html .= $fieldEnd; } else { // do nothing if field already walked/processed $walked = isset(self::$tmpData[$fullKey . '_walked']); if (!$walked) { $html .= "<div id='" . $fullKey . "_container'>"; $html .= $fieldStart; $name = $this->getName(); $cnt = 0; if ($parent !== null && $name !== null) { foreach ($parent->{$name} as $currentField) { $value = (string) $currentField; if (!empty($value)) { // image already exists $mime = (string) $currentField->getAttribute('mime'); if ($cnt > 0) { $html .= "</span></div><div class='cmetarow'><span class='$cmetalabel'></span><span class='cmetafield'>"; } $html .= "<img id='" . $fullKey . $cnt . "_image' src='data:" . q($mime) . ";base64," . q($value) . "'/> <a id='" . $fullKey . $cnt . "_delete' href='javascript:photoDelete(\"#" . $fullKey . $cnt . "\");'> <img src='" . $GLOBALS['themeimg'] . "/delete.png'/></a> <input id='" . $fullKey . $cnt . "_hidden' type='hidden' name='" . q($fullKey) . $multiplicity . "' value='" . q($value) . "'> <input id='" . $fullKey . $cnt . "_hidden_mime' type='hidden' name='" . q($fullKey) . "_mime" . $multiplicity . "' value='" . q($mime) . "'>"; $cnt++; } } } if ($cnt == 0) { $html .= "<input type='file' size='30' name='" . q($fullKey) . $multiplicity . "'>"; } $html .= $fieldEnd; $html .= "</div>"; // close container // + button $html .= "<div class='cmetarow'><span class='$cmetalabel'></span><span class='cmetafield'>"; $html .= "<a id='" . $fullKey . "_add' href='#add'><img src='" . $GLOBALS['themeimg'] . "/add.png' alt='alt'/></a>"; $html .= "</span></div>"; self::$tmpData[$fullKey . '_walked'] = true; } } return $html; } // array fields if (in_array($fullKeyNoLang, CourseXMLConfig::$arrayFields) || in_array($fullKeyNoLang, CourseXMLConfig::$unitFields)) { return $fieldStart . "<input class='form-control' type='text' name='" . q($fullKey) . "[]' value='" . q((string) $this) . "' $readonly>" . $fieldEnd; } // all others get a typical input type box return $fieldStart . "<input type='text' class='form-control' name='" . q($fullKey) . "' value='" . q((string) $this) . "' $readonly>" . $fieldEnd; }