You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
198 lines
4.2 KiB
198 lines
4.2 KiB
13 years ago
|
<?php
|
||
|
|
||
|
/**
|
||
|
* Controller
|
||
|
*
|
||
|
*
|
||
|
*
|
||
|
* @author Laurent Opprecht <laurent@opprecht.info> for the Univesity of Genevas
|
||
|
* @license see /license.txt
|
||
|
*/
|
||
|
class Controller
|
||
|
{
|
||
|
|
||
|
const PARAM_ACTION = 'action';
|
||
|
|
||
|
protected $access;
|
||
|
|
||
|
protected function __construct($access = null)
|
||
|
{
|
||
|
$access = $access ? $access : Access::all();
|
||
|
$this->access = $access;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
* @return \Access
|
||
|
*/
|
||
|
public function access()
|
||
|
{
|
||
|
return $this->access;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* List of actions accepted by the controller.
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public function get_actions()
|
||
|
{
|
||
|
$reflector = new ReflectionClass($this);
|
||
|
$constants = $reflector->getConstants();
|
||
|
$result = array();
|
||
|
foreach ($constants as $key => $value) {
|
||
|
if (strpos($key, 'ACTION') !== false) {
|
||
|
$result[$key] = $value;
|
||
|
}
|
||
|
}
|
||
|
return $result;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Action to perform.
|
||
|
* Returns the request parameter.
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
public function get_action()
|
||
|
{
|
||
|
$result = Request::get(self::PARAM_ACTION);
|
||
|
$actions = $this->get_actions();
|
||
|
$result = in_array($result, $actions) ? $result : '';
|
||
|
return $result;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set up the environment. Set up breadcrumps, raise tracking event, etc.
|
||
|
*/
|
||
|
protected function prolog()
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Whether the call is authorized or not.
|
||
|
*
|
||
|
* @return boolean
|
||
|
*/
|
||
|
public function authorize()
|
||
|
{
|
||
|
return $this->access()->authorize();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns a string containing dynamic javascript to be included in the template.
|
||
|
* This requires a {{javascript}} tag in a twigg template to appear.
|
||
|
*
|
||
|
* Note:
|
||
|
*
|
||
|
* A better approach to this method is to create a twigg "javascript"
|
||
|
* template and to include it where required.
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
public function javascript()
|
||
|
{
|
||
|
return '';
|
||
|
}
|
||
|
|
||
|
// public function check_token()
|
||
|
// {
|
||
|
// return (bool) Security::check_token('get');
|
||
|
// }
|
||
|
|
||
|
/**
|
||
|
* Run the controller. Dispatch action and execute requested tasks.
|
||
|
*/
|
||
|
public function run()
|
||
|
{
|
||
|
if (!$this->authorize()) {
|
||
|
$this->forbidden();
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
$this->prolog();
|
||
|
$action = $this->get_action();
|
||
|
if (empty($action)) {
|
||
|
$this->unknown();
|
||
|
return;
|
||
|
}
|
||
|
$f = array($this, $action);
|
||
|
if (is_callable($f)) {
|
||
|
call_user_func($f);
|
||
|
} else {
|
||
|
$this->missing();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Unknown action. I.e. the action has not been registered.
|
||
|
* Possibly missing action declaration:
|
||
|
*
|
||
|
* const ACTION_XXX = 'XXX';
|
||
|
*
|
||
|
* @return boolean
|
||
|
*/
|
||
|
public function unknown()
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
* @return boolean
|
||
|
*/
|
||
|
public function forbidden()
|
||
|
{
|
||
|
api_not_allowed();
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Action exists but implementation is missing.
|
||
|
*/
|
||
|
public function missing()
|
||
|
{
|
||
|
echo 'No implementation';
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Render a template using data. Adds a few common parameters to data.
|
||
|
*
|
||
|
* @see /main/template/default/course_description/
|
||
|
* @param string $template
|
||
|
* @param array $data
|
||
|
*/
|
||
|
protected function render($template_name, $data)
|
||
|
{
|
||
|
$data = (object) $data;
|
||
|
$data->www = \Chamilo::url();
|
||
|
$data->messages = isset($data->messages) ? $data->messages : array();
|
||
|
$javascript = $this->javascript();
|
||
|
if ($javascript) {
|
||
|
$data->javascript = $javascript;
|
||
|
}
|
||
|
|
||
|
$tpl = new Template();
|
||
|
foreach ($data as $key => $value) {
|
||
|
$tpl->assign($key, $value);
|
||
|
}
|
||
|
$template = $tpl->get_template($template_name);
|
||
|
$content = $tpl->fetch($template);
|
||
|
$tpl->assign('content', $content);
|
||
|
$tpl->display_one_col_template();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Render data as JSON
|
||
|
*
|
||
|
* @param any $data
|
||
|
*/
|
||
|
protected function render_json($data)
|
||
|
{
|
||
|
Header::content_type_json();
|
||
|
echo json_encode($data);
|
||
|
}
|
||
|
|
||
|
}
|