. * * @filesource vols_avion.php * @package controllers * * Contrôleur générique */ /** * Le controleur GVV parent de la plupart des controleurs fournit les services * suivant: * - fonctions page, edit, create * - verification des droits d'accés * - une vue page et une vue forumlaire * - un modèle de référence */ class Gvv_Controller extends CI_Controller { protected $controller; protected $model; protected $kid; protected $modification_level; protected $view_level; public $table_view; protected $form_view; protected $unit_test = FALSE; // régles de validation protected $fields = array (); // Données transmises au formulaire protected $data = array (); /** * Constructeur */ function __construct() { $model_name = $this->model; parent::__construct(); date_default_timezone_set("Europe/Paris"); $this->load->library('DX_Auth'); if (getenv('TEST') != '1') { // Checks to be done only when not controlled by PHPUnit $this->dx_auth->check_login(); } $this->lang->load('gvv'); $this->load->helper('date'); $this->load->helper('validation'); $this->table_view = $this->controller . "/tableView"; $this->form_view = $this->controller . "/formView"; $this->popup_view = $this->controller . "/popupView"; // remplit les selecteurs depuis la base $this->load->model($model_name, 'gvv_model'); $this->kid = $this->gvv_model->primary_key(); if (! $this->session->userdata('year')) { $this->session->set_userdata('year', date('Y')); } if (! $this->session->userdata('per_page')) { $this->session->set_userdata('per_page', PER_PAGE); } if (! $this->session->userdata('licence_type')) { $this->session->set_userdata('licence_type', 0); } } /** * Génération des éléments statiques à passer au formulaire en cas de création, * modification ou réaffichage après erreur. * Sont statiques les parties qui ne changent * pas d'un élément sur l'autre. * * @param $action CREATION * | MODIFICATION | VISUALISATION * @see constants.php */ protected function form_static_element($action) { $this->data ['action'] = $action; $this->data ['fields'] = $this->fields; $this->data ['controller'] = $this->controller; if ($action == "visualisation") { $this->data ['readonly'] = "readonly"; } } /** * Affiche le formulaire de création */ function create() { if (func_num_args() > 0) { $no_view_loading = func_get_arg(0); } // initialise les valeurs par défaut // if (isset($this->rules)) { // Méthode basée sur les méta-données $table = $this->gvv_model->table(); $this->data = $this->gvvmetadata->defaults_list($table); // } else { // @deprecated //foreach ( $this->fields as $field => $value ) { //$this->data [$field] = (array_key_exists('default', $value)) ? $value ['default'] : ''; //} //} $this->form_static_element(CREATION); if (! isset($no_view_loading)) { return load_last_view($this->form_view, $this->data, $this->unit_test); } else { return ""; } } /** * Supprime un élèment */ function delete($id) { // détruit en base $this->pre_delete($id); $this->gvv_model->delete(array ( $this->kid => $id )); // réaffiche la liste (serait sympa de réafficher la même page) redirect($this->controller . "/page"); } /** * Affiche le formulaire de modification * * @param $id de * l'élément à modifier * @param $load_view = * TRUE si il faut afficher la vue * @param $action CREATION * | MODIFICATION | VISUALISATION */ function edit($id = "", $load_view = TRUE, $action = MODIFICATION) { // charge les données $this->data = $this->gvv_model->get_by_id($this->kid, $id); // TODO le faire aussi en production // Cela améliorera la qualité du code de signaler tous les tentatives d'accès à des données inconnues // Cependant il faut être sur que les exceptions sont traitées partout if (ENVIRONMENT == 'development') { if (count($this->data) < 1) { throw new Exception("$id not found"); } } $this->form_static_element($action); $this->session->set_userdata('inital_id', $id); $this->data [$this->kid] = $id; if ($load_view) { return load_last_view($this->form_view, $this->data, $this->unit_test); } } /** * Vérifie que l'élément n'existe pas déjà en base de données * * @param unknown_type $id */ // TODO a renomer en do_not_exist function check_uniq($id) { if ($id == "") return TRUE; if ($this->gvv_model->count(array ( $this->kid => $id )) > 0) { $this->form_validation->set_message('check_uniq', $this->lang->line("check_uniq")); return FALSE; } else { return $id; } } /** * Validation des dates postérieures à la date de gel */ function valid_activity_date($date) { // Special date validation under watir if ($this->config->item('watir')) { gvv_debug("watir date format = " . $date); if (preg_match('/(\d{2,2})(\d{2,2})(\d{4,4})/', $date, $matches)) { $day = $matches [1]; $month = $matches [2]; $year = $matches [3]; // force the date $date = $day . '/' . $month . '/' . $year; } } // check that it is a regular date if (! $this->valid_date($date)) { gvv_debug("non valide date " . $date); return false; } $date_gel = $this->config->item('date_gel'); $this->form_validation->set_message('valid_activity_date', "Date antérieure au " . $date_gel); if (preg_match('/(\d+)\/(\d+)\/(\d+)/', $date, $matches)) { $day = $matches [1]; $month = $matches [2]; $year = $matches [3]; $time = mktime(0, 0, 0, $month, $day, $year); if (preg_match('/(\d+)\/(\d+)\/(\d+)/', $date_gel, $matches)) { $day = $matches [1]; $month = $matches [2]; $year = $matches [3]; $freeze_time = mktime(0, 0, 0, $month, $day, $year); return $time > $freeze_time; } } else { return FALSE; } return TRUE; } /** * Validation de la date * * Tout le boulot est fait dans le helper, mais je n'arrive pas à réferencer autre chose que des * fonctions locales dans les règles de validation. * * @param string $date * @return boolean */ function valid_date($date) { if ($date == '') return ''; $this->form_validation->set_message('valid_date', $this->lang->line("valid_activity_date")); if (preg_match('/(\d+)\/(\d+)\/(\d+)/', $date, $matches)) { $day = $matches [1]; $month = $matches [2]; $year = $matches [3]; // echo "day=$day, month=$month, year=$year" . br(); if (! checkdate($month, $day, $year)) { return FALSE; } } else { return FALSE; } if ($res = mysql_date($date)) { // do not return a modified date or the field will not be repopulated correctly return TRUE; } else { return FALSE; } } /** * Validation des heures * * Tout le boulot est fait dans le helper, mais je n'arrive pas à réferencer autre chose que des * fonctions locales dans les règles de validation. * * @param unknown_type $time * @return boolean */ function valid_time($time) { if ($res = mysql_time($time)) { return $res; } else { $this->form_validation->set_message('valid_time', $this->lang->line("valid_minute_time")); return FALSE; } } /** * * Validation des temps en minute * * @param unknown_type $time */ function valid_minute_time($time) { // Todo: the error messages should be localized $res = mysql_minutes($time); if ($res < 0) { $this->form_validation->set_message('valid_minute_time', $this->lang->line("valid_minute_time")); return FALSE; } if (!$res) { $this->form_validation->set_message('valid_minute_time', $this->lang->line("valid_minute_time")); return FALSE; } return $res; } /** * * Validation des requêtes sql * * @param unknown_type $sql */ function safe_sql($sql) { if (preg_match('/drop/', $sql) || preg_match('/delete/', $sql)) { $this->form_validation->set_message('safe_sql', $this->lang->line("safe_sql")); gvv_debug("safe_sql unsafe $sql"); return FALSE; } if (preg_match('/update/', $sql)) { $this->form_validation->set_message('safe_sql', $this->lang->line("safe_sql_update")); gvv_debug("safe_sql unsafe $sql"); return FALSE; } if (! preg_match('/select/', $sql)) { $this->form_validation->set_message('safe_sql', $this->lang->line("safe_sql_select")); gvv_debug("safe_sql unsafe $sql"); return FALSE; } return $sql; } /** * Validation des checkboxes * * @param $value checkbox * field * @return 0 ou 1 */ function valid_checkbox($value) { if ($value == '') return 0; if ($value != 0) return 1; return 0; } /** * Destination après validation sans erreurs */ function validationOkPage($processed_data, $button) { if ($button == $this->lang->line("gvv_button_create_and_continue")) { // Display the form again redirect($this->controller . "/create"); return; } $this->pop_return_url(); } /** * Transforme les données brutes en base en données affichables * Default implementation returns the data attribute * * @param $action CREATION * | MODIFICATION | VISUALISATION */ function form2database($action = '') { $processed_data = array (); if (isset($this->rules)) { // Méthode basée sur les méta-données $table = $this->gvv_model->table(); $fields_list = $this->gvvmetadata->fields_list($table); foreach ( $fields_list as $field ) { $processed_data [$field] = $this->gvvmetadata->post2database($table, $field, $this->input->post($field)); } } else { foreach ( $this->fields as $field => $value ) { $processed_data [$field] = $this->input->post($field); } } return $processed_data; } /** * Hook activé après la création d'un élément * Ce mécanisme permet de laisser le contrôleur parent faire la majeur * partie de boulot mais également de réaliser des traitements spécifiques * dans les enfants. * * @param $data enregistrement * crée */ function post_create($data = array ()) { gvv_debug($this->controller . " creation " . var_export($data, true)); } /** * Hook activé avant la destruction * * @param $id clé * de l'élément à détruire */ function pre_delete($id) { gvv_debug($this->controller . " delete $id"); } /** * Hook activé après la mise à jour * * @param $data enregistrement * modifié */ function post_update($data = array ()) { gvv_debug($this->controller . " post modification " . var_export($data, true)); } /** * Hook activé avant la mise à jour */ function pre_update($id, $data = array ()) { gvv_debug($this->controller . " pre modification $id " . var_export($data, true)); } /** * Validation du formulaire d'édition * * @param $action CREATION * | MODIFICATION | VISUALISATION */ public function formValidation($action, $return_on_success = false) { // $button = $_POST['button']; $button = $this->input->post('button'); $numlign = $this->input->post('numlign'); if ($button == $this->lang->line("gvv_button_show_list")) { $this->page(); return; } else if ($button == $this->lang->line("gvv_button_cancel")) { $this->pop_return_url(); return; } elseif ($button == $this->lang->line("gvv_button_delete")) { $id = $this->input->post($this->kid); $this->delete($id); return; } // Validates the form entries $this->form_validation->set_error_delimiters('