/** * Checks if UddeIM is installed; if it is then load its API * * @return bool */ private function isInstalled() { global $_CB_framework, $_PLUGINS; $absPath = $_CB_framework->getCfg('absolute_path'); if (!file_exists($absPath . '/components/com_uddeim/uddeim.php')) { $_PLUGINS->_setErrorMSG(CBTxt::T('UDDEIM_NOT_INSTALLED', 'The UddeIM private message system is not installed.')); return false; } static $loaded = 0; if (!$loaded++) { $this->loadLib(); /** @noinspection PhpIncludeInspection */ require_once $absPath . '/administrator/components/com_uddeim/admin.shared.php'; /** @noinspection PhpIncludeInspection */ require_once $absPath . '/components/com_uddeim/bbparser.php'; /** @noinspection PhpIncludeInspection */ require_once $absPath . '/components/com_uddeim/includes.php'; /** @noinspection PhpIncludeInspection */ require_once $absPath . '/components/com_uddeim/includes.db.php'; /** @noinspection PhpIncludeInspection */ require_once $absPath . '/components/com_uddeim/crypt.class.php'; /** @noinspection PhpIncludeInspection */ require_once $absPath . '/administrator/components/com_uddeim/config.class.php'; $this->uddeIMConfigRAW = new uddeimconfigclass(); uddeIMloadLanguage($absPath . '/administrator/components/com_uddeim', $this->uddeIMConfigRAW); $this->uddeIMConfig->load($this->uddeIMConfigRAW); } return true; }
/** * Handles the backend plugin edition * * @param string $option * @param string $action * @param SimpleXMLElement $element * @param string $mode * @return string HTML * * @throws \LogicException */ public function drawView($option, $action, $element, $mode) { global $_CB_Backend_Menu; $ui = $this->clientId == 1 ? 2 : 1; $context = new Context(); $pluginParams = $context->getParams(); $interfaceUi = $ui == 2 ? 'admin' : 'frontend'; $adminActionsModel = $element->getChildByNameAttr('actions', 'ui', $interfaceUi); if (!$adminActionsModel) { $adminActionsModel = $element->getChildByNameAttr('actions', 'ui', 'all'); } if (!$adminActionsModel) { throw new \LogicException('No ' . $interfaceUi . ' actions defined in XML'); } // Check permission if specified: if (!Access::authorised($adminActionsModel)) { return CBTxt::T("Access to these actions is not authorized by the permissions of your user groups."); } // General-purpose extenders: $extenders = $adminActionsModel->xpath('extend'); /** @var SimpleXMLElement[] $extenders */ foreach ($extenders as $k => $extends) { $error = RegistryEditView::extendXMLnode($extenders[$k], $element, null, $context->getPluginObject()); if ($error) { echo $error; } } $found = false; $actionPath = array(); if ($action) { $actionsModel = $adminActionsModel->getChildByNameAttr('action', 'name', $action); $found = $actionsModel != null; if ($found) { $requests = explode(' ', $actionsModel->attributes('request')); $values = explode(' ', $actionsModel->attributes('action')); $actionPath = array(); for ($i = 0, $n = count($requests); $i < $n; $i++) { $actionPath[$requests[$i]] = $values[$i]; } } } if (!$found) { // EVENT: select the event from URL and compute the selected $actionPath $found = false; $actionsModel = null; foreach ($adminActionsModel->children() as $actionsModel) { /** @var SimpleXMLElement $actionsModel */ $request = $actionsModel->attributes('request'); if ($request) { $requests = explode(' ', $request); $values = explode(' ', $actionsModel->attributes('action')); $actionPath = array(); for ($i = 0, $n = count($requests); $i < $n; $i++) { $actionPath[$requests[$i]] = $this->input->get($requests[$i], null, GetterInterface::STRING); // Temporary fix for older versions of CBSubs before CBSubs 4.0.0 stable to avoid warnings on ajax version checks: if ($requests[$i] === 'view' && $actionPath['view'] === null) { $actionPath['view'] = $this->input->get('task', null, GetterInterface::STRING); } if ($actionPath[$requests[$i]] != $values[$i]) { break; } } if ($i == $n) { $found = true; break; } } } } if (!$found) { $actionPath = array(); // try finding first default one: if ($ui == 2) { $actionsModel = $adminActionsModel->getChildByNameAttr('action', 'request', ''); } if (!isset($actionsModel)) { return CBTxt::T('AHAWOW_REQUESTED_ACTION_NOT_DEFINED_IN_XML', "Requested action '[ACTION]' not defined in XML.", array('[ACTION]' => htmlspecialchars($action))); } } // Check permission if specified: if (!isset($actionsModel) || !Access::authorised($actionsModel)) { return CBTxt::T("This action is not authorized by the permissions of your user groups."); } if (!isset($actionPath['view'])) { $actionPath['view'] = $ui == 2 ? 'editPlugin' : ''; //TODO: 2nd should come from target routing } elseif ($actionPath['view'] != 'editPlugin') { $actionPath['act'] = ''; } // EVENT: fetch the input parameters from URL: $parametersNames = explode(' ', $actionsModel->attributes('requestparameters')); $parametersValues = array(); foreach ($parametersNames as $paraNam) { $parametersValues[$paraNam] = null; if (strpos($paraNam, '[') === false) { if (trim($paraNam)) { $parametersValues[$paraNam] = $this->input->get($paraNam, '', GetterInterface::STRING); } } else { $matches = null; preg_match_all('/(.*)(?:\\[(.*)\\])+/', $paraNam, $matches); if (is_array($matches) && count($matches) >= 3 && count($matches[2]) >= 1) { $parametersValues[$paraNam] = $this->input->get($matches[1][0] . '.' . $matches[2][0], null, GetterInterface::STRING); } } } $keyValues = array(); // Action-specific general extenders: $extenders = $adminActionsModel->xpath('actionspecific/extend'); /** @var SimpleXMLElement[] $extenders */ foreach ($extenders as $k => $extends) { $error = RegistryEditView::extendXMLnode($extenders[$k], $element, $actionsModel, $context->getPluginObject()); if ($error) { echo $error; } } // First extend what can be extended so the showview's below have a complete XML tree: /** @var $actionItem SimpleXMLElement */ foreach ($actionsModel->xpath('extend') as $actionItem) { $error = RegistryEditView::extendXMLnode($actionItem, $element, $actionsModel, $context->getPluginObject()); if ($error) { echo $error; } } /** @var $actionItem SimpleXMLElement */ foreach ($actionsModel->children() as $actionItem) { // CONTROLLER: select the controller: switch ($actionItem->getName()) { case 'extend': // Treated just above. break; case 'showview': $viewName = $actionItem->attributes('view'); $showviewType = $actionItem->attributes('type'); $viewMode = $actionItem->attributes('mode'); // MODEL: load data to view: $dataModel = $actionItem->getElementByPath('data'); if ($dataModel) { $dataModelType = $dataModel->attributes('type'); $cbDatabase = $this->db; if (in_array($dataModelType, array('sql:row', 'sql:multiplerows', 'sql:field', 'parameters'))) { $xmlsql = new XmlQuery($cbDatabase, null, $pluginParams); $data = $xmlsql->loadObjectFromData($dataModel); if ($data === null) { return 'showview::sql:row: load failed: ' . $cbDatabase->getErrorMsg(); } $dataModelValueName = $dataModel->attributes('value'); $dataModelValueType = $dataModel->attributes('valuetype'); // if the value of key is a parameter name, replace it with the corresponding parameter: $dataModelValueTypeArray = explode(':', $dataModelValueType); if ($dataModelValueTypeArray[0] == 'request') { if (isset($parametersValues[$dataModelValueName])) { $dataModelValue = $parametersValues[$dataModelValueName]; // database escaping to int is done at request time $keyValues[$dataModelValueName] = $dataModelValue; unset($parametersValues[$dataModelValueName]); } else { echo sprintf('showview::sql::row %s: request %s not in parameters of action.', $dataModel->attributes('name'), $dataModelValueName); } } if ($dataModelType == 'sql:field') { $data = new Registry($data); } } elseif ($dataModelType == 'class') { $dataModelClass = $dataModel->attributes('class'); $dataModelValue = $dataModel->attributes('value'); $dataModelValueName = $dataModelValue; $dataModelValueType = $dataModel->attributes('valuetype'); $dataModelValueTypeArray = explode(':', $dataModelValueType); if ($dataModelValueTypeArray[0] == 'request') { if (isset($parametersValues[$dataModelValueName])) { $dataModelValue = $parametersValues[$dataModelValueName]; $keyValues[$dataModelValueName] = $dataModelValue; unset($parametersValues[$dataModelValueName]); } else { echo sprintf('showview::sql::row %s: request %s not in parameters of action.', $dataModel->attributes('name'), $dataModelValue); } } if (strpos($dataModelClass, '::') === false) { $data = new $dataModelClass($cbDatabase); // normal clas="className" /** @var $data TableInterface */ $data->load($dataModelValue); } else { $dataModelSingleton = explode('::', $dataModelClass); // class object loader from singleton: class="loaderClass::loadStaticMethor" with 1 parameter, the key value. if (is_callable($dataModelSingleton)) { if (is_callable(array($dataModelSingleton[0], 'getInstance'))) { $instance = call_user_func_array(array($dataModelSingleton[0], 'getInstance'), array(&$cbDatabase)); $rows = call_user_func_array(array($instance, $dataModelSingleton[1]), array($dataModelValue)); } else { $rows = call_user_func_array($dataModelSingleton, array($dataModelValue)); } } else { echo sprintf('showview::class %s: missing singleton class creator %s.', $dataModel->attributes('name'), $dataModelClass); $std = new \stdClass(); $rows = array($std); } $data = $rows[0]; } } else { $data = null; echo 'showview: Data model type ' . $dataModelType . ' is not implemented !'; } } else { if ($this->_data instanceof TableInterface || $this->_data instanceof \comprofilerDBTable) { $data = $this->_data; $dataModelType = 'sql:row'; } elseif ($this->_data instanceof ParamsInterface) { $data = $this->_data; $dataModelType = 'sql:row'; } else { $data = null; $dataModelType = null; } } // VIEW: select view: $allViewsModels = $element->getElementByPath('views'); if ($viewName && (!$showviewType || $showviewType == 'view')) { ////// $viewModel = $allViewsModels->getChildByNameAttributes( 'view', array( 'name' => $viewName ) ); $xpathUi = '/*/views/view[@ui="' . $interfaceUi . '" and @name="' . $viewName . '"]'; $xpathAll = '/*/views/view[@ui="all" and @name="' . $viewName . '"]'; $viewModel = $element->xpath($xpathUi); if (!$viewModel) { $viewModel = $element->xpath($xpathAll); } if (!$viewModel) { $viewModel = RegistryEditView::xpathWithAutoLoad($element, $xpathUi); } if (!$viewModel) { $viewModel = RegistryEditView::xpathWithAutoLoad($element, $xpathAll); } /* if ( ! $viewModel ) { $viewModel = RegistryEditView::xpathWithAutoLoad( $element, '/ * / views/view[not(@ui) and @name="' . $viewName . '"]' ); } */ if ($viewModel) { $viewModel = $viewModel[0]; } else { return 'XML:showview: View ' . $viewName . ' not defined in ui ' . $interfaceUi . ' in XML'; } } elseif ($showviewType == 'xml') { // e.g.: <showview name="gateway_paymentstatus_information" mode="view" type="xml" file="processors/{payment_method}/edit.gateway" path="/*/views/view[@name="paymentstatusinformation"]" mandatory="false" /> $fromNode = $actionItem->attributes('path'); $fromFile = $actionItem->attributes('file'); if ($fromNode && $fromFile !== null) { // $this->substituteName( $fromFile, true ); // $this->substituteName( $fromNode, false ); $fromFile = $context->getPluginPath() . '/' . $fromFile . '.xml'; if ($fromFile === '' || is_readable($fromFile)) { if ($fromFile === '') { $fromRoot = $element; } else { $fromRoot = new SimpleXMLElement($fromFile, LIBXML_NONET | (defined('LIBXML_COMPACT') ? LIBXML_COMPACT : 0), true); } $viewModel = $fromRoot->xpath($fromNode); if (!$viewModel) { trigger_error('Admin:showview: View ' . $viewName . ': file ' . $fromFile . ', path: ' . $fromNode . ' does not exist or is empty.', E_USER_NOTICE); } $viewModel = $viewModel[0]; } else { throw new \LogicException('Admin:showview: View ' . $viewName . ': file ' . $fromFile . ' does not exist or is not readable.'); } } else { throw new \LogicException('Admin:showview: View ' . $viewName . ' file or path not defined..', E_USER_NOTICE); } } else { throw new \LogicException('Admin:showview: View ' . $viewName . ' not of supported type.', E_USER_NOTICE); } $viewUi = $viewModel->attributes('ui'); if ($viewUi & $viewUi != 'all' && $viewUi != $interfaceUi) { throw new \LogicException('showview: View ' . $viewName . ' not allowed for ' . $interfaceUi); } $extendedParser = $allViewsModels->getElementByPath('extendxmlparser'); $actionPath = array_merge($actionPath, $keyValues); $options = array_merge($this->getBaseOptions(), $actionPath, $parametersValues); if ($ui == 2) { $options = array_merge($options, $actionPath, $parametersValues); } $cbprevstate = $this->input->get('cbprevstate', null, GetterInterface::STRING); $params = new RegistryEditController($this->input, $this->db, new Registry(), $viewModel, $element, $context->getPluginObject()); $displayData = $this->bindInput($viewMode, $data); // Set the parameters with the $displayData : $registry = new Registry(); $registry->load($displayData); $registry->setStorage($displayData); $params->setRegistry($registry); $params->setPluginParams($pluginParams); $params->setOptions($options); if ($extendedParser) { $params->setExtendedViewParser($extendedParser); } $extenders = $allViewsModels->xpath('extend'); foreach ($extenders as $extends) { RegistryEditView::extendXMLnode($extends, $element, $actionsModel, $context->getPluginObject()); } $viewType = $viewModel->attributes('type'); switch ($viewType) { case 'params': if ($mode == 'edit') { if ($viewMode == 'edit' || $viewMode == 'show') { $viewTypeMode = $viewMode == 'edit' ? 'param' : 'view'; if ($ui == 2) { $htmlOutput = $this->input->get('no_html', 0, GetterInterface::COMMAND) != 1 && $this->input->get('format', null, GetterInterface::COMMAND) != 'raw'; ActionViewAdmin::editPluginView($options, $actionPath, $viewModel, $displayData, $params, $context->getPluginObject(), $viewTypeMode, $cbprevstate, $htmlOutput); $settings = null; $html = null; } else { /** @global \stdClass $_CB_Backend_Menu : 'show' : only displays close button, 'edit' : special close button */ global $_CB_Backend_Menu; $_CB_Backend_Menu = new \stdClass(); $html = ''; outputCbTemplate(); outputCbJs(); // $_CB_framework->outputCbJQuery( '' ); initToolTip(); $htmlFormatting = $viewModel->attributes('viewformatting'); if (!$htmlFormatting) { global $ueConfig; if (isset($ueConfig['use_divs']) && $ueConfig['use_divs'] == 1) { $htmlFormatting = 'div'; } else { $htmlFormatting = 'table'; } } $settings = $params->draw(null, null, null, null, null, null, false, $viewTypeMode, $htmlFormatting); } if ($ui == 2) { $_CB_Backend_Menu->mode = $viewMode; // Implemented in lower level in RegistryEditView: $toolbarMenu = $viewModel->getElementByPath( 'toolbarmenu' ); } if ($ui != 2) { $actionView = new ActionView(); $buttonSaveText = $actionsModel->attributes('label'); if (!$buttonSaveText) { $buttonSaveText = 'Save'; } $buttonSaveText = CBTxt::Th($buttonSaveText); // CBTxt::Th("Save"); For translation strings extraction $warning = null; if ($viewTypeMode == 'param') { $settings .= '<div class="cbControlButtonsLine">' . "\n\t" . '<span class="cb_button_wrapper">' . '<button type="submit" name="actbutton" value="' . 'save' . $action . '" class="button cbregButton cbregSaveButton">' . $buttonSaveText . '</button>' . '</span>' . "\n\t" . '</div>' . "\n"; $postedActionPath = $actionPath; unset($postedActionPath['view']); $formHiddens = array_merge($this->getBaseOptions(), array('act' => 'save' . $action), $postedActionPath); } else { $formHiddens = null; } $html .= $actionView->drawForm($settings, $warning, $formHiddens, array_merge($this->_getParams, array('act' => $action)), RegistryEditView::buildClasses($viewModel)); return $html; } } else { echo 'showview::params: mode is ' . $mode . ' but view mode is ' . $viewMode . ' instead of edit.'; } } elseif (in_array($mode, array('apply', 'save', 'savenew', 'savecopy'))) { $this->savePluginView($options, $actionPath, $keyValues, $parametersValues, $viewModel, $data, $params, $mode, $dataModelType, $context->getPluginObject(), $dataModel, $pluginParams, $cbprevstate, $ui); if ($ui == 2 && $mode == 'apply') { // We arrive here only in case of saving error, as redirect (performed in savePluginView) would loose the inputs: return $this->drawView($option, $action, $element, 'edit'); } } else { echo 'showview::params: view type params mode ' . $mode . ' is not implemented !'; } break; default: echo 'showview::not-params: type of view ' . $viewType . ' is not implemented !'; break; } break; default: echo 'action::not-showview: child xml element "' . $actionItem->getName() . '" of action is not implemented !'; break; } } return null; }
/** * @param Table $trigger * @param Registry $params */ public static function usergroup( &$trigger, &$params ) { $usergroupCount = substr_count( $trigger->get( 'params' ), 'usergroup_mode' ); if ( $usergroupCount ) { $newParams = array(); $newParams['usergroup'] = array(); $paramsMap = array( 'usergroup_mode' => 'mode', 'usergroup_parent' => 'parent', 'usergroup_title' => 'title', 'usergroup_add' => 'add', 'usergroup_groups' => 'groups' ); for ( $i = 0, $n = $usergroupCount; $i < $n; $i++ ) { if ( $i == 0 ) { $i = null; } $usergroup = array(); foreach ( $paramsMap as $old => $new ) { $usergroup[$new] = $trigger->get( 'params' )->get( $old . $i, null, GetterInterface::RAW ); } $newParams['usergroup'][] = $usergroup; } $params->load( $newParams ); } }
/** * Sets the namespace registry of this editor * * @param string $name * @param object $object */ public function setNamespaceRegistry($name, $object) { $registry = new Registry(); $registry->load($object); $registry->setStorage($object); $this->registryEditController->getEditedParams()->setNamespaceRegistry($name, $registry); }