123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197 |
- <?php
- /**
- * Copyright (c) 2005-2009, Laurent Laville <pear@laurent-laville.org>
- *
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * * Neither the name of the authors nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * PHP versions 4 and 5
- *
- * @category HTML
- * @package HTML_QuickForm_advmultiselect
- * @author Laurent Laville <pear@laurent-laville.org>
- * @copyright 2005-2009 Laurent Laville
- * @license http://www.opensource.org/licenses/bsd-license.php BSD
- * @version CVS: $Id: advmultiselect.php,v 1.36 2009/04/05 07:03:39 farell Exp $
- * @link http://pear.php.net/package/HTML_QuickForm_advmultiselect
- * @since File available since Release 0.4.0
- */
- /**
- * Basic error codes
- *
- * @var integer
- * @since 1.5.0
- */
- define('HTML_QUICKFORM_ADVMULTISELECT_ERROR_INVALID_INPUT', 1);
- /**
- * Element for HTML_QuickForm that emulate a multi-select.
- *
- * The HTML_QuickForm_advmultiselect package adds an element to the
- * HTML_QuickForm package that is two select boxes next to each other
- * emulating a multi-select.
- *
- * @category HTML
- * @package HTML_QuickForm_advmultiselect
- * @author Laurent Laville <pear@laurent-laville.org>
- * @copyright 2005-2009 Laurent Laville
- * @license http://www.opensource.org/licenses/bsd-license.php BSD
- * @version Release: @package_version@
- * @link http://pear.php.net/package/HTML_QuickForm_advmultiselect
- * @since Class available since Release 0.4.0
- */
- class HTML_QuickForm_advmultiselect extends HTML_QuickForm_select
- {
- /**
- * Prefix function name in javascript move selections
- *
- * @var string
- * @access private
- * @since 0.4.0
- */
- var $_jsPrefix;
- /**
- * Postfix function name in javascript move selections
- *
- * @var string
- * @access private
- * @since 0.4.0
- */
- var $_jsPostfix;
- /**
- * Associative array of the multi select container attributes
- *
- * @var array
- * @access private
- * @since 0.4.0
- */
- var $_tableAttributes;
- /**
- * Associative array of the add button attributes
- *
- * @var array
- * @access private
- * @since 0.4.0
- */
- var $_addButtonAttributes;
- /**
- * Associative array of the remove button attributes
- *
- * @var array
- * @access private
- * @since 0.4.0
- */
- var $_removeButtonAttributes;
- /**
- * Associative array of the select all button attributes
- *
- * @var array
- * @access private
- * @since 1.1.0
- */
- var $_allButtonAttributes;
- /**
- * Associative array of the select none button attributes
- *
- * @var array
- * @access private
- * @since 1.1.0
- */
- var $_noneButtonAttributes;
- /**
- * Associative array of the toggle selection button attributes
- *
- * @var array
- * @access private
- * @since 1.1.0
- */
- var $_toggleButtonAttributes;
- /**
- * Associative array of the move up button attributes
- *
- * @var array
- * @access private
- * @since 0.5.0
- */
- var $_upButtonAttributes;
- /**
- * Associative array of the move up button attributes
- *
- * @var array
- * @access private
- * @since 0.5.0
- */
- var $_downButtonAttributes;
- /**
- * Associative array of the move top button attributes
- *
- * @var array
- * @access private
- * @since 1.5.0
- */
- var $_topButtonAttributes;
- /**
- * Associative array of the move bottom button attributes
- *
- * @var array
- * @access private
- * @since 1.5.0
- */
- var $_bottomButtonAttributes;
- /**
- * Defines if both list (unselected, selected) will have their elements be
- * arranged from lowest to highest (or reverse)
- * depending on comparaison function.
- *
- * SORT_ASC is used to sort in ascending order
- * SORT_DESC is used to sort in descending order
- *
- * @var string ('none' == false, 'asc' == SORT_ASC, 'desc' == SORT_DESC)
- * @access private
- * @since 0.5.0
- */
- var $_sort;
- /**
- * Associative array of the unselected item box attributes
- *
- * @var array
- * @access private
- * @since 0.4.0
- */
- var $_attributesUnselected;
- /**
- * Associative array of the selected item box attributes
- *
- * @var array
- * @access private
- * @since 0.4.0
- */
- var $_attributesSelected;
- /**
- * Associative array of the internal hidden box attributes
- *
- * @var array
- * @access private
- * @since 0.4.0
- */
- var $_attributesHidden;
- public $selectAllCheckBox = false;
- /**
- * Default Element template string
- *
- * @var string
- * @access private
- * @since 0.4.0
- */
- var $_elementTemplate;
- /**
- * Default Element stylesheet string
- *
- * @var string
- * @access private
- * @since 0.4.0
- */
- var $_elementCSS = '';
- /**
- * Class constructor
- *
- * Class constructors :
- * Zend Engine 1 uses HTML_QuickForm_advmultiselect, while
- * Zend Engine 2 uses __construct
- *
- * @param string $elementName Dual Select name attribute
- * @param mixed $elementLabel Label(s) for the select boxes
- * @param mixed $options Data to be used to populate options
- * @param mixed $attributes Either a typical HTML attribute string or
- * an associative array
- * @param integer $sort Either SORT_ASC for auto ascending arrange,
- * SORT_DESC for auto descending arrange, or
- * NULL for no sort (append at end: default)
- *
- * @access public
- * @return void
- * @since version 0.4.0 (2005-06-25)
- */
- public function __construct(
- $elementName = null,
- $elementLabel = null,
- $options = null,
- $attributes = null,
- $sort = null
- ) {
- $opts = $options;
- $options = null; // prevent to use the default select element load options
- parent::__construct($elementName, $elementLabel, $options, $attributes);
- $this->selectAllCheckBox = isset($attributes['select_all_checkbox']) ? $attributes['select_all_checkbox'] : false;
- // allow to load options at once and take care of fancy attributes
- $this->load($opts);
- // add multiple selection attribute by default if missing
- $this->updateAttributes(array('multiple' => 'multiple'));
- if (is_null($this->getAttribute('size'))) {
- // default size is ten item on each select box (left and right)
- $this->updateAttributes(array('size' => 10));
- }
- if (is_null($this->getAttribute('class'))) {
- // default width of each select box
- $this->updateAttributes(array('class' => 'form-control'));
- }
- /* $this->_tableAttributes = $this->getAttribute('class');
- $attr = null;
- if (is_null($this->_tableAttributes)) {
- $this->updateAttributes(array('class' => 'col-md-4'));
- } else {
- $attr = array('class' => $this->_tableAttributes);
- $this->_removeAttr('class', $this->_attributes);
- }*/
- //$this->_tableAttributes = $this->_getAttrString($attr);
- $this->removeAttribute('class');
- $this->setAttribute('class','form-control');
- // set default add button attributes
- $this->setButtonAttributes('add');
- // set default remove button attributes
- $this->setButtonAttributes('remove');
- // set default selectall button attributes
- $this->setButtonAttributes('all');
- // set default selectnone button attributes
- $this->setButtonAttributes('none');
- // set default toggle selection button attributes
- $this->setButtonAttributes('toggle');
- // set default move up button attributes
- $this->setButtonAttributes('moveup');
- // set default move up button attributes
- $this->setButtonAttributes('movedown');
- // set default move top button attributes
- $this->setButtonAttributes('movetop');
- // set default move bottom button attributes
- $this->setButtonAttributes('movebottom');
- // defines javascript functions names
- $this->_jsPrefix = 'QFAMS.';
- $this->_jsPostfix = 'moveSelection';
- // set select boxes sort order (none by default)
- if (!isset($sort)) {
- $sort = false;
- }
- if ($sort === SORT_ASC) {
- $this->_sort = 'asc';
- } elseif ($sort === SORT_DESC) {
- $this->_sort = 'desc';
- } else {
- $this->_sort = 'none';
- }
- // set the default advmultiselect element template (with javascript embedded)
- $this->setElementTemplate();
- }
- /**
- * Sets the button attributes
- *
- * In <b>custom example 1</b>, the <i>add</i> and <i>remove</i> buttons
- * have look set by the css class <i>inputCommand</i>.
- *
- * In <b>custom example 2</b>, the basic text <i>add</i> and <i>remove</i>
- * buttons are now replaced by images.
- *
- * In <b>custom example 5</b>, we have ability to sort the selection list
- * (on right side) by :
- * <pre>
- * - <b>user-end</b>: with <i>Up</i> and <i>Down</i> buttons
- * - <b>programming</b>: with the QF element constructor $sort option
- * </pre>
- *
- * @param string $button Button identifier, either 'add', 'remove',
- * 'all', 'none', 'toggle',
- * 'movetop', 'movebottom'
- * 'moveup' or 'movedown'
- * @param mixed $attributes (optional) Either a typical HTML attribute string
- * or an associative array
- *
- * @return void
- * @throws PEAR_Error $button argument
- * is not a string, or not in range
- * (add, remove, all, none, toggle,
- * movetop, movebottom, moveup, movedown)
- * @access public
- * @since version 0.4.0 (2005-06-25)
- *
- * @example examples/qfams_custom_5.php
- * Custom example 5: source code
- * @link http://www.laurent-laville.org/img/qfams/screenshot/custom5.png
- * Custom example 5: screenshot
- *
- * @example examples/qfams_custom_2.php
- * Custom example 2: source code
- * @link http://www.laurent-laville.org/img/qfams/screenshot/custom2.png
- * Custom example 2: screenshot
- *
- * @example examples/qfams_custom_1.php
- * Custom example 1: source code
- * @link http://www.laurent-laville.org/img/qfams/screenshot/custom1.png
- * Custom example 1: screenshot
- */
- function setButtonAttributes($button, $attributes = null)
- {
- if (!is_string($button)) {
- return PEAR::throwError('Argument 1 of HTML_QuickForm_advmultiselect::' .
- 'setButtonAttributes is not a string',
- HTML_QUICKFORM_ADVMULTISELECT_ERROR_INVALID_INPUT,
- array('level' => 'exception'));
- }
- switch ($button) {
- case 'add':
- if (is_null($attributes)) {
- $this->_addButtonAttributes = array(
- 'name' => 'add',
- 'value' => ' ',
- 'type' => 'button',
- 'class'=> 'btn btn-primary'
- );
- } else {
- $this->_updateAttrArray(
- $this->_addButtonAttributes,
- $this->_parseAttributes($attributes)
- );
- }
- break;
- case 'remove':
- if (is_null($attributes)) {
- $this->_removeButtonAttributes = array(
- 'name' => 'remove',
- 'value' => ' ',
- 'type' => 'button',
- 'class'=> 'btn btn-primary'
- );
- } else {
- $this->_updateAttrArray($this->_removeButtonAttributes,
- $this->_parseAttributes($attributes));
- }
- break;
- case 'all':
- if (is_null($attributes)) {
- $this->_allButtonAttributes = array(
- 'name' => 'all',
- 'value' => ' Select All ',
- 'type' => 'button'
- );
- } else {
- $this->_updateAttrArray($this->_allButtonAttributes,
- $this->_parseAttributes($attributes));
- }
- break;
- case 'none':
- if (is_null($attributes)) {
- $this->_noneButtonAttributes
- = array('name' => 'none',
- 'value' => ' Select None ',
- 'type' => 'button');
- } else {
- $this->_updateAttrArray($this->_noneButtonAttributes,
- $this->_parseAttributes($attributes));
- }
- break;
- case 'toggle':
- if (is_null($attributes)) {
- $this->_toggleButtonAttributes
- = array('name' => 'toggle',
- 'value' => ' Toggle Selection ',
- 'type' => 'button');
- } else {
- $this->_updateAttrArray($this->_toggleButtonAttributes,
- $this->_parseAttributes($attributes));
- }
- break;
- case 'moveup':
- if (is_null($attributes)) {
- $this->_upButtonAttributes
- = array('name' => 'up',
- 'value' => ' Up ',
- 'type' => 'button');
- } else {
- $this->_updateAttrArray($this->_upButtonAttributes,
- $this->_parseAttributes($attributes));
- }
- break;
- case 'movedown':
- if (is_null($attributes)) {
- $this->_downButtonAttributes
- = array('name' => 'down',
- 'value' => ' Down ',
- 'type' => 'button');
- } else {
- $this->_updateAttrArray($this->_downButtonAttributes,
- $this->_parseAttributes($attributes));
- }
- break;
- case 'movetop':
- if (is_null($attributes)) {
- $this->_topButtonAttributes
- = array('name' => 'top',
- 'value' => ' Top ',
- 'type' => 'button');
- } else {
- $this->_updateAttrArray($this->_topButtonAttributes,
- $this->_parseAttributes($attributes));
- }
- break;
- case 'movebottom':
- if (is_null($attributes)) {
- $this->_bottomButtonAttributes
- = array('name' => 'bottom',
- 'value' => ' Bottom ',
- 'type' => 'button');
- } else {
- $this->_updateAttrArray($this->_bottomButtonAttributes,
- $this->_parseAttributes($attributes));
- }
- break;
- default;
- return PEAR::throwError('Argument 1 of HTML_QuickForm_advmultiselect::' .
- 'setButtonAttributes has unexpected value',
- HTML_QUICKFORM_ADVMULTISELECT_ERROR_INVALID_INPUT,
- array('level' => 'error'));
- }
- }
- /**
- * Sets element template
- *
- * @param string $html (optional) The HTML surrounding select boxes and buttons
- * @param string $js (optional) if we need to include qfams javascript handler
- *
- * @access public
- * @return string
- * @since version 0.4.0 (2005-06-25)
- */
- function setElementTemplate($html = null, $js = true)
- {
- $oldTemplate = $this->_elementTemplate;
- if (isset($html) && is_string($html)) {
- $this->_elementTemplate = $html;
- } else {
- $this->_elementTemplate = '
- {javascript}
- <div class="row">
- <div class="col-sm-5"><!-- BEGIN label_2 -->{label_2}<!-- END label_2 --> {unselected}</div>
- <div class="col-sm-2"><div class="text-center">{add}{remove}</div></div>
- <div class="col-sm-5"><!-- BEGIN label_3 -->{label_3}<!-- END label_3 -->{selected}</div>
- </div>
- ';
- }
- if ($js == false) {
- $this->_elementTemplate = str_replace('{javascript}', '',
- $this->_elementTemplate);
- }
- return $oldTemplate;
- }
- /**
- * Gets default element stylesheet for a single multi-select shape render
- *
- * In <b>custom example 4</b>, the template defined allows
- * a single multi-select checkboxes shape. Useful when javascript is disabled
- * (or when browser is not js compliant). In our example, no need to add
- * javascript code, but css is mandatory.
- *
- * @param boolean $raw (optional) html output with style tags or just raw data
- *
- * @access public
- * @return string
- * @since version 0.4.0 (2005-06-25)
- *
- * @example qfams_custom_4.php
- * Custom example 4: source code
- * @link http://www.laurent-laville.org/img/qfams/screenshot/custom4.png
- * Custom example 4: screenshot
- */
- function getElementCss($raw = true)
- {
- $id = $this->getAttribute('name');
- $css = str_replace('{id}', $id, $this->_elementCSS);
- if ($raw !== true) {
- $css = '<style type="text/css">' . PHP_EOL
- . $css . PHP_EOL
- . '</style>';
- }
- return $css;
- }
- /**
- * Returns the HTML generated for the advanced mutliple select component
- *
- * @access public
- * @return string
- * @since version 0.4.0 (2005-06-25)
- */
- public function toHtml()
- {
- if ($this->_flagFrozen) {
- return $this->getFrozenHtml();
- }
- $tabs = $this->_getTabs();
- $tab = $this->_getTab();
- $selectId = $this->getName();
- $selectName = $this->getName() . '[]';
- $selectNameFrom = $this->getName() . '-f[]';
- $selectNameTo = $this->getName() . '-t[]';
- $selected_count = 0;
- // placeholder {unselected} existence determines if we will render
- if (strpos($this->_elementTemplate, '{unselected}') === false) {
- // ... a single multi-select with checkboxes
- $this->_jsPostfix = 'editSelection';
- $id = $this->getAttribute('name');
- $strHtmlSelected = $tab . '<div id="qfams_'.$id.'">' . PHP_EOL;
- $unselected_count = count($this->_options);
- $checkbox_id_suffix = 0;
- foreach ($this->_options as $option) {
- $_labelAttributes
- = array('style', 'class', 'onmouseover', 'onmouseout');
- $labelAttributes = array();
- foreach ($_labelAttributes as $attr) {
- if (isset($option['attr'][$attr])) {
- $labelAttributes[$attr] = $option['attr'][$attr];
- unset($option['attr'][$attr]);
- }
- }
- if (is_array($this->_values)
- && in_array((string)$option['attr']['value'], $this->_values)) {
- // The items is *selected*
- $checked = ' checked="checked"';
- $selected_count++;
- } else {
- // The item is *unselected* so we want to put it
- $checked = '';
- }
- $checkbox_id_suffix++;
- $strHtmlSelected .= $tab
- . '<label'
- . $this->_getAttrString($labelAttributes) .'>'
- . '<input type="checkbox"'
- . ' id="'.$selectId . $checkbox_id_suffix.'"'
- . ' name="'.$selectName.'"'
- . $checked
- . $this->_getAttrString($option['attr'])
- . ' />' . $option['text'] . '</label>'
- . PHP_EOL;
- }
- $strHtmlSelected .= $tab . '</div>'. PHP_EOL;
- $strHtmlHidden = '';
- $strHtmlUnselected = '';
- $strHtmlAdd = '';
- $strHtmlRemove = '';
- // build the select all button with all its attributes
- $jsName = $this->_jsPrefix . $this->_jsPostfix;
- $attributes = array('onclick' => $jsName ."('". $selectId ."', 1);");
- $this->_allButtonAttributes = array_merge($this->_allButtonAttributes, $attributes);
- $attrStrAll = $this->_getAttrString($this->_allButtonAttributes);
- $strHtmlAll = "<input$attrStrAll />". PHP_EOL;
- // build the select none button with all its attributes
- $attributes = array('onclick' => $jsName ."('". $selectId ."', 0);");
- $this->_noneButtonAttributes
- = array_merge($this->_noneButtonAttributes, $attributes);
- $attrStrNone = $this->_getAttrString($this->_noneButtonAttributes);
- $strHtmlNone = "<input$attrStrNone />". PHP_EOL;
- // build the toggle selection button with all its attributes
- $attributes = array('onclick' => $jsName .
- "('". $selectId ."', 2);");
- $this->_toggleButtonAttributes = array_merge($this->_toggleButtonAttributes, $attributes);
- $attrStrToggle = $this->_getAttrString($this->_toggleButtonAttributes);
- $strHtmlToggle = "<input$attrStrToggle />". PHP_EOL;
- $strHtmlMoveUp = '';
- $strHtmlMoveDown = '';
- $strHtmlMoveTop = '';
- $strHtmlMoveBottom = '';
- // default selection counters
- $strHtmlSelectedCount = $selected_count . '/' . $unselected_count;
- } else {
- // ... or a dual multi-select
- $this->_jsPostfix = 'moveSelection';
- $jsName = $this->_jsPrefix . $this->_jsPostfix;
- // set name of Select From Box
- $this->_attributesUnselected
- = array('id' => $selectId . '-f',
- 'name' => $selectNameFrom,
- 'ondblclick' => $jsName .
- "('{$selectId}', ".
- "this.form.elements['" . $selectNameFrom . "'], " .
- "this.form.elements['" . $selectNameTo . "'], " .
- "this.form.elements['" . $selectName . "'], " .
- "'add', '{$this->_sort}')");
- $this->_attributesUnselected
- = array_merge($this->_attributes, $this->_attributesUnselected);
- $attrUnselected = $this->_getAttrString($this->_attributesUnselected);
- // set name of Select To Box
- $this->_attributesSelected
- = array('id' => $selectId . '-t',
- 'name' => $selectNameTo,
- 'ondblclick' => $jsName .
- "('{$selectId}', " .
- "this.form.elements['" . $selectNameFrom . "'], " .
- "this.form.elements['" . $selectNameTo . "'], ".
- "this.form.elements['" . $selectName . "'], " .
- "'remove', '{$this->_sort}')");
- $this->_attributesSelected
- = array_merge($this->_attributes, $this->_attributesSelected);
- $attrSelected = $this->_getAttrString($this->_attributesSelected);
- // set name of Select hidden Box
- $this->_attributesHidden
- = array('name' => $selectName,
- 'style' => 'overflow: hidden; visibility: hidden; ' .
- 'width: 1px; height: 0;');
- $this->_attributesHidden
- = array_merge($this->_attributes, $this->_attributesHidden);
- $attrHidden = $this->_getAttrString($this->_attributesHidden);
- // prepare option tables to be displayed as in POST order
- $append = count($this->_values);
- if ($append > 0) {
- $arrHtmlSelected = array_fill(0, $append, ' ');
- } else {
- $arrHtmlSelected = array();
- }
- $options = count($this->_options);
- $arrHtmlUnselected = array();
- if ($options > 0) {
- $arrHtmlHidden = array_fill(0, $options, ' ');
- foreach ($this->_options as $option) {
- if (is_array($this->_values)
- && in_array((string)$option['attr']['value'],
- $this->_values)) {
- // Get the post order
- $key = array_search($option['attr']['value'],
- $this->_values);
- /** The items is *selected* so we want to put it
- in the 'selected' multi-select */
- $arrHtmlSelected[$key] = $option;
- /** Add it to the 'hidden' multi-select
- and set it as 'selected' */
- if (isset($option['attr']['disabled'])) {
- unset($option['attr']['disabled']);
- }
- $option['attr']['selected'] = 'selected';
- $arrHtmlHidden[$key] = $option;
- } else {
- /** The item is *unselected* so we want to put it
- in the 'unselected' multi-select */
- $arrHtmlUnselected[] = $option;
- // Add it to the hidden multi-select as 'unselected'
- $arrHtmlHidden[$append] = $option;
- $append++;
- }
- }
- } else {
- $arrHtmlHidden = array();
- }
- // The 'unselected' multi-select which appears on the left
- $unselected_count = count($arrHtmlUnselected);
- if ($unselected_count == 0) {
- $this->_attributesUnselected['disabled'] = 'disabled';
- $this->_attributesUnselected
- = array_merge($this->_attributes, $this->_attributesUnselected);
- $attrUnselected = $this->_getAttrString($this->_attributesUnselected);
- }
- $strHtmlUnselected = "<select$attrUnselected>". PHP_EOL;
- if ($unselected_count > 0) {
- foreach ($arrHtmlUnselected as $data) {
- $strHtmlUnselected
- .= $tabs . $tab
- . '<option' . $this->_getAttrString($data['attr']) . '>'
- . $data['text'] . '</option>' . PHP_EOL;
- }
- } else {
- $strHtmlUnselected .= '<option value=""> </option>';
- }
- $strHtmlUnselected .= '</select>';
- $strHtmlUnselected = '<input placeholder="'.get_lang('Search').'" id="'.$selectId.'-f-filter" type="text" class="form-control search-query select_class_filter"><br />'.$strHtmlUnselected;
- // The 'selected' multi-select which appears on the right
- $selected_count = count($arrHtmlSelected);
- if ($selected_count == 0) {
- $this->_attributesSelected['disabled'] = 'disabled';
- $this->_attributesSelected
- = array_merge($this->_attributes, $this->_attributesSelected);
- $attrSelected = $this->_getAttrString($this->_attributesSelected);
- }
- $strHtmlSelected = "<select$attrSelected>";
- if ($selected_count > 0) {
- foreach ($arrHtmlSelected as $data) {
- $attribute = null;
- if (isset($data['attr'])) {
- $attribute = $this->_getAttrString($data['attr']);
- }
- $text = null;
- if (isset($data['text'])) {
- $text = $data['text'];
- }
- $strHtmlSelected
- .= $tabs . $tab
- . '<option' . $attribute. '>'
- . $text . '</option>';
- }
- } else {
- $strHtmlSelected .= '<option value=""> </option>';
- }
- $strHtmlSelected .= '</select>';
- $strHtmlSelected = '<input placeholder="'.get_lang('Search').'" id="'.$selectId.'-t-filter" type="text" class="form-control search-query select_class_filter"><br />'.$strHtmlSelected;
- // The 'hidden' multi-select
- $strHtmlHidden = "<select$attrHidden>". PHP_EOL;
- if (count($arrHtmlHidden) > 0) {
- foreach ($arrHtmlHidden as $data) {
- $attribute = null;
- if (isset($data['attr'])) {
- $attribute = $this->_getAttrString($data['attr']);
- }
- $text = null;
- if (isset($data['text'])) {
- $text = $data['text'];
- }
- $strHtmlHidden
- .= $tabs . $tab
- . '<option' . $attribute . '>'
- . $text . '</option>' . PHP_EOL;
- }
- }
- $strHtmlHidden .= '</select>';
- // build the remove button with all its attributes
- $attributes
- = array('onclick' => $jsName .
- "('{$selectId}', " .
- "this.form.elements['" . $selectNameFrom . "'], " .
- "this.form.elements['" . $selectNameTo . "'], " .
- "this.form.elements['" . $selectName . "'], " .
- "'remove', '{$this->_sort}'); return false;");
- $this->_removeButtonAttributes
- = array_merge($this->_removeButtonAttributes, $attributes);
- $attrStrRemove = $this->_getAttrString($this->_removeButtonAttributes);
- $strHtmlRemove = "<button $attrStrRemove /> <em class='fa fa-arrow-left'></em></button>";
- // build the add button with all its attributes
- $attributes
- = array('onclick' => $jsName .
- "('{$selectId}', " .
- "this.form.elements['" . $selectNameFrom . "'], " .
- "this.form.elements['" . $selectNameTo . "'], " .
- "this.form.elements['" . $selectName . "'], " .
- "'add', '{$this->_sort}'); return false;");
- $this->_addButtonAttributes = array_merge($this->_addButtonAttributes, $attributes);
- $attrStrAdd = $this->_getAttrString($this->_addButtonAttributes);
- $strHtmlAdd = "<button $attrStrAdd /> <em class='fa fa-arrow-right'></em></button><br /><br />";
- // build the select all button with all its attributes
- $attributes
- = array('onclick' => $jsName .
- "('{$selectId}', " .
- "this.form.elements['" . $selectNameFrom . "'], " .
- "this.form.elements['" . $selectNameTo . "'], " .
- "this.form.elements['" . $selectName . "'], " .
- "'all', '{$this->_sort}'); return false;");
- $this->_allButtonAttributes = array_merge($this->_allButtonAttributes, $attributes);
- $attrStrAll = $this->_getAttrString($this->_allButtonAttributes);
- $strHtmlAll = "<input$attrStrAll />". PHP_EOL;
- // build the select none button with all its attributes
- $attributes
- = array('onclick' => $jsName .
- "('{$selectId}', " .
- "this.form.elements['" . $selectNameFrom . "'], " .
- "this.form.elements['" . $selectNameTo . "'], " .
- "this.form.elements['" . $selectName . "'], " .
- "'none', '{$this->_sort}'); return false;");
- $this->_noneButtonAttributes
- = array_merge($this->_noneButtonAttributes, $attributes);
- $attrStrNone = $this->_getAttrString($this->_noneButtonAttributes);
- $strHtmlNone = "<input$attrStrNone />". PHP_EOL;
- // build the toggle button with all its attributes
- $attributes
- = array('onclick' => $jsName .
- "('{$selectId}', " .
- "this.form.elements['" . $selectNameFrom . "'], " .
- "this.form.elements['" . $selectNameTo . "'], " .
- "this.form.elements['" . $selectName . "'], " .
- "'toggle', '{$this->_sort}'); return false;");
- $this->_toggleButtonAttributes
- = array_merge($this->_toggleButtonAttributes, $attributes);
- $attrStrToggle = $this->_getAttrString($this->_toggleButtonAttributes);
- $strHtmlToggle = "<input$attrStrToggle />". PHP_EOL;
- // build the move up button with all its attributes
- $attributes
- = array('onclick' => "{$this->_jsPrefix}moveUp" .
- "(this.form.elements['" . $selectNameTo . "'], " .
- "this.form.elements['" . $selectName . "']); " .
- "return false;");
- $this->_upButtonAttributes
- = array_merge($this->_upButtonAttributes, $attributes);
- $attrStrUp = $this->_getAttrString($this->_upButtonAttributes);
- $strHtmlMoveUp = "<input$attrStrUp />". PHP_EOL;
- // build the move down button with all its attributes
- $attributes
- = array('onclick' => "{$this->_jsPrefix}moveDown" .
- "(this.form.elements['" . $selectNameTo . "'], " .
- "this.form.elements['" . $selectName . "']); " .
- "return false;");
- $this->_downButtonAttributes
- = array_merge($this->_downButtonAttributes, $attributes);
- $attrStrDown = $this->_getAttrString($this->_downButtonAttributes);
- $strHtmlMoveDown = "<input$attrStrDown />". PHP_EOL;
- // build the move top button with all its attributes
- $attributes
- = array('onclick' => "{$this->_jsPrefix}moveTop" .
- "(this.form.elements['" . $selectNameTo . "'], " .
- "this.form.elements['" . $selectName . "']); " .
- "return false;");
- $this->_topButtonAttributes
- = array_merge($this->_topButtonAttributes, $attributes);
- $attrStrTop = $this->_getAttrString($this->_topButtonAttributes);
- $strHtmlMoveTop = "<input$attrStrTop />". PHP_EOL;
- // build the move bottom button with all its attributes
- $attributes
- = array('onclick' => "{$this->_jsPrefix}moveBottom" .
- "(this.form.elements['" . $selectNameTo . "'], " .
- "this.form.elements['" . $selectName . "']); " .
- "return false;");
- $this->_bottomButtonAttributes
- = array_merge($this->_bottomButtonAttributes, $attributes);
- $attrStrBottom = $this->_getAttrString($this->_bottomButtonAttributes);
- $strHtmlMoveBottom = "<input$attrStrBottom />". PHP_EOL;
- // default selection counters
- $strHtmlSelectedCount = $selected_count;
- }
- $strHtmlUnselectedCount = $unselected_count;
- $strHtmlSelectedCountId = $selectId .'_selected';
- $strHtmlUnselectedCountId = $selectId .'_unselected';
- // render all part of the multi select component with the template
- $strHtml = $this->_elementTemplate;
- // Prepare multiple labels
- $labels = $this->getLabel();
- if (is_array($labels)) {
- array_shift($labels);
- }
- // render extra labels, if any
- if (is_array($labels)) {
- foreach ($labels as $key => $text) {
- $key = is_int($key)? $key + 2: $key;
- $strHtml = str_replace("{label_{$key}}", $text, $strHtml);
- $strHtml = str_replace("<!-- BEGIN label_{$key} -->", '', $strHtml);
- $strHtml = str_replace("<!-- END label_{$key} -->", '', $strHtml);
- }
- }
- // clean up useless label tags
- if (strpos($strHtml, '{label_')) {
- $strHtml = preg_replace('/\s*<!-- BEGIN label_(\S+) -->'.
- '.*<!-- END label_\1 -->\s*/i', '', $strHtml);
- }
- $placeHolders = array(
- '{stylesheet}',
- '{javascript}',
- '{class}',
- '{unselected_count_id}',
- '{selected_count_id}',
- '{unselected_count}',
- '{selected_count}',
- '{unselected}',
- '{selected}',
- '{add}',
- '{remove}',
- '{all}',
- '{none}',
- '{toggle}',
- '{moveup}',
- '{movedown}',
- '{movetop}',
- '{movebottom}',
- );
- $htmlElements = array(
- $this->getElementCss(false),
- $this->getElementJs(false),
- $this->_tableAttributes,
- $strHtmlUnselectedCountId,
- $strHtmlSelectedCountId,
- $strHtmlUnselectedCount,
- $strHtmlSelectedCount,
- $strHtmlUnselected,
- $strHtmlSelected.$strHtmlHidden,
- $strHtmlAdd,
- $strHtmlRemove,
- $strHtmlAll,
- $strHtmlNone,
- $strHtmlToggle,
- $strHtmlMoveUp,
- $strHtmlMoveDown,
- $strHtmlMoveTop,
- $strHtmlMoveBottom,
- );
- if ($this->selectAllCheckBox) {
- $strHtml .= '<div class="col-sm-8">
- <label >'.get_lang('SelectAll').'
- <input type="checkbox" class="advmultiselect_checkbox" id="'.$selectId.'_select_all'.'">
- </label>
- </div>';
- }
- $strHtml = str_replace($placeHolders, $htmlElements, $strHtml);
- $comment = $this->getComment();
- if (!empty($comment)) {
- $strHtml = $tabs . '<!-- ' . $comment . " //-->" . PHP_EOL . $strHtml;
- }
- return $strHtml;
- }
- /**
- * Returns the javascript code generated to handle this element
- *
- * @param boolean $raw (optional) html output with script tags or just raw data
- * @param boolean $min (optional) uses javascript compressed version
- *
- * @access public
- * @return string
- * @since version 0.4.0 (2005-06-25)
- */
- function getElementJs($raw = true, $min = true)
- {
- $js = api_get_path(LIBRARY_PATH).'javascript'.DIRECTORY_SEPARATOR.'pear'.DIRECTORY_SEPARATOR;
- $js .= 'qfamsHandler.js';
- if (file_exists($js)) {
- $js = file_get_contents($js);
- } else {
- $js = '';
- }
- if ($raw !== true) {
- $js = '<script>'.PHP_EOL.$js.PHP_EOL.'</script>'.PHP_EOL;
- }
- return $js;
- }
- /**
- * Loads options from different types of data sources
- *
- * This method overloaded parent method of select element, to allow
- * loading options with fancy attributes.
- *
- * @param mixed &$options Options source currently supports assoc array or DB_result
- * @param mixed $param1 (optional) See function detail
- * @param mixed $param2 (optional) See function detail
- * @param mixed $param3 (optional) See function detail
- * @param mixed $param4 (optional) See function detail
- *
- * @access public
- * @since version 1.5.0 (2009-02-15)
- * @return PEAR_Error|NULL on error and TRUE on success
- * @throws PEAR_Error
- * @see loadArray()
- */
- function load(&$options,
- $param1 = null, $param2 = null, $param3 = null, $param4 = null)
- {
- if (is_array($options)) {
- $ret = $this->loadArray($options, $param1);
- } else {
- $ret = parent::load($options, $param1, $param2, $param3, $param4);
- }
- return $ret;
- }
- /**
- * Loads the options from an associative array
- *
- * This method overloaded parent method of select element, to allow to load
- * array of options with fancy attributes.
- *
- * @param array $arr Associative array of options
- * @param mixed $values (optional) Array or comma delimited string of selected values
- *
- * @since version 1.5.0 (2009-02-15)
- * @access public
- * @return PEAR_Error on error and TRUE on success
- * @throws PEAR_Error
- * @see load()
- */
- function loadArray($arr, $values = null)
- {
- if (!is_array($arr)) {
- return PEAR::throwError('Argument 1 of HTML_QuickForm_advmultiselect::' .
- 'loadArray is not a valid array',
- HTML_QUICKFORM_ADVMULTISELECT_ERROR_INVALID_INPUT,
- array('level' => 'exception'));
- }
- if (isset($values)) {
- $this->setSelected($values);
- }
- if (is_array($arr)) {
- foreach ($arr as $key => $val) {
- if (is_array($val)) {
- $this->addOption($val[0], $key, $val[1]);
- } else {
- $this->addOption($val, $key);
- }
- }
- }
- return true;
- }
- /**
- * Sets which items should be persistant
- *
- * Sets which items should have the disabled attribute
- * to keep it persistant
- *
- * @param mixed $optionValues Options (key-values) that should be persistant
- * @param bool $persistant (optional) TRUE if persistant, FALSE otherwise
- *
- * @since version 1.5.0 (2009-02-15)
- * @access public
- * @return PEAR_Error on error and TRUE on success
- * @throws PEAR_Error
- */
- function setPersistantOptions($optionValues, $persistant = true)
- {
- if (!is_bool($persistant)) {
- return PEAR::throwError('Argument 2 of HTML_QuickForm_advmultiselect::' .
- 'setPersistantOptions is not a boolean',
- HTML_QUICKFORM_ADVMULTISELECT_ERROR_INVALID_INPUT,
- array('level' => 'exception'));
- }
- if (is_string($optionValues)) {
- $optionValues = array($optionValues);
- }
- if (!is_array($optionValues)) {
- return PEAR::throwError('Argument 1 of HTML_QuickForm_advmultiselect::' .
- 'setPersistantOptions is not a valid array',
- HTML_QUICKFORM_ADVMULTISELECT_ERROR_INVALID_INPUT,
- array('level' => 'exception'));
- }
- foreach ($this->_options as $k => $v) {
- if (in_array($v['attr']['value'], $optionValues)) {
- if ($persistant) {
- $this->_options[$k]['attr']['disabled'] = 'disabled';
- } else {
- unset($this->_options[$k]['attr']['disabled']);
- }
- }
- }
- return true;
- }
- /**
- * Returns list of persistant options
- *
- * Returns list of persistant options (key-values) that could not
- * be selected or unselected.
- *
- * @since version 1.5.0 (2009-02-15)
- * @access public
- * @return array
- */
- function getPersistantOptions()
- {
- $options = array();
- foreach ($this->_options as $k => $v) {
- if (isset($v['attr']['disabled'])) {
- $options[] = $this->_options[$k]['attr']['value'];
- }
- }
- return $options;
- }
- }
|