Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download
<?php namespace ProcessWire;/*** Class InputfieldCheckboxes** @property bool $table Whether or not to display as a table* @property string $thead Pipe "|" separated list of table headings. Do the same for the addOption() labels.* @property int|bool $optionColumns Specify 1 for inline list of options, or qty of columns to list options in.**/class InputfieldCheckboxes extends InputfieldSelectMultiple implements InputfieldHasArrayValue {public static function getModuleInfo() {return array('title' => __('Checkboxes', __FILE__), // Module Title'summary' => __('Multiple checkbox toggles', __FILE__), // Module Summary'version' => 107,'permanent' => true,);}public function init() {$this->set('table', false);$this->set('thead', '');$this->set('optionColumns', 0);parent::init();$this->set('size', null); // cancel 'size' attribute used by select multiple}public function ___render() {$this->checkDefaultValue();$out = '';$table = null;$columns = (int) $this->optionColumns;$inline = $columns === 1 || $columns > 10;$liAttr = '';$ulClass = '';$inputClass = $this->wire('sanitizer')->entities($this->attr('class'));$entityEncode = $this->getSetting('entityEncodeText') === false ? false : true;if($this->table) {/** @var MarkupAdminDataTable $table */$table = $this->modules->get("MarkupAdminDataTable");$table->setEncodeEntities(false);$table->setSortable(false);$table->addClass('pw-no-select');if($this->thead) $table->headerRow(explode('|', htmlspecialchars($this->thead, ENT_QUOTES, 'UTF-8')));} else if($columns) {if($inline) {$ulClass = 'InputfieldCheckboxesFloated';} else {$liWidth = round(100 / $columns)-1; // 1% padding-right added from stylesheet$liAttr = " style='width: {$liWidth}%;'";$ulClass = 'InputfieldCheckboxesColumns';}$classes = InputfieldWrapper::getClasses();$ulClass .= " " . $classes['list_clearfix'];} else {$ulClass = 'InputfieldCheckboxesStacked';}if(!$table) $out = "<ul class='$ulClass'>";foreach($this->getOptions() as $key => $value) {$checked = '';if($this->isOptionSelected($key)) $checked = " checked='checked'";$id = $this->wire()->sanitizer->name($key);if(!strlen(trim($id, '_'))) $id = trim(base64_encode($key), '=/.');$id = $this->id . '_' . $id;$attrs = $this->getOptionAttributes($key);$disabled = empty($attrs['disabled']) ? '' : " disabled='disabled'";unset($attrs['checked'], $attrs['selected'], $attrs['disabled']);$attrs = $this->getOptionAttributesString($attrs);if($attrs) $attrs = ' ' . $attrs;if($entityEncode) $value = $this->entityEncode($value, true);$input ="<label$attrs>" ."<input$checked$disabled " ."type='checkbox' " ."name='{$this->name}[]' " ."id='$id' " ."class='$inputClass' " ."value='" . htmlspecialchars($key, ENT_QUOTES, 'UTF-8') . "' />";if($table) {$value = explode("|", nl2br($value));$value[0] = "$input<span class='pw-no-select'>$value[0]</span></label>";$table->row($value);} else {//$value = str_replace(' ', ' <wbr>', $value);$out .= "<li$liAttr>$input<span class='pw-no-select'>$value</span></label></li>";}}if($table) $out .= $table->render();else $out .= "</ul>";return $out;}public function set($key, $value) {if($key == 'optionColumns') {$value = (int) $value;if($value < 0) $value = 0;if($value > 10) $value = 10;}return parent::set($key, $value);}public function ___getConfigInputfields() {$inputfields = parent::___getConfigInputfields();/** @var InputfieldInteger $f */$f = $this->wire('modules')->get('InputfieldInteger');$f->label = $this->_('Columns of Checkboxes');$f->description = $this->_('If you want the checkboxes to display in columns (rather than stacked), enter the number of columns you want to use (up to 10). To display checkboxes side-by-side (inline) enter 1.');$f->attr('name', 'optionColumns');$f->attr('value', (int) $this->optionColumns);$inputfields->add($f);return $inputfields;}}