/** * Lists all media items that are outstanding, for the user to add * meta data such as title/description * * @return string */ public function outstandingSection() { $this->setTitle(t('Manage uploaded files')); try { $category = $this->_model()->getCategory($this->_input->get('cid')); $resource = 'media-cat_upload_' . $category['id']; if (!$this->_acl->resourceExists($resource) || !$this->_acl->check($resource)) { throw new Module_NoPermission(); } $cid = (int) $category['id']; } catch (Input_KeyNoExist $e) { $cid = null; } catch (Media_CategoryNoExist $e) { $this->_event->error(t('Media category does not exist')); $cid = null; } /** * Work out which URL to redirect back to, since if we've come from * the 'config' cntrlr, we want to redirect back to that always. */ if (empty($_SESSION['previous_url']) || !empty($_SESSION['media']['fromConfigCntrlr'])) { $redirectUrl = $this->_router->makeUrl('media', 'config'); } else { $parsedPreviousUrl = new Router_Url($_SESSION['previous_url']); if ($parsedPreviousUrl->module == 'media' && $parsedPreviousUrl->controller == 'config') { $_SESSION['media']['fromConfigCntrlr'] = true; $redirectUrl = $this->_router->makeUrl('media', 'config'); } else { $redirectUrl = new Router_Url('media'); if (isset($category['identifier'])) { $redirectUrl->controller('cat')->section($category['identifier']); } } } // Get all outstanding media items $outstanding = $this->_model()->getOutstandingItems($cid); if (($count = count($outstanding)) == 0) { $this->_event->error(t('There are currently no outstanding media items')); return zula_redirect($redirectUrl); } else { $form = new View_form('manage/outstanding.html', 'media'); $form->addElement('media/cid', $cid, 'cid', new Validator_Confirm($cid)); $form->addElement('media/item', null, t('Items'), array(new Validator_Is('array'), new Validator_Length($count, $count))); if ($form->hasInput() && $form->isValid()) { /** * Update the title and description for all provided media items * however the ids must match the selecting outstanding items. */ $validItemIds = array_keys($outstanding); // Validate the provided values $validatorName = new Validator_Length(1, 255); $validatorDesc = new Validator_Length(0, 1000); $successCount = 0; foreach ($form->getValues('media/item') as $key => $item) { if (in_array($key, $validItemIds)) { $valid = true; if (($errorMsg = $validatorName->validate($item['name'])) !== true) { $valid = false; $this->_event->error(sprintf($errorMsg, t('Titles'))); } if (($errorMsg = $validatorDesc->validate($item['desc'])) !== true) { $valid = false; $this->_event->error(sprintf($errorMsg, t('Descriptions'))); } if ($valid) { $this->_model()->editItem($key, $item['name'], $item['desc']); unset($outstanding[$key]); ++$successCount; } } } // Redirect back to the correct location if ($successCount > 0) { $langStr = nt('Completed upload for 1 media item', 'Completed upload for %d media items', $successCount); $this->_event->success(sprintf($langStr, $successCount)); } if ($successCount == $count) { unset($_SESSION['media']['fromConfigCntrlr']); return zula_redirect($redirectUrl); } } $form->assign(array('CID' => $cid, 'OUTSTANDING' => $outstanding)); return $form->getOutput(); } }
/** * Takes data from a Router_Url instance and attempts to load the correct cntrlr * based upon that. * * @param Router_Url $request * @param array $config * @return string|bool */ public function dispatch(Router_Url $request, array $config = array()) { $this->dispatchData = $request->asArray(); $this->dispatchData['config'] = $config; unset($config); while ($preDispatch = Hooks::notify('cntrlr_pre_dispatch', $this->dispatchData)) { if (is_string($preDispatch)) { return $preDispatch; } else { if (is_array($preDispatch)) { $this->dispatchData = $preDispatch; } } } try { $module = new Module($this->dispatchData['module']); $loadedCntrlr = $module->loadController($this->dispatchData['controller'], $this->dispatchData['section'], $this->dispatchData['config'], 'SC'); $this->requestedCntrlr = $loadedCntrlr['cntrlr']; return $loadedCntrlr['output']; } catch (Module_NoPermission $e) { $this->statusCode = 403; } catch (Module_ControllerNoExist $e) { $this->statusCode = 404; } catch (Module_NoExist $e) { $this->statusCode = 404; } if ($this->setStatusHeader) { switch ($this->statusCode) { case 200: header('HTTP/1.1 200 OK'); break; case 403: header('HTTP/1.1 403 Forbidden'); break; case 404: header('HTTP/1.1 404 Not Found'); } } if ($this->displayErrors) { // Display own custom error message in place of the modules output $view = new View('errors/' . $this->statusCode . '.html'); $view->assign($this->dispatchData); $output = $view->getOutput(); # hook event: cntrrl_error_output while ($tmpOutput = Hooks::notify('cntrlr_error_output', $this->statusCode, $output)) { if (is_string($tmpOutput)) { $output = $tmpOutput; } } return $output; } else { return false; } }
/** * Allows the user to configure the module that is attached to a * sector. This, however, currently depends on JavaScript enabled. * * @return string */ public function indexSection($layoutName = null) { $this->setTitle(t('Edit module')); $this->setOutputType(self::_OT_CONFIG); // Check permission and if a layout has been provided if (!$this->_acl->check('content_layout_config_module')) { throw new Module_NoPermission(); } else { if ($layoutName === null) { $this->_event->error(t('Unable to edit attached module, no layout given')); return zula_redirect($this->_router->makeUrl('content_layout')); } } // Get correct cntrlr ID that is to be edited try { $cntrlrId = $this->_router->getArgument('id'); } catch (Router_ArgNoExist $e) { try { $cntrlrId = $this->_input->post('content_layout/cid'); } catch (Input_KeyNoExist $e) { $this->_event->error(t('Unable to edit attached module, no ID given')); return zula_redirect($this->_router->makeUrl('content_layout')); } } // Create the correct layout and ensure cntrlr exists $layout = new Layout($layoutName); try { $cntrlr = $layout->getControllerDetails($cntrlrId); $module = new Module($cntrlr['mod']); $this->setTitle(sprintf(t('Configure attached module "%1$s"'), $module->title)); if (!isset($cntrlr['config']['clDescription'])) { $cntrlr['config']['clDescription'] = ''; } } catch (Layout_ControllerNoExist $e) { $this->_event->error(sprintf(t('Unable to edit controller "%1$d" as it does not exist'), $cntrlrId)); return zula_redirect($this->_router->makeUrl('content_layout', 'manage', $layoutName)); } catch (Module_NoExist $e) { $this->_event->error(sprintf(t('Unable to edit attached module "%1$s" as it does not exist'), $cntrlr['mod'])); return zula_redirect($this->_router->makeUrl('content_layout', 'manage', $layoutName)); } /** * Prepare form validation */ $form = new View_form('edit/module.html', $this->getDetail('name'), false); $form->addElement('content_layout/config/displayTitle', $cntrlr['config']['displayTitle'], t('Display Title'), new Validator_InArray(array('true', 'false', 'custom'))); $form->addElement('content_layout/config/customTitle', $cntrlr['config']['customTitle'], t('Custom title'), new Validator_Length(0, 255)); $form->addElement('content_layout/config/htmlWrapClass', $cntrlr['config']['htmlWrapClass'], t('HTML class'), new Validator_Length(0, 500), $cntrlr['sector'] != 'SC'); $form->addElement('content_layout/config/clDescription', $cntrlr['config']['clDescription'], t('Description'), new Validator_Length(0, 255), $cntrlr['sector'] != 'SC'); $form->addElement('content_layout/cntrlr', null, t('Controller'), new Validator_Alphanumeric('_-.!+')); $form->addElement('content_layout/section', null, t('Section'), new Validator_Alphanumeric('_-.!+')); $form->addElement('content_layout/config', null, t('Config'), new Validator_Is('array'), false); if ($form->hasInput() && $form->isValid()) { $fd = $form->getValues('content_layout'); try { $layout->editController($cntrlr['id'], array('con' => $fd['cntrlr'], 'sec' => $fd['section'], 'order' => $cntrlr['order'], 'config' => isset($fd['config']) ? $fd['config'] : array())); try { $roles = $this->_input->post('acl_resources/layout_controller_' . $cntrlr['id']); } catch (Input_ValueNoExist $e) { $roles = array(); } $this->_acl->allowOnly('layout_controller_' . $cntrlr['id'], $roles); if ($layout->save()) { $this->_event->success(sprintf(t('Configured attached module ID "%d"'), $cntrlr['id'])); } else { $this->_event->error(t('Unable to save layout, ensure file is writable')); } } catch (Layout_ControllerNoExist $e) { $this->_event->error(sprintf(t('Unable to edit attached module ID "%d" as it does not exist'), $cntrlr['id'])); } catch (Theme_SectorMapNotWriteable $e) { $this->_event->error(sprintf(t('Unable to edit module in sector map: $s'), $e->getMessage())); } // Redirect back to correct location, FPSC layouts go back to index $url = new Router_Url('content_layout'); $url->siteType($this->_router->getSiteType()); if (strpos($layoutName, 'fpsc-') === 0) { $url->queryArgs(array('type' => substr($layoutName, 5))); } else { $url->controller('manage')->section($layoutName); } return zula_redirect($url); } /** * Gets all displays modes that this module offers, the current display * mode being used - once done start building up the form. */ $displayModes = Hooks::notifyAll($module->name . '_display_modes'); $currentMode = Hooks::notifyAll($module->name . '_resolve_mode', $cntrlr['con'], $cntrlr['sec'], $cntrlr['config']); $this->addAsset('js/edit.js'); $form->assign(array('CID' => $cntrlr['id'], 'LAYOUT_NAME' => $layoutName, 'SECTOR' => $cntrlr['sector'], 'MODULE' => $module->getDetails(), 'DISPLAY_MODES' => empty($displayModes) ? array('default' => t('Default')) : $displayModes, 'CURRENT_MODE' => empty($currentMode) ? 'default' : $currentMode[0])); $jsConfig = array_merge($cntrlr, $cntrlr['config']); unset($jsConfig['config']); $form->assignHtml(array('JS_CONFIG' => zula_array_js_string($jsConfig), 'ACL_FORM' => $this->_acl->buildForm(array(t('View attached module') => 'layout_controller_' . $cntrlr['id'])))); return $form->getOutput(); }
/** * Makes a correct URL needed for all of the pagination links * * @param int $page * @return string */ protected function makeUrl($page = 1) { $page = abs($page); if ($this->requestPath) { $url = new Router_Url($this->requestPath); } else { // Use the current parsed URL as a base $url = new Router_Url($this->_router->getRawRequestPath()); if ($this->appendQuery) { $url->queryArgs($this->_router->getParsedUrl()->getAllQueryArgs()); } } if ($page > 1) { $url->queryArgs(array($this->urlArgument => $page)); } else { $url->removeQueryArgs($this->urlArgument); } return $url->make(); }
/** * Constructs a new URL and returns the Router_Url object * * @param string $module * @param string $controller * @param string $section * @param string $siteType * @param array $arguments * @return object */ public function makeUrl($module, $controller = null, $section = null, $siteType = null, $arguments = array()) { if ($siteType == null) { $siteType = $this->getSiteType(); } if (preg_match('@(?:/|#|\\?)@', $module) == false) { $url = new Router_Url(); $url->siteType($siteType)->module($module)->controller($controller)->section($section)->arguments($arguments); } else { $url = new Router_Url($module); # Module given was infact a request path, use that. } return $url; }