(mixed) custom id attribute value * if numeric value is passed it'll be just appended to the name e.g. {filed-name}-{value} * if false is passed id will be not created * if empty string is passed (or no 'id' option is found) * in all other cases the value will be used as field id * default: empty string * * - class => (string) field class(es) * Example: 'tbox select class1 class2 class3' * NOTE: this will override core classes, so you have to explicit include them! * default: empty string * * - size => (int) size attribute value (used when needed) * default: 40 * * - title (string) title attribute * default: empty string (omitted) * * - readonly => (bool) readonly attribute * default: false * * - selected => (bool) selected attribute (used when needed) * default: false * * checked => (bool) checked attribute (used when needed) * default: false * - disabled => (bool) disabled attribute * default: false * * - tabindex => (int) tabindex attribute value * default: inner tabindex counter * * - other => (string) additional data * Example: 'attribute1="value1" attribute2="value2"' * default: empty string */ class e_form { protected $_tabindex_counter = 0; protected $_tabindex_enabled = true; protected $_cached_attributes = array(); /** * @var user_class */ protected $_uc; protected $_required_string; function __construct($enable_tabindex = false) { $this->_tabindex_enabled = $enable_tabindex; $this->_uc = e107::getUserClass(); $this->setRequiredString(''); } /** * Open a new form * @param string name * @param $method - post|get default is post * @param @target - e_REQUEST_URI by default * @param $other - unused at the moment. */ public function open($name, $method=null, $target=null, $options=null) { if($target == null) { $target = e_REQUEST_URI; } if($method == null) { $method = "post"; } $class = ""; $autoComplete = ""; parse_str($options,$options); if(vartrue($options['class'])) { $class = "class='".$options['class']."'"; } else // default { $class= "class='form-horizontal'"; } if(isset($options['autocomplete'])) // leave as isset() { $autoComplete = " autocomplete='".($options['autocomplete'] ? 'on' : 'off')."'"; } if($method == 'get' && strpos($target,'=')) { list($url,$qry) = explode("?",$target); $text = "\n
\n"; parse_str($qry,$m); foreach($m as $k=>$v) { $text .= $this->hidden($k, $v); } } else { $target = str_replace("&", "&", $target); $text = "\n\n"; } return $text; } /** * Close a Form */ public function close() { return "
"; } /** * Get required field markup string * @return string */ public function getRequiredString() { return $this->_required_string; } /** * Set required field markup string * @param string $string * @return e_form */ public function setRequiredString($string) { $this->_required_string = $string; return $this; } // For Comma separated keyword tags. function tags($name, $value, $maxlength = 200, $options = array()) { if(is_string($options)) parse_str($options, $options); $options['class'] = 'tbox span1 e-tags'; $options['size'] = 7; return $this->text($name, $value, $maxlength, $options); } /** * Render Bootstrap Tabs * @param $array * @param $options * @example * $array = array( * 'home' => array('caption' => 'Home', 'text' => 'some tab content' ), * 'other' => array('caption' => 'Other', 'text' => 'second tab content' ) * ); */ function tabs($array,$options = array()) { $text =' '; $text .= '
'; $c=0; foreach($array as $key=>$tab) { $active = ($c == 0) ? ' active' : ''; $text .= '
'.$tab['text'].'
'; $c++; } $text .= '
'; return $text; } /** * Render Bootstrap Carousel * @param $name : A unique name * @param $array * @param $options : placeholder for any future options. (currently not in use) * @example * $array = array( * 'slide1' => array('caption' => 'Slide 1', 'text' => 'first slide content' ), * 'slide2' => array('caption' => 'Slide 2', 'text' => 'second slide content' ), * 'slide3' => array('caption' => 'Slide 3', 'text' => 'third slide content' ) * ); */ function carousel($name="e-carousel", $array, $options = null) { $interval = null; $wrap = null; $pause = null; if(isset($options['wrap'])) { $wrap = 'data-wrap="'.$options['wrap'].'"'; } if(isset($options['interval'])) { $interval = 'data-interval="'.$options['interval'].'"'; } if(isset($options['pause'])) { $interval = 'data-pause="'.$options['pause'].'"'; } $text =' '; return $text; } /** * Text-Field Form Element * @param $name * @param $value * @param $maxlength * @param $options * - size: mini, small, medium, large, xlarge, xxlarge * - class: * - typeahead: 'users' * */ function text($name, $value = '', $maxlength = 80, $options= array()) { if(is_string($options)) { parse_str($options,$options); } if(!vartrue($options['class'])) { $options['class'] = "tbox"; } if(deftrue('BOOTSTRAP') === 3) { $options['class'] .= ' form-control'; } /* if(!vartrue($options['class'])) { if($maxlength < 10) { $options['class'] = 'tbox input-text span3'; } elseif($maxlength < 50) { $options['class'] = 'tbox input-text span7'; } elseif($maxlength > 99) { $options['class'] = 'tbox input-text span7'; } else { $options['class'] = 'tbox input-text'; } } */ if(vartrue($options['typeahead'])) { if(vartrue($options['typeahead']) == 'users') { $options['data-source'] = e_BASE."user.php"; $options['class'] .= " e-typeahead"; } } if(vartrue($options['size']) && !is_numeric($options['size'])) { $options['class'] .= " input-".$options['size']; unset($options['size']); // don't include in html 'size='. } $mlength = vartrue($maxlength) ? "maxlength=".$maxlength : ""; $options = $this->format_options('text', $name, $options); //never allow id in format name-value for text fields return "get_attributes($options, $name)." />"; } function number($name, $value=0, $maxlength = 200, $options = array()) { if(is_string($options)) parse_str($options, $options); if (vartrue($options['maxlength'])) $maxlength = $options['maxlength']; unset($options['maxlength']); if(!vartrue($options['size'])) $options['size'] = 15; if(!vartrue($options['class'])) $options['class'] = 'tbox number e-spinner input-small form-control'; $options['type'] ='number'; $mlength = vartrue($maxlength) ? "maxlength=".$maxlength : ""; $options = $this->format_options('text', $name, $options); $min = vartrue($options['min']) ? 'min="'.$options['min'].'"' : ''; $max = vartrue($options['max']) ? 'min="'.$options['max'].'"' : ''; //never allow id in format name-value for text fields if(deftrue('BOOTSTRAP')) { return "get_attributes($options, $name)." />"; } return $this->text($name, $value, $maxlength, $options); } function email($name, $value, $maxlength = 200, $options = array()) { $options = $this->format_options('text', $name, $options); //never allow id in format name-value for text fields return "get_attributes($options, $name)." /> "; } function iconpreview($id, $default, $width='', $height='') // FIXME { // XXX - $name ?! $parms = $name."|".$width."|".$height."|".$id; $sc_parameters .= 'mode=preview&default='.$default.'&id='.$id; return e107::getParser()->parseTemplate("{ICONPICKER=".$sc_parameters."}"); } /** * @param $name * @param $default value * @param $label * @param $options - gylphs=1 * @param $ajax */ function iconpicker($name, $default, $label, $options = array(), $ajax = true) { $options['media'] = '_icon'; return $this->imagepicker($name, $default, $label, $options); } /** * Internal Function used by imagepicker and filepicker */ private function mediaUrl($category = '', $label = '', $tagid='', $extras=null) { $cat = ($category) ? '&for='.$category : ""; if(!$label) $label = ' Upload an image or file'; if($tagid) $cat .= '&tagid='.$tagid; if(is_string($extras)) { parse_str($extras,$extras); } if(vartrue($extras['bbcode'])) $cat .= '&bbcode=1'; $mode = vartrue($extras['mode'],'main'); $action = vartrue($extras['action'],'dialog'); // $tabs // TODO - option to choose which tabs to display. //TODO Parse selection data back to parent form. $url = e_ADMIN_ABS."image.php?mode={$mode}&action={$action}".$cat; $url .= "&iframe=1"; if(vartrue($extras['w'])) { $url .= "&w=".$extras['w']; } if(vartrue($extras['glyphs'])) { $url .= "&glyphs=1"; } if(vartrue($extras['video'])) { $url .= "&video=1"; } $title = "Media Manager : ".$category; // $ret = "".$label.""; // using colorXXXbox. $ret = "".$label.""; // using bootstrap. // $footer = "
Save
"; $footer = ''; if(!e107::getRegistry('core/form/mediaurl')) { /* e107::js('core','core/admin.js','prototype'); e107::js('core','core/dialog.js','prototype'); e107::js('core','core/draggable.js','prototype'); e107::css('core','core/dialog/dialog.css','prototype'); e107::css('core','core/dialog/e107/e107.css','prototype'); e107::js('footer-inline',' $$("a.e-dialog").invoke("observe", "click", function(ev) { var element = ev.findElement("a"); ev.stop(); new e107Widgets.URLDialog(element.href, { id: element["id"] || "e-dialog", width: 890, height: 680 }).center().setHeader("Media Manager : '.$category.'").setFooter('.$footer.').activate().show(); }); ','prototype'); */ e107::setRegistry('core/form/mediaurl', true); } return $ret; } /** * Avatar Picker * @param $name - form element name ie. value to be posted. * @param $curVal - current avatar value. ie. the image-file name or URL. */ function avatarpicker($name,$curVal='',$options=array()) { $tp = e107::getParser(); $pref = e107::getPref(); $attr = "aw=".$pref['im_width']."&ah=".$pref['im_height']; $tp->setThumbSize($pref['im_width'],$pref['im_height']); $blankImg = $tp->thumbUrl(e_IMAGE."generic/blank_avatar.jpg",$attr); $localonly = true; //TODO add a pref for allowing external or internal avatars or both. $idinput = $this->name2id($name); $previnput = $idinput."-preview"; $optioni = $idinput."-options"; $path = (substr($curVal,0,8) == '-upload-') ? '{e_AVATAR}upload/' : '{e_AVATAR}default/'; $curVal = str_replace('-upload-','',$curVal); $img = (strpos($curVal,"://")!==false) ? $curVal : $tp->thumbUrl($path.$curVal); if(!$curVal) { $img = $blankImg; } if($localonly == true) { $text = ""; $text .= ""; // TODO LAN } else { $text = ""; $text .= ""; $text .= ""; //TODO Common LAN. } $avFiles = e107::getFile()->get_files(e_AVATAR_DEFAULT,".jpg|.png|.gif|.jpeg|.JPG|.GIF|.PNG"); $text .= "\n"; // Used by usersettings.php right now. return $text; //TODO discuss and FIXME // Intentionally disable uploadable avatar and photos at this stage if (false && $pref['avatar_upload'] && FILE_UPLOADS) { $text .= "
".LAN_SIGNUP_25."
".LAN_SIGNUP_34."
"; } if (false && $pref['photo_upload'] && FILE_UPLOADS) { $text .= "
".LAN_SIGNUP_26."
".LAN_SIGNUP_34."
"; } } /** * FIXME {IMAGESELECTOR} rewrite * @param string $name input name * @param string $default default value * @param string $label custom label * @param string $sc_parameters shortcode parameters * --- SC Parameter list --- * - media: if present - load from media category table * - w: preview width in pixels * - h: preview height in pixels * - help: tooltip * - video: when set to true, will enable the Youtube (video) tab. * @example $frm->imagepicker('banner_image', $_POST['banner_image'], '', 'banner'); // all images from category 'banner_image' + common images. * @example $frm->imagepicker('banner_image', $_POST['banner_image'], '', 'media=banner&w=600'); * @return string html output */ function imagepicker($name, $default, $label = '', $sc_parameters = '') { $tp = e107::getParser(); $name_id = $this->name2id($name); $meta_id = $name_id."-meta"; if(is_string($sc_parameters)) { if(strpos($sc_parameters, '=') === false) $sc_parameters = 'media='.$sc_parameters; parse_str($sc_parameters, $sc_parameters); } // print_a($sc_parameters); if(empty($sc_parameters['media'])) { $sc_parameters['media'] = '_common'; } $default_thumb = $default; if($default) { if($video = $tp->toVideo($default, array('thumb'=>'src'))) { $default_url = $video; } else { if('{' != $default[0]) { // convert to sc path $default_thumb = $tp->createConstants($default, 'nice'); $default = $tp->createConstants($default, 'mix'); } $default_url = $tp->replaceConstants($default, 'abs'); } $blank = FALSE; } else { //$default = $default_url = e_IMAGE_ABS."generic/blank.gif"; $default_url = e_IMAGE_ABS."generic/nomedia.png"; $blank = TRUE; } //$width = intval(vartrue($sc_parameters['width'], 150)); $cat = $tp->toDB(vartrue($sc_parameters['media'])); if($cat == '_icon') // ICONS { $ret = "
"; $thpath = isset($sc_parameters['nothumb']) || vartrue($hide) ? $default : $default_thumb; $label = "
"; $label .= $tp->toIcon($default_url); $label .= "
"; // $label = "{$default_url}"; } else // Images { $title = (vartrue($sc_parameters['help'])) ? "title='".$sc_parameters['help']."'" : ""; $width = vartrue($sc_parameters['w'], 120); $height = vartrue($sc_parameters['h'], 100); $ret = "
"; $att = 'aw='.$width."'&ah=".$height."'"; $thpath = isset($sc_parameters['nothumb']) || vartrue($hide) ? $default : $tp->thumbUrl($default_thumb, $att, true); $label = "{$default_url}"; if($cat != 'news' && $cat !='page' && $cat !='') { $cat = $cat . "_image"; } } $ret .= $this->mediaUrl($cat, $label,$name_id,$sc_parameters); $ret .= "
\n"; $ret .= ""; $ret .= ""; // $ret .= $this->text($name,$default); // to be hidden eventually. return $ret; // ---------------- } function filepicker($name, $default, $label = '', $sc_parameters = '') { $tp = e107::getParser(); $name_id = $this->name2id($name); if(is_string($sc_parameters)) { if(strpos($sc_parameters, '=') === false) $sc_parameters = 'media='.$sc_parameters; parse_str($sc_parameters, $sc_parameters); } $cat = vartrue($sc_parameters['media']) ? $tp->toDB($sc_parameters['media']) : "_common_file"; $default_label = ($default) ? $default : "Choose a file"; $label = "".basename($default_label).""; $sc_parameters['mode'] = 'main'; $sc_parameters['action'] = 'dialog'; // $ret .= $this->mediaUrl($cat, $label,$name_id,"mode=dialog&action=list"); $ret .= $this->mediaUrl($cat, $label,$name_id,$sc_parameters); $ret .= ""; return $ret; } /** * Date field with popup calendar // NEW in 0.8/2.0 * * @param string $name the name of the field * @param integer $datestamp UNIX timestamp - default value of the field * @param array or str * @example $frm->datepicker('my_field',time(),'type=date'); * @example $frm->datepicker('my_field',time(),'type=datetime&inline=1'); * @example $frm->datepicker('my_field',time(),'type=date&format=yyyy-mm-dd'); * @example $frm->datepicker('my_field',time(),'type=datetime&format=MM, dd, yyyy hh:ii'); * * @url http://trentrichardson.com/examples/timepicker/ */ function datepicker($name, $datestamp = false, $options = null) { if(vartrue($options) && is_string($options)) { parse_str($options,$options); } $type = varset($options['type']) ? trim($options['type']) : "date"; // OR 'datetime' $dateFormat = varset($options['format']) ? trim($options['format']) :e107::getPref('inputdate', '%Y-%m-%d'); $ampm = (preg_match("/%l|%I|%p|%P/",$dateFormat)) ? 'true' : 'false'; if($type == 'datetime' && !varset($options['format'])) { $dateFormat .= " ".e107::getPref('inputtime', '%H:%M:%S'); } $dformat = e107::getDate()->toMask($dateFormat); $id = $this->name2id($name); $classes = array('date' => 'e-date', 'datetime' => 'e-datetime'); if ($datestamp) { $value = is_numeric($datestamp) ? e107::getDate()->convert_date($datestamp, $dateFormat) : $datestamp; //date("d/m/Y H:i:s", $datestamp); } $text = ""; // $text .= 'dformat='.$dformat.' defdisp='.$dateFormat; $class = (isset($classes[$type])) ? $classes[$type] : "tbox e-date"; $size = vartrue($options['size']) ? intval($options['size']) : 40; $required = vartrue($options['required']) ? "required" : ""; $firstDay = vartrue($options['firstDay']) ? $options['firstDay'] : 0; $xsize = (vartrue($options['size']) && !is_numeric($options['size'])) ? $options['size'] : 'xlarge'; if(vartrue($options['inline'])) { $text .= "
"; } else { $text .= ""; } // $text .= "ValueFormat: ".$dateFormat." Value: ".$value; // $text .= " ({$dformat}) type:".$dateFormat." ".$value; return $text; } /** * User auto-complete search * * @param string $name_fld field name for user name * @param string $id_fld field name for user id * @param string $default_name default user name value * @param integer $default_id default user id * @param array|string $options [optional] 'readonly' (make field read only), 'name' (db field name, default user_name) * @return string HTML text for display */ function userpicker($name_fld, $id_fld, $default_name, $default_id, $options = array()) { $tp = e107::getParser(); if(!is_array($options)) parse_str($options, $options); $default_name = vartrue($default_name, ''); $default_id = vartrue($default_id, 0); //TODO Auto-calculate $name_fld from $id_fld ie. append "_usersearch" here ? $fldid = $this->name2id($name_fld); $hidden_fldid = $this->name2id($id_fld); $ret = '
'; $ret .= $this->text($name_fld,$default_name,20, "class=e-tip&title=Type name of user&typeahead=users&readonly=".vartrue($options['readonly'])) .$this->hidden($id_fld,$default_id, array('id' => $this->name2id($id_fld)))."".$tp->toGlyph('fa-user')." ".$default_id.''; $ret .= "reset
"; e107::js('footer-inline', " \$('#{$fldid}').blur(function () { \$('#{$fldid}-id').html(\$('#{$hidden_fldid}').val()); }); \$('#{$fldid}-reset').click(function () { \$('#{$fldid}-id').html('0'); \$('#{$hidden_fldid}').val(0); \$('#{$fldid}').val(''); return false; }); "); return $ret; /* $label_fld = str_replace('_', '-', $name_fld).'-upicker-lable'; //'.$this->text($id_fld, $default_id, 10, array('id' => false, 'readonly'=>true, 'class'=>'tbox number')).' $ret = '
'.$this->text($name_fld, $default_name, 150, array('id' => false, 'readonly' => vartrue($options['readonly']) ? true : false)).' Id #'.((int) $default_id).' '.$this->hidden($id_fld, $default_id, array('id' => false)).'
'; e107::getJs()->requireCoreLib('scriptaculous/controls.js', 2); e107::getJs()->footerInline(" //autocomplete fields \$\$('input[name={$name_fld}]').each(function(el) { if(el.readOnly) { el.observe('click', function(ev) { ev.stop(); var el1 = ev.findElement('input'); el1.blur(); } ); el.next('span.indicator').hide(); el.next('div.e-autocomplete').hide(); return; } new Ajax.Autocompleter(el, el.next('div.e-autocomplete'), '".e_JS."e_ajax.php', { paramName: '{$name_fld}', minChars: 2, frequency: 0.5, afterUpdateElement: function(txt, li) { if(!\$(li)) return; var elnext = el.next('input[name={$id_fld}]'), ellab = \$('{$label_fld}'); if(\$(li).id) { elnext.value = parseInt(\$(li).id); } else { elnext.value = 0 } if(ellab) { ellab.removeClassName('warning').removeClassName('success'); ellab.addClassName((elnext.value ? 'success' : 'warning')).update('Id #' + elnext.value); } }, indicator: el.next('span.indicator'), parameters: 'ajax_used=1&ajax_sc=usersearch=".rawurlencode('searchfld='.str_replace('user_', '', vartrue($options['name'], 'user_name')).'--srcfld='.$name_fld)."' }); }); "); return $ret; */ } /** * A Rating element * @var $text */ function rate($table,$id,$options=null) { $table = preg_replace('/\W/', '', $table); $id = intval($id); return e107::getRate()->render($table, $id, $options); } function like($table,$id,$options=null) { $table = preg_replace('/\W/', '', $table); $id = intval($id); return e107::getRate()->renderLike($table,$id,$options); } function file($name, $options = array()) { $options = $this->format_options('file', $name, $options); //never allow id in format name-value for text fields return "get_attributes($options, $name)." />"; } function upload($name, $options = array()) { return 'Ready to use upload form fields, optional - file list view'; } function password($name, $value = '', $maxlength = 50, $options = array()) { if(is_string($options)) parse_str($options, $options); $addon = ""; $gen = ""; if(vartrue($options['generate'])) { $gen = ' Generate Show
'; } if(vartrue($options['strength'])) { $addon .= "
"; } $options['pattern'] = vartrue($options['pattern'],'[\S]{4,}'); $options['required'] = varset($options['required'], 1); $options['class'] = vartrue($options['class'],'e-password'); if(deftrue('BOOTSTRAP') == 3) { $options['class'] .= ' form-control'; } $options = $this->format_options('text', $name, $options); //never allow id in format name-value for text fields $text = "get_attributes($options, $name)." />"; return "".$text.$gen."".vartrue($addon); } /** * Render a bootStrap ProgressBar. * @param string $name * @param number $value * @param array $options */ public function progressBar($name,$value,$options=array()) { if(!deftrue('BOOTSTRAP')) { return; } $class = vartrue($options['class'],''); return "
"; } /** * Textarea Element * @param $name * @param $value * @param $rows * @param $cols * @param $options * @param $count */ function textarea($name, $value, $rows = 10, $cols = 80, $options = array(), $counter = false) { if(is_string($options)) parse_str($options, $options); // auto-height support if(vartrue($options['size']) && !is_numeric($options['size'])) { $options['class'] .= " input-".$options['size']; unset($options['size']); // don't include in html 'size='. } elseif(!vartrue($options['noresize'])) { $options['class'] = (isset($options['class']) && $options['class']) ? $options['class'].' e-autoheight' : 'tbox span7 e-autoheight'; } $options = $this->format_options('textarea', $name, $options); //never allow id in format name-value for text fields return "".(false !== $counter ? $this->hidden('__'.$name.'autoheight_opt', $counter) : ''); } /** * Bbcode Area. Name, value, template, media-Cat, size, options array eg. counter * IMPORTANT: $$mediaCat is also used is the media-manager category identifier */ function bbarea($name, $value, $template = '', $mediaCat='_common', $size = 'large', $options = array()) { if(is_string($options)) parse_str($options, $options); //size - large|medium|small //width should be explicit set by current admin theme $size = 'input-large'; switch($size) { case 'small': $rows = '7'; $height = "style='height:250px'"; // inline required for wysiwyg break; case 'medium': $rows = '10'; $height = "style='height:375px'"; // inline required for wysiwyg $size = "input-block-level"; break; case 'large': default: $rows = '15'; $size = 'large input-block-level'; // $height = "style='height:500px;width:1025px'"; // inline required for wysiwyg break; } // auto-height support $options['class'] = 'tbox bbarea '.($size ? ' '.$size : '').' e-wysiwyg e-autoheight'; $bbbar = ''; $help_tagid = $this->name2id($name)."--preview"; $options['other'] = "onselect='storeCaret(this);' onclick='storeCaret(this);' onkeyup='storeCaret(this);' {$height}"; $counter = vartrue($options['counter'],false); $ret = "
\n"; $ret .= e107::getBB()->renderButtons($template,$help_tagid); $ret .= $this->textarea($name, $value, $rows, 70, $options, $counter); // higher thank 70 will break some layouts. $ret .= "
\n"; $_SESSION['media_category'] = $mediaCat; // used by TinyMce. return $ret; // Quick fix - hide TinyMCE links if not installed, dups are handled by JS handler /* e107::getJs()->footerInline(" if(typeof tinyMCE === 'undefined') { \$$('a.e-wysiwyg-switch').invoke('hide'); } "); */ } /** * Render a checkbox * @param string $name * @param mixed $value * @param boolean $checked * @param mixed $options query-string or array or string for a label. eg. label=Hello&foo=bar or array('label'=>Hello') or 'Hello' * @return void */ function checkbox($name, $value, $checked = false, $options = array()) { if(!is_array($options)) { if(strpos($options,"=")!==false) { parse_str($options, $options); } else // Assume it's a label. { $options = array('label'=>$options); } } $options = $this->format_options('checkbox', $name, $options); $options['checked'] = $checked; //comes as separate argument just for convenience $text = ""; $pre = (vartrue($options['label'])) ? "" : ""; unset($options['label']); // not to be used as attribute; $text .= "get_attributes($options, $name, $value)." />"; return $pre.$text.$post; } function checkbox_label($label_title, $name, $value, $checked = false, $options = array()) { return $this->checkbox($name, $value, $checked, $options).$this->label($label_title, $name, $value); } function checkbox_switch($name, $value, $checked = false, $label = '') { return $this->checkbox($name, $value, $checked).$this->label($label ? $label : LAN_ENABLED, $name, $value); } function checkbox_toggle($name, $selector = 'multitoggle', $id = false, $label='') { $selector = 'jstarget:'.$selector; if($id) $id = $this->name2id($id); return $this->checkbox($name, $selector, false, array('id' => $id,'class' => 'checkbox toggle-all','label'=>$label)); } function uc_checkbox($name, $current_value, $uc_options, $field_options = array()) { if(!is_array($field_options)) parse_str($field_options, $field_options); return '
'.$this->_uc->vetted_tree($name, array($this, '_uc_checkbox_cb'), $current_value, $uc_options, $field_options).'
'; } /** * Callback function used with $this->uc_checkbox * * @see user_class->select() for parameters */ function _uc_checkbox_cb($treename, $classnum, $current_value, $nest_level, $field_options) { if($classnum == e_UC_BLANK) return ''; if (!is_array($current_value)) { $tmp = explode(',', $current_value); } $classIndex = abs($classnum); // Handle negative class values $classSign = (substr($classnum, 0, 1) == '-') ? '-' : ''; $class = $style = ''; if($nest_level == 0) { $class = " strong"; } else { $style = " style='text-indent:" . (1.2 * $nest_level) . "em'"; } $descr = varset($field_options['description']) ? ' ('.$this->_uc->uc_get_classdescription($classnum).')' : ''; return "
".$this->checkbox($treename.'[]', $classnum, in_array($classnum, $tmp), $field_options).$this->label($this->_uc->uc_get_classname($classIndex).$descr, $treename.'[]', $classnum)."
\n"; } function uc_label($classnum) { return $this->_uc->uc_get_classname($classnum); } /** * A Radio Button Form Element * @param $name * @param @value array pair-values|string - auto-detected. * @param $checked boolean * @param $options */ function radio($name, $value, $checked = false, $options = null) { if(!is_array($options)) parse_str($options, $options); if(is_array($value)) { return $this->radio_multi($name, $value, $checked, $options); } $labelFound = vartrue($options['label']); unset($options['label']); // label attribute not valid in html5 $options = $this->format_options('radio', $name, $options); $options['checked'] = $checked; //comes as separate argument just for convenience // $options['class'] = 'inline'; $text = ""; // return print_a($options,true); if($labelFound) // Bootstrap compatible markup { $text .= ""; } return $text; } /** * @param name * @param check_enabled * @param label_enabled * @param label_disabled * @param options */ function radio_switch($name, $checked_enabled = false, $label_enabled = '', $label_disabled = '',$options=array()) { if(!is_array($options)) parse_str($options, $options); $options_on = varset($options['enabled'],array()); $options_off = varset($options['disabled'],array()); if(vartrue($options['class']) == 'e-expandit' || vartrue($options['expandit'])) // See admin->prefs 'Single Login' for an example. { $options_on = array_merge($options, array('class' => 'e-expandit-on')); $options_off = array_merge($options, array('class' => 'e-expandit-off')); } $options_on['label'] = $label_enabled ? defset($label_enabled,$label_enabled) : LAN_ENABLED; $options_off['label'] = $label_disabled ? defset($label_disabled,$label_disabled) : LAN_DISABLED; if(vartrue($options['reverse'])) // reverse order. { unset($options['reverse']); return $this->radio($name, 0, !$checked_enabled, $options_off)." ". $this->radio($name, 1, $checked_enabled, $options_on); // return $this->radio($name, 0, !$checked_enabled, $options_off)."".$this->label($label_disabled ? $label_disabled : LAN_DISABLED, $name, 0)."  ". // $this->radio($name, 1, $checked_enabled, $options_on)."".$this->label($label_enabled ? $label_enabled : LAN_ENABLED, $name, 1); } // $helpLabel = (is_array($help)) ? vartrue($help[$value]) : $help; // Bootstrap Style Code - for use later. // ['help'] = $helpLabel; // $text[] = $this->radio($name, $value, (string) $checked === (string) $value, $options); return $this->radio($name, 1, $checked_enabled, $options_on)." ".$this->radio($name, 0, !$checked_enabled, $options_off); // return $this->radio($name, 1, $checked_enabled, $options_on)."".$this->label($label_enabled ? $label_enabled : LAN_ENABLED, $name, 1)."   // ".$this->radio($name, 0, !$checked_enabled, $options_off)."".$this->label($label_disabled ? $label_disabled : LAN_DISABLED, $name, 0); } /** * XXX INTERNAL ONLY - Use radio() instead. array will automatically trigger this internal method. * @param string $name * @param array $elements = arrays value => label * @param string/integer $checked = current value * @param boolean $multi_line * @param mixed $help array of field help items or string of field-help (to show on all) */ private function radio_multi($name, $elements, $checked, $options=array(), $help = null) { /* // Bootstrap Test. return' '; */ $text = array(); if(is_string($elements)) parse_str($elements, $elements); if(!is_array($options)) parse_str($options, $options); $help = ''; if(vartrue($options['help'])) { $help = "
".$options['help']."
"; unset($options['help']); } foreach ($elements as $value => $label) { $label = defset($label, $label); $helpLabel = (is_array($help)) ? vartrue($help[$value]) : $help; // Bootstrap Style Code - for use later. $options['label'] = $label; $options['help'] = $helpLabel; $text[] = $this->radio($name, $value, (string) $checked === (string) $value, $options); // $text[] = $this->radio($name, $value, (string) $checked === (string) $value)."".$this->label($label, $name, $value).(isset($helpLabel) ? "
".$helpLabel."
" : ''); } if($multi_line === false) { // return implode("  ", $text); } // support of UI owned 'newline' parameter if(!varset($options['sep']) && vartrue($options['newline'])) $options['sep'] = '
'; // TODO div class=separator? $separator = varset($options['sep']," "); // return print_a($text,true); return implode($separator, $text).$help; // return implode("\n", $text); //XXX Limiting markup. // return "
".implode("
", $text)."
"; } /** * Just for BC - use the $options['label'] instead. */ function label($text, $name = '', $value = '') { e107::getMessage()->addDebug("Deprecated \$frm->label() used"); $for_id = $this->_format_id('', $name, $value, 'for'); return "{$text}"; } function help($text) { return !empty($text) ? '
'.$text.'
' : ''; } function select_open($name, $options = array()) { $options = $this->format_options('select', $name, $options); return "
*/ } function uc_select($name, $current_value, $uc_options, $select_options = array(), $opt_options = array()) { return $this->select_open($name, $select_options)."\n".$this->_uc->vetted_tree($name, array($this, '_uc_select_cb'), $current_value, $uc_options, $opt_options)."\n".$this->select_close(); } // Callback for vetted_tree - Creates the option list for a selection box function _uc_select_cb($treename, $classnum, $current_value, $nest_level) { $classIndex = abs($classnum); // Handle negative class values $classSign = (substr($classnum, 0, 1) == '-') ? '-' : ''; if($classnum == e_UC_BLANK) return $this->option(' ', ''); $tmp = explode(',', $current_value); if($nest_level == 0) { $prefix = ''; $style = "font-weight:bold; font-style: italic;"; } elseif($nest_level == 1) { $prefix = '  '; $style = "font-weight:bold"; } else { $prefix = '  '.str_repeat('--', $nest_level - 1).'>'; $style = ''; } return $this->option($prefix.$this->_uc->uc_get_classname($classnum), $classSign.$classIndex, ($current_value !== '' && in_array($classnum, $tmp)), array("style"=>"{$style}"))."\n"; } function optgroup_open($label, $disabled = false, $options = null) { return ""; } /** * "; } /** * Use selectbox() instead. */ function option_multi($option_array, $selected = false, $options = array()) { if(is_string($option_array)) parse_str($option_array, $option_array); $text = ''; foreach ($option_array as $value => $label) { if(is_array($label)) { $text .= $this->optgroup_open($value); foreach($label as $val => $lab) { if(is_array($lab)) { $text .= $this->optgroup_open($val,null,array('class'=>'level-2')); // Not valid HTML5 - but appears to work in modern browsers. foreach($lab as $k=>$v) { $text .= $this->option($v, $k, (is_array($selected) ? in_array($k, $selected) : $selected == $k), $options)."\n"; } $text .= $this->optgroup_close($val); } else { $text .= $this->option($lab, $val, (is_array($selected) ? in_array($val, $selected) : $selected == $val), $options)."\n"; } } $text .= $this->optgroup_close(); } else { $text .= $this->option($label, $value, (is_array($selected) ? in_array($value, $selected) : $selected == $value), $options)."\n"; } } return $text; } function optgroup_close() { return ""; } function select_close() { return ""; } function hidden($name, $value, $options = array()) { $options = $this->format_options('hidden', $name, $options); return "get_attributes($options, $name, $value)." />"; } /** * Generate hidden security field * @return string */ function token() { return ""; } function submit($name, $value, $options = array()) { $options = $this->format_options('submit', $name, $options); return "get_attributes($options, $name, $value)." />"; } function submit_image($name, $value, $image, $title='', $options = array()) { $tp = e107::getParser(); $options = $this->format_options('submit_image', $name, $options); switch ($image) { case 'edit': $icon = "e-edit-32"; $options['class'] = $options['class'] == 'action' ? 'btn btn-default action edit' : $options['class']; break; case 'delete': $icon = "e-delete-32"; $options['class'] = $options['class'] == 'action' ? 'btn btn-default action delete' : $options['class']; $options['other'] = 'data-confirm="'.LAN_JSCONFIRM.'"'; break; case 'execute': $icon = "e-execute-32"; $options['class'] = $options['class'] == 'action' ? 'btn btn-default action execute' : $options['class']; break; case 'view': $icon = "e-view-32"; $options['class'] = $options['class'] == 'action' ? 'btn btn-default action view' : $options['class']; break; } $options['title'] = $title;//shorthand return ""; } /** * Alias of admin_button, adds the etrigger_ prefix required for UI triggers * @see e_form::admin_button() */ function admin_trigger($name, $value, $action = 'submit', $label = '', $options = array()) { return $this->admin_button('etrigger_'.$name, $value, $action, $label, $options); } /** * Generic Button Element. * @param string $name * @param string $value * @param string $action [optional] default is submit - use 'dropdown' for a bootstrap dropdown button. * @param string $label [optional] * @param string|array $options [optional] * @return string */ public function button($name, $value, $action = 'submit', $label = '', $options = array()) { if(deftrue('BOOTSTRAP') && $action == 'dropdown' && is_array($value)) { // $options = $this->format_options('admin_button', $name, $options); $options['class'] = vartrue($options['class']); $align = vartrue($options['align'],'left'); $text = '
'.($label ? $label : 'No Label Provided').'
'; return $text; } return $this->admin_button($name, $value, $action, $label, $options); } /** * Render a Breadcrumb in Bootstrap format. * @param $array */ function breadcrumb($array) { if(!is_array($array)){ return; } $opt = array(); $homeIcon = e107::getParser()->toGlyph('icon-home.glyph',false); $opt[] = "".$homeIcon.""; // Add Site-Pref to disable? $text = '"; // return print_a($opt,true); return $text; } /** * Admin Button - for front-end, use button(); * @param string $name * @param string $value * @param string $action [optional] default is submit * @param string $label [optional] * @param string|array $options [optional] * @return string */ function admin_button($name, $value, $action = 'submit', $label = '', $options = array()) { $btype = 'submit'; if(strpos($action, 'action') === 0) $btype = 'button'; $options = $this->format_options('admin_button', $name, $options); $options['class'] = vartrue($options['class']); $options['class'] .= ' btn '.$action.' ';//shorthand if(empty($label)) $label = $value; switch ($action) { case 'update': case 'create': case 'import': case 'submit': $options['class'] .= 'btn-success'; break; case 'checkall': $options['class'] .= 'btn-mini'; break; case 'cancel': // use this for neutral colors. break; case 'delete': $options['class'] .= 'btn-danger'; $options['other'] = 'data-confirm="'.LAN_JSCONFIRM.'"'; break; case 'execute': $options['class'] .= 'btn-success'; break; case 'other': case 'login': $options['class'] .= 'btn-primary'; break; case 'warning': case 'confirm': $options['class'] .= 'btn-warning'; break; case 'batch': case 'batch e-hide-if-js': // FIXME hide-js shouldn't be here. $options['class'] .= 'btn-primary'; break; case 'filter': case 'filter e-hide-if-js': // FIXME hide-js shouldn't be here. $options['class'] .= 'btn-primary'; break; default: $options['class'] .= 'btn-default'; break; } return " "; } function getNext() { if(!$this->_tabindex_enabled) return 0; $this->_tabindex_counter += 1; return $this->_tabindex_counter; } function getCurrent() { if(!$this->_tabindex_enabled) return 0; return $this->_tabindex_counter; } function resetTabindex($reset = 0) { $this->_tabindex_counter = $reset; } function get_attributes($options, $name = '', $value = '') { $ret = ''; // foreach ($options as $option => $optval) { $optval = trim($optval); switch ($option) { case 'id': $ret .= $this->_format_id($optval, $name, $value); break; case 'class': if(!empty($optval)) $ret .= " class='{$optval}'"; break; case 'size': if($optval) $ret .= " size='{$optval}'"; break; case 'title': if($optval) $ret .= " title='{$optval}'"; break; case 'label': if($optval) $ret .= " label='{$optval}'"; break; case 'tabindex': if($optval) $ret .= " tabindex='{$optval}'"; elseif(false === $optval || !$this->_tabindex_enabled) break; else { $this->_tabindex_counter += 1; $ret .= " tabindex='".$this->_tabindex_counter."'"; } break; case 'readonly': if($optval) $ret .= " readonly='readonly'"; break; case 'multiple': if($optval) $ret .= " multiple='multiple'"; break; case 'selected': if($optval) $ret .= " selected='selected'"; break; case 'checked': if($optval) $ret .= " checked='checked'"; break; case 'disabled': if($optval) $ret .= " disabled='disabled'"; break; case 'required': if($optval) $ret .= " required='required'"; break; case 'autofocus': if($optval) $ret .= " autofocus='autofocus'"; break; case 'placeholder': if($optval) $ret .= " placeholder='{$optval}'"; break; case 'autocomplete': if($optval) $ret .= " autocomplete='{$optval}'"; break; case 'pattern': if($optval) $ret .= " pattern='{$optval}'"; break; case 'other': if($optval) $ret .= " $optval"; break; } if(substr($option,0,5) =='data-') { $ret .= " ".$option."='{$optval}'"; } } return $ret; } /** * Auto-build field attribute id * * @param string $id_value value for attribute id passed with the option array * @param string $name the name attribute passed to that field * @param unknown_type $value the value attribute passed to that field * @return string formatted id attribute */ function _format_id($id_value, $name, $value = '', $return_attribute = 'id') { if($id_value === false) return ''; //format data first $name = trim($this->name2id($name), '-'); $value = trim(preg_replace('#[^a-zA-Z0-9\-]#','-', $value), '-'); //$value = trim(preg_replace('#[^a-z0-9\-]#/i','-', $value), '-'); // This should work - but didn't for me! $value = trim(str_replace("/","-",$value), '-'); // Why? if(!$id_value && is_numeric($value)) $id_value = $value; // clean - do it better, this could lead to dups $id_value = trim($id_value, '-'); if(empty($id_value) ) return " {$return_attribute}='{$name}".($value ? "-{$value}" : '')."'";// also useful when name is e.g. name='my_name[some_id]' elseif(is_numeric($id_value) && $name) return " {$return_attribute}='{$name}-{$id_value}'";// also useful when name is e.g. name='my_name[]' else return " {$return_attribute}='{$id_value}'"; } function name2id($name) { $name = strtolower($name); return rtrim(str_replace(array('[]', '[', ']', '_', '/', ' ','.'), array('-', '-', '', '-', '-', '-', '-'), $name), '-'); } /** * Format options based on the field type, * merge with default * * @param string $type * @param string $name form name attribute value * @param array|string $user_options * @return array merged options */ function format_options($type, $name, $user_options=null) { if(is_string($user_options)) { parse_str($user_options, $user_options); } $def_options = $this->_default_options($type); if(is_array($user_options)) { $user_options['name'] = $name; //required for some of the automated tasks foreach (array_keys($user_options) as $key) { if(!isset($def_options[$key]) && substr($key,0,5)!='data-') unset($user_options[$key]); // data-xxxx exempt //remove it? } } else { $user_options = array('name' => $name); //required for some of the automated tasks } return array_merge($def_options, $user_options); } /** * Get default options array based on the field type * * @param string $type * @return array default options */ function _default_options($type) { if(isset($this->_cached_attributes[$type])) return $this->_cached_attributes[$type]; $def_options = array( 'id' => '', 'class' => '', 'title' => '', 'size' => '', 'readonly' => false, 'selected' => false, 'checked' => false, 'disabled' => false, 'required' => false, 'autofocus' => false, 'tabindex' => 0, 'label' => '', 'placeholder' => '', 'pattern' => '', 'other' => '', 'autocomplete' => '' // 'multiple' => false, - see case 'select' ); $form_control = (deftrue('BOOTSTRAP') === 3) ? ' form-control' : ''; switch ($type) { case 'hidden': $def_options = array('id' => false, 'disabled' => false, 'other' => ''); break; case 'text': $def_options['class'] = 'tbox input-text'.$form_control; unset($def_options['selected'], $def_options['checked']); break; case 'file': $def_options['class'] = 'tbox file'; unset($def_options['selected'], $def_options['checked']); break; case 'textarea': $def_options['class'] = 'tbox textarea'.$form_control; unset($def_options['selected'], $def_options['checked'], $def_options['size']); break; case 'select': $def_options['class'] = 'tbox select'.$form_control; $def_options['multiple'] = false; unset($def_options['checked']); break; case 'option': $def_options = array('class' => '', 'selected' => false, 'other' => '', 'disabled' => false, 'label' => ''); break; case 'radio': //$def_options['class'] = ' '; unset($def_options['size'], $def_options['selected']); break; case 'checkbox': unset($def_options['size'], $def_options['selected']); break; case 'submit': $def_options['class'] = 'button'; unset($def_options['checked'], $def_options['selected'], $def_options['readonly']); break; case 'submit_image': $def_options['class'] = 'action'; unset($def_options['checked'], $def_options['selected'], $def_options['readonly']); break; case 'admin_button': unset($def_options['checked'], $def_options['selected'], $def_options['readonly']); break; } $this->_cached_attributes[$type] = $def_options; return $def_options; } function columnSelector($columnsArray, $columnsDefault = '', $id = 'column_options') { $columnsArray = array_filter($columnsArray); $text = '"; // $text .= "
"; $text .= ""; /* $text = ''; */ return $text; } function colGroup($fieldarray, $columnPref = '') { $text = ""; $count = 0; foreach($fieldarray as $key=>$val) { if ((in_array($key, $columnPref) || $key=='options' || varsettrue($val['forced'])) && !vartrue($val['nolist'])) { $class = vartrue($val['class']) ? 'class="'.$val['class'].'"' : ''; $width = vartrue($val['width']) ? ' style="width:'.$val['width'].'"' : ''; $text .= ' '; $count++; } } return ' '.$text.' '; } function thead($fieldarray, $columnPref = array(), $querypattern = '', $requeststr = '') { $text = ""; $querypattern = filter_var($querypattern, FILTER_SANITIZE_STRING); if(!$requeststr) $requeststr = rawurldecode(e_QUERY); $requeststr = filter_var($requeststr, FILTER_SANITIZE_STRING); // Recommended pattern: mode=list&field=[FIELD]&asc=[ASC]&from=[FROM] if(strpos($querypattern,'&')!==FALSE) { // we can assume it's always $_GET since that's what it will generate // more flexible (e.g. pass default values for order/field when they can't be found in e_QUERY) & secure $tmp = str_replace('&', '&', $requeststr ? $requeststr : e_QUERY); parse_str($tmp, $tmp); $etmp = array(); parse_str(str_replace('&', '&', $querypattern), $etmp); } else // Legacy Queries. eg. main.[FIELD].[ASC].[FROM] { $tmp = explode(".", ($requeststr ? $requeststr : e_QUERY)); $etmp = explode(".", $querypattern); } foreach($etmp as $key => $val) // I'm sure there's a more efficient way to do this, but too tired to see it right now!. { if($val == "[FIELD]") { $field = varset($tmp[$key]); } if($val == "[ASC]") { $ascdesc = varset($tmp[$key]); } if($val == "[FROM]") { $fromval = varset($tmp[$key]); } } if(!varset($fromval)){ $fromval = 0; } $ascdesc = (varset($ascdesc) == 'desc') ? 'asc' : 'desc'; foreach($fieldarray as $key=>$val) { if ((in_array($key, $columnPref) || $key == 'options' || (vartrue($val['forced']))) && !vartrue($val['nolist'])) { $cl = (vartrue($val['thclass'])) ? " class='".$val['thclass']."'" : ""; $text .= " "; if($querypattern!="" && !varsettrue($val['nosort']) && $key != "options" && $key != "checkboxes") { $from = ($key == $field) ? $fromval : 0; $srch = array("[FIELD]","[ASC]","[FROM]"); $repl = array($key,$ascdesc,$from); $val['url'] = e_SELF."?".str_replace($srch,$repl,$querypattern); } $text .= (vartrue($val['url'])) ? "" : ""; // Really this column-sorting link should be auto-generated, or be autocreated via unobtrusive js. $text .= defset($val['title'], $val['title']); $text .= ($val['url']) ? "" : ""; $text .= ($key == "options" && !vartrue($val['noselector'])) ? $this->columnSelector($fieldarray, $columnPref) : ""; $text .= ($key == "checkboxes") ? $this->checkbox_toggle('e-column-toggle', vartrue($val['toggle'], 'multiselect')) : ""; $text .= " "; } } return " ".$text." "; } /** * Render Table cells from hooks. * @param array $data * @return string */ function renderHooks($data) { $hooks = e107::getEvent()->triggerHook($data); $text = ""; if(!empty($hooks)) { foreach($hooks as $plugin => $hk) { $text .= "\n\n\n"; if(!empty($hk)) { foreach($hk as $hook) { $text .= "\t\t\t\n"; $text .= "\t\t\t".$hook['caption']."\n"; $text .= "\t\t\t".$hook['html'].""; $text .= (varset($hook['help'])) ? "\n".$hook['help']."" : ""; $text .= "\n\t\t\t\n"; } } } } return $text; } /** * Render Related Items for the current page/news-item etc. * @param string $type : comma separated list. ie. plugin folder names. * @param string $tags : comma separated list of keywords to return related items of. * @param array $curVal. eg. array('page'=> current-page-id-value); */ function renderRelated($parm,$tags, $curVal) //XXX TODO Cache! { if(empty($tags)) { return; } if(!varset($parm['limit'])) { $parm = array('limit' => 5); } if(!varset($parm['types'])) { $parm['types'] = 'news'; } $tp = e107::getParser(); $types = explode(',',$parm['types']); $list = array(); foreach($types as $plug) { if(!$obj = e107::getAddon($plug,'e_related')) { continue; } $parm['current'] = intval(varset($curVal[$plug])); $tmp = $obj->compile($tags,$parm); if(count($tmp)) { foreach($tmp as $val) { $list[] = "
  • ".$val['title']."
  • "; } } } if(count($list)) { return ""; //XXX Tablerender? } } /** * Render Table cells from field listing. * @param array $fieldarray - eg. $this->fields * @param array $currentlist - eg $this->fieldpref * @param array $fieldvalues - eg. $row * @param string $pid - eg. table_id * @return string */ function renderTableRow($fieldarray, $currentlist, $fieldvalues, $pid) { $cnt = 0; $ret = ''; /*$fieldarray = $obj->fields; $currentlist = $obj->fieldpref; $pid = $obj->pid;*/ $trclass = vartrue($fieldvalues['__trclass']) ? ' class="'.$trclass.'"' : ''; unset($fieldvalues['__trclass']); foreach ($fieldarray as $field => $data) { // shouldn't happen... if(!isset($fieldvalues[$field]) && vartrue($data['alias'])) { $fieldvalues[$data['alias']] = $fieldvalues[$data['field']]; $field = $data['alias']; } //Not found if((!varset($data['forced']) && !in_array($field, $currentlist)) || varset($data['nolist'])) { continue; } elseif(vartrue($data['type']) != 'method' && !$data['forced'] && !isset($fieldvalues[$field]) && $fieldvalues[$field] !== NULL) { $ret .= " Not Found! ($field) "; continue; } $tdclass = vartrue($data['class']); if($field == 'checkboxes') $tdclass = $tdclass ? $tdclass.' autocheck e-pointer' : 'autocheck e-pointer'; if($field == 'options') $tdclass = $tdclass ? $tdclass.' options' : 'options'; // there is no other way for now - prepare user data if('user' == vartrue($data['type']) /* && isset($data['readParms']['idField'])*/) { if(varset($data['readParms']) && is_string($data['readParms'])) parse_str($data['readParms'], $data['readParms']); if(isset($data['readParms']['idField'])) { $data['readParms']['__idval'] = $fieldvalues[$data['readParms']['idField']]; } elseif(isset($fieldvalues['user_id'])) // Default { $data['readParms']['__idval'] = $fieldvalues['user_id']; } if(isset($data['readParms']['nameField'])) { $data['readParms']['__nameval'] = $fieldvalues[$data['readParms']['nameField']]; } elseif(isset($fieldvalues['user_name'])) // Default { $data['readParms']['__nameval'] = $fieldvalues['user_name']; } } $value = $this->renderValue($field, varset($fieldvalues[$field]), $data, varset($fieldvalues[$pid])); if($tdclass) { $tdclass = ' class="'.$tdclass.'"'; } $ret .= ' '.$value.' '; $cnt++; } if($cnt) { return ' '.$ret.' '; } return ''; } /** * Create an Inline Edit link. * @param $dbField : field being edited //TODO allow for an array of all data here. * @param $pid : primary ID of the row being edited. * @param $fieldName - Description of the field name (caption) * @param $curVal : existing value of in the field * @param $linkText : existing value displayed * @param $type text|textarea|select|date|checklist * @param $array : array data used in dropdowns etc. */ private function renderInline($dbField, $pid, $fieldName, $curVal, $linkText, $type='text', $array=null) { $source = str_replace('"',"'",json_encode($array, JSON_FORCE_OBJECT)); // SecretR - force object, fix number of bugs $mode = preg_replace('/[^\w]/', '', vartrue($_GET['mode'], '')); $text = "".$linkText.""; return $text; } /** * Render Field Value * @param string $field field name * @param mixed $value field value * @param array $attributes field attributes including render parameters, element options - see e_admin_ui::$fields for required format * @return string */ function renderValue($field, $value, $attributes, $id = 0) { $parms = array(); if(isset($attributes['readParms'])) { if(!is_array($attributes['readParms'])) parse_str($attributes['readParms'], $attributes['readParms']); $parms = $attributes['readParms']; } if(vartrue($attributes['inline'])) $parms['editable'] = true; // attribute alias if(vartrue($attributes['sort'])) $parms['sort'] = true; // attribute alias $this->renderValueTrigger($field, $value, $parms, $id); $tp = e107::getParser(); switch($field) // special fields { case 'options': if(varset($attributes['type']) == "method") // Allow override with 'options' function. { $attributes['mode'] = "read"; if(isset($attributes['method']) && $attributes['method'] && method_exists($this, $attributes['method'])) { $method = $attributes['method']; return $this->$method($parms, $value, $id, $attributes); } elseif(method_exists($this, 'options')) { //return $this->options($field, $value, $attributes, $id); // consistent method arguments, fixed in admin cron administration return $this->options($parms, $value, $id, $attributes); // OLD breaks admin->cron 'options' column } } if(!$value) { parse_str(str_replace('&', '&', e_QUERY), $query); //FIXME - FIX THIS // keep other vars in tact $query['action'] = 'edit'; $query['id'] = $id; //$edit_query = array('mode' => varset($query['mode']), 'action' => varset($query['action']), 'id' => $id); $query = http_build_query($query); $value = "
    "; if(vartrue($parms['sort']))//FIXME use a global variable such as $fieldpref { $mode = preg_replace('/[^\w]/', '', vartrue($_GET['mode'], '')); $from = intval(vartrue($_GET['from'],0)); $value .= "".ADMIN_SORT_ICON." "; } $cls = false; if(varset($parms['editClass'])) { $cls = (deftrue($parms['editClass'])) ? constant($parms['editClass']) : $parms['editClass']; } if((false === $cls || check_class($cls)) && varset($parms['edit'],1) == 1) { /* $value .= " ".LAN_EDIT.""; */ $value .= " ".ADMIN_EDIT_ICON.""; } $delcls = vartrue($attributes['noConfirm']) ? ' no-confirm' : ''; if(varset($parms['deleteClass']) && varset($parms['delete'],1) == 1) { $cls = (deftrue($parms['deleteClass'])) ? constant($parms['deleteClass']) : $parms['deleteClass']; if(check_class($cls)) { $value .= $this->submit_image('etrigger_delete['.$id.']', $id, 'delete', LAN_DELETE.' [ ID: '.$id.' ]', array('class' => 'action delete btn btn-default'.$delcls)); } } else { $value .= $this->submit_image('etrigger_delete['.$id.']', $id, 'delete', LAN_DELETE.' [ ID: '.$id.' ]', array('class' => 'action delete btn btn-default'.$delcls)); } } //$attributes['type'] = 'text'; $value .= "
    "; return $value; break; case 'checkboxes': $value = $this->checkbox(vartrue($attributes['toggle'], 'multiselect').'['.$id.']', $id); //$attributes['type'] = 'text'; return $value; break; } switch($attributes['type']) { case 'number': if(!$value) $value = '0'; if($parms) { if(!isset($parms['sep'])) $value = number_format($value, $parms['decimals']); else $value = number_format($value, $parms['decimals'], vartrue($parms['point'], '.'), vartrue($parms['sep'], ' ')); } if(!vartrue($attributes['noedit']) && vartrue($parms['editable']) && !vartrue($parms['link'])) // avoid bad markup, better solution coming up { $mode = preg_replace('/[^\w]/', '', vartrue($_GET['mode'], '')); $value = "".$value.""; } $value = vartrue($parms['pre']).$value.vartrue($parms['post']); // else same break; case 'ip': //$e107 = e107::getInstance(); $value = e107::getIPHandler()->ipDecode($value); // else same break; case 'templates': case 'layouts': $pre = vartrue($parms['pre']); $post = vartrue($parms['post']); unset($parms['pre'], $parms['post']); if($parms) { $attributes['writeParms'] = $parms; } elseif(isset($attributes['writeParms'])) { if(is_string($attributes['writeParms'])) parse_str($attributes['writeParms'], $attributes['writeParms']); } $attributes['writeParms']['raw'] = true; $tmp = $this->renderElement($field, '', $attributes); // Inline Editing. //@SecretR - please FIXME! if(!vartrue($attributes['noedit']) && vartrue($parms['editable']) && !vartrue($parms['link'])) // avoid bad markup, better solution coming up { $mode = preg_replace('/[^\w]/', '', vartrue($_GET['mode'], '')); $source = str_replace('"',"'",json_encode($wparms)); $value = "".$value.""; } // $value = $pre.vartrue($tmp[$value]).$post; // FIXME "Fatal error: Only variables can be passed by reference" featurebox list page. break; case 'comma': case 'dropdown': // XXX - should we use readParams at all here? see writeParms check below if($parms && is_array($parms)) // FIXME - add support for multi-level arrays (option groups) { //FIXME return no value at all when 'editable=1' is a readParm. See FAQs templates. // $value = vartrue($parms['pre']).vartrue($parms[$value]).vartrue($parms['post']); // break; } // NEW - multiple (array values) support // FIXME - add support for multi-level arrays (option groups) if(!is_array($attributes['writeParms'])) parse_str($attributes['writeParms'], $attributes['writeParms']); $wparms = $attributes['writeParms']; if(!is_array(varset($wparms['__options']))) parse_str($wparms['__options'], $wparms['__options']); $opts = $wparms['__options']; unset($wparms['__options']); $_value = $value; if(vartrue($opts['multiple']) || vartrue($attributes['type']) == 'comma') { $ret = array(); $value = is_array($value) ? $value : explode(',', $value); foreach ($value as $v) { if(isset($wparms[$v])) $ret[] = $wparms[$v]; } $value = implode(', ', $ret); } else { $ret = ''; if(isset($wparms[$value])) $ret = $wparms[$value]; $value = $ret; } $value = ($value ? vartrue($parms['pre']).defset($value, $value).vartrue($parms['post']) : ''); // Inline Editing. // Inline Editing with 'comma' @SecretR - please FIXME - empty values added. @see news 'render type' or 'media-manager' category for test examples. if(!vartrue($attributes['noedit']) && vartrue($parms['editable']) && !vartrue($parms['link'])) // avoid bad markup, better solution coming up { $xtype = ($attributes['type'] == 'dropdown') ? 'select' : 'checklist'; // $value = "".$value.""; $value = $this->renderInline($field, $id, $attributes['title'], $_value, $value, $xtype, $wparms); } // return ; break; case 'radio': if($parms && is_array($parms)) // FIXME - add support for multi-level arrays (option groups) { $value = vartrue($parms['pre']).vartrue($parms[$value]).vartrue($parms['post']); break; } if(!is_array($attributes['writeParms'])) parse_str($attributes['writeParms'], $attributes['writeParms']); $value = vartrue($attributes['writeParms']['__options']['pre']).vartrue($attributes['writeParms'][$value]).vartrue($attributes['writeParms']['__options']['post']); break; case 'tags': case 'text': if(vartrue($parms['truncate'])) { $value = $tp->text_truncate($value, $parms['truncate'], '...'); } elseif(vartrue($parms['htmltruncate'])) { $value = $tp->html_truncate($value, $parms['htmltruncate'], '...'); } if(vartrue($parms['wrap'])) { $value = $tp->htmlwrap($value, (int)$parms['wrap'], varset($parms['wrapChar'], ' ')); } if(vartrue($parms['link']) && $id/* && is_numeric($id)*/) { $link = str_replace('[id]',$id,$parms['link']); $link = $tp->replaceConstants($link); // SEF URL is not important since we're in admin. $dialog = vartrue($parms['target']) =='dialog' ? " e-dialog" : ""; // iframe $ext = vartrue($parms['target']) =='blank' ? " rel='external' " : ""; // new window $modal = vartrue($parms['target']) =='modal' ? " data-toggle='modal' data-cache='false' data-target='#uiModal' " : ""; if($parms['link'] == 'sef' && $this->getController()->getListModel()) { $model = $this->getController()->getListModel(); // copy url config if(!$model->getUrl()) $model->setUrl($this->getController()->getUrl()); // assemble the url $link = $model->url(); } elseif(vartrue($data[$parms['link']])) // support for a field-name as the link. eg. link_url. { $link = $tp->replaceConstants(vartrue($data[$parms['link']])); } // in case something goes wrong... if($link) $value = "".$value.""; } if(!vartrue($attributes['noedit']) && vartrue($parms['editable']) && !vartrue($parms['link'])) // avoid bad markup, better solution coming up { $mode = preg_replace('/[^\w]/', '', vartrue($_GET['mode'], '')); $value = "".$value.""; } $value = vartrue($parms['pre']).$value.vartrue($parms['post']); break; case 'bbarea': case 'textarea': if($attributes['type'] == 'textarea' && !vartrue($attributes['noedit']) && vartrue($parms['editable']) && !vartrue($parms['link'])) // avoid bad markup, better solution coming up { return $this->renderInline($field,$id,$attributes['title'],$value,substr($value,0,50)."...",'textarea'); //FIXME. } $expand = '...'; $toexpand = false; if($attributes['type'] == 'bbarea' && !isset($parms['bb'])) $parms['bb'] = true; //force bb parsing for bbareas $elid = trim(str_replace('_', '-', $field)).'-'.$id; if(!vartrue($parms['noparse'])) $value = $tp->toHTML($value, (vartrue($parms['bb']) ? true : false), vartrue($parms['parse'])); if(vartrue($parms['expand']) || vartrue($parms['truncate']) || vartrue($parms['htmltruncate'])) { $ttl = vartrue($parms['expand']); if($ttl == 1) { $ttl = $expand.""; $ttl1 = ""; } $expands = ''.defset($ttl, $ttl).""; $contracts = ''.defset($ttl1, $ttl1).""; } $oldval = $value; if(vartrue($parms['truncate'])) { $value = $oldval = strip_tags($value); $value = $tp->text_truncate($value, $parms['truncate'], ''); $toexpand = $value != $oldval; } elseif(vartrue($parms['htmltruncate'])) { $value = $tp->html_truncate($value, $parms['htmltruncate'], ''); $toexpand = $value != $oldval; } if($toexpand) { // force hide! TODO - core style .expand-c (expand container) // TODO: Hide 'More..' button when text fully displayed. $value .= ''; $value .= $expands; // 'More..' button. Keep it at the bottom so it does't cut the sentence. } break; case 'icon': $value = $tp->toIcon($value,array('size'=>'2x')); break; case 'file': if(vartrue($parms['base'])) { $url = $parms['base'].$value; } else $url = e107::getParser()->replaceConstants($value, 'full'); $name = basename($value); $value = ''.$name.''; break; case 'image': //TODO - thumb, js tooltip... if($value) { if(strpos($value,",")!==false) { $tmp = explode(",",$value); $value = $tmp[0]; unset($tmp); } $vparm = array('thumb'=>'tag','w'=> vartrue($parms['thumb_aw'],'80')); if($video = e107::getParser()->toVideo($value,$vparm)) { return $video; } if(!preg_match("/[a-zA-z0-9_-\s\(\)]+\.(png|jpg|jpeg|gif|PNG|JPG|JPEG|GIF)$/",$value) && strpos($value,'.')!==false) { $icon = "{e_IMAGE}filemanager/zip_32.png"; $src = $tp->replaceConstants(vartrue($parms['pre']).$icon, 'abs'); return e107::getParser()->toGlyph('fa-file','size=2x'); // return ''.$value.''; } if(vartrue($parms['thumb'])) { $src = $tp->replaceConstants(vartrue($parms['pre']).$value, 'abs'); $thumb = $parms['thumb']; $thparms = array(); if(is_numeric($thumb) && '1' != $thumb) { $thparms['w'] = intval($thumb); } elseif(vartrue($parms['thumb_aw'])) { $thparms['aw'] = intval($parms['thumb_aw']); } $thsrc = $tp->thumbUrl(vartrue($parms['pre']).$value, $thparms, varset($parms['thumb_urlraw'])); $alt = basename($src); $ttl = ''.$alt.''; $value = ''.$ttl.''; } else { $src = $tp->replaceConstants(vartrue($parms['pre']).$value, 'abs'); $alt = $src; //basename($value); $ttl = vartrue($parms['title'], 'LAN_PREVIEW'); $value = ''.defset($ttl, $ttl).''; } } break; case 'datestamp': $value = $value ? e107::getDate()->convert_date($value, vartrue($parms['mask'], 'short')) : ''; break; case 'date': // just show original value break; case 'userclass': $dispvalue = $this->_uc->uc_get_classname($value); // Inline Editing. if(!vartrue($attributes['noedit']) && vartrue($parms['editable']) && !vartrue($parms['link'])) // avoid bad markup, better solution coming up { $mode = preg_replace('/[^\w]/', '', vartrue($_GET['mode'], '')); $array = e107::getUserClass()->uc_required_class_list(); //XXX Ugly looking (non-standard) function naming - TODO discuss name change. $source = str_replace('"',"'",json_encode($array, JSON_FORCE_OBJECT)); //NOTE Leading ',' required on $value; so it picks up existing value. $value = "".$dispvalue.""; } else { $value = $dispvalue; } break; case 'userclasses': $classes = explode(',', $value); $uv = array(); foreach ($classes as $cid) { $uv[] = $this->_uc->uc_get_classname($cid); } $dispvalue = implode(vartrue($parms['separator'],"
    "), $uv); // Inline Editing. if(!vartrue($attributes['noedit']) && vartrue($parms['editable']) && !vartrue($parms['link'])) // avoid bad markup, better solution coming up { $mode = preg_replace('/[^\w]/', '', vartrue($_GET['mode'], '')); $optlist = $parm['xxxxx']; // XXX TODO - add param for choice of class list options below. $array = e107::getUserClass()->uc_required_class_list('nobody,admin,main,public,classes'); //XXX Ugly looking (non-standard) function naming - TODO discuss name change. $source = str_replace('"',"'",json_encode($array, JSON_FORCE_OBJECT)); //NOTE Leading ',' required on $value; so it picks up existing value. $value = "".$dispvalue.""; } else { $value = $dispvalue; } break; /*case 'user_name': case 'user_loginname': case 'user_login': case 'user_customtitle': case 'user_email':*/ case 'user': /*if(is_numeric($value)) { $value = get_user_data($value); if($value) { $value = $value[$attributes['type']] ? $value[$attributes['type']] : $value['user_name']; } else { $value = 'not found'; } }*/ // Dirty, but the only way for now $id = 0; $ttl = LAN_ANONYMOUS; //Defaults to user_id and user_name (when present) and when idField and nameField are not present. // previously set - real parameters are idField && nameField $id = vartrue($parms['__idval']); if($value && !is_numeric($value)) { $id = vartrue($parms['__idval']); $ttl = $value; } elseif($value && is_numeric($value)) { $id = $value; $ttl = vartrue($parms['__nameval']); } if(vartrue($parms['link']) && $id && $ttl && is_numeric($id)) { $value = ''.$ttl.''; } else { $value = $ttl; } break; case 'bool': case 'boolean': $false = vartrue($parms['trueonly']) ? "" : ADMIN_FALSE_ICON; if(vartrue($parms['reverse'])) { $value = ($value) ? $false : ADMIN_TRUE_ICON; } else { $value = $value ? ADMIN_TRUE_ICON : $false; } break; case 'url': if(!$value) break; $ttl = $value; if(vartrue($parms['href'])) { return $tp->replaceConstants(vartrue($parms['pre']).$value, varset($parms['replace_mod'],'abs')); } if(vartrue($parms['truncate'])) { $ttl = $tp->text_truncate($value, $parms['truncate'], '...'); } $value = "".$ttl.""; break; case 'email': if(!$value) break; $ttl = $value; if(vartrue($parms['truncate'])) { $ttl = $tp->text_truncate($value, $parms['truncate'], '...'); } $value = "".$ttl.""; break; case 'method': // Custom Function $method = $attributes['field']; // prevents table alias in method names. ie. u.my_method. $_value = $value; $value = call_user_func_array(array($this, $method), array($value, 'read', $parms)); // Inline Editing. if(!vartrue($attributes['noedit']) && vartrue($parms['editable'])) // avoid bad markup, better solution coming up { $mode = preg_replace('/[^\w]/', '', vartrue($_GET['mode'], '')); $methodParms = call_user_func_array(array($this, $method), array($value, 'inline', $parms)); $source = str_replace('"',"'",json_encode($methodParms, JSON_FORCE_OBJECT)); $value = "".$value.""; } break; case 'hidden': return (vartrue($parms['show']) ? ($value ? $value : vartrue($parms['empty'])) : ''); break; case 'lanlist': $options = e107::getLanguage()->getLanSelectArray(); if($options) // FIXME - add support for multi-level arrays (option groups) { if(!is_array($attributes['writeParms'])) parse_str($attributes['writeParms'], $attributes['writeParms']); $wparms = $attributes['writeParms']; if(!is_array(varset($wparms['__options']))) parse_str($wparms['__options'], $wparms['__options']); $opts = $wparms['__options']; if($opts['multiple']) { $ret = array(); $value = is_array($value) ? $value : explode(',', $value); foreach ($value as $v) { if(isset($options[$v])) $ret[] = $options[$v]; } $value = implode(', ', $ret); } else { $ret = ''; if(isset($options[$value])) $ret = $options[$value]; $value = $ret; } $value = ($value ? vartrue($parms['pre']).$value.vartrue($parms['post']) : ''); } else { $value = ''; } break; //TODO - order default: //unknown type break; } return $value; } /** * Auto-render Form Element * @param string $key * @param mixed $value * @param array $attributes field attributes including render parameters, element options - see e_admin_ui::$fields for required format * #param array (under construction) $required_data required array as defined in e_model/validator * @return string */ function renderElement($key, $value, $attributes, $required_data = array(), $id = 0) { $parms = vartrue($attributes['writeParms'], array()); $tp = e107::getParser(); if(is_string($parms)) parse_str($parms, $parms); // Two modes of read-only. 1 = read-only, but only when there is a value, 2 = read-only regardless. if(vartrue($attributes['readonly']) && (vartrue($value) || vartrue($attributes['readonly'])===2)) // quick fix (maybe 'noedit'=>'readonly'?) { if(vartrue($attributes['writeParms'])) // eg. different size thumbnail on the edit page. { $attributes['readParms'] = $attributes['writeParms']; } return $this->renderValue($key, $value, $attributes).$this->hidden($key, $value); // } // FIXME standard - writeParams['__options'] is introduced for list elements, bundle adding to writeParms is non reliable way $writeParamsOptionable = array('dropdown', 'comma', 'radio', 'lanlist', 'language', 'user'); $writeParamsDisabled = array('layouts', 'templates', 'userclass', 'userclasses'); // FIXME it breaks all list like elements - dropdowns, radio, etc if(vartrue($required_data[0]) || vartrue($attributes['required'])) // HTML5 'required' attribute { // FIXME - another approach, raise standards, remove checks if(in_array($attributes['type'], $writeParamsOptionable)) { $parms['__options']['required'] = 1; } elseif(!in_array($attributes['type'], $writeParamsDisabled)) { $parms['required'] = 1; } } // FIXME it breaks all list like elements - dropdowns, radio, etc if(vartrue($required_data[3]) || vartrue($attributes['pattern'])) // HTML5 'pattern' attribute { // FIXME - another approach, raise standards, remove checks if(in_array($attributes['type'], $writeParamsOptionable)) { $parms['__options']['pattern'] = vartrue($attributes['pattern'], $required_data[3]); } elseif(!in_array($attributes['type'], $writeParamsDisabled)) { $parms['pattern'] = vartrue($attributes['pattern'], $required_data[3]); } } $this->renderElementTrigger($key, $value, $parms, $required_data, $id); switch($attributes['type']) { case 'number': $maxlength = vartrue($parms['maxlength'], 255); unset($parms['maxlength']); if(!vartrue($parms['size'])) $parms['size'] = 'mini'; if(!vartrue($parms['class'])) $parms['class'] = 'tbox number e-spinner'; if(!$value) $value = '0'; $ret = vartrue($parms['pre']).$this->text($key, $value, $maxlength, $parms).vartrue($parms['post']); break; case 'ip': $ret = $this->text($key, e107::getIPHandler()->ipDecode($value), 32, $parms); break; case 'url': case 'email': case 'text': case 'password': // encrypts to md5 when saved. $maxlength = vartrue($parms['maxlength'], 255); unset($parms['maxlength']); $ret = vartrue($parms['pre']).$this->text($key, $value, $maxlength, $parms).vartrue($parms['post']); // vartrue($parms['__options']) is limited. See 'required'=>true break; case 'tags': $ret = vartrue($parms['pre']).$this->tags($key, $value, $maxlength, $parms).vartrue($parms['post']); // vartrue($parms['__options']) is limited. See 'required'=>true break; case 'textarea': $text = ""; if(vartrue($parms['append'])) // similar to comments - TODO TBD. a 'comment' field type may be better. { $attributes['readParms'] = 'bb=1'; $text = $this->renderValue($key, $value, $attributes).$this->hidden($key, $value).'
    '; $value = ""; } $text .= $this->textarea($key, $value, vartrue($parms['rows'], 5), vartrue($parms['cols'], 40), vartrue($parms['__options'],$parms), varset($parms['counter'], false)); $ret = $text; break; case 'bbarea': $options = array('counter' => varset($parms['counter'], false)); // Media = media-category owner used by media-manager. $ret = $this->bbarea($key, $value, vartrue($parms['template']), vartrue($parms['media']), vartrue($parms['size'], 'medium'),$options ); break; case 'image': //TODO - thumb, image list shortcode, js tooltip... $label = varset($parms['label'], 'LAN_EDIT'); unset($parms['label']); $ret = $this->imagepicker($key, $value, defset($label, $label), $parms); break; case 'images': $value = str_replace(''',"'",html_entity_decode($value)); //FIXME @SecretR Horrible workaround to Line 3203 of admin_ui.php $ival = e107::unserialize($value); for ($i=0; $i < 5; $i++) { $k = $key.'[path]['.$i.']'; $ret .= $this->imagepicker($k, $ival['path'][$i], defset($label, $label), $parms); } break; case 'file': //TODO - thumb, image list shortcode, js tooltip... $label = varset($parms['label'], 'LAN_EDIT'); unset($parms['label']); $ret = $this->filepicker($key, $value, defset($label, $label), $parms); break; case 'icon': $label = varset($parms['label'], 'LAN_EDIT'); $ajax = varset($parms['ajax'], true) ? true : false; unset($parms['label'], $parms['ajax']); $ret = $this->iconpicker($key, $value, defset($label, $label), $parms, $ajax); break; case 'date': // date will show the datepicker but won't convert the value to unix. ie. string value will be saved. (or may be processed manually with beforeCreate() etc. Format may be determined by $parm. case 'datestamp': // If hidden, value is updated regardless. eg. a 'last updated' field. // If not hidden, and there is a value, it is retained. eg. during the update of an existing record. // otherwise it is added. eg. during the creation of a new record. if(vartrue($parms['auto']) && (($value == null) || vartrue($parms['hidden']))) { $value = time(); } if(vartrue($parms['readonly'])) // different to 'attribute-readonly' since the value may be auto-generated. { $ret = $this->renderValue($key, $value, $attributes).$this->hidden($key, $value); } elseif(vartrue($parms['hidden'])) { $ret = $this->hidden($key, $value); } else { $ret = $this->datepicker($key, $value, $parms); } break; case 'layouts': //to do - exclude param (exact match) $location = varset($parms['plugin']); // empty - core $ilocation = vartrue($parms['id'], $location); // omit if same as plugin name $where = vartrue($parms['area'], 'front'); //default is 'front' $filter = varset($parms['filter']); $merge = vartrue($parms['merge']) ? true : false; $layouts = e107::getLayouts($location, $ilocation, $where, $filter, $merge, true); if(varset($parms['default']) && !isset($layouts[0]['default'])) { $layouts[0] = array('default' => $parms['default']) + $layouts[0]; } $info = array(); if($layouts[1]) { foreach ($layouts[1] as $k => $info_array) { if(isset($info_array['description'])) $info[$k] = defset($info_array['description'], $info_array['description']); } } //$this->selectbox($key, $layouts, $value) $ret = (vartrue($parms['raw']) ? $layouts[0] : $this->radio_multi($key, $layouts[0], $value,array('sep'=>"
    "), $info)); break; case 'templates': //to do - exclude param (exact match) $templates = array(); if(varset($parms['default'])) { $templates['default'] = defset($parms['default'], $parms['default']); } $location = vartrue($parms['plugin']) ? e_PLUGIN.$parms['plugin'].'/' : e_THEME; $ilocation = vartrue($parms['location']); $tmp = e107::getFile()->get_files($location.'templates/'.$ilocation, vartrue($parms['fmask'], '_template\.php$'), vartrue($parms['omit'], 'standard'), vartrue($parms['recurse_level'], 0)); foreach($tmp as $files) { $k = str_replace('_template.php', '', $files['fname']); $templates[$k] = implode(' ', array_map('ucfirst', explode('_', $k))); //TODO add LANS? } // override $where = vartrue($parms['area'], 'front'); $location = vartrue($parms['plugin']) ? $parms['plugin'].'/' : ''; $tmp = e107::getFile()->get_files(e107::getThemeInfo($where, 'rel').'templates/'.$location.$ilocation, vartrue($parms['fmask']), vartrue($parms['omit'], 'standard'), vartrue($parms['recurse_level'], 0)); foreach($tmp as $files) { $k = str_replace('_template.php', '', $files['fname']); $templates[$k] = implode(' ', array_map('ucfirst', explode('_', $k))); //TODO add LANS? } $ret = (vartrue($parms['raw']) ? $templates : $this->selectbox($key, $templates, $value)); break; case 'dropdown': case 'comma': $eloptions = vartrue($parms['__options'], array()); if(is_string($eloptions)) parse_str($eloptions, $eloptions); if($attributes['type'] === 'comma') $eloptions['multiple'] = true; unset($parms['__options']); if(vartrue($eloptions['multiple']) && !is_array($value)) $value = explode(',', $value); $ret = vartrue($eloptions['pre']).$this->selectbox($key, $parms, $value, $eloptions).vartrue($eloptions['post']); break; case 'radio': // TODO - more options (multi-line, help) $eloptions = vartrue($parms['__options'], array()); if(is_string($eloptions)) parse_str($eloptions, $eloptions); unset($parms['__options']); $ret = vartrue($eloptions['pre']).$this->radio_multi($key, $parms, $value, $eloptions, false).vartrue($eloptions['post']); break; case 'userclass': case 'userclasses': $uc_options = vartrue($parms['classlist'], 'public,guest,nobody,member,admin,main,classes'); // defaults to 'public,guest,nobody,member,classes' (userclass handler) unset($parms['classlist']); $method = ($attributes['type'] == 'userclass') ? 'uc_select' : 'uc_select'; if(vartrue($atrributes['type']) == 'userclasses'){ $parms['multiple'] = true; } $ret = $this->$method($key, $value, $uc_options, vartrue($parms, array())); break; /*case 'user_name': case 'user_loginname': case 'user_login': case 'user_customtitle': case 'user_email':*/ case 'user': //user_id expected // Just temporary solution, could be changed soon if(!isset($parms['__options'])) $parms['__options'] = array(); if(!is_array($parms['__options'])) parse_str($parms['__options'], $parms['__options']); if((empty($value) && varset($parms['currentInit'],USERID)!==0) || vartrue($parms['current'])) // include current user by default. { $value = USERID; if(vartrue($parms['current'])) { $parms['__options']['readonly'] = true; } } if(!is_array($value)) { $value = $value ? e107::getSystemUser($value, true)->getUserData() : array();// get_user_data($value); } $colname = vartrue($parms['nameType'], 'user_name'); $parms['__options']['name'] = $colname; if(!$value) $value = array(); $uname = varset($value[$colname]); $value = varset($value['user_id'], 0); $ret = $this->userpicker(vartrue($parms['nameField'], $key.'_usersearch'), $key, $uname, $value, vartrue($parms['__options'])); break; case 'bool': case 'boolean': if(varset($parms['label']) === 'yesno') { $lenabled = 'LAN_YES'; $ldisabled = 'LAN_NO'; } else { $lenabled = vartrue($parms['enabled'], 'LAN_ENABLED'); $ldisabled = vartrue($parms['disabled'], 'LAN_DISABLED'); } unset($parms['enabled'], $parms['disabled'], $parms['label']); $ret = $this->radio_switch($key, $value, defset($lenabled, $lenabled), defset($ldisabled, $ldisabled),$parms); break; case 'method': // Custom Function $ret = call_user_func_array(array($this, $key), array($value, 'write', $parms)); break; case 'upload': //TODO - from method // TODO uploadfile SC is now processing uploads as well (add it to admin UI), write/readParms have to be added (see uploadfile.php parms) $disbut = varset($parms['disable_button'], '0'); $ret = $tp->parseTemplate("{UPLOADFILE=".(vartrue($parms['path']) ? e107::getParser()->replaceConstants($parms['path']) : e_UPLOAD)."|nowarn&trigger=etrigger_uploadfiles&disable_button={$disbut}}"); break; case 'hidden': $value = (isset($parms['value'])) ? $parms['value'] : $value; $ret = (vartrue($parms['show']) ? ($value ? $value : varset($parms['empty'], $value)) : ''); //echo "
    key=".$key."
    value=".$value; $ret = $ret.$this->hidden($key, $value); break; case 'lanlist': case 'language': $options = e107::getLanguage()->getLanSelectArray(); $eloptions = vartrue($parms['__options'], array()); if(!is_array($eloptions)) parse_str($eloptions, $eloptions); unset($parms['__options']); if(vartrue($eloptions['multiple']) && !is_array($value)) $value = explode(',', $value); $ret = vartrue($eloptions['pre']).$this->selectbox($key, $options, $value, $eloptions).vartrue($eloptions['post']); break; default:// No LAN necessary, debug only. $ret = (ADMIN) ? "".LAN_ERROR." Unknown 'type' : ".$attributes['type'] ."" : $value; break; } if(vartrue($parms['expand'])) { $k = "exp-".$this->name2id($key); $text = "".$parms['expand'].""; $text .= vartrue($parms['help']) ? '
    '.$parms['help'].'
    ' : ''; $text .= "
    ".$ret."
    "; return $text; } else { $ret .= vartrue($parms['help']) ? '
    '.$tp->toHtml($parms['help'],false,'defs').'
    ' : ''; } return $ret; } /** * Generic List Form, used internal by admin UI * Expected options array format: * * 'myplugin', // unique string used for building element ids, REQUIRED * 'pid' => 'primary_id', // primary field name, REQUIRED * 'url' => '{e_PLUGIN}myplug/admin_config.php', // if not set, e_SELF is used * 'query' => 'mode=main&action=list', // or e_QUERY if not set * 'head_query' => 'mode=main&action=list', // without field, asc and from vars, REQUIRED * 'np_query' => 'mode=main&action=list', // without from var, REQUIRED for next/prev functionality * 'legend' => 'Fieldset Legend', // hidden by default * 'form_pre' => '', // markup to be added before opening form element (e.g. Filter form) * 'form_post' => '', // markup to be added after closing form element * 'fields' => array(...), // see e_admin_ui::$fields * 'fieldpref' => array(...), // see e_admin_ui::$fieldpref * 'table_pre' => '', // markup to be added before opening table element * 'table_post' => '', // markup to be added after closing table element (e.g. Batch actions) * 'fieldset_pre' => '', // markup to be added before opening fieldset element * 'fieldset_post' => '', // markup to be added after closing fieldset element * 'perPage' => 15, // if 0 - no next/prev navigation * 'from' => 0, // current page, default 0 * 'field' => 'field_name', //current order field name, default - primary field * 'asc' => 'desc', //current 'order by' rule, default 'asc' * ); * $tree_models['myplugin'] = new e_admin_tree_model($data); * * TODO - move fieldset & table generation in separate methods, needed for ajax calls * @param array $form_options * @param e_admin_tree_model $tree_model * @param boolean $nocontainer don't enclose form in div container * @return string */ public function renderListForm($form_options, $tree_models, $nocontainer = false) { $tp = e107::getParser(); $text = ''; // print_a($form_options); foreach ($form_options as $fid => $options) { $tree_model = $tree_models[$fid]; $tree = $tree_model->getTree(); $total = $tree_model->getTotal(); $amount = $options['perPage']; $from = vartrue($options['from'], 0); $field = vartrue($options['field'], $options['pid']); $asc = strtoupper(vartrue($options['asc'], 'asc')); $elid = $fid;//$options['id']; $query = isset($options['query']) ? $options['query'] : e_QUERY ; if(vartrue($_GET['action']) == 'list') { $query = e_QUERY; //XXX Quick fix for loss of pagination after 'delete'. } $url = (isset($options['url']) ? $tp->replaceConstants($options['url'], 'abs') : e_SELF); $formurl = $url.($query ? '?'.$query : ''); $fields = $options['fields']; $current_fields = varset($options['fieldpref']) ? $options['fieldpref'] : array_keys($options['fields']); $legend_class = vartrue($options['legend_class'], 'e-hideme'); $text .= "
    ".$this->token()." ".vartrue($options['fieldset_pre'])."
    ".$options['legend']." ".vartrue($options['table_pre'])." ".$this->colGroup($fields, $current_fields)." ".$this->thead($fields, $current_fields, varset($options['head_query']), varset($options['query']))." "; if(!$tree) { $text .= "
    "; $text .= "
    ".LAN_NO_RECORDS."
    "; // not prone to column-count issues. } else { foreach($tree as $model) { e107::setRegistry('core/adminUI/currentListModel', $model); $text .= $this->renderTableRow($fields, $current_fields, $model->getData(), $options['pid']); } e107::setRegistry('core/adminUI/currentListModel', null); $text .= " "; } $text .= vartrue($options['table_post']); if($tree && $amount) { // New nextprev SC parameters $parms = 'total='.$total; $parms .= '&amount='.$amount; $parms .= '¤t='.$from; if(ADMIN_AREA) { $parms .= '&tmpl_prefix=admin'; } // NOTE - the whole url is double encoded - reason is to not break parms query string // 'np_query' should be proper (urlencode'd) url query string $url = rawurlencode($url.'?'.(varset($options['np_query']) ? str_replace(array('&', '&'), array('&', '&'), $options['np_query']).'&' : '').'from=[FROM]'); $parms .= '&url='.$url; //$parms = $total.",".$amount.",".$from.",".$url.'?'.($options['np_query'] ? $options['np_query'].'&' : '').'from=[FROM]'; //$text .= $tp->parseTemplate("{NEXTPREV={$parms}}"); $nextprev = $tp->parseTemplate("{NEXTPREV={$parms}}"); if ($nextprev) { $text .= "
    ".$nextprev."
    "; } } $text .= "
    ".vartrue($options['fieldset_post'])."
    "; } if(!$nocontainer) { $text = '
    '.$text.'
    '; } return (vartrue($options['form_pre']).$text.vartrue($options['form_post'])); } /** * Generic DB Record Management Form. * TODO - lans * TODO - move fieldset & table generation in separate methods, needed for ajax calls * Expected arrays format: * * 'myplugin', * 'url' => '{e_PLUGIN}myplug/admin_config.php', //if not set, e_SELF is used * 'query' => 'mode=main&action=edit&id=1', //or e_QUERY if not set * 'tabs' => true, // TODO - NOT IMPLEMENTED YET - enable tabs (only if fieldset count is > 1) //XXX Multiple triggers in a single form? * 'fieldsets' => array( * 'general' => array( * 'legend' => 'Fieldset Legend', * 'fields' => array(...), //see e_admin_ui::$fields * 'after_submit_options' => array('action' => 'Label'[,...]), // or true for default redirect options * 'after_submit_default' => 'action_name', * 'triggers' => 'auto', // standard create/update-cancel triggers * //or custom trigger array in format array('sibmit' => array('Title', 'create', '1'), 'cancel') - trigger name - title, action, optional hidden value (in this case named sibmit_value) * ), * * 'advanced' => array( * 'legend' => 'Fieldset Legend', * 'fields' => array(...), //see e_admin_ui::$fields * 'after_submit_options' => array('__default' => 'action_name' 'action' => 'Label'[,...]), // or true for default redirect options * 'triggers' => 'auto', // standard create/update-cancel triggers * //or custom trigger array in format array('submit' => array('Title', 'create', '1'), 'cancel' => array('cancel', 'cancel')) - trigger name - title, action, optional hidden value (in this case named sibmit_value) * ) * ) * ); * $models[0] = new e_admin_model($data); * $models[0]->setFieldIdName('primary_id'); // you need to do it if you don't use your own admin model extension * * @param array $forms numerical array * @param array $models numerical array with values instance of e_admin_model * @param boolean $nocontainer don't enclose in div container * @return string */ function renderCreateForm($forms, $models, $nocontainer = false) { $text = ''; foreach ($forms as $fid => $form) { $model = $models[$fid]; $query = isset($form['query']) ? $form['query'] : e_QUERY ; $url = (isset($form['url']) ? e107::getParser()->replaceConstants($form['url'], 'abs') : e_SELF).($query ? '?'.$query : ''); $curTab = varset($_GET['tab'],0); $text .= "
    ".vartrue($form['header'])." ".$this->token()." "; foreach ($form['fieldsets'] as $elid => $data) //XXX rename 'fieldsets' to 'forms' ? { $elid = $form['id'].'-'.$elid; if(vartrue($data['tabs'])) // Tabs Present { $text .= '
    '; foreach($data['tabs'] as $tabId=>$label) { $active = ($tabId == $curTab) ? 'active' : ''; $text .= '
    '; $text .= $this->renderCreateFieldset($elid, $data, $model, $tabId); $text .= "
    "; } $text .= "
    "; $text .= $this->renderCreateButtonsBar($elid, $data, $model, $tabId); // Create/Update Buttons etc. } else // No Tabs Present { $text .= $this->renderCreateFieldset($elid, $data, $model, false); $text .= $this->renderCreateButtonsBar($elid, $data, $model, false); // Create/Update Buttons etc. } } $text .= " ".vartrue($form['footer'])."
    "; // e107::js('footer-inline',"Form.focusFirstElement('{$form['id']}-form');",'prototype'); // e107::getJs()->footerInline("Form.focusFirstElement('{$form['id']}-form');"); } if(!$nocontainer) { $text = '
    '.$text.'
    '; } return $text; } /** * Create form fieldset, called internal by {@link renderCreateForm()) * * @param string $id field id * @param array $fdata fieldset data * @param e_admin_model $model */ function renderCreateFieldset($id, $fdata, $model, $tab=0) { $text = vartrue($fdata['fieldset_pre'])."
    ".vartrue($fdata['legend'])." ".vartrue($fdata['table_pre'])." "; // required fields - model definition $model_required = $model->getValidationRules(); $required_help = false; $hidden_fields = array(); foreach($fdata['fields'] as $key => $att) { if($tab !== false && varset($att['tab'], 0) !== $tab) { continue; } // convert aliases - not supported in edit mod if(vartrue($att['alias']) && !$model->hasData($key)) { $key = $att['field']; } if($key == 'checkboxes' || $key == 'options') { continue; } $parms = vartrue($att['formparms'], array()); if(!is_array($parms)) parse_str($parms, $parms); $label = vartrue($att['note']) ? '
    '.deftrue($att['note'], $att['note']).'
    ' : ''; $help = vartrue($att['help']) ? '
    '.deftrue($att['help'], $att['help']).'
    ' : ''; $valPath = trim(vartrue($att['dataPath'], $key), '/'); $keyName = $key; if(strpos($valPath, '/')) //not TRUE, cause string doesn't start with / { $tmp = explode('/', $valPath); $keyName = array_shift($tmp); foreach ($tmp as $path) { $keyName .= '['.$path.']'; } } if('hidden' === $att['type']) { if(!is_array($att['writeParms'])) parse_str(varset($att['writeParms']), $tmp); else $tmp = $att['writeParms']; if(!vartrue($tmp['show'])) { continue; } unset($tmp); } // type null - system (special) fields if(vartrue($att['type']) !== null && !vartrue($att['noedit']) && $key != $model->getFieldIdName()) { $required = ''; $required_class = ''; if(isset($model_required[$key]) || vartrue($att['validate'])) { $required = $this->getRequiredString(); $required_class = ' class="required-label"'; // TODO - add 'required-label' to the core CSS definitions $required_help = true; if(vartrue($att['validate'])) { // override $model_required[$key] = array(); $model_required[$key][] = true === $att['validate'] ? 'required' : $att['validate']; $model_required[$key][] = varset($att['rule']); $model_required[$key][] = $att['title']; $model_required[$key][] = varset($att['error']); } } /* if('hidden' === $att['type']) { parse_str(varset($att['writeParms']), $tmp); if(!vartrue($tmp['show'])) { $hidden_fields[] = $this->renderElement($keyName, $model->getIfPosted($valPath), $att, varset($model_required[$key], array())); unset($tmp); continue; } unset($tmp); } * * * * */ $leftCell = $required."".defset(vartrue($att['title']), vartrue($att['title']))."".$label; $rightCell = $this->renderElement($keyName, $model->getIfPosted($valPath), $att, varset($model_required[$key], array()), $model->getId())." {$help}"; if(vartrue($att['type']) == 'bbarea') { $text .= " "; } else { $text .= " "; } } //if($bckp) $model->remove($bckp); } //print_a($fdata); if($required_help) { $required_help = '
    '.$this->getRequiredString().' - required fields
    '; //TODO - lans } $text .= "
    ".$leftCell."
    ". $rightCell."
    ".$leftCell." ".$rightCell."
    "; $text .= vartrue($fdata['fieldset_post']); return $text; /* $text .= " ".implode("\n", $hidden_fields)." ".$required_help." ".vartrue($fdata['table_post'])."
    "; // After submit options $defsubmitopt = array('list' => 'go to list', 'create' => 'create another', 'edit' => 'edit current'); $submitopt = isset($fdata['after_submit_options']) ? $fdata['after_submit_options'] : true; if(true === $submitopt) { $submitopt = $defsubmitopt; } if($submitopt) { $selected = isset($fdata['after_submit_default']) && array_key_exists($fdata['after_submit_default'], $submitopt) ? $fdata['after_submit_default'] : ''; } $triggers = vartrue($fdata['triggers'], 'auto'); if(is_string($triggers) && 'auto' === $triggers) { $triggers = array(); if($model->getId()) { $triggers['submit'] = array(LAN_UPDATE, 'update', $model->getId()); } else { $triggers['submit'] = array(LAN_CREATE, 'create', 0); } $triggers['cancel'] = array(LAN_CANCEL, 'cancel'); } foreach ($triggers as $trigger => $tdata) { $text .= ($trigger == 'submit') ? "
    " : ""; $text .= $this->admin_button('etrigger_'.$trigger, $tdata[0], $tdata[1]); if($trigger == 'submit' && $submitopt) { $text .= ' '; } $text .= ($trigger == 'submit') ?"
    " : ""; if(isset($tdata[2])) { $text .= $this->hidden($trigger.'_value', $tdata[2]); } } $text .= "
    ".vartrue($fdata['fieldset_post'])." "; return $text; */ } function renderCreateButtonsBar($id, $fdata, $model, $tab=0) { /* $text = vartrue($fdata['fieldset_pre'])."
    ".vartrue($fdata['legend'])." ".vartrue($fdata['table_pre'])." "; */ // required fields - model definition $model_required = $model->getValidationRules(); $required_help = false; $hidden_fields = array(); foreach($fdata['fields'] as $key => $att) { if($tab !== false && varset($att['tab'], 0) !== $tab) { continue; } // convert aliases - not supported in edit mod if(vartrue($att['alias']) && !$model->hasData($key)) { $key = $att['field']; } if($key == 'checkboxes' || $key == 'options') { continue; } $parms = vartrue($att['formparms'], array()); if(!is_array($parms)) parse_str($parms, $parms); $label = vartrue($att['note']) ? '
    '.deftrue($att['note'], $att['note']).'
    ' : ''; $help = vartrue($att['help']) ? '
    '.deftrue($att['help'], $att['help']).'
    ' : ''; $valPath = trim(vartrue($att['dataPath'], $key), '/'); $keyName = $key; if(strpos($valPath, '/')) //not TRUE, cause string doesn't start with / { $tmp = explode('/', $valPath); $keyName = array_shift($tmp); foreach ($tmp as $path) { $keyName .= '['.$path.']'; } } if('hidden' === $att['type']) { if(!is_array($att['writeParms'])) parse_str(varset($att['writeParms']), $tmp); else $tmp = $att['writeParms']; if(!vartrue($tmp['show'])) { $hidden_fields[] = $this->renderElement($keyName, $model->getIfPosted($valPath), $att, varset($model_required[$key], array()), $model->getId()); unset($tmp); continue; } unset($tmp); } // type null - system (special) fields if(vartrue($att['type']) !== null && !vartrue($att['noedit']) && $key != $model->getFieldIdName()) { $required = ''; $required_class = ''; if(isset($model_required[$key]) || vartrue($att['validate'])) { $required = $this->getRequiredString(); $required_class = ' class="required-label"'; // TODO - add 'required-label' to the core CSS definitions $required_help = true; if(vartrue($att['validate'])) { // override $model_required[$key] = array(); $model_required[$key][] = true === $att['validate'] ? 'required' : $att['validate']; $model_required[$key][] = varset($att['rule']); $model_required[$key][] = $att['title']; $model_required[$key][] = varset($att['error']); } } /* $text .= " "; * */ } //if($bckp) $model->remove($bckp); } if($required_help) { // $required_help = '
    '.$this->getRequiredString().' - required fields
    '; //TODO - lans } // $text .= " // //
    ".$required."".defset(vartrue($att['title']), vartrue($att['title']))."".$label." ".$this->renderElement($keyName, $model->getIfPosted($valPath), $att, varset($model_required[$key], array()))." {$help}
    "; $text .= " ".implode("\n", $hidden_fields)." ".vartrue($fdata['table_post'])."
    "; // After submit options $defsubmitopt = array('list' => 'go to list', 'create' => 'create another', 'edit' => 'edit current'); $submitopt = isset($fdata['after_submit_options']) ? $fdata['after_submit_options'] : true; if(true === $submitopt) { $submitopt = $defsubmitopt; } if($submitopt) { $selected = isset($fdata['after_submit_default']) && array_key_exists($fdata['after_submit_default'], $submitopt) ? $fdata['after_submit_default'] : ''; } $triggers = vartrue($fdata['triggers'], 'auto'); if(is_string($triggers) && 'auto' === $triggers) { $triggers = array(); if($model->getId()) { $triggers['submit'] = array(LAN_UPDATE, 'update', $model->getId()); } else { $triggers['submit'] = array(LAN_CREATE, 'create', 0); } $triggers['cancel'] = array(LAN_CANCEL, 'cancel'); } foreach ($triggers as $trigger => $tdata) { $text .= ($trigger == 'submit') ? "
    " : ""; $text .= $this->admin_button('etrigger_'.$trigger, $tdata[0], $tdata[1]); if($trigger == 'submit' && $submitopt) { $text .= ' '; } $text .= ($trigger == 'submit') ?"
    " : ""; if(isset($tdata[2])) { $text .= $this->hidden($trigger.'_value', $tdata[2]); } } $text .= "
    ".vartrue($fdata['fieldset_post'])." "; return $text; } /** * Generic renderForm solution * @param @forms * @param @nocontainer */ function renderForm($forms, $nocontainer = false) { $text = ''; foreach ($forms as $fid => $form) { $query = isset($form['query']) ? $form['query'] : e_QUERY ; $url = (isset($form['url']) ? e107::getParser()->replaceConstants($form['url'], 'abs') : e_SELF).($query ? '?'.$query : ''); $text .= " ".vartrue($form['form_pre'])."
    ".vartrue($form['header'])." ".$this->token()." "; foreach ($form['fieldsets'] as $elid => $fieldset_data) { $elid = $form['id'].'-'.$elid; $text .= $this->renderFieldset($elid, $fieldset_data); } $text .= " ".vartrue($form['footer'])."
    ".vartrue($form['form_post'])." "; } if(!$nocontainer) { $text = '
    '.$text.'
    '; } return $text; } /** * Generic renderFieldset solution, will be split to renderTable, renderCol/Row/Box etc - Still in use. */ function renderFieldset($id, $fdata) { $colgroup = ''; if(vartrue($fdata['table_colgroup'])) { $colgroup = " "; foreach ($fdata['table_colgroup'] as $i => $colgr) { $colgroup .= " $v) { $colgroup .= "{$attr}='{$v}'"; } $colgroup .= " /> "; } $colgroup = " "; } $text = vartrue($fdata['fieldset_pre'])."
    ".vartrue($fdata['legend'])." ".vartrue($fdata['table_pre'])." "; if(vartrue($fdata['table_rows']) || vartrue($fdata['table_body'])) { $text .= " {$colgroup} ".vartrue($fdata['table_head'])." "; if(vartrue($fdata['table_rows'])) { foreach($fdata['table_rows'] as $index => $row) { $text .= " $row "; } } elseif(vartrue($fdata['table_body'])) { $text .= $fdata['table_body']; } if(vartrue($fdata['table_note'])) { $note = '
    '.$fdata['table_note'].'
    '; } $text .= "
    ".$note." ".vartrue($fdata['table_post'])." "; } $triggers = vartrue($fdata['triggers'], array()); if($triggers) { $text .= "
    ".vartrue($fdata['pre_triggers'], '')." "; foreach ($triggers as $trigger => $tdata) { if(is_string($tdata)) { $text .= $tdata; continue; } $text .= $this->admin_button('etrigger_'.$trigger, $tdata[0], $tdata[1]); if(isset($tdata[2])) { $text .= $this->hidden($trigger.'_value', $tdata[2]); } } $text .= "
    "; } $text .= "
    ".vartrue($fdata['fieldset_post'])." "; return $text; } /** * Render Value Trigger - override to modify field/value/parameters * @param string $field field name * @param mixed $value field value * @param array $params 'writeParams' key (see $controller->fields array) * @param int $id record ID */ public function renderValueTrigger(&$field, &$value, &$params, $id) { } /** * Render Element Trigger - override to modify field/value/parameters/validation data * @param string $field field name * @param mixed $value field value * @param array $params 'writeParams' key (see $controller->fields array) * @param array $required_data validation data * @param int $id record ID */ public function renderElementTrigger(&$field, &$value, &$params, &$required_data, $id) { } } // DEPRECATED - use above methods instead ($frm) class form { function form_open($form_method, $form_action, $form_name = "", $form_target = "", $form_enctype = "", $form_js = "") { $method = ($form_method ? "method='".$form_method."'" : ""); $target = ($form_target ? " target='".$form_target."'" : ""); $name = ($form_name ? " id='".$form_name."' " : " id='myform'"); return "\n
    ".e107::getForm()->token()."
    "; } function form_text($form_name, $form_size, $form_value, $form_maxlength = FALSE, $form_class = "tbox", $form_readonly = "", $form_tooltip = "", $form_js = "") { $name = ($form_name ? " id='".$form_name."' name='".$form_name."'" : ""); $value = (isset($form_value) ? " value='".$form_value."'" : ""); $size = ($form_size ? " size='".$form_size."'" : ""); $maxlength = ($form_maxlength ? " maxlength='".$form_maxlength."'" : ""); $readonly = ($form_readonly ? " readonly='readonly'" : ""); $tooltip = ($form_tooltip ? " title='".$form_tooltip."'" : ""); return "\n"; } function form_password($form_name, $form_size, $form_value, $form_maxlength = FALSE, $form_class = "tbox", $form_readonly = "", $form_tooltip = "", $form_js = "") { $name = ($form_name ? " id='".$form_name."' name='".$form_name."'" : ""); $value = (isset($form_value) ? " value='".$form_value."'" : ""); $size = ($form_size ? " size='".$form_size."'" : ""); $maxlength = ($form_maxlength ? " maxlength='".$form_maxlength."'" : ""); $readonly = ($form_readonly ? " readonly='readonly'" : ""); $tooltip = ($form_tooltip ? " title='".$form_tooltip."'" : ""); return "\n"; } function form_button($form_type, $form_name, $form_value, $form_js = "", $form_image = "", $form_tooltip = "") { $name = ($form_name ? " id='".$form_name."' name='".$form_name."'" : ""); $image = ($form_image ? " src='".$form_image."' " : ""); $tooltip = ($form_tooltip ? " title='".$form_tooltip."' " : ""); return "\n"; } function form_textarea($form_name, $form_columns, $form_rows, $form_value, $form_js = "", $form_style = "", $form_wrap = "", $form_readonly = "", $form_tooltip = "") { $name = ($form_name ? " id='".$form_name."' name='".$form_name."'" : ""); $readonly = ($form_readonly ? " readonly='readonly'" : ""); $tooltip = ($form_tooltip ? " title='".$form_tooltip."'" : ""); $wrap = ($form_wrap ? " wrap='".$form_wrap."'" : ""); $style = ($form_style ? " style='".$form_style."'" : ""); return "\n"; } function form_checkbox($form_name, $form_value, $form_checked = 0, $form_tooltip = "", $form_js = "") { $name = ($form_name ? " id='".$form_name.$form_value."' name='".$form_name."'" : ""); $checked = ($form_checked ? " checked='checked'" : ""); $tooltip = ($form_tooltip ? " title='".$form_tooltip."'" : ""); return "\n"; } function form_radio($form_name, $form_value, $form_checked = 0, $form_tooltip = "", $form_js = "") { $name = ($form_name ? " id='".$form_name.$form_value."' name='".$form_name."'" : ""); $checked = ($form_checked ? " checked='checked'" : ""); $tooltip = ($form_tooltip ? " title='".$form_tooltip."'" : ""); return "\n"; } function form_file($form_name, $form_size, $form_tooltip = "", $form_js = "") { $name = ($form_name ? " id='".$form_name."' name='".$form_name."'" : ""); $tooltip = ($form_tooltip ? " title='".$form_tooltip."'" : ""); return ""; } function form_select_open($form_name, $form_js = "") { return "\n"; } function form_option($form_option, $form_selected = "", $form_value = "", $form_js = "") { $value = ($form_value !== FALSE ? " value='".$form_value."'" : ""); $selected = ($form_selected ? " selected='selected'" : ""); return "\n".$form_option.""; } function form_hidden($form_name, $form_value) { return "\n"; } function form_close() { return "\n"; } } /* Usage echo $rs->form_open("post", e_SELF, "_blank"); echo $rs->form_text("testname", 100, "this is the value", 100, 0, "tooltip"); echo $rs->form_button("submit", "testsubmit", "SUBMIT!", "", "Click to submit"); echo $rs->form_button("reset", "testreset", "RESET!", "", "Click to reset"); echo $rs->form_textarea("textareaname", 10, 10, "Value", "overflow:hidden"); echo $rs->form_checkbox("testcheckbox", 1, 1); echo $rs->form_checkbox("testcheckbox2", 2); echo $rs->form_hidden("hiddenname", "hiddenvalue"); echo $rs->form_radio("testcheckbox", 1, 1); echo $rs->form_radio("testcheckbox", 1); echo $rs->form_file("testfile", "20"); echo $rs->form_select_open("testselect"); echo $rs->form_option("Option 1"); echo $rs->form_option("Option 2"); echo $rs->form_option("Option 3", 1, "defaultvalue"); echo $rs->form_option("Option 4"); echo $rs->form_select_close(); echo $rs->form_close(); */ ?>