Chamilo is a learning management system focused on ease of use and accessibility
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.
chamilo-lms/main/inc/lib/controller.class.php

198 lines
4.2 KiB

<?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);
}
}