Your IP : 216.73.217.177


Current Path : /home/balossw/www/temp/common/cms/includes/classes/
Upload File :
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&eacute;');
			$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.'&amp;action=';
				
				if ($this->action=='manage')
				{
					if ($this->isActionAllowed('add'))
					{
						$submenu->add(new MenuItem('Ajouter un &eacute;l&eacute;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 .= '&amp;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('&Ecirc;tes-vous s&ucirc;r de vouloir supprimer les enregistrements selectionn&eacute;s ?',
						$this->self_link.'&amp;action=multiple_actions&amp;delete=true&amp;ids='.$ids.'&amp;confirm=true&amp;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('&Ecirc;tes-vous s&ucirc;r de vouloir supprimer l\'enregistrement ?',
					$this->self_link.'&amp;action=delete&amp;id='.(int)$_GET['id'].'&amp;confirm=true&amp;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 &eacute;l&eacute;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&amp;id='.(int)$_GET['id'];
	
					if (count($invalid_field)>0) { error('Veuillez modifier les champs invalides '.$error); }

					$this->addForm($this->table,$object,$invalid_field,'&amp;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 &eacute;l&eacute;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.'&amp;action=add' : $this->self_link));
			}
			else
			{
				if ($this->action=='edit')
				{
					$action_value = 'edit&amp;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,'&amp;action='.$action_value);
			}
		}

		function _manage()
		{
			$this->title = $this->default_title.' :: Gestion des &eacute;l&eacute;ments';

			$this->addTable();
		}

		function _enable()
		{
			$this->title = 'Activer/d&eacute;sactiver l\'&eacute;l&eacute;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."&amp;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&egrave;s direct : &nbsp;";

				$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."&amp;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 .= "&nbsp;</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 &eacute;l&eacute;ment apr&egrave;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 &eacute;l&eacute;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."&amp;action=multiple_actions".$this->return_uri_param."\" method=\"post\">";
				}
				$this->body .= "<table id=\"elems-table\"><tr>";
				if ($multiple_actions_allowed)
				{
					$this->body .= "<th>&nbsp;</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&eacute;lectionner tout</button>"
						. "<button class=\"deselect-all-button\" onclick=\"javascript:module.unselectAll();return false;\">D&eacute;selectionner tout</button> | S&eacute;lection : &nbsp; ".$this->getMultipleActionsLinks()."</div>";
					$this->body .= "</form>";
				}

				if ($total_numrows<=1)
				{
					$global->page_data['left_infos'] = $total_numrows.' enregistrement trouv&eacute;';
				}
				else
				{
					$global->page_data['left_infos'] = $total_numrows.' enregistrements trouv&eacute;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&eacute;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.'&amp;action='.$action.'&amp;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&eacute;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,'&Ecirc;tes-vous s&ucirc;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'];
		}
	}
}