cb.params.php
上传用户:stephen_wu
上传日期:2008-07-05
资源大小:1757k
文件大小:72k
源码类别:

网络

开发平台:

Unix_Linux

  1. <?php
  2. /**
  3. * Joomla/Mambo Community Builder : Plugin Handler
  4. * @version $Id: library/cb/cb.params.php 610 2006-12-13 17:33:44Z beat $
  5. * @package Community Builder
  6. * @subpackage cb.params.php
  7. * @author various, JoomlaJoe and Beat
  8. * @copyright (C) Beat and JoomlaJoe, www.joomlapolis.com and various
  9. * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU/GPL version 2
  10. */
  11. // ensure this file is being included by a parent file
  12. if ( ! ( defined( '_VALID_CB' ) || defined( '_JEXEC' ) || defined( '_VALID_MOS' ) ) ) { die( 'Direct Access to this location is not allowed.' ); }
  13. /**
  14. * Parameters handler
  15. * @package Joomla/Mambo Community Builder
  16. */
  17. class cbParamsEditorController extends cbParamsBase {
  18. // /** @var object */
  19. // var $_params = null;
  20. // /** @var string The raw params string */
  21. // var $_raw = null;
  22. /** The main enclosing tag name
  23.  *  @var string */
  24. var $_maintagname = null;
  25. /** The attribute name of setup file
  26.  *  @var string */
  27. var $_attrname = null;
  28. /** The attribute value of setup file
  29.  *  @var string */
  30. var $_attrvalue = null;
  31. /** plugin object
  32.  *  @var moscomprofilerPlugin */
  33. var $_pluginObject = null;
  34. /** @var int */
  35. var $_tabid = null;
  36. /** The xml plugin root element
  37.  *  @var CBSimpleXMLElement */
  38. var $_xml = null;
  39. /** The xml params element
  40.  *  @var CBSimpleXMLElement */
  41. var $_xmlElem = null;
  42. /** The xml actions element
  43.  *  @var CBSimpleXMLElement */
  44. var $_actions = null;
  45. /** The xml types element
  46.  *  @var CBSimpleXMLElement */
  47. var $_types = null;
  48. /** The xml views element
  49.  *  @var CBSimpleXMLElement */
  50. var $_views = null;
  51. /** Options from url REQUEST
  52.  *  @var unknown_type */
  53. var $_options = null;
  54. /** Extending view parser
  55.  *  @var cbEditRowView */
  56. var $_extendViewParser = null;
  57. /** CB plugin parameters
  58.  *  @var unknown_type */
  59. var $_pluginParams = null;
  60. /**
  61. * Constructor
  62. * @param string The raw parms text
  63. * @param CBSimpleXMLElement    The root element
  64. * @param string The type of setup file
  65. */
  66. function cbParamsEditorController( $paramsValues, $xmlElement, $xml, &$pluginObject, $tabId=null, $maintagname='cbinstall', $attrname='type', $attrvalue='plugin'  ) {
  67.     // $this->_params = $this->parse( $text );
  68.     // $this->_raw = $text;
  69.     $this->cbParamsBase( $paramsValues );
  70.     $this->_xml =& $xmlElement;
  71.     if ( $xml ) {
  72.      $this->_actions =& $xml->getElementByPath( 'actions' );
  73.     $this->_types =& $xml->getElementByPath( 'types' );
  74.     $this->_views =& $xml->getElementByPath( 'views' );
  75.     }
  76.     $this->_pluginObject =& $pluginObject;
  77.     $this->_tabId = $tabId;
  78.     $this->_maintagname = $maintagname;
  79.     $this->_attrname = $attrname;
  80.     $this->_attrvalue = $attrvalue;
  81.     $this->_pluginParams =& $this;
  82. }
  83. function setAllParams( &$object ) {
  84. $this->_params =& $object;
  85. }
  86. function setPluginParams( &$pluginParams ) {
  87.     $this->_pluginParams =& $pluginParams;
  88. }
  89. function setOptions( $options ) {
  90. $this->_options = $options;
  91. }
  92. function setExtendedViewParser( &$extendedViewParser ) {
  93. $this->_extendViewParser =& $extendedViewParser;
  94. }
  95. /**
  96. * Converts the parameters received as POST array into the raw parms text
  97. * @param mixed POST array or string
  98. * @return string The raw parms text
  99. * @var string The type of setup file
  100. */
  101. function getRawParams ( $params ) {
  102. $ret = null;
  103. if(is_array($params)) {
  104. foreach ($params as $k=>$v) {
  105. if (is_array($v)) {
  106. $v = implode("|*|", $v);
  107. }
  108. if (get_magic_quotes_gpc()) {
  109. $v = stripslashes( $v );
  110. }
  111. $txt[] = "$k=$v";
  112. }
  113. $ret = cbEditRowView::textareaHandling( $txt );
  114. if (get_magic_quotes_gpc()) {
  115. $ret = addslashes( $ret );
  116. }
  117. } else {
  118. $ret = $params;
  119. }
  120. return $ret;
  121. }
  122. /**
  123. * Converts the parameters received as POST array into the |*| and CBparams formats
  124. * @param  array  $params  MODIFIED BY THIS CALL: POST array
  125. */
  126. function fixMultiSelects ( &$params ) {
  127. if ( is_array( $params ) ) {
  128. foreach ( $params as $k => $v ) {
  129. if ( is_array( $v ) ) {
  130. if ( isset( $v[0] ) ) {
  131. $params[$k] = implode( "|*|", $v );
  132. } else {
  133. $params[$k] = cbParamsEditorController::getRawParams( $v );
  134. }
  135. }
  136. }
  137. }
  138. }
  139. /**
  140.  * Draws the control, or the default text area if a setup file is not found
  141.  *
  142.  * @param  string   $tag_path
  143.  * @param  string   $grand_parent_path
  144.  * @param  string   $parent_tag
  145.  * @param  string   $parent_attr
  146.  * @param  string   $parent_attrvalue
  147.  * @param  string   $control_name
  148.  * @param  boolean  $paramstextarea
  149.  * @param  atring   $viewType          ( 'view', 'param', 'depends': means: <param> tag => param, <field> tag => view )
  150.  * @param  string   $htmlFormatting    ( 'table', 'td', 'none', 'fieldsListArray' )
  151.  * @return string                       HTML
  152.  */
  153. function draw( $tag_path='params', $grand_parent_path=null, $parent_tag=null, $parent_attr=null, $parent_attrvalue=null, $control_name='params', $paramstextarea=true, $viewType = 'depends', $htmlFormatting = 'table'  ) {
  154. if ( $this->_xml ) {
  155. $element =& $this->_xml;
  156. if ( $element && $element->name() == $this->_maintagname && $element->attributes( $this->_attrname ) == $this->_attrvalue) {
  157. if ( $grand_parent_path != null ) {
  158. $element =& $element->getElementByPath( $grand_parent_path );
  159. if ( ! $element ) {
  160. return null;
  161. }
  162. }
  163. if ( $parent_tag != null && $parent_attr != null && $parent_attrvalue != null ) {
  164. $element =& $element->getChildByNameAttr( $parent_tag, $parent_attr, $parent_attrvalue );
  165. if ( $element ) {
  166. if ( $tag_path ) {
  167. $element =& $element->getElementByPath( $tag_path );
  168. }
  169. if ( $element ) {
  170. $this->_xmlElem =& $element;
  171. }
  172. }
  173. } else {
  174. $element =& $element->getElementByPath( $tag_path );
  175. if ( $element ) {
  176. $this->_xmlElem =& $element;
  177. }
  178. }
  179. } elseif ( ! $tag_path ) {
  180. $this->_xmlElem =& $element;
  181. }
  182. }
  183.     if ( $this->_xmlElem ) {
  184.     
  185.      $controllerView = new cbDrawController( $this->_xmlElem, $this->_actions, $this->_options );
  186.      $controllerView->setControl_name( $control_name );
  187.     
  188.      $editRowView =& new cbEditRowView( $this->_pluginParams, $this->_types, $this->_actions, $this->_views, $this->_pluginObject, $this->_tabid );
  189.      $editRowView->setModelOfDataRows( $this->_params );
  190.      if ( $this->_extendViewParser ) {
  191.      $editRowView->setExtendedViewParser( $this->_extendViewParser );
  192.      }
  193.      return $editRowView->renderEditRowView( $this->_xmlElem, $this->_params, $controllerView, $this->_options, $viewType, $htmlFormatting );
  194. } else {
  195. if ($paramstextarea) {
  196. return "<textarea name="$control_name" cols="40" rows="10" class="text_area">".htmlspecialchars($this->_raw)."</textarea>";
  197. } else {
  198. return null;
  199. }
  200. }
  201. }
  202. } // class cbParamsEditorController
  203. class cbEditRowView {
  204. var $_i  = 0;
  205. /** A stack (array) of the data which is a class
  206.  *  @var array of stdClass */
  207. var $_modelOfData = array();
  208. /** The data rows (for ordering arrows)
  209.  *  @var array */
  210. var $_modelOfDataRows = null;
  211. /** The current row number (for ordering arrows)
  212.  *  @var int */
  213. var $_modelOfDataRowsNumber = null;
  214. /** Extending view functions
  215.  *  @var cbEditRowView */
  216. var $_extendViewParser = null;
  217. /** Drawing controller
  218.  *  @var cbDrawController */
  219. var $_controllerView = null;
  220. /** The options from url REQUEST
  221.  * @var array of string */
  222. var $_options = null;
  223. /** The plugin parameters
  224.  *  @var cbParamsBase */
  225. var $_pluginParams = null;
  226. /** The parameters objects for individual columns (cache)
  227.  *  @var array of cbParamsBase */
  228. var $_paramsOfColumns = null;
  229. /** The xml <types> element
  230.  *  @var CBSimpleXMLElement */
  231. var $_types = null;
  232. /** The xml <actions> element
  233.  *  @var CBSimpleXMLElement */
  234. var $_actions = null;
  235. /** The xml <views> element
  236.  *  @var CBSimpleXMLElement */
  237. var $_views = null;
  238. /** The xml parent element
  239.  *  @var CBSimpleXMLElement */
  240. var $_parentModelOfView = null;
  241. /** The plugin object
  242.  *  @var moscomprofilerPlugin */
  243. var $_pluginObject = null;
  244. /** Id of tab
  245.  *  @var int */
  246. var $_tabid = null;
  247. /** internal temporary var: if render as view (true) or as param (false)
  248.  *  @var boolean */
  249. var $_view = null;
  250. /** methods of this class
  251.  * @var array */
  252. var $_methods = null;
  253. /** list of possible values
  254.  * @var array of stdClass: 'name' => object (->value, (optional ->index), ->text) */
  255. var $_selectValues = array();
  256. function cbEditRowView( &$pluginParams, &$types, &$actions, &$views, &$pluginObject, $tabId = null ) {
  257. $this->_pluginParams =& $pluginParams;
  258. $this->_types =& $types;
  259. $this->_actions =& $actions;
  260. $this->_views =& $views;
  261. $this->_pluginObject =& $pluginObject;
  262. $this->_tabid = $tabId;
  263. }
  264. function setParentView( &$modelView ) {
  265. $this->_parentModelOfView =& $modelView;
  266. if ( isset( $this->_extendViewParser ) && ( $this->_extendViewParser->_parentModelOfView === null ) ) {
  267. $this->_extendViewParser->setParentView( $modelView );
  268. }
  269. }
  270. function pushModelOfData( &$modelOfData ) {
  271. array_unshift( $this->_modelOfData, $modelOfData );
  272. }
  273. function popModelOfData( ) {
  274. array_shift( $this->_modelOfData );
  275. }
  276. function setModelOfDataRows( &$modelOfDataRows ) {
  277. $this->_modelOfDataRows =& $modelOfDataRows;
  278. }
  279. function setModelOfDataRowsNumber( $i ) {
  280. $this->_modelOfDataRowsNumber = $i;
  281. if ( $this->_extendViewParser ) {
  282. $this->_extendViewParser->setModelOfDataRowsNumber( $i );
  283. }
  284. }
  285. /**
  286.  * Sets an extended view parser
  287.  * This method is experimental and not part of CB API.
  288.  *
  289.  * @param CBSimpleXmlElement $extendedViewParserElement  an xml element like <extendparser class="className" /> where className extends cbEditRowView
  290.  */
  291. function setExtendedViewParser( &$extendedViewParserElement ) {
  292. if ( $extendedViewParserElement ) {
  293. $class = $extendedViewParserElement->attributes( 'class' );
  294. if ( $class ) {
  295. $extendedViewParser =& new $class( $this->_pluginParams, $this->_types, $this->_actions, $this->_views, $this->_pluginObject, $this->_tabid, $this );
  296. $this->_extendViewParser =& $extendedViewParser;
  297. }
  298. }
  299. }
  300. function setSelectValues( &$node, &$selectValues ) {
  301. $this->_selectValues[$node->attributes( 'name' )] =& $selectValues;
  302. }
  303. function & _getSelectValues( &$node ) {
  304. $nodeName = $node->attributes( 'name' );
  305. if ( isset( $this->_selectValues[$nodeName] ) ) {
  306. return $this->_selectValues[$nodeName];
  307. } else {
  308. $arr = array();
  309. return $arr;
  310. }
  311. }
  312. /**
  313.  * Renders as ECHO HTML code of a table
  314.  *
  315.  * @param CBSimpleXmlElement  $modelView
  316.  * @param stdClass            $modelOfData       ( $row object )
  317.  * @param cbDrawController    $controllerView
  318.  * @param array               $options
  319.  * @param atring              $viewType   ( 'view', 'param', 'depends': means: <param> tag => param, <field> tag => view )
  320.  * @param atring              $htmlFormatting   ( 'table', 'td', 'none' )
  321.  * 
  322.  */
  323. function renderEditRowView( &$modelOfView, &$modelOfData, &$controllerView, $options, $viewType = 'depends', $htmlFormatting = 'table' ) {
  324. global $_CB_framework;
  325. if ( $this->_parentModelOfView === null ) {
  326. $this->setParentView( $modelOfView );
  327. }
  328. $this->pushModelOfData( $modelOfData );
  329. $this->_controllerView =& $controllerView;
  330. $this->_options = $options;
  331. if ( $this->_extendViewParser ) {
  332. $html = $this->_extendViewParser->renderEditRowView( $modelOfView, $modelOfData, $controllerView, $options, $viewType, $htmlFormatting );
  333. if ( $html ) {
  334. return $html;
  335. }
  336. }
  337. $html = array();
  338. if ( $htmlFormatting == 'table' ) {
  339. $html[] = '<table class="adminform">';
  340. $label = $modelOfView->attributes( 'label' );
  341. if ( $label ) {
  342.     // add the params description to the display
  343.     $html[] = '<tr><th colspan="3">' . getLangDefinition( $label ) . '</th></tr>';
  344. }
  345. $description = $modelOfView->attributes( 'description' );
  346. if ( $description ) {
  347.     // add the params description to the display
  348.     $html[] = '<tr><td colspan="3">' . getLangDefinition( $description ) . '</td></tr>';
  349. }
  350. }
  351. $this->_methods = get_class_methods( get_class( $this ) );
  352. $this->_jsif = array();
  353. $tabs = new cbTabs( 0, $_CB_framework->getUi() );
  354. $html[] = $this->renderAllParams( $modelOfView, $controllerView->control_name(), $tabs, $viewType, $htmlFormatting );
  355. if ( $htmlFormatting == 'table' ) {
  356. $html[] = '</table>';
  357. }
  358. $jsCode = $this->_compileJsCode();
  359. if ( $jsCode && ( $htmlFormatting != 'fieldsListArray' ) ) {
  360. $html[] = '<script type="text/javascript"><!--//--><![CDATA[//><!--' . "n";
  361. // $html[] = "var cbHideFields = new Array();n";
  362. $html[] = $jsCode;
  363. $html[] = "//--><!]]></script>n";
  364. }
  365. return ( $htmlFormatting == 'fieldsListArray' ? $html : implode( "n", $html ) );
  366. }
  367. /**
  368. * @param string The name of the field
  369. * @param mixed The default value if not found
  370. * @return string
  371. */
  372. function get( $key, $default=null ) {
  373.     if ( isset( $this->_modelOfData[0]->$key ) ) {
  374.      if (is_array( $default ) ) {
  375.      return explode( '|*|', $this->_modelOfData[0]->$key );
  376.      } else {
  377.         return $this->_modelOfData[0]->$key;
  378.      }
  379. } else {
  380.     return $default;
  381. }
  382. }
  383. function _compileJsCode( ) {
  384. if ( count( $this->_jsif ) == 0 ) {
  385. return null;
  386. }
  387. $js = '';
  388. $i = 0;
  389. foreach ( $this->_jsif as $ifVal ) {
  390. $ifName = $ifVal['ifname'];
  391. $element = $ifVal['element'];
  392. $name = $element->attributes( 'name' );
  393. $operator = $element->attributes( 'operator' );
  394. $value = $element->attributes( 'value' );
  395. // $valuetype = $element->attributes( 'valuetype' );
  396. if ( $operator ) {
  397. $operatorNegation = array( '=' => '!=', '==' => '!=', '!=' => '==', '<>' => '==', '<' => '>=', '>' => '<=', '<=' => '>', '>=' => '<', 'regexp' => 'regexp' );
  398. $revertedOp = $operatorNegation[$operator];
  399. } elseif ( isset( $ifVal['onchange'] ) && ( $ifVal['onchange'] == 'evaluate' ) ) {
  400. $revertedOp = 'evaluate';
  401. } else {
  402. $revertedOp = 'no-operator-specified-in-xml';
  403. }
  404. //if ( in_array( $valuetype, array( 'string', 'const:string', 'text', 'const:text' ) ) ) {
  405. // $value = "\'" . $value . "\'";
  406. //}
  407. if ( isset( $ifVal['show'] ) && ( count( $ifVal['show'] ) > 0 ) ) {
  408. $show = "['" . implode( "','", $ifVal['show'] ) . "']";
  409. } else {
  410. $show = "[]";
  411. }
  412. if ( isset( $ifVal['set'] ) && ( count( $ifVal['set'] ) > 0 ) ) {
  413. $set = "['" . implode( "','", $ifVal['set'] ) . "']";
  414. } else {
  415. $set = "[]";
  416. }
  417. $js .= "cbHideFields[" . $i . "] = new Array();n";
  418. $js .= "cbHideFields[" . $i . "][0] = '" . $ifName . "';n";
  419. $js .= "cbHideFields[" . $i . "][1] = '" . $name . "';n";
  420. $js .= "cbHideFields[" . $i . "][2] = '" . $revertedOp . "';n";
  421. $js .= "cbHideFields[" . $i . "][3] = '" . str_replace( '\', '\\', $value ) . "';n";
  422. $js .= "cbHideFields[" . $i . "][4] = "  . $show . ";n";
  423. $js .= "cbHideFields[" . $i . "][5] = "  . $set . ";n";
  424. $i++;
  425. }
  426. return $js;
  427. }
  428. function _evalIf( &$element ) {
  429. $name = $element->attributes( 'name' );
  430. $operator = $element->attributes( 'operator' );
  431. $value = $element->attributes( 'value' );
  432. // $valuetype = $element->attributes( 'valuetype' );
  433. $paramValue = $this->get( $name ); //TBD: missing default value, but not easy to find, as it's in the view param for now: $param->attributes( 'default' ) );
  434. if ( $element->attributes( 'translate' ) == '_UE' ) {
  435. $value = getLangDefinition( $value );
  436. }
  437. switch ( $operator ) {
  438. case '=':
  439. case '==':
  440. $result = ( $paramValue == $value );
  441. break;
  442. case '!=':
  443. case '<>':
  444. $result = ( $paramValue != $value );
  445. break;
  446. case '<':
  447. $result = ( $paramValue < $value );
  448. break;
  449. case '>':
  450. $result = ( $paramValue > $value );
  451. break;
  452. case '<=':
  453. $result = ( $paramValue <= $value );
  454. break;
  455. case '>=':
  456. $result = ( $paramValue >= $value );
  457. break;
  458. case 'regexp':
  459. $result = ( preg_match( '/' . $value . '/', $paramValue ) == 1 );
  460. break;
  461. default:
  462. break;
  463. }
  464. return $result;
  465. }
  466. function _htmlId( $control_name, $element ) {
  467. $name = $element->attributes( 'name' );
  468. if ( $name ) {
  469. return str_replace( array( '[', ']' ), '__', 'cbfr_' . ( $control_name ? $control_name . '_' : '' ) . $name );
  470. } else {
  471. return null;
  472. }
  473. }
  474. function _outputIdEqualHtmlId( $control_name, $element ) {
  475. $htmlid = $this->_htmlId( $control_name, $element );
  476. if ( $htmlid ) {
  477. $htmlid = ' id="' . htmlspecialchars( $htmlid ) . '"';
  478. }
  479. return $htmlid;
  480. }
  481. function _renderLine( $param, $result, $control_name='params', $htmlFormatting = 'table', $htmlid = true ) {
  482. $html = array();
  483. if ( $htmlid ) {
  484. $htid = $this->_outputIdEqualHtmlId( $control_name, $param );
  485. } else {
  486. $htid = null;
  487. }
  488. if ( $htmlFormatting == 'table' ) {
  489. $html[] = '<tr' . $htid
  490. . ( ( $param->attributes( 'class' ) ) ? ' class="' . htmlspecialchars( $param->attributes( 'class' ) ) . '"' : '' )
  491. . '>';
  492. if ( $param->attributes( 'label' ) === '' ) {
  493. $html[] = '<td colspan="2" width="95%"'
  494. . ( ( $param->attributes( 'valuedescription' ) ) ? ' onmouseover="return overlib(''. str_replace( array( "n", "r" ), array( "&lt;br /&gt;", "\r" ), htmlspecialchars( addslashes( $param->attributes( 'valuedescription' ) ) ) ) .'', CAPTION, ''
  495.   . htmlspecialchars( addslashes( $param->attributes( 'valuedescriptiontitle' ) ) ) . '', BELOW, RIGHT);" onmouseout="return nd();"' : '' )
  496. . '>' . $result[1] . '</td>';
  497. } else {
  498. $html[] = '<td width="35%" align="right" valign="top">' . $result[0] . '</td>';
  499. $html[] = '<td width="60%"'
  500. . ( ( $param->attributes( 'valuedescription' ) ) ? ' onmouseover="return overlib(''. str_replace( array( "n", "r" ), array( "&lt;br /&gt;", "\r" ), htmlspecialchars( addslashes( $param->attributes( 'valuedescription' ) ) ) ) .'', CAPTION, ''
  501.   . htmlspecialchars( addslashes( $param->attributes( 'valuedescriptiontitle' ) ) ) . '', BELOW, RIGHT);" onmouseout="return nd();"' : '' )
  502. . '>' . $result[1] . '</td>';
  503. }
  504. $html[] = '<td width="5%" align="left" valign="top">' . $result[2] . "</td>";
  505. $html[] = '</tr>';
  506. } elseif ( $htmlFormatting == 'td' ) {
  507. $rowspan = $param->attributes( 'rowspan' );
  508. if ( ( ! $rowspan ) || ( ( $rowspan == 'all' ) && ( $this->_modelOfDataRowsNumber == 0 ) ) ) {
  509. $html[] = "ttt<td" . $htid
  510. . ( ( $param->attributes( 'class' ) ) ? ' class="' . htmlspecialchars( $param->attributes( 'class' ) ) . '"' : '' )
  511. . ( ( $param->attributes( 'align' ) ) ? ' style="text-align:' . htmlspecialchars( $param->attributes( 'align' ) ) . ';"' :
  512. ( in_array( $param->attributes( 'type' ), array( 'checkmark', 'published' ) ) ? ' style="text-align:center;"' : '' ) )
  513. . ( ( $param->attributes( 'nowrap' ) ) || in_array( $param->attributes( 'type' ), array( 'checkmark', 'ordering' ) ) ? ' nowrap="nowrap"' : '' )
  514. . ( ( $param->attributes( 'valuedescription' ) ) ? ' onmouseover="return overlib(''. htmlspecialchars( addslashes( str_replace( array( "n", "r" ), array( "<br />", "\r" ), $param->attributes( 'valuedescription' ) ) ) ) .'', CAPTION, ''
  515.   . htmlspecialchars( addslashes( $param->attributes( 'valuedescriptiontitle' ) ) ) . '', BELOW, RIGHT);" onmouseout="return nd();"' : '' )
  516. . ( ( $rowspan == 'all' ) ? ' rowspan="' . (int) count( $this->_modelOfDataRows ) . '"' : '' )
  517. . '>'
  518. . $result[1]
  519. . "</td>";
  520. } else {
  521. $html[] = '';
  522. }
  523. } elseif ( $htmlFormatting == 'span' ) {
  524. if (substr( $result[0], -1 ) == ":" ) {
  525. $result[0] = substr( $result[0], 0, -1 );
  526. }
  527. if (substr( $result[0], -2 ) == "%s" ) {
  528. $result[0] = substr( $result[0], 0, -2 );
  529. $html[] = '<div' . $htid
  530. . ( ( $param->attributes( 'class' ) ) ? ' class="' . htmlspecialchars( $param->attributes( 'class' ) ) . '"' : '' )
  531. . '>'
  532. . '<span class="cbLabelSpan">' . $result[0] . '</span>'
  533. . '<span class="cbFieldSpan"'
  534. . ( ( $param->attributes( 'valuedescription' ) ) ? ' onmouseover="return overlib(''. str_replace( array( "n", "r" ), array( "&lt;br /&gt;", "\r" ), htmlspecialchars( addslashes( $param->attributes( 'valuedescription' ) ) ) ) .'', CAPTION, ''
  535.    . htmlspecialchars( addslashes( $param->attributes( 'valuedescriptiontitle' ) ) ) . '', BELOW, RIGHT);" onmouseout="return nd();"' : '' )
  536. . '>' . $result[1] . '</span> '
  537. . '</div>';
  538. } else {
  539. $html[] = '<div' . $htid
  540. . ( ( $param->attributes( 'class' ) ) ? ' class="' . htmlspecialchars( $param->attributes( 'class' ) ) . '"' : '' )
  541. . '>'
  542. . '<span class="cbFieldSpan"'
  543. . ( ( $param->attributes( 'valuedescription' ) ) ? ' onmouseover="return overlib(''. str_replace( array( "n", "r" ), array( "&lt;br /&gt;", "\r" ), htmlspecialchars( addslashes( $param->attributes( 'valuedescription' ) ) ) ) .'', CAPTION, ''
  544.   . htmlspecialchars( addslashes( $param->attributes( 'valuedescriptiontitle' ) ) ) . '', BELOW, RIGHT);" onmouseout="return nd();"' : '' )
  545. . '>' . $result[1] . '</span> '
  546. . '<span class="cbLabelSpan">' . $result[0] . '</span>'
  547. . '</div>';
  548. }
  549. } elseif ( in_array( $htmlFormatting, array( 'none', 'fieldsListArray' ) ) ) {
  550. $html[] = $result[1];
  551. } else {
  552. $html[] = "*" . $result[1] . "*";
  553. }
  554. return ( $htmlFormatting == 'fieldsListArray' ? $html : implode( "n", $html ) );
  555. }
  556. function & _parseParamsColumn( $paramsName ) {
  557. if ( ! isset( $this->_paramsOfColumns[$paramsName] ) ) {
  558. $this->_paramsOfColumns[$paramsName] = new cbParamsBase( $this->_modelOfData[0]->$paramsName );
  559. }
  560. return $this->_paramsOfColumns[$paramsName]->_params;
  561. }
  562. /**
  563.  * Renders all parameters (including inheritance magic)
  564.  *
  565.  * @param CBSimpleXMLElement $element
  566.  * @param string             $control_name
  567.  * @param cbTabs             $tabs
  568.  * @param atring             $viewType         ( 'view', 'param', 'depends': means: <param> tag => param, <field> tag => view )
  569.  * @param atring             $htmlFormatting   ( 'table', 'td', 'span', 'none' )
  570.  * @return string HTML
  571.  */
  572. function renderAllParams( &$xmlParentElement, $control_name='params', $tabs=null, $viewType = 'depends', $htmlFormatting = 'table' ) {
  573. $html = array();
  574. $extenders = array();
  575. if ( ( $this->_inverted ) && ( count( $this->_extenders ) == 1 ) ) {
  576. $element = array_shift( $this->_extenders );
  577. array_unshift( $this->_extenders, array( &$xmlParentElement ) );
  578. $this->_inverted = false;
  579. } else {
  580. $element =& $xmlParentElement;
  581. }
  582. if ( is_array( $element ) ) {
  583. foreach ( $element as $el ) {
  584. $html[] = $this->renderAllParams( $el, $control_name, $tabs, $viewType, $htmlFormatting );
  585. }
  586. } else {
  587. $identicalMatches = array();
  588. $nonMatches = array();
  589. if ( count( $this->_extenders ) > 0 ) {
  590. $extenders = array_shift( $this->_extenders );
  591. foreach ( $extenders as $ext ) {
  592. if ( ( $ext->name() == 'inherit' ) || ( ( ( $ext->name() == $element->name() ) ) && $ext->attributes( 'name' ) == $element->attributes( 'name' ) ) ) {
  593. if ( count( $element->children() ) > 0 ) {
  594. foreach ( $ext->children() as $chld ) {
  595. $this->_addTagMatch( $identicalMatches, $chld );
  596. }
  597. } else {
  598. foreach ( $ext->children() as $chld ) {
  599. $saveExtTwo = $this->_extenders;
  600. $this->_extenders = array ();
  601. $html[] = $this->renderOneParamAndChildren( $chld, $control_name, $tabs, $viewType, $htmlFormatting );
  602. $this->_extenders = $saveExtTwo;
  603. }
  604. }
  605. } else {
  606. foreach ( $ext->children() as $chld ) {
  607. $nonMatches[] = $chld;
  608. }
  609. }
  610. }
  611. }
  612. foreach ( $element->children() as $param ) {
  613. $idkeyMatched = $this->_getKeyOfTagMatch( $identicalMatches, $param );
  614. if ( $idkeyMatched !== null ) {
  615. foreach ( $identicalMatches as $idkey => $idmatch ) {
  616. if ( $idkey == $idkeyMatched ) {
  617. break;
  618. } else {
  619. foreach ( $idmatch as $extparam ) {
  620. $saveExtTwo = $this->_extenders;
  621. $this->_extenders = array ( array( &$param ) );
  622. $html[] = $this->renderOneParamAndChildren( $extparam, $control_name, $tabs, $viewType, $htmlFormatting );
  623. $this->_extenders = $saveExtTwo;
  624. }
  625. unset( $identicalMatches[$idkey] );
  626. }
  627. }
  628. foreach ( $identicalMatches[$idkeyMatched] as $k => $extparam ) {
  629. $saveExtTwo = $this->_extenders;
  630. $this->_extenders = array ( array( &$param ) );
  631. $this->_inverted = true;
  632. $html[] = $this->renderOneParamAndChildren( $extparam, $control_name, $tabs, $viewType, $htmlFormatting );
  633. $this->_inverted = false;
  634. $this->_extenders = $saveExtTwo;
  635. unset( $identicalMatches[$idkeyMatched][$k] );
  636. }
  637. } else {
  638. $html[] = $this->renderOneParamAndChildren( $param, $control_name, $tabs, $viewType, $htmlFormatting );
  639. }
  640. }
  641. foreach ( $identicalMatches as $idmatch ) {
  642. foreach ( $idmatch as $extparam ) {
  643. $saveExtTwo = $this->_extenders;
  644. $this->_extenders = array ();
  645. $html[] = $this->renderOneParamAndChildren( $extparam, $control_name, $tabs, $viewType, $htmlFormatting );
  646. $this->_extenders = $saveExtTwo;
  647. }
  648. }
  649. foreach ( $nonMatches as $chld ) {
  650. // if ( ( count( $chld->children() ) == 0 ) || in_array( $chld->name(), array( 'param', 'field' ) ) ) {
  651. // $html[] = $this->renderOneParamAndChildren( $chld, $control_name, $tabs, $viewType, $htmlFormatting );
  652. // unset( $this->_extenders[$k] );
  653. // }
  654. }
  655. // $this->_extenders = $saveExt;
  656. if ( ( count( $element->children() ) < 1 ) && ( count( $extenders ) == 0 ) ) {
  657. if ( $htmlFormatting == 'table' ) {
  658. $html[] = "<tr><td colspan="2"><i>" . _UE_NO_PARAMS . /* ": " . $element->name() . '(' . implode( ',', $element->attributes() ) . ')' . */ "</i></td></tr>";
  659. } elseif ( $htmlFormatting == 'td' ) {
  660. $html[] = "<td><i>" . _UE_NO_PARAMS . "</i></td>";
  661. } elseif ( $htmlFormatting == 'fieldsListArray' ) {
  662. // nothing
  663. } else {
  664. $html[] = "<i>" . _UE_NO_PARAMS . "</i>";
  665. }
  666. }
  667. }
  668. return ( $htmlFormatting == 'fieldsListArray' ? $html : implode( "n", $html ) );
  669. }
  670. /**
  671.  * Returns a unique text id of a xml element depending on name and attribute values
  672.  * @access private
  673.  *
  674.  * @param  CBSimpleXMLElement  $el
  675.  * @return string
  676.  */
  677. function _uniqueTag( &$el ) {
  678. $add = '';
  679. foreach ( $el->attributes() as $k => $v ) {
  680. $add .= '|**|' . $k . '|==|' . $v;
  681. }
  682. return ( $el->name()) . $add;
  683. }
  684. /*
  685. function _explodeTag( $uniqueTag ) {
  686. $tags = explode( '|**|', $uniqueTag );
  687. $name = $tags[0];
  688. $attr = array();
  689. for ( $i = 1, $n = count( $tags ); $i < $n; $i++ ) {
  690. $parts = explode( '|==|', $tags[$i] );
  691. $attr[$parts[0]] = $parts[1];
  692. }
  693. }
  694. */
  695. function _addTagMatch( &$identicalMatches, $chld ) {
  696. $identicalMatches[$this->_uniqueTag( $chld )][] = $chld;
  697. }
  698. function _getKeyOfTagMatch( &$identicalMatches, &$param ) {
  699. $paramTag = $this->_uniqueTag( $param );
  700. foreach ( $identicalMatches as $k => $v ) {
  701. if ( strpos( $k, $paramTag ) === 0 ) {
  702. return $k;
  703. }
  704. }
  705. return null;
  706. }
  707. function _getKeyOfTagMatchOLD( &$identicalMatches, $param ) {
  708. if ( isset( $identicalMatches[$this->_uniqueTag( $param )] ) ) {
  709. return $this->_uniqueTag( $param );
  710. } else {
  711. return null;
  712. }
  713. }
  714. /**
  715.  * renders one parameter and its children
  716.  *
  717.  * @param CBSimpleXMLElement $param
  718.  * @param string             $control_name
  719.  * @param cbTabs             $tabs
  720.  * @param atring             $viewType   ( 'view', 'param', 'depends': means: <param> tag => param, <field> tag => view )
  721.  * @param atring             $htmlFormatting   ( 'table', 'td', 'span', 'none' )
  722.  * @return string HTML
  723.  */
  724. var $_inverted = false;
  725. var $_extenders = array();
  726. function renderOneParamAndChildren( &$param, $control_name='params', $tabs=null, $viewType = 'depends', $htmlFormatting = 'table' ) {
  727. static $tabNavJS = array(); // javascript for all nested tabs.
  728. static $tabpaneCounter = 0; // level of tabs (for nested tabs)
  729. // static $tabpaneNames = array(); // names of the tabpanes of level [tabpaneCounter] for the tabpanetabs
  730. $html = array();
  731. $viewMode = $param->attributes( 'mode' );
  732. switch ( $viewMode ) {
  733. // case 'view':
  734. case 'show':
  735. $viewType = 'view';
  736. break;
  737. // case 'param':
  738. case 'edit':
  739. $viewType = 'param';
  740. break;
  741. default:
  742. break;
  743. }
  744. switch ( $param->name() ) {
  745. case 'inherit':
  746. $from = $param->attributes( 'from' );
  747. if ( $from ) {
  748. $fromXml = $param->xpath( $from );
  749. if ( $fromXml && ( count( $fromXml ) > 0 ) ) {
  750. array_unshift( $this->_extenders, array( &$param ) );
  751. foreach ( $fromXml as $fmx ) {
  752. $html[] = $this->renderAllParams( $fmx, $control_name, $tabs, $viewType, $htmlFormatting );
  753. }
  754. }
  755. }
  756. break;
  757. case 'param':
  758. $result = $this->renderParam( $param, $control_name, ( $viewType == 'view' ), $htmlFormatting );
  759. $html[] = $this->_renderLine( $param, $result, $control_name, $htmlFormatting );
  760. if ( ( ! ( $viewType == 'view' ) ) && ( $param->attributes( 'onchange' ) == 'evaluate' ) ) {
  761. $ifName = $this->_htmlId( $control_name, $param );
  762. $this->_jsif[$ifName]['element'] = $param;
  763. $this->_jsif[$ifName]['ifname'] = $ifName;
  764. $this->_jsif[$ifName]['onchange'] = $param->attributes( 'onchange' );
  765. }
  766. break;
  767. case 'params':
  768. $paramsName = $param->attributes( 'name' );
  769. $paramsType = $param->attributes( 'type' );
  770. if ( ( $paramsType == 'params' ) && $paramsName ) {
  771. $valueObj =& $this->_parseParamsColumn( $paramsName );
  772. $this->pushModelOfData( $valueObj );
  773. if ( $control_name ) {
  774. $child_cnam = $control_name . '[' . $paramsName . ']';
  775. } else {
  776. $child_cnam = $paramsName;
  777. }
  778. $html[] = $this->renderAllParams( $param, $child_cnam, $tabs, $viewType, $htmlFormatting );
  779. $this->popModelOfData();
  780. }
  781. break;
  782. case 'field':
  783. $result = $this->renderParam( $param, $control_name, ( $viewType != 'param' ) );
  784. $link = $param->attributes( 'link' );
  785. $title = htmlspecialchars( $param->attributes( 'title' ) );
  786. if ( $title ) {
  787. $title = ' title="' . $title . '"';
  788. } else {
  789. $title = '';
  790. }
  791. if ( $htmlFormatting != 'fieldsListArray' ) {
  792. if ( $link ) {
  793. if ( $param->attributes( 'target' ) == '_blank' ) {
  794. $linkhref = $this->_controllerView->drawUrl( $link, $param, $this->_modelOfData[0], isset( $this->_modelOfData[0]->id ) ? $this->_modelOfData[0]->id : null, true, false ); //TBD NOT URGENT: hardcoded id column name 'id'
  795. $onclickJS = 'window.open('' . htmlspecialchars( unHtmlspecialchars( $linkhref ) )
  796.   . '', 'cbtablebrowserpopup', 'status=no,toolbar=no,scrollbars=yes,titlebar=no,menubar=no,resizable=yes,width=640,height=480,directories=no,location=no'); return false;';
  797.   $rowOnclickHtml = ' onclick="' . $onclickJS . '"';
  798. } else {
  799. $linkhref = $this->_controllerView->drawUrl( $link, $param, $this->_modelOfData[0], isset( $this->_modelOfData[0]->id ) ? $this->_modelOfData[0]->id : null, true ); //TBD NOT URGENT: hardcoded id column name 'id'
  800. $rowOnclickHtml = '';
  801. }
  802. $result[1] = '<a href="' . $linkhref .'"' . $title . $rowOnclickHtml . '>' . ( trim( $result[1] ) ? $result[1] : '---' ) . '</a>';
  803. } elseif ( $title ) {
  804. $result[1] = '<span' . $title . '>' . $result[1] . '</span>';
  805. }
  806. }
  807. $html[] = $this->_renderLine( $param, $result, $control_name, $htmlFormatting, false );
  808. break;
  809. case 'fieldset':
  810. $htid = $this->_outputIdEqualHtmlId( $control_name, $param );
  811. $legend = $param->attributes( 'label' );
  812. $description = $param->attributes( 'description' );
  813. $name = $param->attributes( 'name' );
  814. $fieldsethtml = '<fieldset' . ( $name ? ( ' class="cbfieldset_' . $name . '"' ) : '' ) . '>';
  815. if ( $htmlFormatting == 'table' ) {
  816. $html[]  = '<tr' . $htid . '><td colspan="3" width="100%">' . $fieldsethtml;
  817. } elseif ( $htmlFormatting == 'td' ) {
  818. $html[] = "ttt<td" . $htid . ">" . $fieldsethtml;
  819. } elseif ( $htmlFormatting == 'span' ) {
  820. $html[] = '<div' . $htid . '>' . $fieldsethtml;
  821. } elseif ( $htmlFormatting == 'fieldsListArray' ) {
  822. // nothing
  823. } else {
  824. $html[]  = '<fieldset' . $htid . ( $name ? ( ' class="cbfieldset_' . $name . '"' ) : '' ) . '>';
  825. }
  826. if ( $legend && ( $htmlFormatting != 'fieldsListArray' ) ) {
  827.     $html[] = '<legend>' . getLangDefinition($legend) . '</legend>';
  828. }
  829. if ( $htmlFormatting == 'table' ) {
  830. $html[] = '<table class="paramlist" cellspacing="0" cellpadding="0" width="100%">';
  831. if ( $description ) {
  832.     $html[] = '<tr><td colspan="3" width="100%"><strong>' . getLangDefinition($description) . '</strong></td></tr>';
  833. }
  834. } elseif ( $htmlFormatting == 'td' ) {
  835. if ( $description ) {
  836. $html[]  = '<td colspan="3" width="100%"><strong>' . getLangDefinition($description) . '</strong></td>';
  837. }
  838. } elseif ( $htmlFormatting == 'span' ) {
  839. if ( $description ) {
  840. $html[] = '<span class="cbLabelSpan">' . getLangDefinition($description) . '</span> ';
  841. }
  842. $html[] = '<span class="cbFieldSpan">';
  843. } elseif ( $htmlFormatting == 'fieldsListArray' ) {
  844. // nothing
  845. } else {
  846. if ( $description ) {
  847. $html[]  = '<strong>' . getLangDefinition($description) . '</strong>';
  848. }
  849. }
  850. $html[] = $this->renderAllParams( $param, $control_name, $tabs, $viewType, $htmlFormatting );
  851. if ( $htmlFormatting == 'table' ) {
  852. $html[] = "nt</table>";
  853. $html[] = '</fieldset></td></tr>';
  854. } elseif ( $htmlFormatting == 'td' ) {
  855. $html[] = '</fieldset></td>';
  856. } elseif ( $htmlFormatting == 'span' ) {
  857. $html[] = '</span></fieldset></div>';
  858. } elseif ( $htmlFormatting == 'fieldsListArray' ) {
  859. // nothing
  860. } else {
  861. $html[] = '</fieldset>';
  862. }
  863. break;
  864. case 'fields':
  865. case 'status':
  866. $html[] = $this->renderAllParams( $param, $control_name, $tabs, $viewType, $htmlFormatting );
  867. break;
  868. case 'if':
  869. $showInside = true;
  870. $ifType = $param->attributes( 'type' );
  871. if ( ( $ifType == 'showhide' ) && ( ! ( $viewType == 'view' ) ) ) {
  872. $ifName = $this->_htmlId( $control_name, $param ) . $param->attributes( 'operator' ) . $param->attributes( 'value' ). $param->attributes( 'valuetype' );
  873. // $this->_jsif[$ifName] = array();
  874. // $this->_jsif[$ifName]['show']= array();
  875. // $this->_jsif[$ifName]['set'] = array();
  876. if ( count( $param->children() ) > 0 ) {
  877. foreach ( $param->children() as $subParam ) {
  878. if ( $subParam->name() == 'showview' ) {
  879. $viewName = $subParam->attributes( 'view' );
  880. $viewModel =& $this->_views->getChildByNameAttributes( 'view', array( 'ui' => 'admin', 'name' => $viewName ) );
  881. if ( !$viewModel ) {
  882. echo 'Extended renderAllParams:showview: View ' . $viewName . ' not defined in XML';
  883. return false;
  884. }
  885. foreach ( $viewModel->children() as $vChild ) {
  886. $this->_jsif[$ifName]['show'][] = $this->_htmlId( $control_name, $vChild );
  887. }
  888. } elseif ( in_array( $subParam->name(), array( 'params', 'fields', 'status' ) ) ) {
  889. if ( count( $subParam->children() ) > 0 ) {
  890. if ( $subParam->name() == 'params' ) {
  891. $paramsName = $subParam->attributes( 'name' );
  892. if ( $control_name ) {
  893. $child_cnam = $control_name . '[' . $paramsName . ']';
  894. } else {
  895. $child_cnam = $paramsName;
  896. }
  897. } else {
  898. $child_cnam = $control_name;
  899. }
  900. foreach ( $subParam->children() as $vChild ) {
  901. if ( $vChild->name() != 'showview' ) { //TBD //FIXME: this avoids JS error but still shows sub-view ! recursive function needed here
  902. $this->_jsif[$ifName]['show'][] = $this->_htmlId( $child_cnam, $vChild );
  903. }
  904. }
  905. }
  906. } elseif ( $subParam->name() == 'else' ) {
  907. if ( $subParam->attributes( 'action' ) == 'set' ) {
  908. $correspondingParam = $param->getAnyChildByNameAttr( 'param', 'name', $subParam->attributes( 'name' ) );
  909. if ( $correspondingParam ) {
  910. $this->_jsif[$ifName]['set'][] = $this->_htmlId( $control_name, $correspondingParam )
  911. . '=' . $this->control_id( $control_name, $subParam->attributes( 'name' ) )
  912. . '=' . $subParam->attributes( 'value' );
  913. } else {
  914. echo 'No corresponding param to the else statement for name ' . $subParam->attributes( 'name' ) . ' !';
  915. }
  916. }
  917. } else {
  918. $this->_jsif[$ifName]['show'][] = $this->_htmlId( $control_name, $subParam );
  919. }
  920. }
  921. $this->_jsif[$ifName]['element'] = $param;
  922. $this->_jsif[$ifName]['ifname'] = $this->_htmlId( $control_name, $param );
  923. }
  924. } elseif ( ( $ifType == 'condition' ) || ( $viewType == 'view' ) ) {
  925. $showInside = $this->_evalIf( $param );
  926. }
  927. if ( $showInside ) {
  928. $html[] = $this->renderAllParams( $param, $control_name, $tabs, $viewType, $htmlFormatting );
  929. }
  930. break;
  931. case 'else':
  932. break; // implemented in if above it
  933. case 'toolbarmenu':
  934. break; // implemented in higher level
  935. case 'tabpane':
  936. // first render all tabpanetabs (including nested tabpanes):
  937. $tabpaneCounter++;
  938. $this->tabpaneNames[$tabpaneCounter] = $param->attributes( 'name' );
  939. $subhtml = $this->renderAllParams( $param, $control_name, $tabs, $viewType, $htmlFormatting );
  940. unset( $this->tabpaneNames[$tabpaneCounter] );
  941. $tabpaneCounter--;
  942. if ( $htmlFormatting != 'fieldsListArray' ) {
  943. // then puts them together:
  944. $htid = $this->_outputIdEqualHtmlId( $control_name, $param );
  945. if ( $htmlFormatting == 'table' ) {
  946. $html[] = '<tr' . $htid . '><td colspan="3" width="100%">';
  947. } elseif ( $htmlFormatting == 'td' ) {
  948. $html[] = '<td' . $htid . '>';
  949. }
  950. if ( $tabpaneCounter == 0 ) {
  951. $html[] = $tabs->_getTabNavJS( $param->attributes( 'name' ), $tabNavJS );
  952. $tabNavJS = array();
  953. }
  954. $html[] = $tabs->startPane( $param->attributes( 'name' ) );
  955. }
  956. $html[] = $subhtml;
  957. if ( $htmlFormatting != 'fieldsListArray' ) {
  958. $html[] = $tabs->endPane();
  959. if ( $htmlFormatting == 'table' ) {
  960. $html[] = '</td></tr>';
  961. } elseif ( $htmlFormatting == 'td' ) {
  962. $html[] = '</td>';
  963. }
  964. }
  965. break;
  966. case 'tabpanetab':
  967. if ( $htmlFormatting != 'fieldsListArray' ) {
  968. $i = $this->_i++;
  969. $idtab = $this->tabpaneNames[$tabpaneCounter] . $this->_i;
  970. $html[] = $tabs->startTab( $this->tabpaneNames[$tabpaneCounter], getLangDefinition( $param->attributes( 'label' ) ), $idtab );
  971. $html[] = '<table class="paramlist" cellspacing="0" cellpadding="0" width="100%">';
  972. $tabName = $param->attributes( 'name' );
  973. $tabTitle = $param->attributes( 'title' );
  974. $description = $param->attributes( 'description' );
  975. if ( $tabTitle ) {
  976.     $html[] = '<tr><td colspan="3" width="100%"><h3' . ( $tabName ? ' class="cbTH' . $this->tabpaneNames[$tabpaneCounter] . $tabName . '"' : '' ) . '>' . getLangDefinition( $tabTitle ) . '</h3></td></tr>';
  977. }
  978. if ( $description || ! $tabTitle ) {
  979.     $html[] = '<tr><td colspan="3" width="100%"><strong>' . getLangDefinition( $description ) . '</strong></td></tr>'; // either description or a spacer.
  980. }
  981. }
  982. $html[] = $this->renderAllParams( $param, $control_name, $tabs, $viewType, $htmlFormatting );
  983. if ( $htmlFormatting != 'fieldsListArray' ) {
  984. $html[] = "nt</table>";
  985. $html[] = $tabs->endTab();
  986. $tabNavJS[$i]->nested = ( $tabpaneCounter > 1 );
  987. $tabNavJS[$i]->name = getLangDefinition( $param->attributes( 'label' ) );
  988. $tabNavJS[$i]->id = $idtab;
  989. $tabNavJS[$i]->pluginclass = $idtab;
  990. }
  991. break;
  992. case 'extendparser':
  993. $this->setExtendedViewParser( $param );
  994. break;
  995. default:
  996. if ( $this->_extendViewParser ) {
  997. $html[] = $this->_extendViewParser->renderAllParams( $param, $control_name, $tabs, $viewType, $htmlFormatting );
  998. } else {
  999. echo 'Method to render XML view element ' . $param->name() . ' is not implemented !';
  1000. }
  1001. break;
  1002. }
  1003. return ( $htmlFormatting == 'fieldsListArray' ? $html : implode( "n", $html ) );
  1004. }
  1005. /**
  1006. * @param  CBSimpleXMLElement $param           object A param tag node
  1007. * @param  string             $control_name    The control name
  1008. * @param  boolean            $view            true if view only, false if editable
  1009. * @param  string             $htmlFormatting  'table', 'fieldsListArray', etc.
  1010. * @return array Any array of the label, the form element and the tooltip
  1011. */
  1012. function renderParam( &$param, $control_name = 'params', $view = true, $htmlFormatting = 'table' ) {
  1013. if ( $htmlFormatting == 'fieldsListArray' ) {
  1014. return array( null, $this->control_name( $control_name, $param->attributes( 'name' ) ), null );
  1015. }
  1016.     $result = array();
  1017. $name = $param->attributes( 'name' );
  1018. $label = getLangDefinition($param->attributes( 'label' ));
  1019. $description = getLangDefinition(htmlspecialchars($param->attributes( 'description' )));
  1020. $value = $this->get( $name, $param->attributes( 'default' ) );
  1021. if ( $param->attributes( 'translate' ) == '_UE' ) {
  1022. $value = getLangDefinition( $value );
  1023. }
  1024. $result[0] = $label ? $label : $name;
  1025. if ( $result[0] == '@spacer' ) {
  1026. $result[0] = '<hr/>';
  1027. } else if ( $result[0] ) {
  1028. if ($name == '@spacer') $result[0] = '<strong>'.$result[0].'</strong>';
  1029. else $result[0] .= ':';
  1030. }
  1031. $result[1] = null;
  1032. $type = $param->attributes( 'type' );
  1033. /* up to proof of contrary, not needed, as type="private" does it... //TBD remove this once sure
  1034. if ( $type == 'privateparam' ) {
  1035. $className = $param->attributes( 'class' );
  1036. $methodName = $param->attributes( 'method' );
  1037. if ( ! $className ) {
  1038. $className = $this->_parentModelOfView->attributes( 'class' );
  1039. }
  1040. if ( $className && $methodName && class_exists( $className ) ) {
  1041. global $_CB_database;
  1042. $obj = new $className( $_CB_database );
  1043. if ( method_exists( $obj, $methodName ) ) {
  1044. $control_name_name = $this->control_name( $control_name, $name );
  1045. $result[1] = $obj->$methodName( $param, $control_name, $view, $name, $control_name_name, $value, $this->_pluginParams, $type ); //TBD FIXME: pluginParams should be available by the method params() of $obj, not as function parameter
  1046. } else {
  1047. $result[1] = "Missing method " . $methodName. " in class " . $className;
  1048. }
  1049. } else {
  1050. $result[1] = "Missing class " . $className . ", and/or method " . $methodName . " in xml";
  1051. }
  1052. }
  1053. */
  1054. if ( substr( $type, 0, 4 ) == 'xml:' ) {
  1055. $xmlType = substr( $type, 4 );
  1056. if ( $this->_types ) {
  1057. $typeModel = $this->_types->getChildByNameAttr( 'type', 'name' , $xmlType );
  1058. // find root type:
  1059. if ( $typeModel ) {
  1060. $root = $typeModel;
  1061. for ( $i = 0; $i < 100; $i++ ) {
  1062. if ( substr( $root->attributes( 'base' ), 0, 4 ) == 'xml:' ) {
  1063. $subbasetype = $root->attributes( 'base' );
  1064. $root = $this->_types->getChildByNameAttr( 'type', 'name' , substr( $subbasetype, 4 ) );
  1065. if ( ! $root ) {
  1066. $result[1] = "Missing type definition of " . $subbasetype;
  1067. break;
  1068. }
  1069. } else {
  1070. // we found the root and type:
  1071. $type = $root->attributes( 'base' );
  1072. break;
  1073. }
  1074. }
  1075. if ( $i >= 99 ) {
  1076. echo 'Error: recursion loop in XML type definition of ' . $o->name() . ' ' . $o->attributes( 'name' ) . ' type: ' . $o->attributes( 'type' );
  1077. exit;
  1078. }
  1079. $levelModel = $typeModel;
  1080. $insertAfter = array();
  1081. for ( $i = 0; $i < 100; $i++ ) {
  1082. switch ( $type ) {
  1083. case 'list':
  1084. case 'multilist':
  1085. case 'radio':
  1086. case 'checkbox':
  1087. if ( $view ) {
  1088. $valueNode = $levelModel->getAnyChildByNameAttr( 'option', 'value', $value ); // recurse in children over optgroups if needed.
  1089. if ( $valueNode ) {
  1090. $result[1] = $valueNode->data();
  1091. }
  1092. } else {
  1093. if ( $levelModel->attributes( 'insertbase' ) != 'before' ) {
  1094. foreach ( $levelModel->children() as $option ) {
  1095. if ( $option->name() == 'option' ) {
  1096. $param->addChildWithAttr( 'option', $option->data(), null, $option->attributes() );
  1097. } elseif ( $option->name() == 'optgroup' ) {
  1098. $paramOptgroup = $param->addChildWithAttr( 'optgroup', $option->data(), null, $option->attributes() );
  1099. // in HTML 4, optgroups can not be nested (w3c)
  1100. foreach ( $option->children() as $optChild ) {
  1101. if ( $optChild->name() == 'option' ) {
  1102. $paramOptgroup->addChildWithAttr( 'option', $optChild->data(), null, $optChild->attributes() );
  1103. }
  1104. }
  1105. }
  1106. }
  1107. } else {
  1108. $insertAfter[] = $levelModel;
  1109. }
  1110. }
  1111. break;
  1112. default:
  1113. if ( $view ) {
  1114. $result[1] = "Unknown base type " . $type . " in XML";
  1115. } else {
  1116. $param->addChildWithAttr( 'option', "Unknown base type " . $type . " in XML", null, array( 'value' => '0') );
  1117. }
  1118. break;
  1119. }
  1120. if ( ( $levelModel->attributes( 'name' ) == $typeModel->attributes( 'name' ) ) && ( substr( $levelModel->attributes( 'type' ), 0, 4 ) == 'xml:' ) ) {
  1121. $levelModel = $this->_types->getChildByNameAttr( 'type', 'name' , substr( $levelModel->attributes( 'type' ), 4 ) );
  1122. } elseif ( substr( $levelModel->attributes( 'base' ), 0, 4 ) == 'xml:' ) {
  1123. $levelModel = $this->_types->getChildByNameAttr( 'type', 'name' , substr( $levelModel->attributes( 'base' ), 4 ) );
  1124. } else {
  1125. break;
  1126. }
  1127. }
  1128. foreach ( $insertAfter as $levelModel ) {
  1129. foreach ($levelModel->children() as $option ) {
  1130. if ( $option->name() == 'option' ) {
  1131. $param->addChildWithAttr( 'option', $option->data(), null, $option->attributes() );
  1132. } elseif ( $option->name() == 'optgroup' ) {
  1133. $paramOptgroup = $param->addChildWithAttr( 'optgroup', $option->data(), null, $option->attributes() );
  1134. foreach ( $option->children() as $optChild ) {
  1135. if ( $optChild->name() == 'option' ) {
  1136. $paramOptgroup->addChildWithAttr( 'option', $optChild->data(), null, $optChild->attributes() );
  1137. }
  1138. }
  1139. }
  1140. }
  1141. }
  1142. } else {
  1143. $result[1] = "Missing type def. for param-type " .  $param->attributes( 'type' );
  1144. }
  1145. } else {
  1146. $result[1] = "No types defined in XML";
  1147. }
  1148. }
  1149. if ( ! isset( $this->_methods ) ) {
  1150. $this->_methods = get_class_methods( get_class( $this ) );
  1151. }
  1152. if ($result[1] ) {
  1153. // nothing to do
  1154. } elseif ( $this->_extendViewParser && in_array( '_form_' . $type, $this->_extendViewParser->_methods ) ) {
  1155. $this->_view = $view;
  1156. $this->_extendViewParser->_view = $view;
  1157. $result[1] = call_user_func( array( &$this->_extendViewParser, '_form_' . $type ), $name, $value, $param, $control_name );
  1158. } elseif (in_array( '_form_' . $type, $this->_methods )) {
  1159. $this->_view = $view;
  1160. $result[1] = call_user_func( array( &$this, '_form_' . $type ), $name, $value, $param, $control_name );
  1161. } else {
  1162.     $result[1] = _HANDLER . ' = ' . $type;
  1163. }
  1164. if ( $description ) {
  1165. $result[2] = cbFieldTip( null, $description, $name );
  1166. } else {
  1167. $result[2] = '';
  1168. }
  1169. if ( ( ! $view ) && ( ! $result[1] ) ) {
  1170. $result = array( null, null, null );
  1171. }
  1172. return $result;
  1173. }
  1174. function control_name( $control_name, $name ) {
  1175. if ( $control_name ) {
  1176. return $control_name .'['. $name .']';
  1177. } else {
  1178. return $name;
  1179. }
  1180. }
  1181. function control_id( $control_name, $name ) {
  1182. return moscomprofilerHTML::htmlId( $this->control_name( $control_name, $name ) );
  1183. /*
  1184. if ( $control_name ) {
  1185. return str_replace( array( '[', ']' ), array( '__', '' ), $control_name ) .'__'. $name;
  1186. } else {
  1187. return $name;
  1188. }
  1189. */
  1190. }
  1191. /**
  1192. * @param string The name of the form element
  1193. * @param string The value of the element
  1194. * @param CBSimpleXMLElement  $node The xml element for the parameter
  1195. * @param string The control name
  1196. * @return string The html for the element
  1197. */
  1198. function _form_text( $name, $value, &$node, $control_name ) {
  1199. $size = $node->attributes( 'size' );
  1200. $maxlength = $node->attributes( 'maxlength' );
  1201. return '<input type="text" name="'. $this->control_name( $control_name, $name ) . '" id="'. $this->control_id( $control_name, $name ) . '" value="'. htmlspecialchars($value) .'" class="text_area" '
  1202. . ( $size ? 'size="'. $size .'" ' : '' )
  1203. . ( $maxlength ? 'maxlength="'. $maxlength .'" ' : '' )
  1204. . '/>';
  1205. }
  1206. /**
  1207. * Calls method or function of plugin/tab
  1208. * @param string The name of the form element
  1209. * @param string The value of the element
  1210. * @param CBSimpleXMLElement  $node The xml element for the parameter
  1211. * @param string The control name
  1212. * @return string The html for the element
  1213. */
  1214. function _form_custom( $name, $value, &$node, $control_name ) {
  1215. global $_CB_database, $_PLUGINS;
  1216. $pluginId = $this->_pluginObject->id;
  1217. $tabId = $this->_tabid;
  1218. $class = $node->attributes( 'class' );
  1219. $method = $node->attributes( 'method' );
  1220. if(!is_null($class) && strlen(trim($class)) > 0) {
  1221. if ($pluginId !== null) {
  1222. $params = null;
  1223. if ($tabId !== null) {
  1224. $_CB_database->setQuery( "SELECT * FROM #__comprofiler_tabs t"
  1225. . "n WHERE t.enabled=1 AND t.tabid = " . (int) $tabId);
  1226. $oTabs = $_CB_database->loadObjectList();
  1227. if (count($oTabs)>0) $params = $oTabs[0]->params;
  1228. }
  1229. $args = array($name,$value,$control_name);
  1230. $_PLUGINS->plugVarValue($pluginId, "published", "1"); // need to be able to call also unpublished plugin for parametring
  1231. return $_PLUGINS->call($pluginId,$method,$class,$args,$params);
  1232. } else {
  1233. $udc = new $class();
  1234. if(method_exists($udc,$method)) {
  1235. return call_user_func_array(array($udc,$method),array($name,$value,$control_name));
  1236. }
  1237. }
  1238. } elseif (function_exists( $method )) {
  1239. return call_user_func_array( $method, array($name,$value,$control_name) );
  1240. }
  1241. return "";
  1242. }
  1243. /**
  1244. * @param string The name of the form element
  1245. * @param string The value of the element
  1246. * @param CBSimpleXMLElement  $node The xml element for the parameter
  1247. * @param string The control name
  1248. * @return string The html for the element
  1249. */
  1250. function _form_list( $name, $value, &$node, $control_name ) {
  1251. $options = array();
  1252. if ( ( $node->attributes( 'blanktext' ) ) && ( ( $node->attributes( 'hideblanktext' ) != 'true' ) || ( $value == $node->attributes( 'default' ) ) ) ) {
  1253. $options[] = moscomprofilerHTML::makeOption( $node->attributes( 'default' ), $node->attributes( 'blanktext' ) );
  1254. }
  1255. foreach ( $node->children() as $option ) {
  1256. if ( $option->name() == 'option' ) {
  1257. if ( $option->attributes( 'index' ) ) {
  1258. $val = $option->attributes( 'index' );
  1259. } else {
  1260. $val = $option->attributes( 'value' );
  1261. }
  1262. $text = getLangDefinition($option->data());
  1263. $options[] = moscomprofilerHTML::makeOption( $val, $text );
  1264. } elseif ( $option->name() == 'optgroup' ) {
  1265. $text = getLangDefinition( $option->attributes( 'label' ) );
  1266. $options[] = moscomprofilerHTML::makeOptGroup( $text );
  1267. foreach ( $option->children() as $optGroupOption ) {
  1268. if ( $optGroupOption->name() == 'option' ) {
  1269. if ( $optGroupOption->attributes( 'index' ) ) {
  1270. $val = $optGroupOption->attributes( 'index' );
  1271. } else {
  1272. $val = $optGroupOption->attributes( 'value' );
  1273. }
  1274. $text = getLangDefinition($optGroupOption->data());
  1275. $options[] = moscomprofilerHTML::makeOption( $val, $text );
  1276. }
  1277. }
  1278. $options[] = moscomprofilerHTML::makeOptGroup( null );
  1279. }
  1280. }
  1281. return moscomprofilerHTML::selectList( $options, ''. $this->control_name( $control_name, $name ) . '', 'class="inputbox" id="' . $this->control_id( $control_name, $name ) . '"', 'value', 'text', $value, 2 );
  1282. }
  1283. /**
  1284. * @param string The name of the form element
  1285. * @param string The value of the element
  1286. * @param CBSimpleXMLElement  $node The xml element for the parameter
  1287. * @param string The control name
  1288. * @return string The html for the element
  1289. */
  1290. function _form_radio( $name, $value, &$node, $control_name ) {
  1291. $options = array();
  1292. foreach ( $node->children() as $option ) {
  1293. if ( $option->attributes( 'index' ) ) {
  1294. $val = $option->attributes( 'index' );
  1295. } else {
  1296. $val = $option->attributes( 'value' );
  1297. }
  1298. $text = getLangDefinition($option->data());
  1299. $options[] = moscomprofilerHTML::makeOption( $val, $text );
  1300. }
  1301. return moscomprofilerHTML::radioList( $options, ''. $this->control_name( $control_name, $name ) . '', '', 'value', 'text', $value ); //TBD missing id :  id="' . $this->control_id( $control_name, $name ) . '"
  1302. }
  1303. /**
  1304. * @param string The name of the form element
  1305. * @param string The value of the element
  1306. * @param CBSimpleXMLElement  $node The xml element for the parameter
  1307. * @param string The control name
  1308. * @return string The html for the element
  1309. */
  1310. function _form_mos_section( $name, $value, &$node, $control_name ) {
  1311. global $_CB_database;
  1312. $query = "SELECT id AS value, title AS text"
  1313. . "n FROM #__sections"
  1314. . "n WHERE published = 1 AND scope = 'content'"
  1315. . "n ORDER BY title"
  1316. ;
  1317. $_CB_database->setQuery( $query );
  1318. $options = $_CB_database->loadObjectList();
  1319. array_unshift( $options, moscomprofilerHTML::makeOption( '0', '- Select Content Section -' ) );
  1320. return moscomprofilerHTML::selectList( $options, ''. $this->control_name( $control_name, $name ) . '', 'class="inputbox" id="' . $this->control_id( $control_name, $name ) . '"', 'value', 'text', $value, 2 );
  1321. }
  1322. /**
  1323. * @param string The name of the form element
  1324. * @param string The value of the element
  1325. * @param CBSimpleXMLElement  $node The xml element for the parameter
  1326. * @param string The control name
  1327. * @return string The html for the element
  1328. */
  1329. function _form_mos_category( $name, $value, &$node, $control_name ) {
  1330. global $_CB_database;
  1331. $query  = "SELECT c.id AS value, CONCAT_WS( '/',s.title, c.title ) AS text"
  1332. . "n FROM #__categories AS c"
  1333. . "n LEFT JOIN #__sections AS s ON s.id=c.section"
  1334. . "n WHERE c.published = 1 AND s.scope='content'"
  1335. . "n ORDER BY c.title"
  1336. ;
  1337. $_CB_database->setQuery( $query );
  1338. $options = $_CB_database->loadObjectList();
  1339. array_unshift( $options, moscomprofilerHTML::makeOption( '0', '- Select Content Category -' ) );
  1340. return moscomprofilerHTML::selectList( $options, ''. $this->control_name( $control_name, $name ) . '', 'class="inputbox" id="' . $this->control_id( $control_name, $name ) . '"', 'value', 'text', $value, 2 );
  1341. }
  1342. /**
  1343. * @param string The name of the form element
  1344. * @param string The value of the element
  1345. * @param CBSimpleXMLElement  $node The xml element for the parameter
  1346. * @param string The control name
  1347. * @return string The html for the element
  1348. */
  1349. function _form_field( $name, $value, &$node, $control_name ) {
  1350. global $_CB_database;
  1351. $query  = "SELECT f.fieldid AS value, f.title AS text"
  1352. . "n FROM #__comprofiler_fields AS f"
  1353. . "n LEFT JOIN #__comprofiler_tabs AS t ON t.tabid = f.tabid"
  1354. . "n WHERE f.published = 1 AND f.name != 'NA'"
  1355. . "n ORDER BY t.ordering, f.ordering"
  1356. ;
  1357. $_CB_database->setQuery( $query );
  1358. $options = $_CB_database->loadObjectList();
  1359. for ($i=0, $n=count($options); $i<$n; $i++) {
  1360. $options[$i]->text = getLangDefinition( $options[$i]->text );
  1361. }
  1362. array_unshift( $options, moscomprofilerHTML::makeOption( '0', '- Select Field -' ) );
  1363. return moscomprofilerHTML::selectList( $options, ''. $this->control_name( $control_name, $name ) . '', 'class="inputbox" id="' . $this->control_id( $control_name, $name ) . '"', 'value', 'text', $value, 2 );
  1364. }
  1365. /**
  1366. * @param string The name of the form element
  1367. * @param string The value of the element
  1368. * @param CBSimpleXMLElement  $node The xml element for the parameter
  1369. * @param string The control name
  1370. * @return string The html for the element
  1371. */
  1372. function _form_mos_menu( $name, $value, &$node, $control_name ) {
  1373. $menuTypes = $this->_form_mos_menu__menutypes();
  1374. foreach( $menuTypes as $menutype ) {
  1375. $options[] = moscomprofilerHTML::makeOption( $menutype, $menutype );
  1376. }
  1377. array_unshift( $options, moscomprofilerHTML::makeOption( '', '- Select Menu -' ) );
  1378. return moscomprofilerHTML::selectList( $options, ''. $this->control_name( $control_name, $name ) . '', 'class="inputbox" id="' . $this->control_id( $control_name, $name ) . '"', 'value', 'text', $value, 2 );
  1379. }
  1380. function _form_mos_menu__menutypes() {
  1381. global $_CB_database;
  1382. $query = "SELECT params"
  1383. . "n FROM #__modules"
  1384. . "n WHERE module = 'mod_mainmenu'"
  1385. //. "n ORDER BY title"
  1386. ;
  1387. $_CB_database->setQuery( $query );
  1388. $modMenus = $_CB_database->loadObjectList();
  1389. $query = "SELECT menutype"
  1390. . "n FROM #__menu"
  1391. . "n GROUP BY menutype"
  1392. //. "n ORDER BY menutype"
  1393. ;
  1394. $_CB_database->setQuery( $query );
  1395. $menuMenus = $_CB_database->loadResultArray();
  1396. $menuTypes = array();
  1397. foreach ( $modMenus as $modMenu ) {
  1398. $modParams  = new cbParamsBase( $modMenu->params );
  1399. $menuType  = $modParams->get( 'menutype' );
  1400. if ( ! $menuType ) {
  1401. $menuType = 'mainmenu';
  1402. }
  1403. if ( ! in_array( $menuType, $menuTypes ) ) {
  1404. $menuTypes[] = $menuType;
  1405. }
  1406. }
  1407. foreach ( $menuMenus as $menuType ) {
  1408. if ( ! in_array( $menuType, $menuTypes ) ) {
  1409. $menuTypes[] = $menuType;
  1410. }
  1411. }
  1412. asort( $menuTypes );
  1413. return $menuTypes;
  1414. }
  1415. /**
  1416. * @param string The name of the form element
  1417. * @param string The value of the element
  1418. * @param CBSimpleXMLElement  $node The xml element for the parameter
  1419. * @param string The control name
  1420. * @return string The html for the element
  1421. */
  1422. function _form_imagelist( $name, $value, &$node, $control_name ) {
  1423. global $_CB_framework;
  1424. // path to images directory
  1425. $path = $_CB_framework->getCfg('absolute_path') . $node->attributes( 'directory' );
  1426. $files = cbReadDirectory( $path, '.png$|.gif$|.jpg$|.bmp$|.ico$' );
  1427. $options = array();
  1428. foreach ($files as $file) {
  1429. $options[] = moscomprofilerHTML::makeOption( $file, $file );
  1430. }
  1431. if ( !$node->attributes( 'hide_none' ) ) {
  1432. array_unshift( $options, moscomprofilerHTML::makeOption( '-1', '- Do not use an image -' ) );
  1433. }
  1434. if ( !$node->attributes( 'hide_default' ) ) {
  1435. array_unshift( $options, moscomprofilerHTML::makeOption( '', '- Use Default image -' ) );
  1436. }
  1437. return moscomprofilerHTML::selectList( $options, ''. $this->control_name( $control_name, $name ) . '', 'class="inputbox" id="' . $this->control_id( $control_name, $name ) . '"', 'value', 'text', $value, 2 );
  1438. }
  1439. /**
  1440. * @param string The name of the form element
  1441. * @param string The value of the element
  1442. * @param CBSimpleXMLElement  $node The xml element for the parameter
  1443. * @param string The control name
  1444. * @return string The html for the element
  1445. */
  1446. function _form_textarea( $name, $value, &$node, $control_name ) {
  1447.   $rows  = $node->attributes( 'rows' );
  1448.   $cols  = $node->attributes( 'cols' );
  1449.   // convert <br /> tags so they are not visible when editing
  1450.   $value  = str_replace( array( "\\", 'n', 'r' ), array( "\", "n", "r" ), $value );
  1451.   return '<textarea name="'. $this->control_name( $control_name, $name ) . '" cols="'. $cols .'" rows="'. $rows .'" class="text_area" id="' . $this->control_id( $control_name, $name ) . '">'. htmlspecialchars($value) .'</textarea>';
  1452. }
  1453. /**
  1454. * @param string The name of the form element
  1455. * @param string The value of the element
  1456. * @param CBSimpleXMLElement  $node The xml element for the parameter
  1457. * @param string The control name
  1458. * @return string The html for the element
  1459. */
  1460. function _form_spacer( $name, $value, &$node, $control_name ) {
  1461. if ( $value ) {
  1462. return '<strong id="' . $this->control_id( $control_name, $name ) . '">'.$value.'</strong>';
  1463. } else {
  1464. return '<hr id="' . $this->control_id( $control_name, $name ) . '" />';
  1465. }
  1466. }
  1467. /**
  1468. * @param string The name of the form element
  1469. * @param string The value of the element
  1470. * @param CBSimpleXMLElement  $node The xml element for the parameter
  1471. * @param string The control name
  1472. * @return string The html for the element
  1473. */
  1474. function _form_usergroup( $name, $value, &$node, $control_name ) {
  1475. $gtree = cbGetAllUsergroupsBelowMe();
  1476. /*
  1477. if ( ! $value ) {
  1478. $value = $_CB_framework->acl->get_group_id('Registered','ARO');
  1479. // array_unshift( $gtree, moscomprofilerHTML::makeOption( '0', '- Select User Group -' ) );
  1480. }
  1481. */
  1482. if ( ( $node->attributes( 'blanktext' ) ) && ( ( $node->attributes( 'hideblanktext' ) != 'true' ) || ( $value == 0 ) ) ) {
  1483. array_unshift( $gtree, moscomprofilerHTML::makeOption( '0', $node->attributes( 'blanktext' ) ) );
  1484. }
  1485. $content = moscomprofilerHTML::selectList( $gtree, $this->control_name( $control_name, $name ), 'class="inputbox" id="' . $this->control_id( $control_name, $name ) . '" size="1"', 'value', 'text', (int) $value, 2 ); //  size="10"
  1486. return $content;
  1487. }
  1488. /**
  1489. * special handling for textarea param
  1490. */
  1491. function textareaHandling( &$txt ) {
  1492. $total = count( $txt );
  1493. for( $i=0; $i < $total; $i++ ) {
  1494. if ( strstr( $txt[$i], "n" ) ) {
  1495. $txt[$i] = str_replace( array( "\", "n", "r" ), array( "\\", 'n', 'r'  ) , $txt[$i] );
  1496. }
  1497. }
  1498. $ret = implode( "n", $txt );
  1499. return $ret;
  1500. }
  1501. }
  1502. /**
  1503.  * This class is EXPERIMENTAL WIP (reasearch Work In Progress)
  1504.  * It is not yet ready for use in CB API and will be developped in a probably incompatible way.
  1505.  * That's why it's licence is not yet GPL. It will be released GPL once completed, but that's not this version yet.
  1506.  * @license For CB 1.1 internal use only. Copying outside CB not permitted, as it's not yet final. Thanks.
  1507.  */
  1508. class cbDrawController {
  1509. /** CB page navigator (and ordering)
  1510.  *  @var cbPageNav */
  1511. var $pageNav;
  1512. /** @var CBSimpleXMLElement */
  1513. var $_tableBrowserModel;
  1514. /**  <actions> element
  1515.  *  @var CBSimpleXMLElement*/
  1516. var $_actions;
  1517. var $_options;
  1518. var $_tableName;
  1519. var $_search;
  1520. var $_searchFields;
  1521. var $_filters;
  1522. var $_statistics;
  1523. var $_control_name;
  1524. function cbDrawController( $tableBrowserModel, $actions, $options ) {
  1525. $this->_tableBrowserModel =& $tableBrowserModel;
  1526. $this->_actions =& $actions;
  1527. $this->_options =  $options;
  1528. $this->_tableName = $tableBrowserModel->attributes( 'name' ); // TBD: does this really belong here ???!
  1529. }
  1530. function fieldName( $fieldName ) {
  1531. // search, toggle, idcid[], order[], subtask
  1532. $arrayBrackets = '';
  1533. if ( substr( $fieldName, -2 ) == '[]' ) {
  1534. $fieldName = substr( $fieldName, 0 , -2 );
  1535. $arrayBrackets = '[]';
  1536. }
  1537. return $this->_tableName . '[' . $fieldName . ']' . $arrayBrackets;
  1538. }
  1539. function fieldId( $fieldId, $number=null, $htmlspecs=true ) { //TBD: htmlspecialchars....
  1540. // id 
  1541. return 'cb' . $this->_tableName . $fieldId . $number;
  1542. }
  1543. function taskName( $subTask, $htmlspecs=true ) {
  1544. // for saveorder,  publish, unpublish, orderup, orderdown
  1545. return $this->_options['task'];
  1546. }
  1547. function fieldValue( $fieldName ) {
  1548. if ( $fieldName == 'search' ) {
  1549. return $this->_search;
  1550. }
  1551. return '';
  1552. }
  1553. function subtaskName( $htmlspecs=true ) {
  1554. // saveorder,  publish, unpublish, orderup, orderdown
  1555. return $this->fieldName( 'subtask' );
  1556. }
  1557. function subtaskValue( $subTask, $htmlspecs=true  ) {
  1558. return $subTask;
  1559. }
  1560. function setSearch( &$search, $searchFields ) {
  1561. $this->_search =& $search;
  1562. $this->_searchFields = $searchFields;
  1563. }
  1564. function hasSearchFields( ) {
  1565. return ( $this->_searchFields == true );
  1566. }
  1567. function quicksearchfields() {
  1568. $result = '';
  1569. if ( $this->hasSearchFields() ) {
  1570. if ( $this->pageNav !== null ) {
  1571. $onchangeJs = $this->pageNav->js_limitstart(0);
  1572. } else {
  1573. $onchangeJs = 'cbParentForm(this).submit();';
  1574. }
  1575. $result = '<input type="text" name="' . $this->fieldName( 'search' ) . '" value="' . $this->fieldValue( 'search' ) . '" class="text_area" '
  1576. . 'onchange="' . $onchangeJs . '"'
  1577. . ' />';
  1578. }
  1579. return $result;
  1580. }
  1581. /**
  1582.  * returns HTML code for the filters
  1583.  *
  1584.  * @param cbEditRowView $editRowView
  1585.  * @param string        $htmlFormatting  ( 'table', 'td', 'none' )
  1586.  * @return unknown
  1587.  */
  1588. function filters( &$editRowView, $htmlFormatting = 'none' ) {
  1589. global $_CB_framework;
  1590. $lists  = array();
  1591. if ( count( $this->_filters ) > 0 ) {
  1592. /*
  1593. if ( $this->pageNav !== null ) {
  1594. $onchangeJs = $this->pageNav->js_limitstart(0);
  1595. } else {
  1596. $onchangeJs = 'cbParentForm(this).submit();';
  1597. }
  1598. */
  1599. $valueObj = new stdClass();
  1600. $saveName = array();
  1601. foreach ( $this->_filters as $k => $v ) {
  1602. $valname = 'filter_' . $v['name'];
  1603. $valueObj->$valname = $v['value'];
  1604. // $filterXml = $v['xml'];
  1605. $saveName[$k] = $v['xml']->attributes( 'name' );
  1606. $this->_filters[$k]['xml']->addAttribute( 'name', 'filter_' . $saveName[$k] );
  1607. $editRowView->setSelectValues( $v['xml'], $v['selectValues'] );
  1608. }
  1609. $renderedViews = array();
  1610. foreach ( $this->_filters as $k => $v ) {
  1611. // <filter> tag: $v['xml']
  1612. $viewName = $v['xml']->attributes( 'view' );
  1613. if ( $viewName ) {
  1614. $view = $this->_filters[$k]['xmlparent']->getChildByNameAttr( 'view', 'name', $viewName );
  1615. if ( ! $view ) {
  1616. echo 'filter view ' . $viewName . ' not defined in filters';
  1617. }
  1618. } else {
  1619. $view = $this->_filters[$k]['xml']->getElementByPath( 'view' );
  1620. }
  1621. if ( $view ) {
  1622. if ( ( ! $viewName ) || ! in_array( $viewName, $renderedViews ) ) {
  1623. $lists[$k] = $editRowView->renderEditRowView( $view, $valueObj, $this, $this->_options, 'param', $htmlFormatting );
  1624. }
  1625. if ( $viewName ) {
  1626. $renderedViews[] = $viewName;
  1627. }
  1628. } else {
  1629. $editRowView->pushModelOfData( $valueObj );
  1630. $result = $editRowView->renderParam( $this->_filters[$k]['xml'], $this->control_name(), false );
  1631. $editRowView->popModelOfData();
  1632. $lists[$k] = '<div class="cbFilter">'
  1633. . '<span class="cbLabelSpan">' . $result[0] . '</span> '
  1634. . '<span class="cbDescrSpan">' . $result[2] . '</span>'
  1635. . '<span class="cbFieldSpan">' . $result[1] . '</span>'
  1636. . '</div>';
  1637. }
  1638. }
  1639. foreach ( $this->_filters as $k => $v ) {
  1640. $this->_filters[$k]['xml']->addAttribute( 'name', $saveName[$k] );
  1641. }
  1642. if ( count( $lists ) > 1 ) {
  1643. $adminimagesdir = $_CB_framework->getCfg( 'live_site' ) . '/components/com_comprofiler/images/';
  1644. $lists[] = '<div class="cbFilter"><input type="image" src="' . $adminimagesdir . '/search.gif" alt="' . _UE_SEARCH . '" align="top" style="border: 0px;" /></div>';
  1645. }
  1646. }
  1647. return $lists;
  1648. }
  1649. function setFilters( &$filters ){
  1650. $this->_filters = $filters;
  1651. }
  1652. function setStatistics( &$statsArray ) {
  1653. $this->_statistics =& $statsArray;
  1654. }
  1655. function & getStatistics( ) {
  1656. return $this->_statistics;
  1657. }
  1658. function control_name( ) {
  1659. return $this->_control_name;
  1660. }
  1661. function setControl_name( $control_name ) {
  1662. $this->_control_name = $control_name;
  1663. }
  1664. function drawUrl( $cbUri, &$sourceElem, &$data, $id, $htmlspecialchars = true, $inPage = true ) {
  1665. global $_CB_framework;
  1666. $ui = $_CB_framework->getUi();
  1667. if ( substr( $cbUri, 0, 4 ) == 'cbo:' ) {
  1668. $subTaskValue = substr( $cbUri, 4 );
  1669. switch ( $subTaskValue ) {
  1670. case 'newrow':
  1671. $id = 0;
  1672. // fallthrough: no break on purpose.
  1673. case 'rowedit': //TBD this is duplicate of below
  1674. $baseUrl = ( ( $ui != 2 ) ? ( $inPage ? 'index.php' : 'index2.php' ) : ( $inPage ? 'index2.php' : 'index3.php' ) );
  1675. $baseUrl .= '?option=' . $this->_options['option'] . '&task=' . $this->_options['task'] . '&cid=' . $this->_options['pluginid'];
  1676. $url = $baseUrl . '&table=' . $this->_tableBrowserModel->attributes( 'name' ) . '&action=editrow'; // below: . '&tid=' . $id;
  1677. break;
  1678. case 'editrows':
  1679. case 'deleterows':
  1680. case 'copyrows':
  1681. case 'publish':
  1682. case 'unpublish':
  1683. $url = 'javascript:cbDoListTask(this, ' // cb //TBD: this is duplicate of pager.
  1684. . "'" . $this->taskName( false ). "','"  // task
  1685. . $this->subtaskName( false ). "','"  // subtaskName
  1686. . $this->subtaskValue( $subTaskValue, false ) . "','"  // subtaskValue
  1687. . $this->fieldId( 'id', null, false ) . "'" // fldName
  1688. . ");";
  1689. break;
  1690. default:
  1691. $url = "UNDEFINED_URL-" . $cbUri;
  1692. break;
  1693. }
  1694. } elseif ( substr( $cbUri, 0, 10 ) == 'cb_action:' ) {
  1695. $actionName = substr( $cbUri, 10 );
  1696. $action =& $this->_actions->getChildByNameAttr( 'action', 'name', $actionName );
  1697. if ( $action ) {
  1698. $requestNames = explode( ' ', $action->attributes( 'request' ) );
  1699. $requestValues = explode( ' ', $action->attributes( 'action' ) );
  1700. $parametersValues = explode( ' ', $action->attributes( 'parameters' ) );
  1701. $baseUrl = ( ( $ui != 2 ) ? ( $inPage ? 'index.php' : 'index2.php' ) : ( $inPage ? 'index2.php' : 'index3.php' ) );
  1702. $baseUrl .= '?';
  1703. $baseRequests = array( 'option' => 'option', 'task' => 'task', 'cid' => 'pluginid' );
  1704. $urlParams = array();
  1705. foreach ( $baseRequests as $breq => $breqOptionsValue ) {
  1706. if ( ( ! ( in_array( $breq, $requestNames ) || in_array( $breq, $parametersValues ) ) ) && isset( $this->_options[$breqOptionsValue] ) ) {
  1707. $urlParams[$breq] = $breq . '=' . $this->_options[$breqOptionsValue];
  1708. }
  1709. }
  1710. $url = $baseUrl;
  1711. for ( $i = 0, $n = count( $requestNames ); $i < $n; $i++ ) {
  1712. $urlParams[$requestNames[$i]] = $requestNames[$i] . '=' . $requestValues[$i]; // other parameters = paramvalues added below
  1713. }
  1714. $url = $baseUrl . implode( '&', $urlParams );
  1715. } else {
  1716. $url = "#action_not_defined:" . $actionName;
  1717. }
  1718. } else {
  1719. $url = $cbUri;
  1720. }
  1721. if ( ! cbStartOfStringMatch( $url, 'javascript:' ) ) {
  1722. // get the parameters of action/link from XML :
  1723. $parametersNames = explode( ' ', $sourceElem->attributes( 'parameters' ) );
  1724. $parametersValues = explode( ' ', $sourceElem->attributes( 'paramvalues' ) );
  1725. $parametersValuesTypes = explode( ' ', $sourceElem->attributes( 'paramvaluestypes' ) );
  1726. // add currently activated filters to the parameters:
  1727. if ( count( $this->_filters ) > 0 ) {
  1728. foreach ( $this->_filters as $k => $v ) {
  1729. $filterName = $this->fieldName( $k );
  1730. if ( ( $v['value'] != $v['default'] ) && ( ! in_array( $filterName, $parametersNames ) ) ) {
  1731. $parametersNames[] = $filterName;
  1732. $parametersValues[] = "'" . $v['value'] . "'"; //TBD: check this.
  1733. }
  1734. }
  1735. }
  1736. // add current search string, if any:
  1737. $searchName = $this->fieldName( 'search' );
  1738. $searchValue = $this->fieldValue( 'search' );
  1739. if ( $searchValue && ( ! in_array( $searchName, $parametersNames ) ) ) {
  1740. $parametersNames[] = $searchName;
  1741. $parametersValues[] = "'" . $searchValue . "'";
  1742. }
  1743. // generate current action (and parameters ?) as cbprevstate
  1744. $cbprevstate = array();
  1745. foreach ( $this->_options as $req => $act ) {
  1746. if ( $req && $act && ! in_array( $req, array( 'cbprevstate' ) ) ) {
  1747. $cbprevstate[] = $req . '=' . $act;
  1748. }
  1749. }
  1750. $parametersNames[] = 'cbprevstate';
  1751. $parametersValues[] = "'" . base64_encode( implode( '&', $cbprevstate ) ) . "'";
  1752. // finally generate URL:
  1753. for ( $i = 0, $n = count( $parametersNames ); $i < $n; $i++ ) {
  1754. $nameOfVariable = $parametersValues[$i];
  1755. if ( $nameOfVariable ) {
  1756. if ( isset( $parametersValuesTypes[$i] ) && $parametersValuesTypes[$i] ) {
  1757. if ( $parametersValuesTypes[$i] == 'sql:field' ) {
  1758. $nameOfVariable = $data->$nameOfVariable;
  1759. } else {
  1760. // $nameOfVariable untouched
  1761. }
  1762. } elseif ( ( substr( $nameOfVariable, 0, 1 ) == "'" ) && ( substr( $nameOfVariable, -1 ) == "'" ) ) {
  1763. $nameOfVariable = substr( $nameOfVariable, 1, -1 );
  1764. } else {
  1765. $nameOfVariable = $data->$nameOfVariable;
  1766. }
  1767. $url .= '&' . $parametersNames[$i] . '=' . urlencode( $nameOfVariable );
  1768. }
  1769. }
  1770. }
  1771. if ( $htmlspecialchars ) {
  1772. $url = htmlspecialchars( $url );
  1773. }
  1774. return $url;
  1775. }
  1776. function drawPageNvigator( $positionType /* , $viewModelElement ??? */ ) {
  1777. }
  1778. function createPageNvigator( $total, $limitstart, $limit ) {
  1779. cbimport( 'cb.pagination' );
  1780. $this->pageNav = new cbPageNav( $total, $limitstart, $limit, array( &$this, 'fieldName' ), $this );
  1781. $this->pageNav->setControllerView( $this );
  1782. }
  1783. /* $this->pageNav =& $pageNav;
  1784. $this->filters =& $this->filters;
  1785. $this->search  =& $this->search;
  1786. */
  1787. } // class cbDrawController
  1788. ?>