| Current Path : /home/balossw/www/temp/common/cms/includes/classes/ |
| Current File : /home/balossw/www/temp/common/cms/includes/classes/htusers-module.class.php |
<?php
/*---------------------------------------------------------------------------
File name ............ includes/classes/htusers-module.class.php
Project .............. Owebia CMS
Author ............... Antoine Lemoine
Creation date ........ 31.07.2008
Modification date .... 29.01.2010
---------------------------------------------------------------------------*/
include_once $global->realpath('common/cms/includes/classes/abstract-module.class.php');
if (!class_exists('HtusersModule'))
{
class HtusersModule extends AbstractModule
{
var $table;
var $filename;
var $encryption;
var $action;
var $default_action;
var $rows_per_page;
var $disabled_actions;
var $users;
var $default_rows_per_page = 30;
function HtusersModule()
{
global $global;
$args = func_get_args();
$args = $args[0];
$this->AbstractModule($args['default_title']);
$this->filename = $args['filename'];
$this->encryption = isset($args['encryption']) && in_array($args['encryption'],array('none','crypt','md5')) ? $args['encryption'] : 'crypt';
$this->default_action = 'manage';
$this->rows_per_page = -1;
$this->submit_button_values = array('add' => 'Ajouter', 'edit' => 'Modifier');
$this->disabled_actions = array();
$f1 = new Field('id');
$f2 = new InputField('login','Utilisateur',false,false);
$f3 = new PasswordField('password','Mot de passe');
$f4 = new BinaryField('enabled','Activé');
$this->table = new Table('',array($f1,$f2,$f3,$f4),$f1,$f2,'A');
$this->users = array();
}
function disableActions($table_index, $disabled_actions)
{
$this->disabled_actions[$table_index] = $disabled_actions;
}
function run()
{
AbstractModule::run();
{
$submenu = new SubMenu();
$self_link = $this->self_link.'&action=';
if ($this->action=='manage')
{
if ($this->isActionAllowed('add'))
{
$submenu->add(new MenuItem('Ajouter un élément', $self_link.'add',false,'add-button'));
}
if ($this->isActionAllowed('config'))
{
$submenu->add(new MenuItem('Configuration', $self_link.'config',false,'config-button'));
}
}
else
{
$submenu->add(new MenuItem('Retour', $self_link.$this->default_action,false,'go-back-button'));
}
$this->menu->addSubMenu($submenu);
}
$this->self_link = $this->self_link.$this->self_link_suffix;
if ($this->isActionAllowed($this->action))
{
$method = '_'.$this->action;
if (method_exists($this,$method)) { $this->$method(); }
}
}
function isActionAllowed($action)
{
return !(isset($this->disabled_actions) && in_array($action,$this->disabled_actions));
}
// Recuperation des variables
function getVars()
{
AbstractModule::getVars();
if (!$this->load())
{
error('Impossible de lire le fichier `'.htmlentities($this->filename).'`');
}
$this->action = (isset($_GET['action']) && $_GET['action']!='') ? $_GET['action'] : $this->default_action;
}
function validData($table, &$invalid_field, &$error, $action=null)
{
AbstractModule::validData($table,$invalid_field,$error);
if ($action==null) { $action = $this->action; }
return count($invalid_field)==0;
}
function _multiple_actions()
{
if (isset($_GET['ids']))
{
$ids = $_GET['ids'];
}
else
{
$ids = '';
foreach ($_POST as $key => $value)
{
if (substr($key,0,3)=='row')
{
$ids .= substr($key,3,strlen($key)-3).',';
}
}
if (substr($ids,strlen($ids)-1,1)==',') { $ids = substr($ids,0,strlen($ids)-1); }
}
$id_array = explode(',',$ids);
$return_uri = $this->return_uri;
if (preg_match('/ids=/',$this->return_uri))
{
$return_uri = preg_replace('/ids=([0-9,]*)/','ids='.$ids,$return_uri);
}
else
{
$return_uri .= '&ids='.$ids;
}
if (count($id_array)==0 || $id_array[0]=='')
{
$this->operationResult(false,$return_uri);
return;
}
$disable = isset($_POST['disable']) ? $_POST['disable'] : (isset($_GET['disable']) ? $_GET['disable'] : null);
$enable = isset($_POST['enable']) ? $_POST['enable'] : (isset($_GET['enable']) ? $_GET['enable'] : null);
if (isset($disable) && $disable==true || isset($enable) && $enable==true)
{
foreach ($id_array as $id)
{
$this->enableRow($id,isset($enable) && $enable==true);
}
$success = $this->save();
$this->operationResult($success,$return_uri);
}
$delete = isset($_POST['delete']) ? $_POST['delete'] : (isset($_GET['delete']) ? $_GET['delete'] : null);
if (isset($delete) && $delete==true)
{
if (isset($_GET['confirm']) && $_GET['confirm']==true)
{
foreach ($id_array as $id)
{
$this->deleteRow($id);
}
$success = $this->save();
$this->operationResult($success,$return_uri);
}
else
{
$this->body .= confirmDialog('Êtes-vous sûr de vouloir supprimer les enregistrements selectionnés ?',
$this->self_link.'&action=multiple_actions&delete=true&ids='.$ids.'&confirm=true&return_uri='.urlencode($this->return_uri),
$this->return_uri);
}
}
}
function save()
{
$fp = @fopen($this->filename,'w');
if ($fp)
{
$content = '';
foreach ($this->users as $user)
{
$content .= (!$user['enabled'] ? '#' : '').$user['login'].':'.$user['password']."\r\n";
}
fwrite($fp,$content);
fclose($fp);
return true;
}
return false;
}
function load()
{
$fp = @fopen($this->filename,'r');
if ($fp)
{
$i = 0;
$this->users = array();
$content = fread($fp,filesize($this->filename));
fclose($fp);
$lines = explode("\n",$content);
foreach ($lines as $line)
{
$line = trim($line);
if (preg_match('/^(#?)(.*):(.*)$/',$line,$result))
{
$this->users[$i] = array(
'id' => $i,
'login' => $result[2],
'password' => $result[3],
'enabled' => $result[1]!='#',
);
}
$i++;
}
return true;
}
return false;
}
function deleteRow($id)
{
if (isset($this->users[$id]))
{
unset($this->users[$id]);
return true;
}
return false;
}
function enableRow($id,$enabled=null)
{
if (isset($this->users[$id]))
{
$this->users[$id]['enabled'] = isset($enabled) ? $enabled : !$this->users[$id]['enabled'];
return true;
}
return false;
}
function _delete()
{
if (isset($_GET['confirm']) && $_GET['confirm']==true)
{
$success = false;
if ($this->deleteRow((int)$_GET['id']))
{
$success = $this->save();
}
$this->operationResult($success,(!preg_match('/id=/',$this->return_uri) ? $this->return_uri : $this->self_link));
}
else
{
$this->body .= confirmDialog('Êtes-vous sûr de vouloir supprimer l\'enregistrement ?',
$this->self_link.'&action=delete&id='.(int)$_GET['id'].'&confirm=true&return_uri='.urlencode($this->return_uri),$this->return_uri);
}
}
function encryptPassword($password)
{
switch ($this->encryption)
{
case 'none' :
return $password;
case 'crypt' :
return crypt($password);
case 'md5' :
return md5($password);
}
}
function _edit()
{
$this->title = $this->default_title.' :: Modification d\'un élément';
if (isset($_POST['sent']) && isset($_POST['as_new_element']) && $_POST['as_new_element']=='true')
{
$this->_add();
return;
}
if (isset($_POST['sent']) && $this->validData($this->table,$invalid_field,$error,'edit'))
{
$success = false;
if (isset($this->users[(int)$_GET['id']]))
{
$old_user = $this->users[(int)$_GET['id']];
$this->users[(int)$_GET['id']] = array(
'id' => $old_user['id'],
'login' => (string)$_POST['login'],
'password' => isset($_POST['password1']) && $_POST['password1']!='' ? $this->encryptPassword((string)$_POST['password1']) : $old_user['password'],
'enabled' => (bool)$_POST['enabled'],
);
$success = $this->save();
}
$this->operationResult($success,$this->return_uri);
}
else
{
if (isset($this->users[(int)$_GET['id']]))
{
$object = $this->users[(int)$_GET['id']];
$action_value = 'edit&id='.(int)$_GET['id'];
if (count($invalid_field)>0) { error('Veuillez modifier les champs invalides '.$error); }
$this->addForm($this->table,$object,$invalid_field,'&action='.$action_value);
}
else
{
$this->body .= errorDialog('L\'utilisateur n\'existe pas',$this->self_link);
}
}
}
function _add()
{
$this->title = $this->default_title.' :: Ajout d\'un élément';
$invalid_field = array();
if (isset($_POST['sent']) && $this->validData($this->table,$invalid_field,$error,'add'))
{
$i = 1;
while (isset($this->users[$i]))
{
$i++;
}
$this->users[$i] = array(
'id' => $i,
'login' => (string)$_POST['login'],
'password' => $this->encryptPassword((string)$_POST['password1']),
'enabled' => (bool)$_POST['enabled'],
);
$success = $this->save();
$this->operationResult($success,
(isset($_POST['add_after']) && $_POST['add_after']=='true' ? $this->self_link.'&action=add' : $this->self_link));
}
else
{
if ($this->action=='edit')
{
$action_value = 'edit&id='.(int)$_GET['id'];
}
else
{
$action_value = 'add';
}
if (count($invalid_field)>0) { error('Veuillez modifier les champs invalides '.$error); }
$this->addForm($this->table,$object=null,$invalid_field,'&action='.$action_value);
}
}
function _manage()
{
$this->title = $this->default_title.' :: Gestion des éléments';
$this->addTable();
}
function _enable()
{
$this->title = 'Activer/désactiver l\'élément';
$success = false;
if ($this->enableRow((int)$_GET['id']))
{
$success = $this->save();
}
$this->operationResult($success,$this->return_uri);
}
function _config()
{
$row = 0;
$this->title = 'Configuration du module';
if (isset($_POST['module_config']) && is_array($_POST['module_config']))
{
foreach ($_POST['module_config'] as $key => $value)
{
$this->setConfigValue($key,$value);
}
}
$this->body .= "<form action=\"".$this->self_link."&action=config\" method=\"post\"><table>";
{
$key = 'display.rows-per-page';
$value = $this->getConfigValue($key);
if (!isset($value) || !is_numeric($value))
{
$value = $this->getDefaultConfigValue('table.display.rows-per-page');
}
if (!isset($value) || !is_numeric($value))
{
$value = 30;
}
$this->body .= "<tr class=\"row".($row++%2)."\"><td>Nombre de lignes par page</td>"
. "<td><input type=\"text\" class=\"great_input\" name=\"module_config[".$key."]\" value=\"".getHtmlValue($value)."\" /></td></tr>";
}
$this->body .= "</table><div class=\"button_div\">"
. "<input id=\"submit_button\" name=\"sent\" type=\"submit\" class=\"ok-button\" value=\"Modifier\" /></div></form>";
}
function addNavigationElements(&$users, $rows_per_page)
{
if (!isset($rows_per_page) || !is_numeric($rows_per_page))
{
$rows_per_page = $this->default_rows_per_page;
}
$numrows = count($users);
if ($numrows>$rows_per_page)
{
$this->body .= "\n\t<div class=\"navigation\">";
$previous = $this->index-$rows_per_page;
if ($previous<0) { $previous = 0; }
$last = $numrows-$numrows%$rows_per_page;
if ($last==$numrows) { $last = $numrows-$rows_per_page; }
$next = $this->index+$rows_per_page;
if ($next>$last) { $next = $last; }
$navigation = "Accès direct : ";
$navigation .= "<select id=\"nav_select\" tabindex=\"1\" onchange=\"javascript:module.gotoSelectedValue(this);\">";
$temp = 0;
$num = 1;
while ($temp<=$last)
{
$navigation .= "<option value=\"".$this->self_link."&index=".$temp."\"";
if ($this->index==$temp) { $navigation .= " selected=\"selected\""; }
$navigation .= ">".$num."</option>";
$temp += $rows_per_page;
$num++;
}
$navigation .= "</select>";
$this->body .= $navigation;
$users_arrays = array_chunk($users,$rows_per_page);
$users = $users_arrays[floor($this->index/$rows_per_page)];
$this->body .= " </div>";
}
}
function form_getSubmitButtonLabel()
{
return $this->action=='edit' && isset($_POST['as_new_element']) && $_POST['as_new_element']=='true' ?
$this->submit_button_values['add'] : $this->submit_button_values[$this->action];
}
function form_addAdditionalRows()
{
if ($this->action=='add')
{
$this->body .= "<tr><td colspan=\"2\"><input id=\"add_after-checkbox\" name=\"add_after\" type=\"checkbox\" value=\"true\""
. (isset($_POST['add_after']) && $_POST['add_after']=='true' ? " checked=\"checked\"" : '')." />"
. "<label for=\"add_after-checkbox\"> Ajouter un autre élément après</label></td></tr>";
}
if ($this->action=='edit' && $this->isActionAllowed('add'))
{
$this->body .= "<tr><td colspan=\"2\"><input id=\"as_new_element-checkbox\" name=\"as_new_element\" type=\"checkbox\" value=\"true\""
. (isset($_POST['as_new_element']) && $_POST['as_new_element']=='true' ? " checked=\"checked\"" : '')
. " onclick=\"javascript:module.changeButtonValue('submit_button',"
. "(this.checked ? '".$this->submit_button_values['add']."' : '".$this->submit_button_values['edit']."'));\" />"
. "<label for=\"as_new_element-checkbox\"> Ajouter comme nouvel élément</label></td></tr>";
}
}
function addTable()
{
global $global;
$id_array = array();
if (isset($_GET['ids']))
{
$id_array = explode(',',$_GET['ids']);
if (!is_array($id_array)) { $id_array = array($id_array); }
}
$numrows = count($this->users);
if ($numrows>0)
{
$rows_per_page = $this->getConfigValue('display.rows-per-page');
if (!isset($rows_per_page))
{
$rows_per_page = $this->getDefaultConfigValue('table.display.rows-per-page');
}
if (!isset($rows_per_page))
{
$rows_per_page = $this->rows_per_page!=-1 ? $this->rows_per_page : $this->default_rows_per_page;
}
$this->index = isset($_GET['index']) ? $_GET['index'] : 0;
$this->index = $this->index-$this->index%$rows_per_page;
$total_numrows = $numrows;
$multiple_actions_allowed = $this->isActionAllowed('multiple_actions') && $numrows>1;
$actions_count = $this->getActionsCount();
$users = $this->users;
$this->addNavigationElements($users, $rows_per_page);
if ($multiple_actions_allowed)
{
$this->body .= "<form action=\"".$this->self_link."&action=multiple_actions".$this->return_uri_param."\" method=\"post\">";
}
$this->body .= "<table id=\"elems-table\"><tr>";
if ($multiple_actions_allowed)
{
$this->body .= "<th> </th>";
}
$fields = $this->table->visible_fields;
foreach ($fields as $field)
{
$this->body .= "<th>".$field->label."</th>";
}
if ($actions_count>0)
{
$this->body .= "<th colspan=\"".$actions_count."\">Actions</th>";
}
$this->body .= "</tr>";
$checkboxes_ids = '';
$i = 0;
foreach ($users as $object)
{
$this->body .= "\n<tr";
if ($this->isActive($object)) { $this->body .= " class=\"active\""; }
else if ($this->isInactive($object)) { $this->body .= " class=\"inactive\""; }
else { $this->body .= " class=\"row".($i%2)."\""; }
$this->body .= ">";
if ($multiple_actions_allowed)
{
$id = $object['id'];
$this->body .= "<td><input id=\"row".$id."-checkbox\" class=\"row-checkbox\""
. " type=\"checkbox\" name=\"row".$id."\""
. " id=\"row".$id."\" value=\"1\" "
. (in_array($id,$id_array) ? 'checked="checked"' : '')
."/><label for=\"row".$id."-checkbox\"></label></td>";
$checkboxes_ids .= '\''.$id.'\',';
}
for ($j=0; $j<count($fields); $j++)
{
$field = $fields[$j];
$this->body .= "<td>".$this->getFieldValue($field,$object,$j,$total_numrows)."</td>";
}
$this->addActionsLinks($object);
$this->body .= "</tr>";
$i++;
}
$checkboxes_ids = substr($checkboxes_ids,0,strlen($checkboxes_ids)-1);
$this->body .= "</table>";
if ($multiple_actions_allowed)
{
$this->body .= "<div class=\"button_div\"><button class=\"select-all-button\" onclick=\"javascript:module.selectAll();return false;\">Sélectionner tout</button>"
. "<button class=\"deselect-all-button\" onclick=\"javascript:module.unselectAll();return false;\">Déselectionner tout</button> | Sélection : ".$this->getMultipleActionsLinks()."</div>";
$this->body .= "</form>";
}
if ($total_numrows<=1)
{
$global->page_data['left_infos'] = $total_numrows.' enregistrement trouvé';
}
else
{
$global->page_data['left_infos'] = $total_numrows.' enregistrements trouvés';
$val1 = $this->index+1;
$val2 = $this->index+$result->numrows;
$global->page_data['center_infos'] = 'enregistrement'.($val2!=$val1 ? 's' : '').' '.$val1.($val2!=$val1 ? ' - '.$val2 : '');
}
}
else { $this->body .= "<p class=\"error\">Aucun enregistrement</p>"; }
}
function getMultipleActionsLinks()
{
$links = "<button onclick=\"javascript:module.multiAction(this,'enable');\">Activer</button>"
. "<button onclick=\"javascript:module.multiAction(this,'disable');\">Désactiver</button>";
if ($this->isActionAllowed('delete'))
{
$links .= "<button onclick=\"javascript:module.confirmMultiDelete(this);return false;\">Supprimer</button>";
}
return $links;
}
// Ajoute les liens vers les differentes actions autorisees
function addActionsLinks($object)
{
$actions_array = $this->getActionsLinks($object);
if (!isset($actions_array)) { $actions_array = array(); }
foreach ($actions_array as $action => $link)
{
$url = isset($link['url']) ? $link['url'] : $this->self_link.'&action='.$action.'&id='.$object['id'].$this->return_uri_param;
$this->body .= "<td>".($url!='' ? "<a href=\"".$url."\""
.(isset($link['target']) ? " target=\"".$link['target']."\"" : '')
.(isset($link['onclick']) ? " onclick=\"".$link['onclick']."\"" : '')
.">" : '')
.$link['label'].($url!='' ? "</a>" : '')."</td>";
}
}
function getActionsCount()
{
$actions_array = $this->getActionsLinks(null);
if (!isset($actions_array)) { $actions_array = array(); }
return count($actions_array);
}
function getActionsLinks($object)
{
$action_links = array();
$action_links = array_merge($action_links,
array(
'enable' => array(
'label' => $object['enabled'] ? 'désactiver' : 'activer'
),
)
);
if ($this->isActionAllowed('edit'))
{
$action_links = array_merge($action_links,
array(
'edit' => array(
'label' => 'modifier',
),
)
);
}
if ($this->isActionAllowed('delete'))
{
$action_links = array_merge($action_links,
array(
'delete' => array(
'label' => 'supprimer',
'onclick' => "javascript:module.confirm(this,'Êtes-vous sûr de vouloir supprimer l\'enregistrement ?');return false;",
),
)
);
}
return $action_links;
}
function isDefaultValueForced()
{
return (isset($_GET['action']) && $_GET['action']!='add');
}
function isActive($object)
{
return false;
}
function isInactive($object)
{
return !$object['enabled'];
}
}
}