Completed
Branch master (402923)
by Michael
03:40
created
xoops_version.php 1 patch
Indentation   +38 added lines, -38 removed lines patch added patch discarded remove patch
@@ -46,8 +46,8 @@  discard block
 block discarded – undo
46 46
 $modversion['min_xoops']           = '2.5.8';
47 47
 $modversion['min_admin']           = '1.2';
48 48
 $modversion['min_db']              = array(
49
-    'mysql'  => '5.0.7',
50
-    'mysqli' => '5.0.7'
49
+	'mysql'  => '5.0.7',
50
+	'mysqli' => '5.0.7'
51 51
 );
52 52
 
53 53
 // ****************************************************************************
@@ -102,13 +102,13 @@  discard block
 block discarded – undo
102 102
  *                  $options[3] - min font size (px or %)
103 103
  */
104 104
 $modversion['blocks'][] = array(
105
-    'file'        => 'references_block_tag.php',
106
-    'name'        => _MI_REFERENCES_BNAME3,
107
-    'description' => 'Show tag cloud',
108
-    'show_func'   => 'references_tag_block_cloud_show',
109
-    'edit_func'   => 'references_tag_block_cloud_edit',
110
-    'options'     => '100|0|150|80',
111
-    'template'    => 'references_tag_block_cloud.tpl'
105
+	'file'        => 'references_block_tag.php',
106
+	'name'        => _MI_REFERENCES_BNAME3,
107
+	'description' => 'Show tag cloud',
108
+	'show_func'   => 'references_tag_block_cloud_show',
109
+	'edit_func'   => 'references_tag_block_cloud_edit',
110
+	'options'     => '100|0|150|80',
111
+	'template'    => 'references_tag_block_cloud.tpl'
112 112
 );
113 113
 
114 114
 /*
@@ -118,13 +118,13 @@  discard block
 block discarded – undo
118 118
  *                  $options[2] - sort: a - alphabet; c - count; t - time
119 119
  */
120 120
 $modversion['blocks'][] = array(
121
-    'file'        => 'references_block_tag.php',
122
-    'name'        => _MI_REFERENCES_BNAME4,
123
-    'description' => 'Show top tags',
124
-    'show_func'   => 'references_tag_block_top_show',
125
-    'edit_func'   => 'references_tag_block_top_edit',
126
-    'options'     => '50|30|c',
127
-    'template'    => 'references_tag_block_top.tpl'
121
+	'file'        => 'references_block_tag.php',
122
+	'name'        => _MI_REFERENCES_BNAME4,
123
+	'description' => 'Show top tags',
124
+	'show_func'   => 'references_tag_block_top_show',
125
+	'edit_func'   => 'references_tag_block_top_edit',
126
+	'options'     => '50|30|c',
127
+	'template'    => 'references_tag_block_top.tpl'
128 128
 );
129 129
 
130 130
 // ****************************************************************************
@@ -161,9 +161,9 @@  discard block
 block discarded – undo
161 161
 
162 162
 require_once XOOPS_ROOT_PATH . '/modules/references/class/references_utils.php';
163 163
 if (references_utils::getModuleOption('use_rss')) {
164
-    ++$cptm;
165
-    $modversion['sub'][$cptm]['name'] = _MI_REFERENCES_SMENU1;
166
-    $modversion['sub'][$cptm]['url']  = 'rss.php';
164
+	++$cptm;
165
+	$modversion['sub'][$cptm]['name'] = _MI_REFERENCES_SMENU1;
166
+	$modversion['sub'][$cptm]['url']  = 'rss.php';
167 167
 }
168 168
 
169 169
 // ****************************************************************************
@@ -204,16 +204,16 @@  discard block
 block discarded – undo
204 204
  * Editor to use
205 205
  */
206 206
 if (!defined('REFERENCES_MAINTAIN')) {
207
-    ++$cpto;
208
-    $modversion['config'][$cpto]['name']        = 'form_options';
209
-    $modversion['config'][$cpto]['title']       = '_MI_REFERENCES_OPTION2';
210
-    $modversion['config'][$cpto]['description'] = '';
211
-    $modversion['config'][$cpto]['formtype']    = 'select';
212
-    $modversion['config'][$cpto]['valuetype']   = 'text';
213
-    $modversion['config'][$cpto]['default']     = 'dhtmltextarea';
214
-    xoops_load('xoopseditorhandler');
215
-    $editor_handler                         = XoopsEditorHandler::getInstance();
216
-    $modversion['config'][$cpto]['options'] = array_flip($editor_handler->getList());
207
+	++$cpto;
208
+	$modversion['config'][$cpto]['name']        = 'form_options';
209
+	$modversion['config'][$cpto]['title']       = '_MI_REFERENCES_OPTION2';
210
+	$modversion['config'][$cpto]['description'] = '';
211
+	$modversion['config'][$cpto]['formtype']    = 'select';
212
+	$modversion['config'][$cpto]['valuetype']   = 'text';
213
+	$modversion['config'][$cpto]['default']     = 'dhtmltextarea';
214
+	xoops_load('xoopseditorhandler');
215
+	$editor_handler                         = XoopsEditorHandler::getInstance();
216
+	$modversion['config'][$cpto]['options'] = array_flip($editor_handler->getList());
217 217
 }
218 218
 
219 219
 /**
@@ -370,8 +370,8 @@  discard block
 block discarded – undo
370 370
 $modversion['config'][$cpto]['formtype']    = 'select';
371 371
 $modversion['config'][$cpto]['valuetype']   = 'text';
372 372
 $modversion['config'][$cpto]['options']     = array(
373
-    _MI_REFERENCES_SORT_DATE   => 'article_timestamp',
374
-    _MI_REFERENCES_SORT_WEIGHT => 'article_weight'
373
+	_MI_REFERENCES_SORT_DATE   => 'article_timestamp',
374
+	_MI_REFERENCES_SORT_WEIGHT => 'article_weight'
375 375
 );
376 376
 $modversion['config'][$cpto]['default']     = 'article_timestamp';
377 377
 
@@ -385,8 +385,8 @@  discard block
 block discarded – undo
385 385
 $modversion['config'][$cpto]['formtype']    = 'select';
386 386
 $modversion['config'][$cpto]['valuetype']   = 'text';
387 387
 $modversion['config'][$cpto]['options']     = array(
388
-    _MI_REFERENCES_SORT_ASC  => 'ASC',
389
-    _MI_REFERENCES_SORT_DESC => 'DESC'
388
+	_MI_REFERENCES_SORT_ASC  => 'ASC',
389
+	_MI_REFERENCES_SORT_DESC => 'DESC'
390 390
 );
391 391
 $modversion['config'][$cpto]['default']     = 'DESC';
392 392
 
@@ -400,9 +400,9 @@  discard block
 block discarded – undo
400 400
 $modversion['config'][$cpto]['formtype']    = 'select';
401 401
 $modversion['config'][$cpto]['valuetype']   = 'text';
402 402
 $modversion['config'][$cpto]['options']     = array(
403
-    _MI_REFERENCES_SORT_DATE   => 'article_timestamp',
404
-    _MI_REFERENCES_SORT_WEIGHT => 'article_weight',
405
-    _MI_REFERENCES_SORT_TITLE  => 'article_title'
403
+	_MI_REFERENCES_SORT_DATE   => 'article_timestamp',
404
+	_MI_REFERENCES_SORT_WEIGHT => 'article_weight',
405
+	_MI_REFERENCES_SORT_TITLE  => 'article_title'
406 406
 );
407 407
 $modversion['config'][$cpto]['default']     = 'article_weight';
408 408
 
@@ -416,8 +416,8 @@  discard block
 block discarded – undo
416 416
 $modversion['config'][$cpto]['formtype']    = 'select';
417 417
 $modversion['config'][$cpto]['valuetype']   = 'text';
418 418
 $modversion['config'][$cpto]['options']     = array(
419
-    _MI_REFERENCES_SORT_ASC  => 'ASC',
420
-    _MI_REFERENCES_SORT_DESC => 'DESC'
419
+	_MI_REFERENCES_SORT_ASC  => 'ASC',
420
+	_MI_REFERENCES_SORT_DESC => 'DESC'
421 421
 );
422 422
 $modversion['config'][$cpto]['default']     = 'ASC';
423 423
 
Please login to merge, or discard this patch.
include/common.php 1 patch
Indentation   +21 added lines, -21 removed lines patch added patch discarded remove patch
@@ -21,17 +21,17 @@  discard block
 block discarded – undo
21 21
 defined('XOOPS_ROOT_PATH') || exit('XOOPS root path not defined');
22 22
 
23 23
 if (!defined('REFERENCES_DIRNAME')) {
24
-    define('REFERENCES_DIRNAME', 'references');
25
-    define('REFERENCES_URL', XOOPS_URL . '/modules/' . REFERENCES_DIRNAME . '/');
26
-    define('REFERENCES_PATH', XOOPS_ROOT_PATH . '/modules/' . REFERENCES_DIRNAME . '/');
27
-    define('REFERENCES_IMAGES_URL', REFERENCES_URL . 'assets/images/');        // Les images du module (l'url)
28
-    define('REFERENCES_IMAGES_PATH', REFERENCES_PATH . 'assets/images/');    // Les images du module (le chemin)
29
-    define('REFERENCES_CLASS_PATH', REFERENCES_PATH . 'class/');
30
-    define('REFERENCES_PLUGINS_PATH', REFERENCES_PATH . 'plugins/');
31
-    define('REFERENCES_PLUGINS_URL', REFERENCES_URL . 'plugins/');
32
-    define('REFERENCES_JS_URL', REFERENCES_URL . 'js/');
33
-    define('REFERENCES_TEXTFILE1', 'references_index.tpl');
34
-    define('REFERENCES_PERM_READ', 'references_view');    // Nom de la permission de lire
24
+	define('REFERENCES_DIRNAME', 'references');
25
+	define('REFERENCES_URL', XOOPS_URL . '/modules/' . REFERENCES_DIRNAME . '/');
26
+	define('REFERENCES_PATH', XOOPS_ROOT_PATH . '/modules/' . REFERENCES_DIRNAME . '/');
27
+	define('REFERENCES_IMAGES_URL', REFERENCES_URL . 'assets/images/');        // Les images du module (l'url)
28
+	define('REFERENCES_IMAGES_PATH', REFERENCES_PATH . 'assets/images/');    // Les images du module (le chemin)
29
+	define('REFERENCES_CLASS_PATH', REFERENCES_PATH . 'class/');
30
+	define('REFERENCES_PLUGINS_PATH', REFERENCES_PATH . 'plugins/');
31
+	define('REFERENCES_PLUGINS_URL', REFERENCES_URL . 'plugins/');
32
+	define('REFERENCES_JS_URL', REFERENCES_URL . 'js/');
33
+	define('REFERENCES_TEXTFILE1', 'references_index.tpl');
34
+	define('REFERENCES_PERM_READ', 'references_view');    // Nom de la permission de lire
35 35
 }
36 36
 
37 37
 // Chargement des handler et des autres classes
@@ -55,15 +55,15 @@  discard block
 block discarded – undo
55 55
 
56 56
 // Définition des images
57 57
 if (!defined('_REFERENCES_EDIT')) {
58
-    global $xoopsConfig;
59
-    if (isset($xoopsConfig) && file_exists(REFERENCES_PATH . 'language/' . $xoopsConfig['language'] . '/main.php')) {
60
-        require REFERENCES_PATH . 'language/' . $xoopsConfig['language'] . '/main.php';
61
-    } else {
62
-        require REFERENCES_PATH . 'language/english/main.php';
63
-    }
58
+	global $xoopsConfig;
59
+	if (isset($xoopsConfig) && file_exists(REFERENCES_PATH . 'language/' . $xoopsConfig['language'] . '/main.php')) {
60
+		require REFERENCES_PATH . 'language/' . $xoopsConfig['language'] . '/main.php';
61
+	} else {
62
+		require REFERENCES_PATH . 'language/english/main.php';
63
+	}
64 64
 
65
-    $icones = array(
66
-        'edit'   => "<img src='" . REFERENCES_IMAGES_URL . "edit.gif' alt='" . _REFERENCES_EDIT . "' align='middle' />",
67
-        'delete' => "<img src='" . REFERENCES_IMAGES_URL . "delete.gif' alt='" . _REFERENCES_DELETE . "' align='middle' />"
68
-    );
65
+	$icones = array(
66
+		'edit'   => "<img src='" . REFERENCES_IMAGES_URL . "edit.gif' alt='" . _REFERENCES_EDIT . "' align='middle' />",
67
+		'delete' => "<img src='" . REFERENCES_IMAGES_URL . "delete.gif' alt='" . _REFERENCES_DELETE . "' align='middle' />"
68
+	);
69 69
 }
Please login to merge, or discard this patch.
include/search.inc.php 1 patch
Indentation   +57 added lines, -57 removed lines patch added patch discarded remove patch
@@ -22,66 +22,66 @@
 block discarded – undo
22 22
 
23 23
 function references_search($queryarray, $andor, $limit, $offset, $userid)
24 24
 {
25
-    global $xoopsDB;
26
-    include XOOPS_ROOT_PATH . '/modules/references/include/common.php';
25
+	global $xoopsDB;
26
+	include XOOPS_ROOT_PATH . '/modules/references/include/common.php';
27 27
 
28
-    // Recherche dans les articles
29
-    $sql = 'SELECT article_id, article_title, article_text, article_timestamp, article_author FROM ' . $xoopsDB->prefix('references_articles') . ' WHERE (article_online = ' . REFERENCES_STATUS_ONLINE . ')';
30
-    // Permissions
31
-    $handlers    = references_handler::getInstance();
32
-    $permissions = $handlers->h_references_articles->getPermissionsCategoriesCriteria()->renderWhere();
33
-    $sql .= ' AND (' . trim(str_replace('WHERE ', '', $permissions)) . ')';
34
-    // *****
28
+	// Recherche dans les articles
29
+	$sql = 'SELECT article_id, article_title, article_text, article_timestamp, article_author FROM ' . $xoopsDB->prefix('references_articles') . ' WHERE (article_online = ' . REFERENCES_STATUS_ONLINE . ')';
30
+	// Permissions
31
+	$handlers    = references_handler::getInstance();
32
+	$permissions = $handlers->h_references_articles->getPermissionsCategoriesCriteria()->renderWhere();
33
+	$sql .= ' AND (' . trim(str_replace('WHERE ', '', $permissions)) . ')';
34
+	// *****
35 35
 
36
-    // Auteur
37
-    if ($userid != 0) {
38
-        $sql .= ' AND (article_author = ' . $userid . ') ';
39
-    }
36
+	// Auteur
37
+	if ($userid != 0) {
38
+		$sql .= ' AND (article_author = ' . $userid . ') ';
39
+	}
40 40
 
41
-    $tmpObject = new references_articles();
42
-    $datas     = $tmpObject->getVars();
43
-    $tblFields = array();
44
-    $cnt       = 0;
45
-    foreach ($datas as $key => $value) {
46
-        if ($value['data_type'] == XOBJ_DTYPE_TXTBOX || $value['data_type'] == XOBJ_DTYPE_TXTAREA) {
47
-            if ($cnt == 0) {
48
-                $tblFields[] = $key;
49
-            } else {
50
-                $tblFields[] = ' OR ' . $key;
51
-            }
52
-            ++$cnt;
53
-        }
54
-    }
41
+	$tmpObject = new references_articles();
42
+	$datas     = $tmpObject->getVars();
43
+	$tblFields = array();
44
+	$cnt       = 0;
45
+	foreach ($datas as $key => $value) {
46
+		if ($value['data_type'] == XOBJ_DTYPE_TXTBOX || $value['data_type'] == XOBJ_DTYPE_TXTAREA) {
47
+			if ($cnt == 0) {
48
+				$tblFields[] = $key;
49
+			} else {
50
+				$tblFields[] = ' OR ' . $key;
51
+			}
52
+			++$cnt;
53
+		}
54
+	}
55 55
 
56
-    $count = count($queryarray);
57
-    $more  = '';
58
-    if (is_array($queryarray) && $count > 0) {
59
-        $cnt = 0;
60
-        $sql .= ' AND (';
61
-        $more = ')';
62
-        foreach ($queryarray as $oneQuery) {
63
-            $sql .= '(';
64
-            $cond = " LIKE '%" . $oneQuery . "%' ";
65
-            $sql .= implode($cond, $tblFields) . $cond . ')';
66
-            ++$cnt;
67
-            if ($cnt != $count) {
68
-                $sql .= ' ' . $andor . ' ';
69
-            }
70
-        }
71
-    }
72
-    $sql .= $more . ' ORDER BY article_timestamp DESC';
73
-    $i      = 0;
74
-    $ret    = array();
75
-    $myts   = MyTextSanitizer::getInstance();
76
-    $result = $xoopsDB->query($sql, $limit, $offset);
77
-    while ($myrow = $xoopsDB->fetchArray($result)) {
78
-        $ret[$i]['image'] = 'assets/images/newspaper.png';
79
-        $ret[$i]['link']  = REFERENCES_URL . 'reference.php?article_id=' . $myrow['article_id'];
80
-        $ret[$i]['title'] = $myts->htmlSpecialChars($myrow['article_title']);
81
-        $ret[$i]['time']  = $myrow['article_timestamp'];
82
-        $ret[$i]['uid']   = $myrow['article_author'];
83
-        ++$i;
84
-    }
56
+	$count = count($queryarray);
57
+	$more  = '';
58
+	if (is_array($queryarray) && $count > 0) {
59
+		$cnt = 0;
60
+		$sql .= ' AND (';
61
+		$more = ')';
62
+		foreach ($queryarray as $oneQuery) {
63
+			$sql .= '(';
64
+			$cond = " LIKE '%" . $oneQuery . "%' ";
65
+			$sql .= implode($cond, $tblFields) . $cond . ')';
66
+			++$cnt;
67
+			if ($cnt != $count) {
68
+				$sql .= ' ' . $andor . ' ';
69
+			}
70
+		}
71
+	}
72
+	$sql .= $more . ' ORDER BY article_timestamp DESC';
73
+	$i      = 0;
74
+	$ret    = array();
75
+	$myts   = MyTextSanitizer::getInstance();
76
+	$result = $xoopsDB->query($sql, $limit, $offset);
77
+	while ($myrow = $xoopsDB->fetchArray($result)) {
78
+		$ret[$i]['image'] = 'assets/images/newspaper.png';
79
+		$ret[$i]['link']  = REFERENCES_URL . 'reference.php?article_id=' . $myrow['article_id'];
80
+		$ret[$i]['title'] = $myts->htmlSpecialChars($myrow['article_title']);
81
+		$ret[$i]['time']  = $myrow['article_timestamp'];
82
+		$ret[$i]['uid']   = $myrow['article_author'];
83
+		++$i;
84
+	}
85 85
 
86
-    return $ret;
86
+	return $ret;
87 87
 }
Please login to merge, or discard this patch.
plugins/actions/twitter/plugins.php 1 patch
Indentation   +104 added lines, -104 removed lines patch added patch discarded remove patch
@@ -28,111 +28,111 @@
 block discarded – undo
28 28
  */
29 29
 class referencesTwitterAction extends references_action
30 30
 {
31
-    public function registerEvents()
32
-    {
33
-        /**
34
-         * La liste des évènements traités par le plugin se présente sous la forme d'un tableau compposé comme ceci :
35
-         *
36
-         * Indice    Signification
37
-         * ----------------------
38
-         *    0        Evènement sur lequel se raccrocher (voir class/references_plugins.php::EVENT_ON_PRODUCT_CREATE
39
-         *    1        Priorité du plugin (de 1 à 5)
40
-         *    2        Script Php à inclure
41
-         *    3        Classe à instancier
42
-         *    4        Méthode à appeler
43
-         */
44
-        $events   = array();
45
-        $events[] = array(
46
-            references_plugins::EVENT_ON_REFERENCE_CREATE,
47
-            references_plugins::EVENT_PRIORITY_1,
48
-            basename(__FILE__),
49
-            __CLASS__,
50
-            'fireNewReference'
51
-        );
52
-        $events[] = array(
53
-            references_plugins::EVENT_ON_CATEGORY_CREATE,
54
-            references_plugins::EVENT_PRIORITY_1,
55
-            basename(__FILE__),
56
-            __CLASS__,
57
-            'fireNewCategory'
58
-        );
59
-        return $events;
60
-    }
31
+	public function registerEvents()
32
+	{
33
+		/**
34
+		 * La liste des évènements traités par le plugin se présente sous la forme d'un tableau compposé comme ceci :
35
+		 *
36
+		 * Indice    Signification
37
+		 * ----------------------
38
+		 *    0        Evènement sur lequel se raccrocher (voir class/references_plugins.php::EVENT_ON_PRODUCT_CREATE
39
+		 *    1        Priorité du plugin (de 1 à 5)
40
+		 *    2        Script Php à inclure
41
+		 *    3        Classe à instancier
42
+		 *    4        Méthode à appeler
43
+		 */
44
+		$events   = array();
45
+		$events[] = array(
46
+			references_plugins::EVENT_ON_REFERENCE_CREATE,
47
+			references_plugins::EVENT_PRIORITY_1,
48
+			basename(__FILE__),
49
+			__CLASS__,
50
+			'fireNewReference'
51
+		);
52
+		$events[] = array(
53
+			references_plugins::EVENT_ON_CATEGORY_CREATE,
54
+			references_plugins::EVENT_PRIORITY_1,
55
+			basename(__FILE__),
56
+			__CLASS__,
57
+			'fireNewCategory'
58
+		);
59
+		return $events;
60
+	}
61 61
 
62
-    /**
63
-     * Méthode générique chargée d'envoyer un texte sur un compte twitter avec une url
64
-     *
65
-     * @param string $textToSend Le texte à envoyer
66
-     * @param string $mask       Le masque à utiliser
67
-     * @param string $elementUrl L'url de l'élément concerné
68
-     * @return string                Le texte qui a été envoyé à twitter
69
-     */
70
-    private function sendTextToTwitter($textToSend, $mask, $elementUrl)
71
-    {
72
-        if (!defined('REFERENCES_TWITTER_PLUGIN_PATH')) {
73
-            define('REFERENCES_TWITTER_PLUGIN_PATH', REFERENCES_PLUGINS_PATH . 'actions' . DIRECTORY_SEPARATOR . 'twitter' . DIRECTORY_SEPARATOR);
74
-        }
75
-        require_once REFERENCES_TWITTER_PLUGIN_PATH . 'config.php';
76
-        //require_once REFERENCES_TWITTER_PLUGIN_PATH.'twitter.php';
77
-        require_once REFERENCES_TWITTER_PLUGIN_PATH . 'Twitter.class.php';
78
-        require_once REFERENCES_TWITTER_PLUGIN_PATH . 'bitly.class.php';
79
-        if (REFERENCES_BITLY_LOGIN == '') {
80
-            return '';
81
-        }
82
-        $sentText    = '';
83
-        $bitly       = new Bitly(REFERENCES_BITLY_LOGIN, REFERENCES_BITLY_API_KEY);
84
-        $shortUrl    = $bitly->shortenSingle($elementUrl);
85
-        $searches    = array('[itemname]', '[url]');
86
-        $replaces    = array($textToSend, $shortUrl);
87
-        $sentText    = str_replace($searches, $replaces, $mask);
88
-        $totalLength = strlen($sentText);
89
-        if ($totalLength > REFERENCES_TWITTER_TWIT_MAX_LENGTH) {
90
-            $tooLongOf = $totalLength - REFERENCES_TWITTER_TWIT_MAX_LENGTH;
91
-            $searches  = array('[itemname]', '[url]');
92
-            $replaces  = array(substr($textToSend, 0, strlen($textToSend) - $tooLongOf), $shortUrl);
93
-            $sentText  = str_replace($searches, $replaces, $mask);
94
-        }
95
-        if (trim($sentText) != '') {
96
-            //          $twitter = new Twitter(REFERENCES_TWITTER_USERNAME, REFERENCES_TWITTER_PASSWORD);
97
-            //          $twitter->setUserAgent('references');
98
-            //          $twitter->updateStatus($sentText);
99
-            $tweet = new Twitter(REFERENCES_TWITTER_USERNAME, REFERENCES_TWITTER_PASSWORD);
100
-            $tweet->update($sentText);
101
-        }
102
-        return $sentText;
103
-    }
62
+	/**
63
+	 * Méthode générique chargée d'envoyer un texte sur un compte twitter avec une url
64
+	 *
65
+	 * @param string $textToSend Le texte à envoyer
66
+	 * @param string $mask       Le masque à utiliser
67
+	 * @param string $elementUrl L'url de l'élément concerné
68
+	 * @return string                Le texte qui a été envoyé à twitter
69
+	 */
70
+	private function sendTextToTwitter($textToSend, $mask, $elementUrl)
71
+	{
72
+		if (!defined('REFERENCES_TWITTER_PLUGIN_PATH')) {
73
+			define('REFERENCES_TWITTER_PLUGIN_PATH', REFERENCES_PLUGINS_PATH . 'actions' . DIRECTORY_SEPARATOR . 'twitter' . DIRECTORY_SEPARATOR);
74
+		}
75
+		require_once REFERENCES_TWITTER_PLUGIN_PATH . 'config.php';
76
+		//require_once REFERENCES_TWITTER_PLUGIN_PATH.'twitter.php';
77
+		require_once REFERENCES_TWITTER_PLUGIN_PATH . 'Twitter.class.php';
78
+		require_once REFERENCES_TWITTER_PLUGIN_PATH . 'bitly.class.php';
79
+		if (REFERENCES_BITLY_LOGIN == '') {
80
+			return '';
81
+		}
82
+		$sentText    = '';
83
+		$bitly       = new Bitly(REFERENCES_BITLY_LOGIN, REFERENCES_BITLY_API_KEY);
84
+		$shortUrl    = $bitly->shortenSingle($elementUrl);
85
+		$searches    = array('[itemname]', '[url]');
86
+		$replaces    = array($textToSend, $shortUrl);
87
+		$sentText    = str_replace($searches, $replaces, $mask);
88
+		$totalLength = strlen($sentText);
89
+		if ($totalLength > REFERENCES_TWITTER_TWIT_MAX_LENGTH) {
90
+			$tooLongOf = $totalLength - REFERENCES_TWITTER_TWIT_MAX_LENGTH;
91
+			$searches  = array('[itemname]', '[url]');
92
+			$replaces  = array(substr($textToSend, 0, strlen($textToSend) - $tooLongOf), $shortUrl);
93
+			$sentText  = str_replace($searches, $replaces, $mask);
94
+		}
95
+		if (trim($sentText) != '') {
96
+			//          $twitter = new Twitter(REFERENCES_TWITTER_USERNAME, REFERENCES_TWITTER_PASSWORD);
97
+			//          $twitter->setUserAgent('references');
98
+			//          $twitter->updateStatus($sentText);
99
+			$tweet = new Twitter(REFERENCES_TWITTER_USERNAME, REFERENCES_TWITTER_PASSWORD);
100
+			$tweet->update($sentText);
101
+		}
102
+		return $sentText;
103
+	}
104 104
 
105
-    /**
106
-     * Méthode appelée pour indiquer qu'une nouvelle référence a été publié
107
-     *
108
-     * @param object $parameters La référence qui vient d'être publiée
109
-     * @return void
110
-     */
111
-    public function fireNewReference($parameters)
112
-    {
113
-        if (!defined('REFERENCES_TWITTER_PLUGIN_PATH')) {
114
-            define('REFERENCES_TWITTER_PLUGIN_PATH', REFERENCES_PLUGINS_PATH . 'actions' . DIRECTORY_SEPARATOR . 'twitter' . DIRECTORY_SEPARATOR);
115
-        }
116
-        require_once REFERENCES_TWITTER_PLUGIN_PATH . 'config.php';
117
-        $reference = $parameters['reference'];
118
-        $this->sendTextToTwitter(utf8_encode($reference->getVar('article_title', 'n')), utf8_encode(REFERENCES_TWITTER_NEW_REFERENCE_INTRO), $reference->getUrl());
119
-    }
105
+	/**
106
+	 * Méthode appelée pour indiquer qu'une nouvelle référence a été publié
107
+	 *
108
+	 * @param object $parameters La référence qui vient d'être publiée
109
+	 * @return void
110
+	 */
111
+	public function fireNewReference($parameters)
112
+	{
113
+		if (!defined('REFERENCES_TWITTER_PLUGIN_PATH')) {
114
+			define('REFERENCES_TWITTER_PLUGIN_PATH', REFERENCES_PLUGINS_PATH . 'actions' . DIRECTORY_SEPARATOR . 'twitter' . DIRECTORY_SEPARATOR);
115
+		}
116
+		require_once REFERENCES_TWITTER_PLUGIN_PATH . 'config.php';
117
+		$reference = $parameters['reference'];
118
+		$this->sendTextToTwitter(utf8_encode($reference->getVar('article_title', 'n')), utf8_encode(REFERENCES_TWITTER_NEW_REFERENCE_INTRO), $reference->getUrl());
119
+	}
120 120
 
121
-    /**
122
-     * Méthode appelée pour indiquer qu'une nouvelle catégorie de références a été créée
123
-     *
124
-     * @param object $parameters La catégorie qui vient d'être publiée
125
-     * @return void
126
-     */
127
-    public function fireNewCategory($parameters)
128
-    {
129
-        if (!defined('REFERENCES_TWITTER_PLUGIN_PATH')) {
130
-            define('REFERENCES_TWITTER_PLUGIN_PATH', REFERENCES_PLUGINS_PATH . 'actions' . DIRECTORY_SEPARATOR . 'twitter' . DIRECTORY_SEPARATOR);
131
-        }
132
-        require_once REFERENCES_TWITTER_PLUGIN_PATH . 'config.php';
133
-        if (trim(REFERENCES_TWITTER_NEW_CATEGORY_INTRO) != '') {
134
-            $category = $parameters['category'];
135
-            $this->sendTextToTwitter(utf8_encode($category->getVar('category_title', 'n')), utf8_encode(REFERENCES_TWITTER_NEW_CATEGORY_INTRO), $category->getUrl());
136
-        }
137
-    }
121
+	/**
122
+	 * Méthode appelée pour indiquer qu'une nouvelle catégorie de références a été créée
123
+	 *
124
+	 * @param object $parameters La catégorie qui vient d'être publiée
125
+	 * @return void
126
+	 */
127
+	public function fireNewCategory($parameters)
128
+	{
129
+		if (!defined('REFERENCES_TWITTER_PLUGIN_PATH')) {
130
+			define('REFERENCES_TWITTER_PLUGIN_PATH', REFERENCES_PLUGINS_PATH . 'actions' . DIRECTORY_SEPARATOR . 'twitter' . DIRECTORY_SEPARATOR);
131
+		}
132
+		require_once REFERENCES_TWITTER_PLUGIN_PATH . 'config.php';
133
+		if (trim(REFERENCES_TWITTER_NEW_CATEGORY_INTRO) != '') {
134
+			$category = $parameters['category'];
135
+			$this->sendTextToTwitter(utf8_encode($category->getVar('category_title', 'n')), utf8_encode(REFERENCES_TWITTER_NEW_CATEGORY_INTRO), $category->getUrl());
136
+		}
137
+	}
138 138
 }
Please login to merge, or discard this patch.
plugins/models/references_filter.php 1 patch
Indentation   +5 added lines, -5 removed lines patch added patch discarded remove patch
@@ -26,9 +26,9 @@
 block discarded – undo
26 26
 
27 27
 abstract class references_filter
28 28
 {
29
-    /**
30
-     * Retourne la liste des évènements traités par le plugin
31
-     * @return array
32
-     */
33
-    abstract public function registerEvents();
29
+	/**
30
+	 * Retourne la liste des évènements traités par le plugin
31
+	 * @return array
32
+	 */
33
+	abstract public function registerEvents();
34 34
 }
Please login to merge, or discard this patch.
class/references_articles.php 1 patch
Indentation   +603 added lines, -603 removed lines patch added patch discarded remove patch
@@ -22,7 +22,7 @@  discard block
 block discarded – undo
22 22
 
23 23
 require_once XOOPS_ROOT_PATH . '/kernel/object.php';
24 24
 if (!class_exists('references_XoopsPersistableObjectHandler')) {
25
-    require_once XOOPS_ROOT_PATH . '/modules/references/class/PersistableObjectHandler.php';
25
+	require_once XOOPS_ROOT_PATH . '/modules/references/class/PersistableObjectHandler.php';
26 26
 }
27 27
 
28 28
 define('REFERENCES_STATUS_ONLINE', 1);    // Articles en ligne
@@ -30,610 +30,610 @@  discard block
 block discarded – undo
30 30
 
31 31
 class references_articles extends references_Object
32 32
 {
33
-    public function __construct()
34
-    {
35
-        $this->initVar('article_id', XOBJ_DTYPE_INT, null, false);
36
-        $this->initVar('article_category_id', XOBJ_DTYPE_INT, null, false);
37
-        $this->initVar('article_timestamp', XOBJ_DTYPE_INT, null, false);
38
-        $this->initVar('article_weight', XOBJ_DTYPE_INT, null, false);
39
-        $this->initVar('article_date', XOBJ_DTYPE_TXTBOX, null, false);
40
-        $this->initVar('article_title', XOBJ_DTYPE_TXTBOX, null, false);
41
-        $this->initVar('article_text', XOBJ_DTYPE_TXTAREA, null, false);
42
-        $this->initVar('article_externalurl', XOBJ_DTYPE_TXTBOX, null, false);
43
-        $this->initVar('article_picture1', XOBJ_DTYPE_TXTBOX, null, false);
44
-        $this->initVar('article_picture1_text', XOBJ_DTYPE_TXTBOX, null, false);
45
-        $this->initVar('article_picture2', XOBJ_DTYPE_TXTBOX, null, false);
46
-        $this->initVar('article_picture2_text', XOBJ_DTYPE_TXTBOX, null, false);
47
-        $this->initVar('article_picture3', XOBJ_DTYPE_TXTBOX, null, false);
48
-        $this->initVar('article_picture3_text', XOBJ_DTYPE_TXTBOX, null, false);
49
-        $this->initVar('article_picture4', XOBJ_DTYPE_TXTBOX, null, false);
50
-        $this->initVar('article_picture4_text', XOBJ_DTYPE_TXTBOX, null, false);
51
-        $this->initVar('article_picture5', XOBJ_DTYPE_TXTBOX, null, false);
52
-        $this->initVar('article_picture5_text', XOBJ_DTYPE_TXTBOX, null, false);
53
-        $this->initVar('article_picture6', XOBJ_DTYPE_TXTBOX, null, false);
54
-        $this->initVar('article_picture6_text', XOBJ_DTYPE_TXTBOX, null, false);
55
-        $this->initVar('article_picture7', XOBJ_DTYPE_TXTBOX, null, false);
56
-        $this->initVar('article_picture7_text', XOBJ_DTYPE_TXTBOX, null, false);
57
-        $this->initVar('article_picture8', XOBJ_DTYPE_TXTBOX, null, false);
58
-        $this->initVar('article_picture8_text', XOBJ_DTYPE_TXTBOX, null, false);
59
-        $this->initVar('article_picture9', XOBJ_DTYPE_TXTBOX, null, false);
60
-        $this->initVar('article_picture9_text', XOBJ_DTYPE_TXTBOX, null, false);
61
-        $this->initVar('article_picture10', XOBJ_DTYPE_TXTBOX, null, false);
62
-        $this->initVar('article_picture10_text', XOBJ_DTYPE_TXTBOX, null, false);
63
-        $this->initVar('article_author', XOBJ_DTYPE_INT, null, false);
64
-        $this->initVar('article_online', XOBJ_DTYPE_INT, null, false);
65
-        $this->initVar('article_attached_file', XOBJ_DTYPE_TXTBOX, null, false);
66
-        $this->initVar('article_readmore', XOBJ_DTYPE_TXTAREA, null, false);
67
-
68
-        // Pour autoriser le html
69
-        $this->initVar('dohtml', XOBJ_DTYPE_INT, 1, false);
70
-    }
71
-
72
-    /**
73
-     * Indique si l'article en cours est visible
74
-     *
75
-     * @return boolean
76
-     */
77
-    public function isArticleOnline()
78
-    {
79
-        return $this->getVar('article_online') == REFERENCES_STATUS_ONLINE ? true : false;
80
-    }
81
-
82
-    /**
83
-     * Retourne une image qui indique si l'article est en ligne ou pas
84
-     *
85
-     * @return string
86
-     */
87
-    public function getOnlinePicture()
88
-    {
89
-        if ($this->isArticleOnline()) {
90
-            return REFERENCES_IMAGES_URL . 'status_online.png';
91
-        } else {
92
-            return REFERENCES_IMAGES_URL . 'status_offline.png';
93
-        }
94
-    }
95
-
96
-    /**
97
-     * Retourne la chaine de caractères qui peut être utilisée dans l'attribut href d'une balise html A.
98
-     *
99
-     * @return string
100
-     */
101
-    public function getHrefTitle()
102
-    {
103
-        return references_utils::makeHrefTitle($this->getVar('article_title'));
104
-    }
105
-
106
-    /**
107
-     * Indique si une image de l'article existe
108
-     *
109
-     * @param integer $indice L'indice de l'image recherchée
110
-     * @return boolean Vrai si l'image existe sinon faux
111
-     */
112
-    public function pictureExists($indice)
113
-    {
114
-        $return    = false;
115
-        $fieldName = 'article_picture' . $indice;
116
-        if (xoops_trim($this->getVar($fieldName)) != '' && file_exists(references_utils::getModuleOption('images_path') . DIRECTORY_SEPARATOR . $this->getVar($fieldName))) {
117
-            $return = true;
118
-        }
119
-
120
-        return $return;
121
-    }
122
-
123
-    /**
124
-     * Supprime l'image associée à un article
125
-     *
126
-     * @param integer $indice L'indice de l'image recherchée
127
-     * @return void
128
-     */
129
-    public function deletePicture($indice)
130
-    {
131
-        $fieldName = 'article_picture' . $indice;
132
-        if ($this->pictureExists($indice)) {
133
-            @unlink(references_utils::getModuleOption('images_path') . references_utils::getModuleOption('images_path') . $this->getVar($fieldName));
134
-        }
135
-        $this->setVar($fieldName, '');
136
-    }
137
-
138
-    /**
139
-     * Retourne l'URL de l'image de l'article courant
140
-     *
141
-     * @param integer $indice L'indice de l'image recherchée
142
-     * @return string  L'URL
143
-     */
144
-    public function getPictureUrl($indice)
145
-    {
146
-        $fieldName = 'article_picture' . $indice;
147
-        if (xoops_trim($this->getVar($fieldName)) != '' && $this->pictureExists($indice)) {
148
-            return references_utils::getModuleOption('images_url') . '/' . $this->getVar($fieldName);
149
-        } else {
150
-            return REFERENCES_IMAGES_URL . 'blank.gif';
151
-        }
152
-    }
153
-
154
-    /**
155
-     * Retourne le chemin de l'image de l'article courante
156
-     *
157
-     * @param integer $indice L'indice de l'image recherchée
158
-     * @return string  Le chemin
159
-     */
160
-    public function getPicturePath($indice)
161
-    {
162
-        $fieldName = 'article_picture' . $indice;
163
-        if (xoops_trim($this->getVar($fieldName)) != '') {
164
-            return references_utils::getModuleOption('images_path') . DIRECTORY_SEPARATOR . $this->getVar($fieldName);
165
-        } else {
166
-            return '';
167
-        }
168
-    }
169
-
170
-    /**
171
-     * Indique si la vignette de l'image de l'article existe
172
-     *
173
-     * @param integer $indice L'indice de l'image recherchée
174
-     * @return boolean Vrai si l'image existe sinon faux
175
-     */
176
-    public function thumbExists($indice)
177
-    {
178
-        $fieldName = 'article_picture' . $indice;
179
-        $return    = false;
180
-        if (xoops_trim($this->getVar($fieldName)) != '' && file_exists(references_utils::getModuleOption('images_path') . DIRECTORY_SEPARATOR . REFERENCES_THUMBS_PREFIX . $this->getVar($fieldName))) {
181
-            $return = true;
182
-        }
183
-
184
-        return $return;
185
-    }
186
-
187
-    /**
188
-     * Retourne l'URL de la vignette de l'article
189
-     *
190
-     * @param integer $indice L'indice de l'image recherchée
191
-     * @return string  L'URL
192
-     */
193
-    public function getThumbUrl($indice)
194
-    {
195
-        $fieldName = 'article_picture' . $indice;
196
-        if (xoops_trim($this->getVar($fieldName)) != '') {
197
-            return references_utils::getModuleOption('images_url') . '/' . REFERENCES_THUMBS_PREFIX . $this->getVar($fieldName);
198
-        } else {
199
-            return REFERENCES_IMAGES_URL . 'blank.gif';
200
-        }
201
-    }
202
-
203
-    /**
204
-     * Retourne le chemin de la vignette de l'annonce
205
-     *
206
-     * @param integer $indice L'indice de l'image recherchée
207
-     * @return string  L'URL
208
-     */
209
-    public function getThumbPath($indice)
210
-    {
211
-        $fieldName = 'article_picture' . $indice;
212
-        if (xoops_trim($this->getVar($fieldName)) != '') {
213
-            return references_utils::getModuleOption('images_path') . DIRECTORY_SEPARATOR . REFERENCES_THUMBS_PREFIX . $this->getVar($fieldName);
214
-        } else {
215
-            return '';
216
-        }
217
-    }
218
-
219
-    /**
220
-     * Indique si le fichier attaché à un article existe
221
-     *
222
-     * @return boolean
223
-     */
224
-    public function attachmentExists()
225
-    {
226
-        $return = false;
227
-        if (xoops_trim($this->getVar('article_attached_file')) != '' && file_exists(references_utils::getModuleOption('attached_path') . DIRECTORY_SEPARATOR . $this->getVar('article_attached_file'))) {
228
-            $return = true;
229
-        }
230
-
231
-        return $return;
232
-    }
233
-
234
-    /**
235
-     * Retourne l'URL du fichier attaché
236
-     *
237
-     * @return string    L'url du fichier attaché sinon une chaine vide
238
-     */
239
-    public function getAttachmentUrl()
240
-    {
241
-        if (xoops_trim($this->getVar('article_attached_file')) != '' && $this->attachmentExists()) {
242
-            return references_utils::getModuleOption('attached_url') . '/' . $this->getVar('article_attached_file');
243
-        } else {
244
-            return '';
245
-        }
246
-    }
247
-
248
-    /**
249
-     * Retourne le chemin du fichier attaché
250
-     *
251
-     * @return string    Le chemin du fichier attaché sinon une chaine vide
252
-     */
253
-    public function getAttachmentPath()
254
-    {
255
-        if (xoops_trim($this->getVar('article_attached_file')) != '' && $this->attachmentExists()) {
256
-            return references_utils::getModuleOption('attached_path') . DIRECTORY_SEPARATOR . $this->getVar('article_attached_file');
257
-        } else {
258
-            return '';
259
-        }
260
-    }
261
-
262
-    /**
263
-     * Supprime le fichier attaché à un article
264
-     */
265
-    public function deleteAttachment()
266
-    {
267
-        if ($this->attachmentExists()) {
268
-            @unlink(references_utils::getModuleOption('attached_path') . DIRECTORY_SEPARATOR . $this->getVar('article_attached_file'));
269
-        }
270
-        $this->setVar('article_attached_file', '');
271
-    }
272
-
273
-    /**
274
-     * Supprime la miniature associée à l'article
275
-     *
276
-     * @param integer $indice L'indice de l'image recherchée
277
-     * @return void
278
-     */
279
-    public function deleteThumb($indice)
280
-    {
281
-        $fieldName = 'article_picture' . $indice;
282
-        if ($this->thumbExists($indice)) {
283
-            @unlink(references_utils::getModuleOption('images_path') . DIRECTORY_SEPARATOR . REFERENCES_THUMBS_PREFIX . $this->getVar($fieldName));
284
-        }
285
-    }
286
-
287
-    /**
288
-     * Supprime l'image (et vignette) d'un article (raccourcis)
289
-     *
290
-     * @return void
291
-     */
292
-    public function deletePicturesAndThumbs()
293
-    {
294
-        for ($i = 1; $i <= 10; ++$i) {
295
-            $this->deleteThumb($i);
296
-            $this->deletePicture($i);
297
-        }
298
-    }
299
-
300
-    /**
301
-     * Retourne le timestamp de création formaté
302
-     *
303
-     * @return string
304
-     */
305
-    public function getFormatedTimeStamp()
306
-    {
307
-        return formatTimestamp($this->getVar('article_timestamp'), 's');
308
-    }
309
-
310
-    /**
311
-     * Indique s'il existe au moins une image pour l'article
312
-     *
313
-     * @return boolean
314
-     */
315
-    public function isThereAPicture()
316
-    {
317
-        for ($i = 1; $i <= 10; ++$i) {
318
-            if ($this->pictureExists($i)) {
319
-                return true;
320
-            }
321
-        }
322
-
323
-        return false;
324
-    }
325
-
326
-    /**
327
-     * Inidique s'il existe au moins une vignette pour l'article
328
-     *
329
-     * @return boolean
330
-     */
331
-    public function isThereAThumb()
332
-    {
333
-        for ($i = 1; $i <= 10; ++$i) {
334
-            if ($this->thumbExists($i)) {
335
-                return true;
336
-            }
337
-        }
338
-
339
-        return false;
340
-    }
341
-
342
-    /**
343
-     * Retourne l'url pour atteindre l'élément
344
-     *
345
-     * @param bool $shortVersion
346
-     * @return string
347
-     */
348
-    public function getUrl($shortVersion = false)
349
-    {
350
-        if (!$shortVersion) {
351
-            return REFERENCES_URL . 'reference.php?article_id=' . $this->getVar('article_id');
352
-        } else {
353
-            return 'reference.php?article_id=' . $this->getVar('article_id');
354
-        }
355
-    }
356
-
357
-    /**
358
-     * Retourne les éléments de l'annnonce formatés pour affichage
359
-     *
360
-     * @param string $format Format à utiliser
361
-     * @return array
362
-     */
363
-    public function toArray($format = 's')
364
-    {
365
-        $ret                       = array();
366
-        $ret                       = parent::toArray($format);
367
-        $hrefTitle                 = $this->getHrefTitle();
368
-        $ret['article_href_title'] = $hrefTitle;
369
-        $ret['article_url']        = $this->getUrl();
370
-        // Indique si une annonce est expirée
371
-        $ret['article_is_online'] = $this->isArticleOnline();
372
-        if ($this->isThereAPicture()) {
373
-            $ret['article_picture_exists'] = true;
374
-            for ($i = 1; $i <= 10; ++$i) {
375
-                if ($this->pictureExists($i)) {
376
-                    $ret['article_picture_url' . $i]  = $this->getPictureUrl($i);
377
-                    $ret['article_picture_path' . $i] = $this->getPicturePath($i);
378
-                    $ret['article_pictures_urls'][]   = $this->getPictureUrl($i);
379
-                    $ret['article_pictures_paths'][]  = $this->getPicturePath($i);
380
-                    $fieldName                        = 'article_picture' . $i . '_text';
381
-                    if (xoops_trim($this->getVar($fieldName)) != '') {
382
-                        $ret['article_pictures_texts'][] = references_utils::makeHrefTitle($this->getVar($fieldName));
383
-                    } else {
384
-                        $ret['article_pictures_texts'][] = $hrefTitle;
385
-                    }
386
-                }
387
-            }
388
-        } else {
389
-            $ret['article_picture_exists'] = false;
390
-        }
391
-        $ret['article_short_text'] = references_utils::truncate_tagsafe($this->getVar('article_text'), REFERENCES_SHORTEN_TEXT);
392
-
393
-        if ($this->attachmentExists()) {
394
-            $ret['article_attachment_exists'] = true;
395
-            $ret['article_attachment_url']    = $this->getAttachmentUrl();
396
-            $ret['article_attachment_path']   = $this->getAttachmentPath();
397
-        } else {
398
-            $ret['attachment_exists'] = false;
399
-        }
400
-
401
-        if ($this->isThereAThumb()) {
402
-            $ret['article_thumb_exists'] = true;
403
-            for ($i = 1; $i <= 10; ++$i) {
404
-                if ($this->thumbExists($i)) {
405
-                    $ret['article_thumb_url' . $i]  = $this->getThumbUrl($i);
406
-                    $ret['article_thumb_path' . $i] = $this->getThumbPath($i);
407
-                    $ret['article_thumbs_urls'][]   = $this->getThumbUrl($i);
408
-                    $ret['article_thumbs_paths'][]  = $this->getThumbPath($i);
409
-                }
410
-            }
411
-        } else {
412
-            $ret['article_thumb_exists'] = false;
413
-        }
414
-
415
-        $ret['article_timestamp_formated'] = $this->getFormatedTimeStamp();
416
-
417
-        return $ret;
418
-    }
33
+	public function __construct()
34
+	{
35
+		$this->initVar('article_id', XOBJ_DTYPE_INT, null, false);
36
+		$this->initVar('article_category_id', XOBJ_DTYPE_INT, null, false);
37
+		$this->initVar('article_timestamp', XOBJ_DTYPE_INT, null, false);
38
+		$this->initVar('article_weight', XOBJ_DTYPE_INT, null, false);
39
+		$this->initVar('article_date', XOBJ_DTYPE_TXTBOX, null, false);
40
+		$this->initVar('article_title', XOBJ_DTYPE_TXTBOX, null, false);
41
+		$this->initVar('article_text', XOBJ_DTYPE_TXTAREA, null, false);
42
+		$this->initVar('article_externalurl', XOBJ_DTYPE_TXTBOX, null, false);
43
+		$this->initVar('article_picture1', XOBJ_DTYPE_TXTBOX, null, false);
44
+		$this->initVar('article_picture1_text', XOBJ_DTYPE_TXTBOX, null, false);
45
+		$this->initVar('article_picture2', XOBJ_DTYPE_TXTBOX, null, false);
46
+		$this->initVar('article_picture2_text', XOBJ_DTYPE_TXTBOX, null, false);
47
+		$this->initVar('article_picture3', XOBJ_DTYPE_TXTBOX, null, false);
48
+		$this->initVar('article_picture3_text', XOBJ_DTYPE_TXTBOX, null, false);
49
+		$this->initVar('article_picture4', XOBJ_DTYPE_TXTBOX, null, false);
50
+		$this->initVar('article_picture4_text', XOBJ_DTYPE_TXTBOX, null, false);
51
+		$this->initVar('article_picture5', XOBJ_DTYPE_TXTBOX, null, false);
52
+		$this->initVar('article_picture5_text', XOBJ_DTYPE_TXTBOX, null, false);
53
+		$this->initVar('article_picture6', XOBJ_DTYPE_TXTBOX, null, false);
54
+		$this->initVar('article_picture6_text', XOBJ_DTYPE_TXTBOX, null, false);
55
+		$this->initVar('article_picture7', XOBJ_DTYPE_TXTBOX, null, false);
56
+		$this->initVar('article_picture7_text', XOBJ_DTYPE_TXTBOX, null, false);
57
+		$this->initVar('article_picture8', XOBJ_DTYPE_TXTBOX, null, false);
58
+		$this->initVar('article_picture8_text', XOBJ_DTYPE_TXTBOX, null, false);
59
+		$this->initVar('article_picture9', XOBJ_DTYPE_TXTBOX, null, false);
60
+		$this->initVar('article_picture9_text', XOBJ_DTYPE_TXTBOX, null, false);
61
+		$this->initVar('article_picture10', XOBJ_DTYPE_TXTBOX, null, false);
62
+		$this->initVar('article_picture10_text', XOBJ_DTYPE_TXTBOX, null, false);
63
+		$this->initVar('article_author', XOBJ_DTYPE_INT, null, false);
64
+		$this->initVar('article_online', XOBJ_DTYPE_INT, null, false);
65
+		$this->initVar('article_attached_file', XOBJ_DTYPE_TXTBOX, null, false);
66
+		$this->initVar('article_readmore', XOBJ_DTYPE_TXTAREA, null, false);
67
+
68
+		// Pour autoriser le html
69
+		$this->initVar('dohtml', XOBJ_DTYPE_INT, 1, false);
70
+	}
71
+
72
+	/**
73
+	 * Indique si l'article en cours est visible
74
+	 *
75
+	 * @return boolean
76
+	 */
77
+	public function isArticleOnline()
78
+	{
79
+		return $this->getVar('article_online') == REFERENCES_STATUS_ONLINE ? true : false;
80
+	}
81
+
82
+	/**
83
+	 * Retourne une image qui indique si l'article est en ligne ou pas
84
+	 *
85
+	 * @return string
86
+	 */
87
+	public function getOnlinePicture()
88
+	{
89
+		if ($this->isArticleOnline()) {
90
+			return REFERENCES_IMAGES_URL . 'status_online.png';
91
+		} else {
92
+			return REFERENCES_IMAGES_URL . 'status_offline.png';
93
+		}
94
+	}
95
+
96
+	/**
97
+	 * Retourne la chaine de caractères qui peut être utilisée dans l'attribut href d'une balise html A.
98
+	 *
99
+	 * @return string
100
+	 */
101
+	public function getHrefTitle()
102
+	{
103
+		return references_utils::makeHrefTitle($this->getVar('article_title'));
104
+	}
105
+
106
+	/**
107
+	 * Indique si une image de l'article existe
108
+	 *
109
+	 * @param integer $indice L'indice de l'image recherchée
110
+	 * @return boolean Vrai si l'image existe sinon faux
111
+	 */
112
+	public function pictureExists($indice)
113
+	{
114
+		$return    = false;
115
+		$fieldName = 'article_picture' . $indice;
116
+		if (xoops_trim($this->getVar($fieldName)) != '' && file_exists(references_utils::getModuleOption('images_path') . DIRECTORY_SEPARATOR . $this->getVar($fieldName))) {
117
+			$return = true;
118
+		}
119
+
120
+		return $return;
121
+	}
122
+
123
+	/**
124
+	 * Supprime l'image associée à un article
125
+	 *
126
+	 * @param integer $indice L'indice de l'image recherchée
127
+	 * @return void
128
+	 */
129
+	public function deletePicture($indice)
130
+	{
131
+		$fieldName = 'article_picture' . $indice;
132
+		if ($this->pictureExists($indice)) {
133
+			@unlink(references_utils::getModuleOption('images_path') . references_utils::getModuleOption('images_path') . $this->getVar($fieldName));
134
+		}
135
+		$this->setVar($fieldName, '');
136
+	}
137
+
138
+	/**
139
+	 * Retourne l'URL de l'image de l'article courant
140
+	 *
141
+	 * @param integer $indice L'indice de l'image recherchée
142
+	 * @return string  L'URL
143
+	 */
144
+	public function getPictureUrl($indice)
145
+	{
146
+		$fieldName = 'article_picture' . $indice;
147
+		if (xoops_trim($this->getVar($fieldName)) != '' && $this->pictureExists($indice)) {
148
+			return references_utils::getModuleOption('images_url') . '/' . $this->getVar($fieldName);
149
+		} else {
150
+			return REFERENCES_IMAGES_URL . 'blank.gif';
151
+		}
152
+	}
153
+
154
+	/**
155
+	 * Retourne le chemin de l'image de l'article courante
156
+	 *
157
+	 * @param integer $indice L'indice de l'image recherchée
158
+	 * @return string  Le chemin
159
+	 */
160
+	public function getPicturePath($indice)
161
+	{
162
+		$fieldName = 'article_picture' . $indice;
163
+		if (xoops_trim($this->getVar($fieldName)) != '') {
164
+			return references_utils::getModuleOption('images_path') . DIRECTORY_SEPARATOR . $this->getVar($fieldName);
165
+		} else {
166
+			return '';
167
+		}
168
+	}
169
+
170
+	/**
171
+	 * Indique si la vignette de l'image de l'article existe
172
+	 *
173
+	 * @param integer $indice L'indice de l'image recherchée
174
+	 * @return boolean Vrai si l'image existe sinon faux
175
+	 */
176
+	public function thumbExists($indice)
177
+	{
178
+		$fieldName = 'article_picture' . $indice;
179
+		$return    = false;
180
+		if (xoops_trim($this->getVar($fieldName)) != '' && file_exists(references_utils::getModuleOption('images_path') . DIRECTORY_SEPARATOR . REFERENCES_THUMBS_PREFIX . $this->getVar($fieldName))) {
181
+			$return = true;
182
+		}
183
+
184
+		return $return;
185
+	}
186
+
187
+	/**
188
+	 * Retourne l'URL de la vignette de l'article
189
+	 *
190
+	 * @param integer $indice L'indice de l'image recherchée
191
+	 * @return string  L'URL
192
+	 */
193
+	public function getThumbUrl($indice)
194
+	{
195
+		$fieldName = 'article_picture' . $indice;
196
+		if (xoops_trim($this->getVar($fieldName)) != '') {
197
+			return references_utils::getModuleOption('images_url') . '/' . REFERENCES_THUMBS_PREFIX . $this->getVar($fieldName);
198
+		} else {
199
+			return REFERENCES_IMAGES_URL . 'blank.gif';
200
+		}
201
+	}
202
+
203
+	/**
204
+	 * Retourne le chemin de la vignette de l'annonce
205
+	 *
206
+	 * @param integer $indice L'indice de l'image recherchée
207
+	 * @return string  L'URL
208
+	 */
209
+	public function getThumbPath($indice)
210
+	{
211
+		$fieldName = 'article_picture' . $indice;
212
+		if (xoops_trim($this->getVar($fieldName)) != '') {
213
+			return references_utils::getModuleOption('images_path') . DIRECTORY_SEPARATOR . REFERENCES_THUMBS_PREFIX . $this->getVar($fieldName);
214
+		} else {
215
+			return '';
216
+		}
217
+	}
218
+
219
+	/**
220
+	 * Indique si le fichier attaché à un article existe
221
+	 *
222
+	 * @return boolean
223
+	 */
224
+	public function attachmentExists()
225
+	{
226
+		$return = false;
227
+		if (xoops_trim($this->getVar('article_attached_file')) != '' && file_exists(references_utils::getModuleOption('attached_path') . DIRECTORY_SEPARATOR . $this->getVar('article_attached_file'))) {
228
+			$return = true;
229
+		}
230
+
231
+		return $return;
232
+	}
233
+
234
+	/**
235
+	 * Retourne l'URL du fichier attaché
236
+	 *
237
+	 * @return string    L'url du fichier attaché sinon une chaine vide
238
+	 */
239
+	public function getAttachmentUrl()
240
+	{
241
+		if (xoops_trim($this->getVar('article_attached_file')) != '' && $this->attachmentExists()) {
242
+			return references_utils::getModuleOption('attached_url') . '/' . $this->getVar('article_attached_file');
243
+		} else {
244
+			return '';
245
+		}
246
+	}
247
+
248
+	/**
249
+	 * Retourne le chemin du fichier attaché
250
+	 *
251
+	 * @return string    Le chemin du fichier attaché sinon une chaine vide
252
+	 */
253
+	public function getAttachmentPath()
254
+	{
255
+		if (xoops_trim($this->getVar('article_attached_file')) != '' && $this->attachmentExists()) {
256
+			return references_utils::getModuleOption('attached_path') . DIRECTORY_SEPARATOR . $this->getVar('article_attached_file');
257
+		} else {
258
+			return '';
259
+		}
260
+	}
261
+
262
+	/**
263
+	 * Supprime le fichier attaché à un article
264
+	 */
265
+	public function deleteAttachment()
266
+	{
267
+		if ($this->attachmentExists()) {
268
+			@unlink(references_utils::getModuleOption('attached_path') . DIRECTORY_SEPARATOR . $this->getVar('article_attached_file'));
269
+		}
270
+		$this->setVar('article_attached_file', '');
271
+	}
272
+
273
+	/**
274
+	 * Supprime la miniature associée à l'article
275
+	 *
276
+	 * @param integer $indice L'indice de l'image recherchée
277
+	 * @return void
278
+	 */
279
+	public function deleteThumb($indice)
280
+	{
281
+		$fieldName = 'article_picture' . $indice;
282
+		if ($this->thumbExists($indice)) {
283
+			@unlink(references_utils::getModuleOption('images_path') . DIRECTORY_SEPARATOR . REFERENCES_THUMBS_PREFIX . $this->getVar($fieldName));
284
+		}
285
+	}
286
+
287
+	/**
288
+	 * Supprime l'image (et vignette) d'un article (raccourcis)
289
+	 *
290
+	 * @return void
291
+	 */
292
+	public function deletePicturesAndThumbs()
293
+	{
294
+		for ($i = 1; $i <= 10; ++$i) {
295
+			$this->deleteThumb($i);
296
+			$this->deletePicture($i);
297
+		}
298
+	}
299
+
300
+	/**
301
+	 * Retourne le timestamp de création formaté
302
+	 *
303
+	 * @return string
304
+	 */
305
+	public function getFormatedTimeStamp()
306
+	{
307
+		return formatTimestamp($this->getVar('article_timestamp'), 's');
308
+	}
309
+
310
+	/**
311
+	 * Indique s'il existe au moins une image pour l'article
312
+	 *
313
+	 * @return boolean
314
+	 */
315
+	public function isThereAPicture()
316
+	{
317
+		for ($i = 1; $i <= 10; ++$i) {
318
+			if ($this->pictureExists($i)) {
319
+				return true;
320
+			}
321
+		}
322
+
323
+		return false;
324
+	}
325
+
326
+	/**
327
+	 * Inidique s'il existe au moins une vignette pour l'article
328
+	 *
329
+	 * @return boolean
330
+	 */
331
+	public function isThereAThumb()
332
+	{
333
+		for ($i = 1; $i <= 10; ++$i) {
334
+			if ($this->thumbExists($i)) {
335
+				return true;
336
+			}
337
+		}
338
+
339
+		return false;
340
+	}
341
+
342
+	/**
343
+	 * Retourne l'url pour atteindre l'élément
344
+	 *
345
+	 * @param bool $shortVersion
346
+	 * @return string
347
+	 */
348
+	public function getUrl($shortVersion = false)
349
+	{
350
+		if (!$shortVersion) {
351
+			return REFERENCES_URL . 'reference.php?article_id=' . $this->getVar('article_id');
352
+		} else {
353
+			return 'reference.php?article_id=' . $this->getVar('article_id');
354
+		}
355
+	}
356
+
357
+	/**
358
+	 * Retourne les éléments de l'annnonce formatés pour affichage
359
+	 *
360
+	 * @param string $format Format à utiliser
361
+	 * @return array
362
+	 */
363
+	public function toArray($format = 's')
364
+	{
365
+		$ret                       = array();
366
+		$ret                       = parent::toArray($format);
367
+		$hrefTitle                 = $this->getHrefTitle();
368
+		$ret['article_href_title'] = $hrefTitle;
369
+		$ret['article_url']        = $this->getUrl();
370
+		// Indique si une annonce est expirée
371
+		$ret['article_is_online'] = $this->isArticleOnline();
372
+		if ($this->isThereAPicture()) {
373
+			$ret['article_picture_exists'] = true;
374
+			for ($i = 1; $i <= 10; ++$i) {
375
+				if ($this->pictureExists($i)) {
376
+					$ret['article_picture_url' . $i]  = $this->getPictureUrl($i);
377
+					$ret['article_picture_path' . $i] = $this->getPicturePath($i);
378
+					$ret['article_pictures_urls'][]   = $this->getPictureUrl($i);
379
+					$ret['article_pictures_paths'][]  = $this->getPicturePath($i);
380
+					$fieldName                        = 'article_picture' . $i . '_text';
381
+					if (xoops_trim($this->getVar($fieldName)) != '') {
382
+						$ret['article_pictures_texts'][] = references_utils::makeHrefTitle($this->getVar($fieldName));
383
+					} else {
384
+						$ret['article_pictures_texts'][] = $hrefTitle;
385
+					}
386
+				}
387
+			}
388
+		} else {
389
+			$ret['article_picture_exists'] = false;
390
+		}
391
+		$ret['article_short_text'] = references_utils::truncate_tagsafe($this->getVar('article_text'), REFERENCES_SHORTEN_TEXT);
392
+
393
+		if ($this->attachmentExists()) {
394
+			$ret['article_attachment_exists'] = true;
395
+			$ret['article_attachment_url']    = $this->getAttachmentUrl();
396
+			$ret['article_attachment_path']   = $this->getAttachmentPath();
397
+		} else {
398
+			$ret['attachment_exists'] = false;
399
+		}
400
+
401
+		if ($this->isThereAThumb()) {
402
+			$ret['article_thumb_exists'] = true;
403
+			for ($i = 1; $i <= 10; ++$i) {
404
+				if ($this->thumbExists($i)) {
405
+					$ret['article_thumb_url' . $i]  = $this->getThumbUrl($i);
406
+					$ret['article_thumb_path' . $i] = $this->getThumbPath($i);
407
+					$ret['article_thumbs_urls'][]   = $this->getThumbUrl($i);
408
+					$ret['article_thumbs_paths'][]  = $this->getThumbPath($i);
409
+				}
410
+			}
411
+		} else {
412
+			$ret['article_thumb_exists'] = false;
413
+		}
414
+
415
+		$ret['article_timestamp_formated'] = $this->getFormatedTimeStamp();
416
+
417
+		return $ret;
418
+	}
419 419
 }
420 420
 
421 421
 class ReferencesReferences_articlesHandler extends references_XoopsPersistableObjectHandler
422 422
 {
423
-    public function __construct($db)
424
-    {    //                         Table                   Classe                Id            Descr.
425
-        parent::__construct($db, 'references_articles', 'references_articles', 'article_id', 'article_title');
426
-    }
427
-
428
-    /**
429
-     * Retourne le critère à utiliser pour voir les catégories en respectant les permissions
430
-     *
431
-     * @param  string $permissionsType Type de permission (pour l'instant permission de voir)
432
-     * @return obejct de type Criteria
433
-     */
434
-    public function getPermissionsCategoriesCriteria($permissionsType = REFERENCES_PERM_READ)
435
-    {
436
-        global $xoopsUser;
437
-        static $permissions = array();
438
-        if (is_array($permissions) && array_key_exists($permissionsType, $permissions)) {
439
-            return $permissions[$permissionsType];
440
-        }
441
-        $categories    = array();
442
-        $currentModule = references_utils::getModule();
443
-        $groups        = is_object($xoopsUser) ? $xoopsUser->getGroups() : XOOPS_GROUP_ANONYMOUS;
444
-        $gperm_handler = xoops_getHandler('groupperm');
445
-        $categories    = $gperm_handler->getItemIds($permissionsType, $groups, $currentModule->getVar('mid'));
446
-        if (is_array($categories) && count($categories) > 0) {
447
-            $permissions[$permissionsType] = new Criteria('article_category_id', '(' . implode(',', $categories) . ')', 'IN');
448
-        } else {    // Ne peut rien voir
449
-            $permissions[$permissionsType] = new Criteria('article_category_id', '0', '=');
450
-        }
451
-
452
-        return $permissions[$permissionsType];
453
-    }
454
-
455
-    /**
456
-     * Retourne les articles récents en tenant compte des permissions de consultation sur les catégories
457
-     *
458
-     * @param integer  $start      Indice de début
459
-     * @param integer  $limit      Nombre d'objets à renvoyer
460
-     * @param  string  $sort       Zone de tri
461
-     * @param  string  $order      Sens du tri
462
-     * @param  boolean $onlyOnline Uniquement les articles en ligne ?
463
-     * @param integer  $categoryId Identifiant d'une catégorie à laquelle se limiter
464
-     * @return array   Objets de type references_articles
465
-     */
466
-    public function getRecentArticles($start = 0, $limit = 0, $sort = 'article_timestamp', $order = 'DESC', $onlyOnline = true, $categoryId = 0)
467
-    {
468
-        $criteria = new CriteriaCompo();
469
-        $criteria->add(new Criteria('article_id', 0, '<>'));
470
-        $criteria->add($this->getPermissionsCategoriesCriteria());
471
-        if ($onlyOnline) {
472
-            $criteria->add(new Criteria('article_online', REFERENCES_STATUS_ONLINE, '='));
473
-        }
474
-        if (is_array($categoryId) && count($categoryId) > 0) {
475
-            $criteria->add(new Criteria('article_category_id', '(' . implode(',', $categoryId) . ')', 'IN'));
476
-        } elseif ($categoryId > 0) {
477
-            $criteria->add(new Criteria('article_category_id', $categoryId, '='));
478
-        }
479
-        $criteria->setStart($start);
480
-        $criteria->setSort($sort);
481
-        $criteria->setOrder($order);
482
-        $criteria->setLimit($limit);
483
-
484
-        return $this->getObjects($criteria);
485
-    }
486
-
487
-    /**
488
-     * Retourne le nombre total d'articles en ligne
489
-     *
490
-     * @return integer
491
-     */
492
-    public function getOnlineArticlesCount()
493
-    {
494
-        return $this->getCount(new Criteria('article_online', REFERENCES_STATUS_ONLINE, '='));
495
-    }
496
-
497
-    /**
498
-     * Notification de la publication d'une nouvelle référence
499
-     *
500
-     * @param object|references_articles $article L'annonce pour laquelle on fait la notification
501
-     * @return bool
502
-     */
503
-    public function notifyNewArticle(references_articles $article)
504
-    {
505
-        $plugins = references_plugins::getInstance();
506
-        $plugins->fireAction(references_plugins::EVENT_ON_REFERENCE_CREATE, new references_parameters(array('reference' => $article)));
507
-
508
-        return true;
509
-    }
510
-
511
-    /**
512
-     * Effectue la suppression d'un article (et de ses images et fichier attaché)
513
-     *
514
-     * @param references_articles $article L'article à supprimer
515
-     * @return boolean    Le résultat de la suppression
516
-     */
517
-    public function deleteArticle(references_articles $article)
518
-    {
519
-        $article->deletePicturesAndThumbs();
520
-        $article->deleteAttachment();
521
-
522
-        return $this->delete($article, true);
523
-    }
524
-
525
-    /**
526
-     * Retourne la liste des catégories uniques utilisées par les références
527
-     *
528
-     */
529
-    public function getDistinctCategoriesIds()
530
-    {
531
-        $ret = array();
532
-        $sql = 'SELECT distinct(article_category_id) FROM ' . $this->table;
533
-        $sql .= ' ' . $this->getPermissionsCategoriesCriteria()->renderWhere();    // Permissions
534
-        $sql .= ' GROUP BY article_category_id ORDER BY article_category_id';
535
-        $result = $this->db->query($sql);
536
-        if (!$result) {
537
-            return $ret;
538
-        }
539
-        while ($row = $this->db->fetchArray($result)) {
540
-            $ret[$row['article_category_id']] = $row['article_category_id'];
541
-        }
542
-
543
-        return $ret;
544
-    }
545
-
546
-    /**
547
-     * Passe un article en ligne
548
-     *
549
-     * @param  references_articles $article
550
-     * @return boolean
551
-     */
552
-    public function onlineArticle(references_articles $article)
553
-    {
554
-        $article->setVar('article_online', REFERENCES_STATUS_ONLINE);
555
-
556
-        return $this->insert($article, true);
557
-    }
558
-
559
-    /**
560
-     * Passe un article hors ligne
561
-     *
562
-     * @param  references_articles $article
563
-     * @return boolean
564
-     */
565
-    public function offlineArticle(references_articles $article)
566
-    {
567
-        $article->setVar('article_online', REFERENCES_STATUS_OFFLINE);
568
-
569
-        return $this->insert($article, true);
570
-    }
571
-
572
-    /**
573
-     * Indique si une référence est visible d'un utilisateur
574
-     *
575
-     * @param object|references_articles $article L'article à controler
576
-     * @param integer                    $uid     L'id de l'utilisateur à controler
577
-     * @return bool
578
-     */
579
-    public function userCanSeeReference(references_articles $article, $uid = 0)
580
-    {
581
-        global $xoopsUser;
582
-        if ($uid == 0) {
583
-            $uid = references_utils::getCurrentUserID();
584
-        }
585
-        $currentModule = references_utils::getModule();
586
-        $groups        = is_object($xoopsUser) ? $xoopsUser->getGroups() : XOOPS_GROUP_ANONYMOUS;
587
-        $gperm_handler = xoops_getHandler('groupperm');
588
-
589
-        return $gperm_handler->checkRight(REFERENCES_PERM_READ, $article->article_category_id, references_utils::getMemberGroups($uid), $currentModule->getVar('mid'));
590
-    }
591
-
592
-    /**
593
-     * Remonte un article d'un cran dans l'ordre global des articles
594
-     *
595
-     * @param  integer $currentId    L'ID de l'article courant dont on souhaite remonter l'ordre
596
-     * @param integer  $currentOrder L'ordre de l'élément courant à remonter
597
-     * @return void
598
-     */
599
-    public function moveUp($currentId, $currentOrder)
600
-    {
601
-        $sql_plus = 'SELECT article_id FROM ' . $this->table . ' WHERE article_weight = ' . ((int)$currentOrder - 1);
602
-        $res_plus = $this->db->query($sql_plus);
603
-        if ($this->db->getRowsNum($res_plus) == 0) {
604
-            return;
605
-        }
606
-        $row_plus = $this->db->fetchArray($res_plus);
607
-
608
-        $upd1 = 'UPDATE ' . $this->table . ' SET article_weight = (article_weight + 1) WHERE article_id = ' . $row_plus['article_id'];
609
-        $this->db->queryF($upd1);
610
-
611
-        $upd2 = 'UPDATE ' . $this->table . ' SET article_weight = (article_weight - 1) WHERE article_id = ' . (int)$currentId;
612
-        $this->db->queryF($upd2);
613
-        $this->forceCacheClean();
614
-    }
615
-
616
-    /**
617
-     * Descend un article d'un cran dans l'ordre global des articles
618
-     *
619
-     * @param  integer $currentId    L'Id de l'article courant dont on souhaite descendre l'ordre
620
-     * @param integer  $currentOrder L'orde de l'élément courant à remonter
621
-     * @return void
622
-     */
623
-    public function moveDown($currentId, $currentOrder)
624
-    {
625
-        $sql_moins = 'SELECT article_id FROM ' . $this->table . ' WHERE article_weight = ' . ((int)$currentOrder + 1);
626
-        $res_moins = $this->db->query($sql_moins);
627
-        if ($this->db->getRowsNum($res_moins) == 0) {
628
-            return;
629
-        }
630
-
631
-        $row_moins = $this->db->fetchArray($res_moins);
632
-        $upd1      = 'UPDATE ' . $this->table . ' SET article_weight = (article_weight - 1) WHERE article_id = ' . $row_moins['article_id'];
633
-        $this->db->queryF($upd1);
634
-
635
-        $upd2 = 'UPDATE ' . $this->table . ' SET article_weight =( article_weight + 1) WHERE article_id = ' . (int)$currentId;
636
-        $this->db->queryF($upd2);
637
-        $this->forceCacheClean();
638
-    }
423
+	public function __construct($db)
424
+	{    //                         Table                   Classe                Id            Descr.
425
+		parent::__construct($db, 'references_articles', 'references_articles', 'article_id', 'article_title');
426
+	}
427
+
428
+	/**
429
+	 * Retourne le critère à utiliser pour voir les catégories en respectant les permissions
430
+	 *
431
+	 * @param  string $permissionsType Type de permission (pour l'instant permission de voir)
432
+	 * @return obejct de type Criteria
433
+	 */
434
+	public function getPermissionsCategoriesCriteria($permissionsType = REFERENCES_PERM_READ)
435
+	{
436
+		global $xoopsUser;
437
+		static $permissions = array();
438
+		if (is_array($permissions) && array_key_exists($permissionsType, $permissions)) {
439
+			return $permissions[$permissionsType];
440
+		}
441
+		$categories    = array();
442
+		$currentModule = references_utils::getModule();
443
+		$groups        = is_object($xoopsUser) ? $xoopsUser->getGroups() : XOOPS_GROUP_ANONYMOUS;
444
+		$gperm_handler = xoops_getHandler('groupperm');
445
+		$categories    = $gperm_handler->getItemIds($permissionsType, $groups, $currentModule->getVar('mid'));
446
+		if (is_array($categories) && count($categories) > 0) {
447
+			$permissions[$permissionsType] = new Criteria('article_category_id', '(' . implode(',', $categories) . ')', 'IN');
448
+		} else {    // Ne peut rien voir
449
+			$permissions[$permissionsType] = new Criteria('article_category_id', '0', '=');
450
+		}
451
+
452
+		return $permissions[$permissionsType];
453
+	}
454
+
455
+	/**
456
+	 * Retourne les articles récents en tenant compte des permissions de consultation sur les catégories
457
+	 *
458
+	 * @param integer  $start      Indice de début
459
+	 * @param integer  $limit      Nombre d'objets à renvoyer
460
+	 * @param  string  $sort       Zone de tri
461
+	 * @param  string  $order      Sens du tri
462
+	 * @param  boolean $onlyOnline Uniquement les articles en ligne ?
463
+	 * @param integer  $categoryId Identifiant d'une catégorie à laquelle se limiter
464
+	 * @return array   Objets de type references_articles
465
+	 */
466
+	public function getRecentArticles($start = 0, $limit = 0, $sort = 'article_timestamp', $order = 'DESC', $onlyOnline = true, $categoryId = 0)
467
+	{
468
+		$criteria = new CriteriaCompo();
469
+		$criteria->add(new Criteria('article_id', 0, '<>'));
470
+		$criteria->add($this->getPermissionsCategoriesCriteria());
471
+		if ($onlyOnline) {
472
+			$criteria->add(new Criteria('article_online', REFERENCES_STATUS_ONLINE, '='));
473
+		}
474
+		if (is_array($categoryId) && count($categoryId) > 0) {
475
+			$criteria->add(new Criteria('article_category_id', '(' . implode(',', $categoryId) . ')', 'IN'));
476
+		} elseif ($categoryId > 0) {
477
+			$criteria->add(new Criteria('article_category_id', $categoryId, '='));
478
+		}
479
+		$criteria->setStart($start);
480
+		$criteria->setSort($sort);
481
+		$criteria->setOrder($order);
482
+		$criteria->setLimit($limit);
483
+
484
+		return $this->getObjects($criteria);
485
+	}
486
+
487
+	/**
488
+	 * Retourne le nombre total d'articles en ligne
489
+	 *
490
+	 * @return integer
491
+	 */
492
+	public function getOnlineArticlesCount()
493
+	{
494
+		return $this->getCount(new Criteria('article_online', REFERENCES_STATUS_ONLINE, '='));
495
+	}
496
+
497
+	/**
498
+	 * Notification de la publication d'une nouvelle référence
499
+	 *
500
+	 * @param object|references_articles $article L'annonce pour laquelle on fait la notification
501
+	 * @return bool
502
+	 */
503
+	public function notifyNewArticle(references_articles $article)
504
+	{
505
+		$plugins = references_plugins::getInstance();
506
+		$plugins->fireAction(references_plugins::EVENT_ON_REFERENCE_CREATE, new references_parameters(array('reference' => $article)));
507
+
508
+		return true;
509
+	}
510
+
511
+	/**
512
+	 * Effectue la suppression d'un article (et de ses images et fichier attaché)
513
+	 *
514
+	 * @param references_articles $article L'article à supprimer
515
+	 * @return boolean    Le résultat de la suppression
516
+	 */
517
+	public function deleteArticle(references_articles $article)
518
+	{
519
+		$article->deletePicturesAndThumbs();
520
+		$article->deleteAttachment();
521
+
522
+		return $this->delete($article, true);
523
+	}
524
+
525
+	/**
526
+	 * Retourne la liste des catégories uniques utilisées par les références
527
+	 *
528
+	 */
529
+	public function getDistinctCategoriesIds()
530
+	{
531
+		$ret = array();
532
+		$sql = 'SELECT distinct(article_category_id) FROM ' . $this->table;
533
+		$sql .= ' ' . $this->getPermissionsCategoriesCriteria()->renderWhere();    // Permissions
534
+		$sql .= ' GROUP BY article_category_id ORDER BY article_category_id';
535
+		$result = $this->db->query($sql);
536
+		if (!$result) {
537
+			return $ret;
538
+		}
539
+		while ($row = $this->db->fetchArray($result)) {
540
+			$ret[$row['article_category_id']] = $row['article_category_id'];
541
+		}
542
+
543
+		return $ret;
544
+	}
545
+
546
+	/**
547
+	 * Passe un article en ligne
548
+	 *
549
+	 * @param  references_articles $article
550
+	 * @return boolean
551
+	 */
552
+	public function onlineArticle(references_articles $article)
553
+	{
554
+		$article->setVar('article_online', REFERENCES_STATUS_ONLINE);
555
+
556
+		return $this->insert($article, true);
557
+	}
558
+
559
+	/**
560
+	 * Passe un article hors ligne
561
+	 *
562
+	 * @param  references_articles $article
563
+	 * @return boolean
564
+	 */
565
+	public function offlineArticle(references_articles $article)
566
+	{
567
+		$article->setVar('article_online', REFERENCES_STATUS_OFFLINE);
568
+
569
+		return $this->insert($article, true);
570
+	}
571
+
572
+	/**
573
+	 * Indique si une référence est visible d'un utilisateur
574
+	 *
575
+	 * @param object|references_articles $article L'article à controler
576
+	 * @param integer                    $uid     L'id de l'utilisateur à controler
577
+	 * @return bool
578
+	 */
579
+	public function userCanSeeReference(references_articles $article, $uid = 0)
580
+	{
581
+		global $xoopsUser;
582
+		if ($uid == 0) {
583
+			$uid = references_utils::getCurrentUserID();
584
+		}
585
+		$currentModule = references_utils::getModule();
586
+		$groups        = is_object($xoopsUser) ? $xoopsUser->getGroups() : XOOPS_GROUP_ANONYMOUS;
587
+		$gperm_handler = xoops_getHandler('groupperm');
588
+
589
+		return $gperm_handler->checkRight(REFERENCES_PERM_READ, $article->article_category_id, references_utils::getMemberGroups($uid), $currentModule->getVar('mid'));
590
+	}
591
+
592
+	/**
593
+	 * Remonte un article d'un cran dans l'ordre global des articles
594
+	 *
595
+	 * @param  integer $currentId    L'ID de l'article courant dont on souhaite remonter l'ordre
596
+	 * @param integer  $currentOrder L'ordre de l'élément courant à remonter
597
+	 * @return void
598
+	 */
599
+	public function moveUp($currentId, $currentOrder)
600
+	{
601
+		$sql_plus = 'SELECT article_id FROM ' . $this->table . ' WHERE article_weight = ' . ((int)$currentOrder - 1);
602
+		$res_plus = $this->db->query($sql_plus);
603
+		if ($this->db->getRowsNum($res_plus) == 0) {
604
+			return;
605
+		}
606
+		$row_plus = $this->db->fetchArray($res_plus);
607
+
608
+		$upd1 = 'UPDATE ' . $this->table . ' SET article_weight = (article_weight + 1) WHERE article_id = ' . $row_plus['article_id'];
609
+		$this->db->queryF($upd1);
610
+
611
+		$upd2 = 'UPDATE ' . $this->table . ' SET article_weight = (article_weight - 1) WHERE article_id = ' . (int)$currentId;
612
+		$this->db->queryF($upd2);
613
+		$this->forceCacheClean();
614
+	}
615
+
616
+	/**
617
+	 * Descend un article d'un cran dans l'ordre global des articles
618
+	 *
619
+	 * @param  integer $currentId    L'Id de l'article courant dont on souhaite descendre l'ordre
620
+	 * @param integer  $currentOrder L'orde de l'élément courant à remonter
621
+	 * @return void
622
+	 */
623
+	public function moveDown($currentId, $currentOrder)
624
+	{
625
+		$sql_moins = 'SELECT article_id FROM ' . $this->table . ' WHERE article_weight = ' . ((int)$currentOrder + 1);
626
+		$res_moins = $this->db->query($sql_moins);
627
+		if ($this->db->getRowsNum($res_moins) == 0) {
628
+			return;
629
+		}
630
+
631
+		$row_moins = $this->db->fetchArray($res_moins);
632
+		$upd1      = 'UPDATE ' . $this->table . ' SET article_weight = (article_weight - 1) WHERE article_id = ' . $row_moins['article_id'];
633
+		$this->db->queryF($upd1);
634
+
635
+		$upd2 = 'UPDATE ' . $this->table . ' SET article_weight =( article_weight + 1) WHERE article_id = ' . (int)$currentId;
636
+		$this->db->queryF($upd2);
637
+		$this->forceCacheClean();
638
+	}
639 639
 }
Please login to merge, or discard this patch.
class/references_categories.php 1 patch
Indentation   +183 added lines, -183 removed lines patch added patch discarded remove patch
@@ -22,195 +22,195 @@
 block discarded – undo
22 22
 
23 23
 require_once XOOPS_ROOT_PATH . '/kernel/object.php';
24 24
 if (!class_exists('references_XoopsPersistableObjectHandler')) {
25
-    require_once XOOPS_ROOT_PATH . '/modules/references/class/PersistableObjectHandler.php';
25
+	require_once XOOPS_ROOT_PATH . '/modules/references/class/PersistableObjectHandler.php';
26 26
 }
27 27
 
28 28
 class references_categories extends references_Object
29 29
 {
30
-    public function __construct()
31
-    {
32
-        $this->initVar('category_id', XOBJ_DTYPE_INT, null, false);
33
-        $this->initVar('category_title', XOBJ_DTYPE_TXTBOX, null, false);
34
-        $this->initVar('category_weight', XOBJ_DTYPE_INT, null, false);
35
-        $this->initVar('category_description', XOBJ_DTYPE_TXTAREA, null, false);
36
-        // Pour autoriser le html
37
-        $this->initVar('dohtml', XOBJ_DTYPE_INT, 1, false);
38
-    }
39
-
40
-    /**
41
-     * Retourne la chaine de caractères qui peut être utilisée dans l'attribut href d'une balise html A.
42
-     *
43
-     * @return string
44
-     */
45
-    public function getHrefTitle()
46
-    {
47
-        return references_utils::makeHrefTitle($this->getVar('category_title'));
48
-    }
49
-
50
-    /**
51
-     * Retourne l'url à utiliser pour atteindre la catégorie
52
-     *
53
-     * @param bool $shortVersion
54
-     * @return string
55
-     */
56
-    public function getUrl($shortVersion = false)
57
-    {
58
-        if (!$shortVersion) {
59
-            return REFERENCES_URL . 'category.php?category_id=' . $this->getVar('category_id');
60
-        } else {
61
-            return 'category.php?category_id=' . $this->getVar('category_id');
62
-        }
63
-    }
64
-
65
-    /**
66
-     * Retourne les éléments de l'annnonce formatés pour affichage
67
-     *
68
-     * @param string $format Format à utiliser
69
-     * @return array
70
-     */
71
-    public function toArray($format = 's')
72
-    {
73
-        $ret                          = array();
74
-        $ret                          = parent::toArray($format);
75
-        $ret['category_href_title']   = $this->getHrefTitle();
76
-        $ret['category_url_rewrited'] = $this->getUrl();
77
-
78
-        return $ret;
79
-    }
30
+	public function __construct()
31
+	{
32
+		$this->initVar('category_id', XOBJ_DTYPE_INT, null, false);
33
+		$this->initVar('category_title', XOBJ_DTYPE_TXTBOX, null, false);
34
+		$this->initVar('category_weight', XOBJ_DTYPE_INT, null, false);
35
+		$this->initVar('category_description', XOBJ_DTYPE_TXTAREA, null, false);
36
+		// Pour autoriser le html
37
+		$this->initVar('dohtml', XOBJ_DTYPE_INT, 1, false);
38
+	}
39
+
40
+	/**
41
+	 * Retourne la chaine de caractères qui peut être utilisée dans l'attribut href d'une balise html A.
42
+	 *
43
+	 * @return string
44
+	 */
45
+	public function getHrefTitle()
46
+	{
47
+		return references_utils::makeHrefTitle($this->getVar('category_title'));
48
+	}
49
+
50
+	/**
51
+	 * Retourne l'url à utiliser pour atteindre la catégorie
52
+	 *
53
+	 * @param bool $shortVersion
54
+	 * @return string
55
+	 */
56
+	public function getUrl($shortVersion = false)
57
+	{
58
+		if (!$shortVersion) {
59
+			return REFERENCES_URL . 'category.php?category_id=' . $this->getVar('category_id');
60
+		} else {
61
+			return 'category.php?category_id=' . $this->getVar('category_id');
62
+		}
63
+	}
64
+
65
+	/**
66
+	 * Retourne les éléments de l'annnonce formatés pour affichage
67
+	 *
68
+	 * @param string $format Format à utiliser
69
+	 * @return array
70
+	 */
71
+	public function toArray($format = 's')
72
+	{
73
+		$ret                          = array();
74
+		$ret                          = parent::toArray($format);
75
+		$ret['category_href_title']   = $this->getHrefTitle();
76
+		$ret['category_url_rewrited'] = $this->getUrl();
77
+
78
+		return $ret;
79
+	}
80 80
 }
81 81
 
82 82
 class ReferencesReferences_categoriesHandler extends references_XoopsPersistableObjectHandler
83 83
 {
84
-    public function __construct($db)
85
-    {    //                         Table                   Classe                    Id                Descr.
86
-        parent::__construct($db, 'references_categories', 'references_categories', 'category_id', 'category_title');
87
-    }
88
-
89
-    /**
90
-     * Retourne le crit�re � utiliser pour voir les cat�gories en respectant les permissions
91
-     *
92
-     * @param  string $permissionsType Type de permission (pour l'instant permission de voir)
93
-     * @return obejct de type Criteria
94
-     */
95
-    public function getPermissionsCategoriesCriteria($permissionsType = REFERENCES_PERM_READ)
96
-    {
97
-        global $xoopsUser;
98
-        static $permissions = array();
99
-        if (references_utils::isAdmin()) {
100
-            return new Criteria('category_id', '0', '>');
101
-        }
102
-        if (is_array($permissions) && array_key_exists($permissionsType, $permissions)) {
103
-            return $permissions[$permissionsType];
104
-        }
105
-        $categories    = array();
106
-        $currentModule = references_utils::getModule();
107
-        $groups        = is_object($xoopsUser) ? $xoopsUser->getGroups() : XOOPS_GROUP_ANONYMOUS;
108
-        $gperm_handler = xoops_getHandler('groupperm');
109
-        $categories    = $gperm_handler->getItemIds($permissionsType, $groups, $currentModule->getVar('mid'));
110
-        if (is_array($categories) && count($categories) > 0) {
111
-            $permissions[$permissionsType] = new Criteria('category_id', '(' . implode(',', $categories) . ')', 'IN');
112
-        } else {    // Ne peut rien voir
113
-            $permissions[$permissionsType] = new Criteria('category_id', '0', '=');
114
-        }
115
-
116
-        return $permissions[$permissionsType];
117
-    }
118
-
119
-    /**
120
-     * Retourne les catégories
121
-     *
122
-     * @param integer $start Indice de début
123
-     * @param integer $limit Nombre d'objets à renvoyer
124
-     * @param  string $sort  Zone de tri
125
-     * @param  string $order Sens du tri
126
-     * @return array   Objets de type references_categories
127
-     */
128
-    public function getCategories($start = 0, $limit = 0, $sort = 'category_weight', $order = 'ASC')
129
-    {
130
-        $criteria = new CriteriaCompo();
131
-        $criteria->add(new Criteria('category_id', 0, '<>'));
132
-        $criteria->add($this->getPermissionsCategoriesCriteria());
133
-        $criteria->setStart($start);
134
-        $criteria->setSort($sort);
135
-        $criteria->setOrder($order);
136
-        $criteria->setLimit($limit);
137
-
138
-        return $this->getObjects($criteria, true);
139
-    }
140
-
141
-    /**
142
-     * Retourne la liste des catégories en tant que tableau
143
-     * @param integer $start Position de départ
144
-     * @param integer $limit Nombre maximum d'objets à retourner
145
-     * @param  string $sort  ordre de tri
146
-     * @param  string $order Sens du tri
147
-     * @return array
148
-     */
149
-    public function getListArray($start = 0, $limit = 0, $sort = 'category_weight', $order = 'ASC')
150
-    {
151
-        $criteria = new CriteriaCompo();
152
-        $criteria->add(new Criteria('category_id', 0, '<>'));
153
-        $criteria->add($this->getPermissionsCategoriesCriteria());
154
-        $criteria->setStart($start);
155
-        $criteria->setSort($sort);
156
-        $criteria->setOrder($order);
157
-        $criteria->setLimit($limit);
158
-
159
-        return $this->getList($criteria);
160
-    }
161
-
162
-    /**
163
-     * Retourne le sélecteur à utiliser pour voir la liste des catégies
164
-     *
165
-     * @param string  $selectName Le nom du sélecteur
166
-     * @param integer $selected   L'élément sélectionné
167
-     * @return string
168
-     */
169
-    public function getCategoriesSelect($selectName = 'categoriesSelect', $selected = 0)
170
-    {
171
-        $categories = array();
172
-        $ret        = '';
173
-        $categories = $this->getListArray(0, 0, 'category_weight ASC, category_title', 'ASC');
174
-        if (count($categories) == 0) {
175
-            return $ret;
176
-        }
177
-        $jump  = REFERENCES_URL . 'category.php?category_id=';
178
-        $extra = " onchange='location=\"" . $jump . "\"+this.options[this.selectedIndex].value'";
179
-
180
-        return references_utils::htmlSelect($selectName, $categories, $selected, true, '', false, 1, $extra);
181
-    }
182
-
183
-    /**
184
-     * Notification de la création d'une nouvelle catégorie
185
-     *
186
-     * @param object|references_categories $category
187
-     * @return bool
188
-     */
189
-    public function notifyNewCategory(references_categories $category)
190
-    {
191
-        $plugins = references_plugins::getInstance();
192
-        $plugins->fireAction(references_plugins::EVENT_ON_CATEGORY_CREATE, new references_parameters(array('category' => $category)));
193
-
194
-        return true;
195
-    }
196
-
197
-    /**
198
-     * Indique si une catégorie est visible d'un utilisateur
199
-     *
200
-     * @param object|references_categories $category La catégorie à controler
201
-     * @param integer                      $uid      L'id de l'utilisateur à controler
202
-     * @return bool
203
-     */
204
-    public function userCanSeeCategory(references_categories $category, $uid = 0)
205
-    {
206
-        global $xoopsUser;
207
-        if ($uid == 0) {
208
-            $uid = references_utils::getCurrentUserID();
209
-        }
210
-        $currentModule = references_utils::getModule();
211
-        $groups        = is_object($xoopsUser) ? $xoopsUser->getGroups() : XOOPS_GROUP_ANONYMOUS;
212
-        $gperm_handler = xoops_getHandler('groupperm');
213
-
214
-        return $gperm_handler->checkRight(REFERENCES_PERM_READ, $category->category_id, references_utils::getMemberGroups($uid), $currentModule->getVar('mid'));
215
-    }
84
+	public function __construct($db)
85
+	{    //                         Table                   Classe                    Id                Descr.
86
+		parent::__construct($db, 'references_categories', 'references_categories', 'category_id', 'category_title');
87
+	}
88
+
89
+	/**
90
+	 * Retourne le crit�re � utiliser pour voir les cat�gories en respectant les permissions
91
+	 *
92
+	 * @param  string $permissionsType Type de permission (pour l'instant permission de voir)
93
+	 * @return obejct de type Criteria
94
+	 */
95
+	public function getPermissionsCategoriesCriteria($permissionsType = REFERENCES_PERM_READ)
96
+	{
97
+		global $xoopsUser;
98
+		static $permissions = array();
99
+		if (references_utils::isAdmin()) {
100
+			return new Criteria('category_id', '0', '>');
101
+		}
102
+		if (is_array($permissions) && array_key_exists($permissionsType, $permissions)) {
103
+			return $permissions[$permissionsType];
104
+		}
105
+		$categories    = array();
106
+		$currentModule = references_utils::getModule();
107
+		$groups        = is_object($xoopsUser) ? $xoopsUser->getGroups() : XOOPS_GROUP_ANONYMOUS;
108
+		$gperm_handler = xoops_getHandler('groupperm');
109
+		$categories    = $gperm_handler->getItemIds($permissionsType, $groups, $currentModule->getVar('mid'));
110
+		if (is_array($categories) && count($categories) > 0) {
111
+			$permissions[$permissionsType] = new Criteria('category_id', '(' . implode(',', $categories) . ')', 'IN');
112
+		} else {    // Ne peut rien voir
113
+			$permissions[$permissionsType] = new Criteria('category_id', '0', '=');
114
+		}
115
+
116
+		return $permissions[$permissionsType];
117
+	}
118
+
119
+	/**
120
+	 * Retourne les catégories
121
+	 *
122
+	 * @param integer $start Indice de début
123
+	 * @param integer $limit Nombre d'objets à renvoyer
124
+	 * @param  string $sort  Zone de tri
125
+	 * @param  string $order Sens du tri
126
+	 * @return array   Objets de type references_categories
127
+	 */
128
+	public function getCategories($start = 0, $limit = 0, $sort = 'category_weight', $order = 'ASC')
129
+	{
130
+		$criteria = new CriteriaCompo();
131
+		$criteria->add(new Criteria('category_id', 0, '<>'));
132
+		$criteria->add($this->getPermissionsCategoriesCriteria());
133
+		$criteria->setStart($start);
134
+		$criteria->setSort($sort);
135
+		$criteria->setOrder($order);
136
+		$criteria->setLimit($limit);
137
+
138
+		return $this->getObjects($criteria, true);
139
+	}
140
+
141
+	/**
142
+	 * Retourne la liste des catégories en tant que tableau
143
+	 * @param integer $start Position de départ
144
+	 * @param integer $limit Nombre maximum d'objets à retourner
145
+	 * @param  string $sort  ordre de tri
146
+	 * @param  string $order Sens du tri
147
+	 * @return array
148
+	 */
149
+	public function getListArray($start = 0, $limit = 0, $sort = 'category_weight', $order = 'ASC')
150
+	{
151
+		$criteria = new CriteriaCompo();
152
+		$criteria->add(new Criteria('category_id', 0, '<>'));
153
+		$criteria->add($this->getPermissionsCategoriesCriteria());
154
+		$criteria->setStart($start);
155
+		$criteria->setSort($sort);
156
+		$criteria->setOrder($order);
157
+		$criteria->setLimit($limit);
158
+
159
+		return $this->getList($criteria);
160
+	}
161
+
162
+	/**
163
+	 * Retourne le sélecteur à utiliser pour voir la liste des catégies
164
+	 *
165
+	 * @param string  $selectName Le nom du sélecteur
166
+	 * @param integer $selected   L'élément sélectionné
167
+	 * @return string
168
+	 */
169
+	public function getCategoriesSelect($selectName = 'categoriesSelect', $selected = 0)
170
+	{
171
+		$categories = array();
172
+		$ret        = '';
173
+		$categories = $this->getListArray(0, 0, 'category_weight ASC, category_title', 'ASC');
174
+		if (count($categories) == 0) {
175
+			return $ret;
176
+		}
177
+		$jump  = REFERENCES_URL . 'category.php?category_id=';
178
+		$extra = " onchange='location=\"" . $jump . "\"+this.options[this.selectedIndex].value'";
179
+
180
+		return references_utils::htmlSelect($selectName, $categories, $selected, true, '', false, 1, $extra);
181
+	}
182
+
183
+	/**
184
+	 * Notification de la création d'une nouvelle catégorie
185
+	 *
186
+	 * @param object|references_categories $category
187
+	 * @return bool
188
+	 */
189
+	public function notifyNewCategory(references_categories $category)
190
+	{
191
+		$plugins = references_plugins::getInstance();
192
+		$plugins->fireAction(references_plugins::EVENT_ON_CATEGORY_CREATE, new references_parameters(array('category' => $category)));
193
+
194
+		return true;
195
+	}
196
+
197
+	/**
198
+	 * Indique si une catégorie est visible d'un utilisateur
199
+	 *
200
+	 * @param object|references_categories $category La catégorie à controler
201
+	 * @param integer                      $uid      L'id de l'utilisateur à controler
202
+	 * @return bool
203
+	 */
204
+	public function userCanSeeCategory(references_categories $category, $uid = 0)
205
+	{
206
+		global $xoopsUser;
207
+		if ($uid == 0) {
208
+			$uid = references_utils::getCurrentUserID();
209
+		}
210
+		$currentModule = references_utils::getModule();
211
+		$groups        = is_object($xoopsUser) ? $xoopsUser->getGroups() : XOOPS_GROUP_ANONYMOUS;
212
+		$gperm_handler = xoops_getHandler('groupperm');
213
+
214
+		return $gperm_handler->checkRight(REFERENCES_PERM_READ, $category->category_id, references_utils::getMemberGroups($uid), $currentModule->getVar('mid'));
215
+	}
216 216
 }
Please login to merge, or discard this patch.
class/PersistableObjectHandler.php 1 patch
Indentation   +808 added lines, -808 removed lines patch added patch discarded remove patch
@@ -25,44 +25,44 @@  discard block
 block discarded – undo
25 25
 
26 26
 class references_Object extends XoopsObject
27 27
 {
28
-    public function toArray($format = 's')
29
-    {
30
-        $ret = array();
31
-        foreach ($this->vars as $k => $v) {
32
-            $ret[$k] = $this->getVar($k, $format);
33
-        }
34
-
35
-        return $ret;
36
-    }
37
-
38
-    // TODO: Rajouter une méthode intsert() et delete()
39
-
40
-    /**
41
-     * Permet de valoriser un champ de la table comme si c'était une propriété de la classe
42
-     *
43
-     * @example $enregistrement->nom_du_champ = 'ma chaine'
44
-     *
45
-     * @param string $key   Le nom du champ à traiter
46
-     * @param mixed  $value La valeur à lui attribuer
47
-     * @return void
48
-     */
49
-    public function __set($key, $value)
50
-    {
51
-        return $this->setVar($key, $value);
52
-    }
53
-
54
-    /**
55
-     * Permet d'accéder aux champs de la table comme à des propriétés de la classe
56
-     *
57
-     * @example echo $enregistrement->nom_du_champ;
58
-     *
59
-     * @param string $key Le nom du champ que l'on souhaite récupérer
60
-     * @return mixed
61
-     */
62
-    public function __get($key)
63
-    {
64
-        return $this->getVar($key);
65
-    }
28
+	public function toArray($format = 's')
29
+	{
30
+		$ret = array();
31
+		foreach ($this->vars as $k => $v) {
32
+			$ret[$k] = $this->getVar($k, $format);
33
+		}
34
+
35
+		return $ret;
36
+	}
37
+
38
+	// TODO: Rajouter une méthode intsert() et delete()
39
+
40
+	/**
41
+	 * Permet de valoriser un champ de la table comme si c'était une propriété de la classe
42
+	 *
43
+	 * @example $enregistrement->nom_du_champ = 'ma chaine'
44
+	 *
45
+	 * @param string $key   Le nom du champ à traiter
46
+	 * @param mixed  $value La valeur à lui attribuer
47
+	 * @return void
48
+	 */
49
+	public function __set($key, $value)
50
+	{
51
+		return $this->setVar($key, $value);
52
+	}
53
+
54
+	/**
55
+	 * Permet d'accéder aux champs de la table comme à des propriétés de la classe
56
+	 *
57
+	 * @example echo $enregistrement->nom_du_champ;
58
+	 *
59
+	 * @param string $key Le nom du champ que l'on souhaite récupérer
60
+	 * @return mixed
61
+	 */
62
+	public function __get($key)
63
+	{
64
+		return $this->getVar($key);
65
+	}
66 66
 }
67 67
 
68 68
 /**
@@ -73,778 +73,778 @@  discard block
 block discarded – undo
73 73
  */
74 74
 class references_XoopsPersistableObjectHandler extends XoopsObjectHandler
75 75
 {
76
-    /**#@+
76
+	/**#@+
77 77
      * Information about the class, the handler is managing
78 78
      *
79 79
      * @var string
80 80
      */
81
-    public    $table;
82
-    public    $keyName;
83
-    public    $className;
84
-    public    $identifierName;
85
-    protected $cacheOptions = array();
86
-    /**#@-*/
87
-
88
-    /**
89
-     * Constructor - called from child classes
90
-     * @param object $db           {@link XoopsDatabase} object
91
-     * @param string $tablename    Name of database table
92
-     * @param string $classname    Name of Class, this handler is managing
93
-     * @param string $keyname      Name of the property, holding the key
94
-     * @param string $idenfierName Name of the property, holding the label
95
-     * @param array  $cacheOptions Optional, options for the cache
96
-     *
97
-     */
98
-    public function __construct(&$db, $tablename, $classname, $keyname, $idenfierName = '', $cacheOptions = null)
99
-    {
100
-        parent::__construct($db);
101
-        $this->table     = $db->prefix($tablename);
102
-        $this->keyName   = $keyname;
103
-        $this->className = $classname;
104
-        if (trim($idenfierName) != '') {
105
-            $this->identifierName = $idenfierName;
106
-        }
107
-        // To diable cache, add this line after the first one : 'caching' => false,
108
-        if (is_null($cacheOptions)) {
109
-            $this->setCachingOptions(array('cacheDir' => REFERENCES_CACHE_PATH, 'lifeTime' => null, 'automaticSerialization' => true, 'fileNameProtection' => false));
110
-        } else {
111
-            $this->setCachingOptions($cacheOptions);
112
-        }
113
-    }
114
-
115
-    public function setCachingOptions($cacheOptions)
116
-    {
117
-        $this->cacheOptions = $cacheOptions;
118
-    }
119
-
120
-    /**
121
-     * Generates a unique ID for a Sql Query
122
-     *
123
-     * @param  string  $query The SQL query for which we want a unidque ID
124
-     * @param  integer $start Which record to start at
125
-     * @param  integer $limit Max number of objects to fetch
126
-     * @return string  An MD5 of the query
127
-     */
128
-    protected function _getIdForCache($query, $start, $limit)
129
-    {
130
-        $id = md5($query . '-' . (string)$start . '-' . (string)$limit);
131
-
132
-        return $id;
133
-    }
134
-
135
-    /**
136
-     * create a new object
137
-     *
138
-     * @param bool $isNew Flag the new objects as "new"?
139
-     *
140
-     * @return object
141
-     */
142
-    public function &create($isNew = true)
143
-    {
144
-        $obj = new $this->className();
145
-        if ($isNew === true) {
146
-            $obj->setNew();
147
-        }
148
-
149
-        return $obj;
150
-    }
151
-
152
-    /**
153
-     * retrieve an object
154
-     *
155
-     * @param  mixed $id        ID of the object - or array of ids for joint keys. Joint keys MUST be given in the same order as in the constructor
156
-     * @param  bool  $as_object whether to return an object or an array
157
-     * @return mixed reference to the object, FALSE if failed
158
-     */
159
-    public function &get($id, $as_object = true)
160
-    {
161
-        if (is_array($this->keyName)) {
162
-            $criteria = new CriteriaCompo();
163
-            $vnb      = count($this->keyName);
164
-            for ($i = 0; $i < $vnb; ++$i) {
165
-                $criteria->add(new Criteria($this->keyName[$i], (int)$id[$i]));
166
-            }
167
-        } else {
168
-            $criteria = new Criteria($this->keyName, (int)$id);
169
-        }
170
-        $criteria->setLimit(1);
171
-        $obj_array =& $this->getObjects($criteria, false, $as_object);
172
-        if (count($obj_array) != 1) {
173
-            $ret = null;
174
-        } else {
175
-            $ret =& $obj_array[0];
176
-        }
177
-
178
-        return $ret;
179
-    }
180
-
181
-    /**
182
-     * retrieve objects from the database
183
-     *
184
-     * @param null|CriteriaElement $criteria  {@link CriteriaElement} conditions to be met
185
-     * @param bool                 $id_as_key use the ID as key for the array?
186
-     * @param bool                 $as_object return an array of objects?
187
-     *
188
-     * @param string               $fields
189
-     * @param bool                 $autoSort
190
-     * @return array
191
-     */
192
-    public function &getObjects(CriteriaElement $criteria = null, $id_as_key = false, $as_object = true, $fields = '*', $autoSort = true)
193
-    {
194
-        require_once __DIR__ . '/lite.php';
195
-        $ret   = array();
196
-        $limit = $start = 0;
197
-        $sql   = 'SELECT ' . $fields . ' FROM ' . $this->table;
198
-        if (isset($criteria) && is_subclass_of($criteria, 'criteriaelement')) {
199
-            $sql .= ' ' . $criteria->renderWhere();
200
-            if ($criteria->groupby != '') {
201
-                $sql .= $criteria->getGroupby();
202
-            }
203
-            if ($criteria->getSort() != '') {
204
-                $sql .= ' ORDER BY ' . $criteria->getSort() . ' ' . $criteria->getOrder();
205
-            } elseif ($this->identifierName != '' && $autoSort) {
206
-                $sql .= ' ORDER BY ' . $this->identifierName;
207
-            }
208
-            $limit = $criteria->getLimit();
209
-            $start = $criteria->getStart();
210
-        }
211
-        $Cache_Lite = new references_Cache_Lite($this->cacheOptions);
212
-        $id         = $this->_getIdForCache($sql, $start, $limit);
213
-        $cacheData  = $Cache_Lite->get($id);
214
-        if ($cacheData === false) {
215
-            $result = $this->db->query($sql, $limit, $start);
216
-            if (!$result) {
217
-                return $ret;
218
-            }
219
-            $ret = $this->convertResultSet($result, $id_as_key, $as_object, $fields);
220
-            $Cache_Lite->save($ret);
221
-
222
-            return $ret;
223
-        } else {
224
-            return $cacheData;
225
-        }
226
-    }
227
-
228
-    /**
229
-     * Convert a database resultset to a returnable array
230
-     *
231
-     * @param object  $result    database resultset
232
-     * @param boolean $id_as_key - should NOT be used with joint keys
233
-     * @param boolean $as_object
234
-     * @param string  $fields    Requested fields from the query
235
-     *
236
-     * @return array
237
-     */
238
-    protected function convertResultSet($result, $id_as_key = false, $as_object = true, $fields = '*')
239
-    {
240
-        $ret = array();
241
-        while ($myrow = $this->db->fetchArray($result)) {
242
-            $obj =& $this->create(false);
243
-            $obj->assignVars($myrow);
244
-            if (!$id_as_key) {
245
-                if ($as_object) {
246
-                    $ret[] =& $obj;
247
-                } else {
248
-                    $row     = array();
249
-                    $vars    = $obj->getVars();
250
-                    $tbl_tmp = array_keys($vars);
251
-                    foreach ($tbl_tmp as $i) {
252
-                        $row[$i] = $obj->getVar($i);
253
-                    }
254
-                    $ret[] = $row;
255
-                }
256
-            } else {
257
-                if ($as_object) {
258
-                    if ($fields === '*') {
259
-                        $ret[$myrow[$this->keyName]] =& $obj;
260
-                    } else {
261
-                        $ret[] =& $obj;
262
-                    }
263
-                } else {
264
-                    $row     = array();
265
-                    $vars    = $obj->getVars();
266
-                    $tbl_tmp = array_keys($vars);
267
-                    foreach ($tbl_tmp as $i) {
268
-                        $row[$i] = $obj->getVar($i);
269
-                    }
270
-                    $ret[$myrow[$this->keyName]] = $row;
271
-                }
272
-            }
273
-            unset($obj);
274
-        }
275
-
276
-        return $ret;
277
-    }
278
-
279
-    /**
280
-     * get IDs of objects matching a condition
281
-     *
282
-     * @param  object $criteria {@link CriteriaElement} to match
283
-     * @return array  of object IDs
284
-     */
285
-    public function getIds($criteria = null)
286
-    {
287
-        require_once __DIR__ . '/lite.php';
288
-        $limit = $start = 0;
289
-
290
-        $Cache_Lite = new references_Cache_Lite($this->cacheOptions);
291
-        $sql        = 'SELECT ' . $this->keyName . ' FROM ' . $this->table;
292
-        if (isset($criteria) && is_subclass_of($criteria, 'criteriaelement')) {
293
-            $sql .= ' ' . $criteria->renderWhere();
294
-            if ($criteria->groupby != '') {
295
-                $sql .= $criteria->getGroupby();
296
-            }
297
-            if ($criteria->getSort() != '') {
298
-                $sql .= ' ORDER BY ' . $criteria->getSort() . ' ' . $criteria->getOrder();
299
-            } elseif ($this->identifierName != '') {
300
-                $sql .= ' ORDER BY ' . $this->identifierName;
301
-            }
302
-            $limit = $criteria->getLimit();
303
-            $start = $criteria->getStart();
304
-        }
305
-
306
-        $id        = $this->_getIdForCache($sql, $start, $limit);
307
-        $cacheData = $Cache_Lite->get($id);
308
-        if ($cacheData === false) {
309
-            $result = $this->db->query($sql, $limit, $start);
310
-            $ret    = array();
311
-            while ($myrow = $this->db->fetchArray($result)) {
312
-                $ret[] = $myrow[$this->keyName];
313
-            }
314
-            $Cache_Lite->save($ret);
315
-
316
-            return $ret;
317
-        } else {
318
-            return $cacheData;
319
-        }
320
-    }
321
-
322
-    /**
323
-     * Retrieve a list of objects as arrays - DON'T USE WITH JOINT KEYS
324
-     *
325
-     * @param object $criteria {@link CriteriaElement} conditions to be met
326
-     * @return array
327
-     */
328
-    public function getList($criteria = null)
329
-    {
330
-        require_once __DIR__ . '/lite.php';
331
-        $limit      = $start = 0;
332
-        $Cache_Lite = new references_Cache_Lite($this->cacheOptions);
333
-
334
-        $ret = array();
335
-
336
-        $sql = 'SELECT ' . $this->keyName;
337
-        if (!empty($this->identifierName)) {
338
-            $sql .= ', ' . $this->identifierName;
339
-        }
340
-        $sql .= ' FROM ' . $this->table;
341
-        if (isset($criteria) && is_subclass_of($criteria, 'criteriaelement')) {
342
-            $sql .= ' ' . $criteria->renderWhere();
343
-            if ($criteria->groupby != '') {
344
-                $sql .= $criteria->getGroupby();
345
-            }
346
-            if ($criteria->getSort() != '') {
347
-                $sql .= ' ORDER BY ' . $criteria->getSort() . ' ' . $criteria->getOrder();
348
-            } elseif ($this->identifierName != '') {
349
-                $sql .= ' ORDER BY ' . $this->identifierName;
350
-            }
351
-            $limit = $criteria->getLimit();
352
-            $start = $criteria->getStart();
353
-        }
354
-
355
-        $id        = $this->_getIdForCache($sql, $start, $limit);
356
-        $cacheData = $Cache_Lite->get($id);
357
-        if ($cacheData === false) {
358
-            $result = $this->db->query($sql, $limit, $start);
359
-            if (!$result) {
360
-                $Cache_Lite->save($ret);
361
-
362
-                return $ret;
363
-            }
364
-
365
-            $myts = MyTextSanitizer::getInstance();
366
-            while ($myrow = $this->db->fetchArray($result)) {
367
-                //identifiers should be textboxes, so sanitize them like that
368
-                $ret[$myrow[$this->keyName]] = empty($this->identifierName) ? 1 : $myts->htmlSpecialChars($myrow[$this->identifierName]);
369
-            }
370
-            $Cache_Lite->save($ret);
371
-
372
-            return $ret;
373
-        } else {
374
-            return $cacheData;
375
-        }
376
-    }
377
-
378
-    /**
379
-     * Retourne des éléments selon leur ID
380
-     *
381
-     * @param array $ids Les ID des éléments à retrouver
382
-     * @param null  $additionnal
383
-     * @return array Tableau d'objets
384
-     */
385
-    public function getItemsFromIds($ids, $additionnal = null)
386
-    {
387
-        $ret = array();
388
-        if (is_array($ids) && count($ids) > 0) {
389
-            $criteria = new CriteriaCompo();
390
-            $criteria->add(new Criteria($this->keyName, '(' . implode(',', $ids) . ')', 'IN'));
391
-            if (!is_null($additionnal)) {
392
-                $criteria->add($additionnal);
393
-            }
394
-            $ret =& $this->getObjects($criteria, true);
395
-        }
396
-
397
-        return $ret;
398
-    }
399
-
400
-    /**
401
-     * count objects matching a condition
402
-     *
403
-     * @param  object $criteria {@link CriteriaElement} to match
404
-     * @return int    count of objects
405
-     */
406
-    public function getCount($criteria = null)
407
-    {
408
-        $field   = '';
409
-        $groupby = false;
410
-        $limit   = $start = 0;
411
-        require_once __DIR__ . '/lite.php';
412
-
413
-        if (isset($criteria) && is_subclass_of($criteria, 'criteriaelement')) {
414
-            if ($criteria->groupby != '') {
415
-                $groupby = true;
416
-                $field   = $criteria->groupby . ', '; //Not entirely secure unless you KNOW that no criteria's groupby clause is going to be mis-used
417
-            }
418
-        }
419
-        $sql = 'SELECT ' . $field . 'COUNT(*) FROM ' . $this->table;
420
-        if (isset($criteria) && is_subclass_of($criteria, 'criteriaelement')) {
421
-            $sql .= ' ' . $criteria->renderWhere();
422
-            if ($criteria->groupby != '') {
423
-                $sql .= $criteria->getGroupby();
424
-            }
425
-            $limit = $criteria->getLimit();
426
-            $start = $criteria->getStart();
427
-        }
428
-        $Cache_Lite = new references_Cache_Lite($this->cacheOptions);
429
-        $id         = $this->_getIdForCache($sql, $start, $limit);
430
-        $cacheData  = $Cache_Lite->get($id);
431
-        if ($cacheData === false) {
432
-            $result = $this->db->query($sql, $limit, $start);
433
-            if (!$result) {
434
-                $ret = 0;
435
-                $Cache_Lite->save($ret);
436
-
437
-                return $ret;
438
-            }
439
-            if ($groupby == false) {
440
-                list($count) = $this->db->fetchRow($result);
441
-                $Cache_Lite->save($count);
442
-
443
-                return $count;
444
-            } else {
445
-                $ret = array();
446
-                while (list($id, $count) = $this->db->fetchRow($result)) {
447
-                    $ret[$id] = $count;
448
-                }
449
-                $Cache_Lite->save($ret);
450
-
451
-                return $ret;
452
-            }
453
-        } else {
454
-            return $cacheData;
455
-        }
456
-    }
457
-
458
-    /**
459
-     * Retourne le total d'un champ
460
-     *
461
-     * @param  string $field    Le champ dont on veut calculer le total
462
-     * @param  object $criteria {@link CriteriaElement} to match
463
-     * @return integer le total
464
-     */
465
-    public function getSum($field, $criteria = null)
466
-    {
467
-        $limit = $start = 0;
468
-        require_once __DIR__ . '/lite.php';
469
-
470
-        $sql = 'SELECT Sum(' . $field . ') as cpt FROM ' . $this->table;
471
-        if (isset($criteria) && is_subclass_of($criteria, 'criteriaelement')) {
472
-            $sql .= ' ' . $criteria->renderWhere();
473
-            if ($criteria->groupby != '') {
474
-                $sql .= $criteria->getGroupby();
475
-            }
476
-            $limit = $criteria->getLimit();
477
-            $start = $criteria->getStart();
478
-        }
479
-        $Cache_Lite = new references_Cache_Lite($this->cacheOptions);
480
-        $id         = $this->_getIdForCache($sql, $start, $limit);
481
-        $cacheData  = $Cache_Lite->get($id);
482
-        if ($cacheData === false) {
483
-            $result = $this->db->query($sql, $limit, $start);
484
-            if (!$result) {
485
-                $ret = 0;
486
-                $Cache_Lite->save($ret);
487
-
488
-                return $ret;
489
-            }
490
-            $row   = $this->db->fetchArray($result);
491
-            $count = $row['cpt'];
492
-            $Cache_Lite->save($count);
493
-
494
-            return $count;
495
-        } else {
496
-            return $cacheData;
497
-        }
498
-    }
499
-
500
-    /**
501
-     * delete an object from the database
502
-     *
503
-     * @param  XoopsObject $obj reference to the object to delete
504
-     * @param  bool        $force
505
-     * @return bool   FALSE if failed.
506
-     */
507
-    public function delete(XoopsObject $obj, $force = false)
508
-    {
509
-        if (is_array($this->keyName)) {
510
-            $clause = array();
511
-            $vnb    = count($this->keyName);
512
-            for ($i = 0; $i < $vnb; ++$i) {
513
-                $clause[] = $this->keyName[$i] . ' = ' . $obj->getVar($this->keyName[$i]);
514
-            }
515
-            $whereclause = implode(' AND ', $clause);
516
-        } else {
517
-            $whereclause = $this->keyName . ' = ' . $obj->getVar($this->keyName);
518
-        }
519
-        $sql = 'DELETE FROM ' . $this->table . ' WHERE ' . $whereclause;
520
-        if (false != $force) {
521
-            $result = $this->db->queryF($sql);
522
-        } else {
523
-            $result = $this->db->query($sql);
524
-        }
525
-        // Clear cache
526
-        $this->forceCacheClean();
527
-
528
-        if (!$result) {
529
-            return false;
530
-        }
531
-
532
-        return true;
533
-    }
534
-
535
-    /**
536
-     * Quickly insert a record like this $myobject_handler->quickInsert('field1' => field1value, 'field2' => $field2value)
537
-     *
538
-     * @param  array $vars  Array containing the fields name and value
539
-     * @param  bool  $force whether to force the query execution despite security settings
540
-     * @return bool  @link insert's value
541
-     */
542
-    public function quickInsert($vars = null, $force = true)
543
-    {
544
-        $object = $this->create(true);
545
-        $object->setVars($vars);
546
-        $retval =& $this->insert($object, $force);
547
-        unset($object);
548
-
549
-        // Clear cache
550
-        $this->forceCacheClean();
551
-
552
-        return $retval;
553
-    }
554
-
555
-    /**
556
-     * insert a new object in the database
557
-     *
558
-     * @param  XoopsObject $obj         reference to the object
559
-     * @param  bool        $force       whether to force the query execution despite security settings
560
-     * @param  bool        $checkObject check if the object is dirty and clean the attributes
561
-     * @param bool         $ignoreInsert
562
-     * @return bool FALSE if failed, TRUE if already present and unchanged or successful
563
-     */
564
-
565
-    public function insert(XoopsObject $obj, $force = false, $checkObject = true, $ignoreInsert = false)
566
-    {
567
-        if ($checkObject != false) {
568
-            if (!is_object($obj)) {
569
-                trigger_error('Error, not object');
570
-
571
-                return false;
572
-            }
573
-            /**
574
-             * @TODO: Change to if (!(class_exists($this->className) && $obj instanceof $this->className)) when going fully PHP5
575
-             */
576
-            if (!is_a($obj, $this->className)) {
577
-                $obj->setErrors(get_class($obj) . ' Differs from ' . $this->className);
578
-
579
-                return false;
580
-            }
581
-            if (!$obj->isDirty()) {
582
-                $obj->setErrors('Not dirty'); //will usually not be outputted as errors are not displayed when the method returns true, but it can be helpful when troubleshooting code - Mith
583
-
584
-                return true;
585
-            }
586
-        }
587
-        if (!$obj->cleanVars()) {
588
-            foreach ($obj->getErrors() as $oneerror) {
589
-                trigger_error($oneerror);
590
-            }
591
-
592
-            return false;
593
-        }
594
-        foreach ($obj->cleanVars as $k => $v) {
595
-            if ($obj->vars[$k]['data_type'] == XOBJ_DTYPE_INT) {
596
-                $cleanvars[$k] = (int)$v;
597
-            } elseif (is_array($v)) {
598
-                $cleanvars[$k] = $this->db->quoteString(implode(',', $v));
599
-            } else {
600
-                $cleanvars[$k] = $this->db->quoteString($v);
601
-            }
602
-        }
603
-        if (isset($cleanvars['dohtml'])) {        // Modification Herv� to be able to use dohtml
604
-            unset($cleanvars['dohtml']);
605
-        }
606
-        if ($obj->isNew()) {
607
-            if (!is_array($this->keyName)) {
608
-                if ($cleanvars[$this->keyName] < 1) {
609
-                    $cleanvars[$this->keyName] = $this->db->genId($this->table . '_' . $this->keyName . '_seq');
610
-                }
611
-            }
612
-            $ignore = '';
613
-            if ($ignoreInsert) {
614
-                $ignore = 'IGNORE';
615
-            }
616
-            $sql = "INSERT $ignore INTO " . $this->table . ' (' . implode(',', array_keys($cleanvars)) . ') VALUES (' . implode(',', array_values($cleanvars)) . ')';
617
-        } else {
618
-            $sql = 'UPDATE ' . $this->table . ' SET';
619
-            foreach ($cleanvars as $key => $value) {
620
-                if ((!is_array($this->keyName) && $key == $this->keyName) || (is_array($this->keyName) && in_array($key, $this->keyName))) {
621
-                    continue;
622
-                }
623
-                if (isset($notfirst)) {
624
-                    $sql .= ',';
625
-                }
626
-                $sql .= ' ' . $key . ' = ' . $value;
627
-                $notfirst = true;
628
-            }
629
-            if (is_array($this->keyName)) {
630
-                $whereclause = '';
631
-                $vnb         = count($this->keyName);
632
-                for ($i = 0; $i < $vnb; ++$i) {
633
-                    if ($i > 0) {
634
-                        $whereclause .= ' AND ';
635
-                    }
636
-                    $whereclause .= $this->keyName[$i] . ' = ' . $obj->getVar($this->keyName[$i]);
637
-                }
638
-            } else {
639
-                $whereclause = $this->keyName . ' = ' . $obj->getVar($this->keyName);
640
-            }
641
-            $sql .= ' WHERE ' . $whereclause;
642
-        }
643
-
644
-        if (false != $force) {
645
-            $result = $this->db->queryF($sql);
646
-        } else {
647
-            $result = $this->db->query($sql);
648
-        }
649
-
650
-        // Clear cache
651
-        $this->forceCacheClean();
652
-
653
-        if (!$result) {
654
-            return false;
655
-        }
656
-        if ($obj->isNew() && !is_array($this->keyName)) {
657
-            $obj->assignVar($this->keyName, $this->db->getInsertId());
658
-        }
659
-
660
-        return true;
661
-    }
662
-
663
-    /**
664
-     * Change a value for objects with a certain criteria
665
-     *
666
-     * @param string $fieldname  Name of the field
667
-     * @param string $fieldvalue Value to write
668
-     * @param object $criteria   {@link CriteriaElement}
669
-     *
670
-     * @param bool   $force
671
-     * @return bool
672
-     */
673
-    public function updateAll($fieldname, $fieldvalue, $criteria = null, $force = false)
674
-    {
675
-        $set_clause = $fieldname . ' = ';
676
-        if (is_numeric($fieldvalue)) {
677
-            $set_clause .= $fieldvalue;
678
-        } elseif (is_array($fieldvalue)) {
679
-            $set_clause .= $this->db->quoteString(implode(',', $fieldvalue));
680
-        } else {
681
-            $set_clause .= $this->db->quoteString($fieldvalue);
682
-        }
683
-        $sql = 'UPDATE ' . $this->table . ' SET ' . $set_clause;
684
-        if (isset($criteria) && is_subclass_of($criteria, 'criteriaelement')) {
685
-            $sql .= ' ' . $criteria->renderWhere();
686
-        }
687
-        if ($force) {
688
-            $result = $this->db->queryF($sql);
689
-        } else {
690
-            $result = $this->db->query($sql);
691
-        }
692
-
693
-        // Clear cache
694
-        $this->forceCacheClean();
695
-
696
-        if (!$result) {
697
-            return false;
698
-        }
699
-
700
-        return true;
701
-    }
702
-
703
-    //  check if target object is attempting to use duplicated info
704
-    public function isDuplicated(&$obj, $field = '', $error = '')
705
-    {
706
-        if (empty($field)) {
707
-            return false;
708
-        }
709
-        $criteria = new CriteriaCompo();
710
-        $criteria->add(new Criteria($field, $obj->getVar($field)));
711
-        //  one more condition if target object exisits in database
712
-        if (!$obj->isNew()) {
713
-            $criteria->add(new Criteria($this->_key, $obj->getVar($this->_key), '!='));
714
-        }
715
-        if ($this->getCount($criteria)) {
716
-            $obj->setErrors($error);
717
-
718
-            return true;
719
-        }
720
-
721
-        return false;
722
-    }
723
-
724
-    /**
725
-     * delete all objects meeting the conditions
726
-     *
727
-     * @param  object $criteria {@link CriteriaElement} with conditions to meet
728
-     * @return bool
729
-     */
730
-    public function deleteAll($criteria = null)
731
-    {
732
-        if (isset($criteria) && is_subclass_of($criteria, 'criteriaelement')) {
733
-            $sql = 'DELETE FROM ' . $this->table;
734
-            $sql .= ' ' . $criteria->renderWhere();
735
-            if (!$this->db->queryF($sql)) {
736
-                return false;
737
-            }
738
-            $rows = $this->db->getAffectedRows();
739
-
740
-            // Clear cache
741
-            $this->forceCacheClean();
742
-
743
-            return $rows > 0 ? $rows : true;
744
-        }
745
-
746
-        return false;
747
-    }
748
-
749
-    /**
750
-     * Compare two objects and returns, in an array, the differences
751
-     *
752
-     * @param  XoopsObject $old_object The first object to compare
753
-     * @param  XoopsObject $new_object The new object
754
-     * @return array       differences  key = fieldname, value = array('old_value', 'new_value')
755
-     */
756
-    public function compareObjects($old_object, $new_object)
757
-    {
758
-        $ret       = array();
759
-        $vars_name = array_keys($old_object->getVars());
760
-        foreach ($vars_name as $one_var) {
761
-            if ($old_object->getVar($one_var, 'f') == $new_object->getVar($one_var, 'f')) {
762
-            } else {
763
-                $ret[$one_var] = array($old_object->getVar($one_var), $new_object->getVar($one_var));
764
-            }
765
-        }
766
-
767
-        return $ret;
768
-    }
769
-
770
-    /**
771
-     * Get distincted values of a field in the table
772
-     *
773
-     * @param  string $field    Field's name
774
-     * @param  object $criteria {@link CriteriaElement} conditions to be met
775
-     * @param  string $format   Format in wich we want the datas
776
-     * @return array  containing the distinct values
777
-     */
778
-    public function getDistincts($field, $criteria = null, $format = 's')
779
-    {
780
-        require_once __DIR__ . '/lite.php';
781
-        $limit = $start = 0;
782
-        $sql   = 'SELECT ' . $this->keyName . ', ' . $field . ' FROM ' . $this->table;
783
-        if (isset($criteria) && is_subclass_of($criteria, 'criteriaelement')) {
784
-            $sql .= ' ' . $criteria->renderWhere();
785
-            $limit = $criteria->getLimit();
786
-            $start = $criteria->getStart();
787
-        }
788
-        $sql .= ' GROUP BY ' . $field . ' ORDER BY ' . $field;
789
-
790
-        $Cache_Lite = new references_Cache_Lite($this->cacheOptions);
791
-        $id         = $this->_getIdForCache($sql, $start, $limit);
792
-        $cacheData  = $Cache_Lite->get($id);
793
-        if ($cacheData === false) {
794
-            $result = $this->db->query($sql, $limit, $start);
795
-            $ret    = array();
796
-            $obj    = new $this->className();
797
-            while ($myrow = $this->db->fetchArray($result)) {
798
-                $obj->setVar($field, $myrow[$field]);
799
-                $ret[$myrow[$this->keyName]] = $obj->getVar($field, $format);
800
-            }
801
-            $Cache_Lite->save($ret);
802
-
803
-            return $ret;
804
-        } else {
805
-            return $cacheData;
806
-        }
807
-    }
808
-
809
-    /**
810
-     * A generic shortcut to getObjects
811
-     *
812
-     * @author Herve Thouzard - Instant Zero
813
-     *
814
-     * @param  integer $start   Starting position
815
-     * @param  integer $limit   Maximum count of elements to return
816
-     * @param  string  $sort    Field to use for the sort
817
-     * @param  string  $order   Sort order
818
-     * @param  boolean $idAsKey Do we have to return an array whoses keys are the record's ID ?
819
-     * @return array   Array of current objects
820
-     */
821
-    public function getItems($start = 0, $limit = 0, $sort = '', $order = 'ASC', $idAsKey = true)
822
-    {
823
-        if (trim($order) == '') {
824
-            if (isset($this->identifierName) && trim($this->identifierName) != '') {
825
-                $order = $this->identifierName;
826
-            } else {
827
-                $order = $this->keyName;
828
-            }
829
-        }
830
-        $items   = array();
831
-        $critere = new Criteria($this->keyName, 0, '<>');
832
-        $critere->setLimit($limit);
833
-        $critere->setStart($start);
834
-        $critere->setSort($sort);
835
-        $critere->setOrder($order);
836
-        $items =& $this->getObjects($critere, $idAsKey);
837
-
838
-        return $items;
839
-    }
840
-
841
-    /**
842
-     * Forces the cache to be cleaned
843
-     */
844
-    public function forceCacheClean()
845
-    {
846
-        require_once __DIR__ . '/lite.php';
847
-        $Cache_Lite = new references_Cache_Lite($this->cacheOptions);
848
-        $Cache_Lite->clean();
849
-    }
81
+	public    $table;
82
+	public    $keyName;
83
+	public    $className;
84
+	public    $identifierName;
85
+	protected $cacheOptions = array();
86
+	/**#@-*/
87
+
88
+	/**
89
+	 * Constructor - called from child classes
90
+	 * @param object $db           {@link XoopsDatabase} object
91
+	 * @param string $tablename    Name of database table
92
+	 * @param string $classname    Name of Class, this handler is managing
93
+	 * @param string $keyname      Name of the property, holding the key
94
+	 * @param string $idenfierName Name of the property, holding the label
95
+	 * @param array  $cacheOptions Optional, options for the cache
96
+	 *
97
+	 */
98
+	public function __construct(&$db, $tablename, $classname, $keyname, $idenfierName = '', $cacheOptions = null)
99
+	{
100
+		parent::__construct($db);
101
+		$this->table     = $db->prefix($tablename);
102
+		$this->keyName   = $keyname;
103
+		$this->className = $classname;
104
+		if (trim($idenfierName) != '') {
105
+			$this->identifierName = $idenfierName;
106
+		}
107
+		// To diable cache, add this line after the first one : 'caching' => false,
108
+		if (is_null($cacheOptions)) {
109
+			$this->setCachingOptions(array('cacheDir' => REFERENCES_CACHE_PATH, 'lifeTime' => null, 'automaticSerialization' => true, 'fileNameProtection' => false));
110
+		} else {
111
+			$this->setCachingOptions($cacheOptions);
112
+		}
113
+	}
114
+
115
+	public function setCachingOptions($cacheOptions)
116
+	{
117
+		$this->cacheOptions = $cacheOptions;
118
+	}
119
+
120
+	/**
121
+	 * Generates a unique ID for a Sql Query
122
+	 *
123
+	 * @param  string  $query The SQL query for which we want a unidque ID
124
+	 * @param  integer $start Which record to start at
125
+	 * @param  integer $limit Max number of objects to fetch
126
+	 * @return string  An MD5 of the query
127
+	 */
128
+	protected function _getIdForCache($query, $start, $limit)
129
+	{
130
+		$id = md5($query . '-' . (string)$start . '-' . (string)$limit);
131
+
132
+		return $id;
133
+	}
134
+
135
+	/**
136
+	 * create a new object
137
+	 *
138
+	 * @param bool $isNew Flag the new objects as "new"?
139
+	 *
140
+	 * @return object
141
+	 */
142
+	public function &create($isNew = true)
143
+	{
144
+		$obj = new $this->className();
145
+		if ($isNew === true) {
146
+			$obj->setNew();
147
+		}
148
+
149
+		return $obj;
150
+	}
151
+
152
+	/**
153
+	 * retrieve an object
154
+	 *
155
+	 * @param  mixed $id        ID of the object - or array of ids for joint keys. Joint keys MUST be given in the same order as in the constructor
156
+	 * @param  bool  $as_object whether to return an object or an array
157
+	 * @return mixed reference to the object, FALSE if failed
158
+	 */
159
+	public function &get($id, $as_object = true)
160
+	{
161
+		if (is_array($this->keyName)) {
162
+			$criteria = new CriteriaCompo();
163
+			$vnb      = count($this->keyName);
164
+			for ($i = 0; $i < $vnb; ++$i) {
165
+				$criteria->add(new Criteria($this->keyName[$i], (int)$id[$i]));
166
+			}
167
+		} else {
168
+			$criteria = new Criteria($this->keyName, (int)$id);
169
+		}
170
+		$criteria->setLimit(1);
171
+		$obj_array =& $this->getObjects($criteria, false, $as_object);
172
+		if (count($obj_array) != 1) {
173
+			$ret = null;
174
+		} else {
175
+			$ret =& $obj_array[0];
176
+		}
177
+
178
+		return $ret;
179
+	}
180
+
181
+	/**
182
+	 * retrieve objects from the database
183
+	 *
184
+	 * @param null|CriteriaElement $criteria  {@link CriteriaElement} conditions to be met
185
+	 * @param bool                 $id_as_key use the ID as key for the array?
186
+	 * @param bool                 $as_object return an array of objects?
187
+	 *
188
+	 * @param string               $fields
189
+	 * @param bool                 $autoSort
190
+	 * @return array
191
+	 */
192
+	public function &getObjects(CriteriaElement $criteria = null, $id_as_key = false, $as_object = true, $fields = '*', $autoSort = true)
193
+	{
194
+		require_once __DIR__ . '/lite.php';
195
+		$ret   = array();
196
+		$limit = $start = 0;
197
+		$sql   = 'SELECT ' . $fields . ' FROM ' . $this->table;
198
+		if (isset($criteria) && is_subclass_of($criteria, 'criteriaelement')) {
199
+			$sql .= ' ' . $criteria->renderWhere();
200
+			if ($criteria->groupby != '') {
201
+				$sql .= $criteria->getGroupby();
202
+			}
203
+			if ($criteria->getSort() != '') {
204
+				$sql .= ' ORDER BY ' . $criteria->getSort() . ' ' . $criteria->getOrder();
205
+			} elseif ($this->identifierName != '' && $autoSort) {
206
+				$sql .= ' ORDER BY ' . $this->identifierName;
207
+			}
208
+			$limit = $criteria->getLimit();
209
+			$start = $criteria->getStart();
210
+		}
211
+		$Cache_Lite = new references_Cache_Lite($this->cacheOptions);
212
+		$id         = $this->_getIdForCache($sql, $start, $limit);
213
+		$cacheData  = $Cache_Lite->get($id);
214
+		if ($cacheData === false) {
215
+			$result = $this->db->query($sql, $limit, $start);
216
+			if (!$result) {
217
+				return $ret;
218
+			}
219
+			$ret = $this->convertResultSet($result, $id_as_key, $as_object, $fields);
220
+			$Cache_Lite->save($ret);
221
+
222
+			return $ret;
223
+		} else {
224
+			return $cacheData;
225
+		}
226
+	}
227
+
228
+	/**
229
+	 * Convert a database resultset to a returnable array
230
+	 *
231
+	 * @param object  $result    database resultset
232
+	 * @param boolean $id_as_key - should NOT be used with joint keys
233
+	 * @param boolean $as_object
234
+	 * @param string  $fields    Requested fields from the query
235
+	 *
236
+	 * @return array
237
+	 */
238
+	protected function convertResultSet($result, $id_as_key = false, $as_object = true, $fields = '*')
239
+	{
240
+		$ret = array();
241
+		while ($myrow = $this->db->fetchArray($result)) {
242
+			$obj =& $this->create(false);
243
+			$obj->assignVars($myrow);
244
+			if (!$id_as_key) {
245
+				if ($as_object) {
246
+					$ret[] =& $obj;
247
+				} else {
248
+					$row     = array();
249
+					$vars    = $obj->getVars();
250
+					$tbl_tmp = array_keys($vars);
251
+					foreach ($tbl_tmp as $i) {
252
+						$row[$i] = $obj->getVar($i);
253
+					}
254
+					$ret[] = $row;
255
+				}
256
+			} else {
257
+				if ($as_object) {
258
+					if ($fields === '*') {
259
+						$ret[$myrow[$this->keyName]] =& $obj;
260
+					} else {
261
+						$ret[] =& $obj;
262
+					}
263
+				} else {
264
+					$row     = array();
265
+					$vars    = $obj->getVars();
266
+					$tbl_tmp = array_keys($vars);
267
+					foreach ($tbl_tmp as $i) {
268
+						$row[$i] = $obj->getVar($i);
269
+					}
270
+					$ret[$myrow[$this->keyName]] = $row;
271
+				}
272
+			}
273
+			unset($obj);
274
+		}
275
+
276
+		return $ret;
277
+	}
278
+
279
+	/**
280
+	 * get IDs of objects matching a condition
281
+	 *
282
+	 * @param  object $criteria {@link CriteriaElement} to match
283
+	 * @return array  of object IDs
284
+	 */
285
+	public function getIds($criteria = null)
286
+	{
287
+		require_once __DIR__ . '/lite.php';
288
+		$limit = $start = 0;
289
+
290
+		$Cache_Lite = new references_Cache_Lite($this->cacheOptions);
291
+		$sql        = 'SELECT ' . $this->keyName . ' FROM ' . $this->table;
292
+		if (isset($criteria) && is_subclass_of($criteria, 'criteriaelement')) {
293
+			$sql .= ' ' . $criteria->renderWhere();
294
+			if ($criteria->groupby != '') {
295
+				$sql .= $criteria->getGroupby();
296
+			}
297
+			if ($criteria->getSort() != '') {
298
+				$sql .= ' ORDER BY ' . $criteria->getSort() . ' ' . $criteria->getOrder();
299
+			} elseif ($this->identifierName != '') {
300
+				$sql .= ' ORDER BY ' . $this->identifierName;
301
+			}
302
+			$limit = $criteria->getLimit();
303
+			$start = $criteria->getStart();
304
+		}
305
+
306
+		$id        = $this->_getIdForCache($sql, $start, $limit);
307
+		$cacheData = $Cache_Lite->get($id);
308
+		if ($cacheData === false) {
309
+			$result = $this->db->query($sql, $limit, $start);
310
+			$ret    = array();
311
+			while ($myrow = $this->db->fetchArray($result)) {
312
+				$ret[] = $myrow[$this->keyName];
313
+			}
314
+			$Cache_Lite->save($ret);
315
+
316
+			return $ret;
317
+		} else {
318
+			return $cacheData;
319
+		}
320
+	}
321
+
322
+	/**
323
+	 * Retrieve a list of objects as arrays - DON'T USE WITH JOINT KEYS
324
+	 *
325
+	 * @param object $criteria {@link CriteriaElement} conditions to be met
326
+	 * @return array
327
+	 */
328
+	public function getList($criteria = null)
329
+	{
330
+		require_once __DIR__ . '/lite.php';
331
+		$limit      = $start = 0;
332
+		$Cache_Lite = new references_Cache_Lite($this->cacheOptions);
333
+
334
+		$ret = array();
335
+
336
+		$sql = 'SELECT ' . $this->keyName;
337
+		if (!empty($this->identifierName)) {
338
+			$sql .= ', ' . $this->identifierName;
339
+		}
340
+		$sql .= ' FROM ' . $this->table;
341
+		if (isset($criteria) && is_subclass_of($criteria, 'criteriaelement')) {
342
+			$sql .= ' ' . $criteria->renderWhere();
343
+			if ($criteria->groupby != '') {
344
+				$sql .= $criteria->getGroupby();
345
+			}
346
+			if ($criteria->getSort() != '') {
347
+				$sql .= ' ORDER BY ' . $criteria->getSort() . ' ' . $criteria->getOrder();
348
+			} elseif ($this->identifierName != '') {
349
+				$sql .= ' ORDER BY ' . $this->identifierName;
350
+			}
351
+			$limit = $criteria->getLimit();
352
+			$start = $criteria->getStart();
353
+		}
354
+
355
+		$id        = $this->_getIdForCache($sql, $start, $limit);
356
+		$cacheData = $Cache_Lite->get($id);
357
+		if ($cacheData === false) {
358
+			$result = $this->db->query($sql, $limit, $start);
359
+			if (!$result) {
360
+				$Cache_Lite->save($ret);
361
+
362
+				return $ret;
363
+			}
364
+
365
+			$myts = MyTextSanitizer::getInstance();
366
+			while ($myrow = $this->db->fetchArray($result)) {
367
+				//identifiers should be textboxes, so sanitize them like that
368
+				$ret[$myrow[$this->keyName]] = empty($this->identifierName) ? 1 : $myts->htmlSpecialChars($myrow[$this->identifierName]);
369
+			}
370
+			$Cache_Lite->save($ret);
371
+
372
+			return $ret;
373
+		} else {
374
+			return $cacheData;
375
+		}
376
+	}
377
+
378
+	/**
379
+	 * Retourne des éléments selon leur ID
380
+	 *
381
+	 * @param array $ids Les ID des éléments à retrouver
382
+	 * @param null  $additionnal
383
+	 * @return array Tableau d'objets
384
+	 */
385
+	public function getItemsFromIds($ids, $additionnal = null)
386
+	{
387
+		$ret = array();
388
+		if (is_array($ids) && count($ids) > 0) {
389
+			$criteria = new CriteriaCompo();
390
+			$criteria->add(new Criteria($this->keyName, '(' . implode(',', $ids) . ')', 'IN'));
391
+			if (!is_null($additionnal)) {
392
+				$criteria->add($additionnal);
393
+			}
394
+			$ret =& $this->getObjects($criteria, true);
395
+		}
396
+
397
+		return $ret;
398
+	}
399
+
400
+	/**
401
+	 * count objects matching a condition
402
+	 *
403
+	 * @param  object $criteria {@link CriteriaElement} to match
404
+	 * @return int    count of objects
405
+	 */
406
+	public function getCount($criteria = null)
407
+	{
408
+		$field   = '';
409
+		$groupby = false;
410
+		$limit   = $start = 0;
411
+		require_once __DIR__ . '/lite.php';
412
+
413
+		if (isset($criteria) && is_subclass_of($criteria, 'criteriaelement')) {
414
+			if ($criteria->groupby != '') {
415
+				$groupby = true;
416
+				$field   = $criteria->groupby . ', '; //Not entirely secure unless you KNOW that no criteria's groupby clause is going to be mis-used
417
+			}
418
+		}
419
+		$sql = 'SELECT ' . $field . 'COUNT(*) FROM ' . $this->table;
420
+		if (isset($criteria) && is_subclass_of($criteria, 'criteriaelement')) {
421
+			$sql .= ' ' . $criteria->renderWhere();
422
+			if ($criteria->groupby != '') {
423
+				$sql .= $criteria->getGroupby();
424
+			}
425
+			$limit = $criteria->getLimit();
426
+			$start = $criteria->getStart();
427
+		}
428
+		$Cache_Lite = new references_Cache_Lite($this->cacheOptions);
429
+		$id         = $this->_getIdForCache($sql, $start, $limit);
430
+		$cacheData  = $Cache_Lite->get($id);
431
+		if ($cacheData === false) {
432
+			$result = $this->db->query($sql, $limit, $start);
433
+			if (!$result) {
434
+				$ret = 0;
435
+				$Cache_Lite->save($ret);
436
+
437
+				return $ret;
438
+			}
439
+			if ($groupby == false) {
440
+				list($count) = $this->db->fetchRow($result);
441
+				$Cache_Lite->save($count);
442
+
443
+				return $count;
444
+			} else {
445
+				$ret = array();
446
+				while (list($id, $count) = $this->db->fetchRow($result)) {
447
+					$ret[$id] = $count;
448
+				}
449
+				$Cache_Lite->save($ret);
450
+
451
+				return $ret;
452
+			}
453
+		} else {
454
+			return $cacheData;
455
+		}
456
+	}
457
+
458
+	/**
459
+	 * Retourne le total d'un champ
460
+	 *
461
+	 * @param  string $field    Le champ dont on veut calculer le total
462
+	 * @param  object $criteria {@link CriteriaElement} to match
463
+	 * @return integer le total
464
+	 */
465
+	public function getSum($field, $criteria = null)
466
+	{
467
+		$limit = $start = 0;
468
+		require_once __DIR__ . '/lite.php';
469
+
470
+		$sql = 'SELECT Sum(' . $field . ') as cpt FROM ' . $this->table;
471
+		if (isset($criteria) && is_subclass_of($criteria, 'criteriaelement')) {
472
+			$sql .= ' ' . $criteria->renderWhere();
473
+			if ($criteria->groupby != '') {
474
+				$sql .= $criteria->getGroupby();
475
+			}
476
+			$limit = $criteria->getLimit();
477
+			$start = $criteria->getStart();
478
+		}
479
+		$Cache_Lite = new references_Cache_Lite($this->cacheOptions);
480
+		$id         = $this->_getIdForCache($sql, $start, $limit);
481
+		$cacheData  = $Cache_Lite->get($id);
482
+		if ($cacheData === false) {
483
+			$result = $this->db->query($sql, $limit, $start);
484
+			if (!$result) {
485
+				$ret = 0;
486
+				$Cache_Lite->save($ret);
487
+
488
+				return $ret;
489
+			}
490
+			$row   = $this->db->fetchArray($result);
491
+			$count = $row['cpt'];
492
+			$Cache_Lite->save($count);
493
+
494
+			return $count;
495
+		} else {
496
+			return $cacheData;
497
+		}
498
+	}
499
+
500
+	/**
501
+	 * delete an object from the database
502
+	 *
503
+	 * @param  XoopsObject $obj reference to the object to delete
504
+	 * @param  bool        $force
505
+	 * @return bool   FALSE if failed.
506
+	 */
507
+	public function delete(XoopsObject $obj, $force = false)
508
+	{
509
+		if (is_array($this->keyName)) {
510
+			$clause = array();
511
+			$vnb    = count($this->keyName);
512
+			for ($i = 0; $i < $vnb; ++$i) {
513
+				$clause[] = $this->keyName[$i] . ' = ' . $obj->getVar($this->keyName[$i]);
514
+			}
515
+			$whereclause = implode(' AND ', $clause);
516
+		} else {
517
+			$whereclause = $this->keyName . ' = ' . $obj->getVar($this->keyName);
518
+		}
519
+		$sql = 'DELETE FROM ' . $this->table . ' WHERE ' . $whereclause;
520
+		if (false != $force) {
521
+			$result = $this->db->queryF($sql);
522
+		} else {
523
+			$result = $this->db->query($sql);
524
+		}
525
+		// Clear cache
526
+		$this->forceCacheClean();
527
+
528
+		if (!$result) {
529
+			return false;
530
+		}
531
+
532
+		return true;
533
+	}
534
+
535
+	/**
536
+	 * Quickly insert a record like this $myobject_handler->quickInsert('field1' => field1value, 'field2' => $field2value)
537
+	 *
538
+	 * @param  array $vars  Array containing the fields name and value
539
+	 * @param  bool  $force whether to force the query execution despite security settings
540
+	 * @return bool  @link insert's value
541
+	 */
542
+	public function quickInsert($vars = null, $force = true)
543
+	{
544
+		$object = $this->create(true);
545
+		$object->setVars($vars);
546
+		$retval =& $this->insert($object, $force);
547
+		unset($object);
548
+
549
+		// Clear cache
550
+		$this->forceCacheClean();
551
+
552
+		return $retval;
553
+	}
554
+
555
+	/**
556
+	 * insert a new object in the database
557
+	 *
558
+	 * @param  XoopsObject $obj         reference to the object
559
+	 * @param  bool        $force       whether to force the query execution despite security settings
560
+	 * @param  bool        $checkObject check if the object is dirty and clean the attributes
561
+	 * @param bool         $ignoreInsert
562
+	 * @return bool FALSE if failed, TRUE if already present and unchanged or successful
563
+	 */
564
+
565
+	public function insert(XoopsObject $obj, $force = false, $checkObject = true, $ignoreInsert = false)
566
+	{
567
+		if ($checkObject != false) {
568
+			if (!is_object($obj)) {
569
+				trigger_error('Error, not object');
570
+
571
+				return false;
572
+			}
573
+			/**
574
+			 * @TODO: Change to if (!(class_exists($this->className) && $obj instanceof $this->className)) when going fully PHP5
575
+			 */
576
+			if (!is_a($obj, $this->className)) {
577
+				$obj->setErrors(get_class($obj) . ' Differs from ' . $this->className);
578
+
579
+				return false;
580
+			}
581
+			if (!$obj->isDirty()) {
582
+				$obj->setErrors('Not dirty'); //will usually not be outputted as errors are not displayed when the method returns true, but it can be helpful when troubleshooting code - Mith
583
+
584
+				return true;
585
+			}
586
+		}
587
+		if (!$obj->cleanVars()) {
588
+			foreach ($obj->getErrors() as $oneerror) {
589
+				trigger_error($oneerror);
590
+			}
591
+
592
+			return false;
593
+		}
594
+		foreach ($obj->cleanVars as $k => $v) {
595
+			if ($obj->vars[$k]['data_type'] == XOBJ_DTYPE_INT) {
596
+				$cleanvars[$k] = (int)$v;
597
+			} elseif (is_array($v)) {
598
+				$cleanvars[$k] = $this->db->quoteString(implode(',', $v));
599
+			} else {
600
+				$cleanvars[$k] = $this->db->quoteString($v);
601
+			}
602
+		}
603
+		if (isset($cleanvars['dohtml'])) {        // Modification Herv� to be able to use dohtml
604
+			unset($cleanvars['dohtml']);
605
+		}
606
+		if ($obj->isNew()) {
607
+			if (!is_array($this->keyName)) {
608
+				if ($cleanvars[$this->keyName] < 1) {
609
+					$cleanvars[$this->keyName] = $this->db->genId($this->table . '_' . $this->keyName . '_seq');
610
+				}
611
+			}
612
+			$ignore = '';
613
+			if ($ignoreInsert) {
614
+				$ignore = 'IGNORE';
615
+			}
616
+			$sql = "INSERT $ignore INTO " . $this->table . ' (' . implode(',', array_keys($cleanvars)) . ') VALUES (' . implode(',', array_values($cleanvars)) . ')';
617
+		} else {
618
+			$sql = 'UPDATE ' . $this->table . ' SET';
619
+			foreach ($cleanvars as $key => $value) {
620
+				if ((!is_array($this->keyName) && $key == $this->keyName) || (is_array($this->keyName) && in_array($key, $this->keyName))) {
621
+					continue;
622
+				}
623
+				if (isset($notfirst)) {
624
+					$sql .= ',';
625
+				}
626
+				$sql .= ' ' . $key . ' = ' . $value;
627
+				$notfirst = true;
628
+			}
629
+			if (is_array($this->keyName)) {
630
+				$whereclause = '';
631
+				$vnb         = count($this->keyName);
632
+				for ($i = 0; $i < $vnb; ++$i) {
633
+					if ($i > 0) {
634
+						$whereclause .= ' AND ';
635
+					}
636
+					$whereclause .= $this->keyName[$i] . ' = ' . $obj->getVar($this->keyName[$i]);
637
+				}
638
+			} else {
639
+				$whereclause = $this->keyName . ' = ' . $obj->getVar($this->keyName);
640
+			}
641
+			$sql .= ' WHERE ' . $whereclause;
642
+		}
643
+
644
+		if (false != $force) {
645
+			$result = $this->db->queryF($sql);
646
+		} else {
647
+			$result = $this->db->query($sql);
648
+		}
649
+
650
+		// Clear cache
651
+		$this->forceCacheClean();
652
+
653
+		if (!$result) {
654
+			return false;
655
+		}
656
+		if ($obj->isNew() && !is_array($this->keyName)) {
657
+			$obj->assignVar($this->keyName, $this->db->getInsertId());
658
+		}
659
+
660
+		return true;
661
+	}
662
+
663
+	/**
664
+	 * Change a value for objects with a certain criteria
665
+	 *
666
+	 * @param string $fieldname  Name of the field
667
+	 * @param string $fieldvalue Value to write
668
+	 * @param object $criteria   {@link CriteriaElement}
669
+	 *
670
+	 * @param bool   $force
671
+	 * @return bool
672
+	 */
673
+	public function updateAll($fieldname, $fieldvalue, $criteria = null, $force = false)
674
+	{
675
+		$set_clause = $fieldname . ' = ';
676
+		if (is_numeric($fieldvalue)) {
677
+			$set_clause .= $fieldvalue;
678
+		} elseif (is_array($fieldvalue)) {
679
+			$set_clause .= $this->db->quoteString(implode(',', $fieldvalue));
680
+		} else {
681
+			$set_clause .= $this->db->quoteString($fieldvalue);
682
+		}
683
+		$sql = 'UPDATE ' . $this->table . ' SET ' . $set_clause;
684
+		if (isset($criteria) && is_subclass_of($criteria, 'criteriaelement')) {
685
+			$sql .= ' ' . $criteria->renderWhere();
686
+		}
687
+		if ($force) {
688
+			$result = $this->db->queryF($sql);
689
+		} else {
690
+			$result = $this->db->query($sql);
691
+		}
692
+
693
+		// Clear cache
694
+		$this->forceCacheClean();
695
+
696
+		if (!$result) {
697
+			return false;
698
+		}
699
+
700
+		return true;
701
+	}
702
+
703
+	//  check if target object is attempting to use duplicated info
704
+	public function isDuplicated(&$obj, $field = '', $error = '')
705
+	{
706
+		if (empty($field)) {
707
+			return false;
708
+		}
709
+		$criteria = new CriteriaCompo();
710
+		$criteria->add(new Criteria($field, $obj->getVar($field)));
711
+		//  one more condition if target object exisits in database
712
+		if (!$obj->isNew()) {
713
+			$criteria->add(new Criteria($this->_key, $obj->getVar($this->_key), '!='));
714
+		}
715
+		if ($this->getCount($criteria)) {
716
+			$obj->setErrors($error);
717
+
718
+			return true;
719
+		}
720
+
721
+		return false;
722
+	}
723
+
724
+	/**
725
+	 * delete all objects meeting the conditions
726
+	 *
727
+	 * @param  object $criteria {@link CriteriaElement} with conditions to meet
728
+	 * @return bool
729
+	 */
730
+	public function deleteAll($criteria = null)
731
+	{
732
+		if (isset($criteria) && is_subclass_of($criteria, 'criteriaelement')) {
733
+			$sql = 'DELETE FROM ' . $this->table;
734
+			$sql .= ' ' . $criteria->renderWhere();
735
+			if (!$this->db->queryF($sql)) {
736
+				return false;
737
+			}
738
+			$rows = $this->db->getAffectedRows();
739
+
740
+			// Clear cache
741
+			$this->forceCacheClean();
742
+
743
+			return $rows > 0 ? $rows : true;
744
+		}
745
+
746
+		return false;
747
+	}
748
+
749
+	/**
750
+	 * Compare two objects and returns, in an array, the differences
751
+	 *
752
+	 * @param  XoopsObject $old_object The first object to compare
753
+	 * @param  XoopsObject $new_object The new object
754
+	 * @return array       differences  key = fieldname, value = array('old_value', 'new_value')
755
+	 */
756
+	public function compareObjects($old_object, $new_object)
757
+	{
758
+		$ret       = array();
759
+		$vars_name = array_keys($old_object->getVars());
760
+		foreach ($vars_name as $one_var) {
761
+			if ($old_object->getVar($one_var, 'f') == $new_object->getVar($one_var, 'f')) {
762
+			} else {
763
+				$ret[$one_var] = array($old_object->getVar($one_var), $new_object->getVar($one_var));
764
+			}
765
+		}
766
+
767
+		return $ret;
768
+	}
769
+
770
+	/**
771
+	 * Get distincted values of a field in the table
772
+	 *
773
+	 * @param  string $field    Field's name
774
+	 * @param  object $criteria {@link CriteriaElement} conditions to be met
775
+	 * @param  string $format   Format in wich we want the datas
776
+	 * @return array  containing the distinct values
777
+	 */
778
+	public function getDistincts($field, $criteria = null, $format = 's')
779
+	{
780
+		require_once __DIR__ . '/lite.php';
781
+		$limit = $start = 0;
782
+		$sql   = 'SELECT ' . $this->keyName . ', ' . $field . ' FROM ' . $this->table;
783
+		if (isset($criteria) && is_subclass_of($criteria, 'criteriaelement')) {
784
+			$sql .= ' ' . $criteria->renderWhere();
785
+			$limit = $criteria->getLimit();
786
+			$start = $criteria->getStart();
787
+		}
788
+		$sql .= ' GROUP BY ' . $field . ' ORDER BY ' . $field;
789
+
790
+		$Cache_Lite = new references_Cache_Lite($this->cacheOptions);
791
+		$id         = $this->_getIdForCache($sql, $start, $limit);
792
+		$cacheData  = $Cache_Lite->get($id);
793
+		if ($cacheData === false) {
794
+			$result = $this->db->query($sql, $limit, $start);
795
+			$ret    = array();
796
+			$obj    = new $this->className();
797
+			while ($myrow = $this->db->fetchArray($result)) {
798
+				$obj->setVar($field, $myrow[$field]);
799
+				$ret[$myrow[$this->keyName]] = $obj->getVar($field, $format);
800
+			}
801
+			$Cache_Lite->save($ret);
802
+
803
+			return $ret;
804
+		} else {
805
+			return $cacheData;
806
+		}
807
+	}
808
+
809
+	/**
810
+	 * A generic shortcut to getObjects
811
+	 *
812
+	 * @author Herve Thouzard - Instant Zero
813
+	 *
814
+	 * @param  integer $start   Starting position
815
+	 * @param  integer $limit   Maximum count of elements to return
816
+	 * @param  string  $sort    Field to use for the sort
817
+	 * @param  string  $order   Sort order
818
+	 * @param  boolean $idAsKey Do we have to return an array whoses keys are the record's ID ?
819
+	 * @return array   Array of current objects
820
+	 */
821
+	public function getItems($start = 0, $limit = 0, $sort = '', $order = 'ASC', $idAsKey = true)
822
+	{
823
+		if (trim($order) == '') {
824
+			if (isset($this->identifierName) && trim($this->identifierName) != '') {
825
+				$order = $this->identifierName;
826
+			} else {
827
+				$order = $this->keyName;
828
+			}
829
+		}
830
+		$items   = array();
831
+		$critere = new Criteria($this->keyName, 0, '<>');
832
+		$critere->setLimit($limit);
833
+		$critere->setStart($start);
834
+		$critere->setSort($sort);
835
+		$critere->setOrder($order);
836
+		$items =& $this->getObjects($critere, $idAsKey);
837
+
838
+		return $items;
839
+	}
840
+
841
+	/**
842
+	 * Forces the cache to be cleaned
843
+	 */
844
+	public function forceCacheClean()
845
+	{
846
+		require_once __DIR__ . '/lite.php';
847
+		$Cache_Lite = new references_Cache_Lite($this->cacheOptions);
848
+		$Cache_Lite->clean();
849
+	}
850 850
 }
Please login to merge, or discard this patch.
class/references_utils.php 2 patches
Indentation   +1529 added lines, -1529 removed lines patch added patch discarded remove patch
@@ -36,1533 +36,1533 @@
 block discarded – undo
36 36
 
37 37
 class references_utils
38 38
 {
39
-    // Pour la portabilité de module à module
40
-    const MODULE_NAME    = 'references';
41
-    const MODULE_DIRNAME = REFERENCES_DIRNAME;
42
-    const MODULE_PATH    = REFERENCES_PATH;
43
-    const MODULE_URL     = REFERENCES_URL;
44
-    const MODULE_JS_URL  = REFERENCES_JS_URL;
45
-
46
-    /**
47
-     * Access the only instance of this class
48
-     *
49
-     * @return object
50
-     *
51
-     * @static
52
-     * @staticvar   object
53
-     */
54
-    public static function getInstance()
55
-    {
56
-        static $instance;
57
-        if (null === $instance) {
58
-            $instance = new static();
59
-        }
60
-
61
-        return $instance;
62
-    }
63
-
64
-    /**
65
-     * Returns a module's option (with cache)
66
-     *
67
-     * @param  string  $option    module option's name
68
-     * @param  boolean $withCache Do we have to use some cache ?
69
-     * @return mixed   option's value
70
-     */
71
-    public static function getModuleOption($option, $withCache = true)
72
-    {
73
-        global $xoopsModuleConfig, $xoopsModule;
74
-        $repmodule = self::MODULE_NAME;
75
-        static $options = array();
76
-        if (is_array($options) && array_key_exists($option, $options) && $withCache) {
77
-            return $options[$option];
78
-        }
79
-
80
-        $retval = false;
81
-        if (isset($xoopsModuleConfig) && (is_object($xoopsModule) && $xoopsModule->getVar('dirname') == $repmodule && $xoopsModule->getVar('isactive'))) {
82
-            if (isset($xoopsModuleConfig[$option])) {
83
-                $retval = $xoopsModuleConfig[$option];
84
-            }
85
-        } else {
86
-            $module_handler = xoops_getHandler('module');
87
-            $module         = $module_handler->getByDirname($repmodule);
88
-            $config_handler = xoops_getHandler('config');
89
-            if ($module) {
90
-                $moduleConfig = $config_handler->getConfigsByCat(0, $module->getVar('mid'));
91
-                if (isset($moduleConfig[$option])) {
92
-                    $retval = $moduleConfig[$option];
93
-                }
94
-            }
95
-        }
96
-        $options[$option] = $retval;
97
-
98
-        return $retval;
99
-    }
100
-
101
-    /**
102
-     * Is Xoops 2.3.x ?
103
-     *
104
-     * @return boolean need to say it ?
105
-     */
106
-    public static function isX23()
107
-    {
108
-        $x23 = false;
109
-        $xv  = str_replace('XOOPS ', '', XOOPS_VERSION);
110
-        if ((int)substr($xv, 2, 1) >= 3) {
111
-            $x23 = true;
112
-        }
113
-
114
-        return $x23;
115
-    }
116
-
117
-    /**
118
-     * Retreive an editor according to the module's option "form_options"
119
-     *
120
-     * @param  string $caption Caption to give to the editor
121
-     * @param  string $name    Editor's name
122
-     * @param  string $value   Editor's value
123
-     * @param  string $width   Editor's width
124
-     * @param  string $height  Editor's height
125
-     * @param string  $supplemental
126
-     * @return object The editor to use
127
-     */
128
-    public static function getWysiwygForm($caption, $name, $value = '', $width = '100%', $height = '400px', $supplemental = '')
129
-    {
130
-        $editor                   = false;
131
-        $editor_configs           = array();
132
-        $editor_configs['name']   = $name;
133
-        $editor_configs['value']  = $value;
134
-        $editor_configs['rows']   = 35;
135
-        $editor_configs['cols']   = 60;
136
-        $editor_configs['width']  = '100%';
137
-        $editor_configs['height'] = '400px';
138
-
139
-        $editor_option = strtolower(self::getModuleOption('form_options'));
140
-
141
-        if (self::isX23()) {
142
-            $editor = new XoopsFormEditor($caption, $editor_option, $editor_configs);
143
-
144
-            return $editor;
145
-        }
146
-
147
-        // Only for Xoops 2.0.x
148
-        switch ($editor_option) {
149
-            case 'fckeditor':
150
-                if (is_readable(XOOPS_ROOT_PATH . '/class/fckeditor/formfckeditor.php')) {
151
-                    require_once(XOOPS_ROOT_PATH . '/class/fckeditor/formfckeditor.php');
152
-                    $editor = new XoopsFormFckeditor($caption, $name, $value);
153
-                }
154
-                break;
155
-
156
-            case 'htmlarea':
157
-                if (is_readable(XOOPS_ROOT_PATH . '/class/htmlarea/formhtmlarea.php')) {
158
-                    require_once(XOOPS_ROOT_PATH . '/class/htmlarea/formhtmlarea.php');
159
-                    $editor = new XoopsFormHtmlarea($caption, $name, $value);
160
-                }
161
-                break;
162
-
163
-            case 'dhtmltextarea':
164
-                $editor = new XoopsFormDhtmlTextArea($caption, $name, $value, 10, 50, $supplemental);
165
-                break;
166
-
167
-            case 'textarea':
168
-                $editor = new XoopsFormTextArea($caption, $name, $value);
169
-                break;
170
-
171
-            case 'tinyeditor':
172
-            case 'tinymce':
173
-                if (is_readable(XOOPS_ROOT_PATH . '/class/xoopseditor/tinyeditor/formtinyeditortextarea.php')) {
174
-                    require_once XOOPS_ROOT_PATH . '/class/xoopseditor/tinyeditor/formtinyeditortextarea.php';
175
-                    $editor = new XoopsFormTinyeditorTextArea(array('caption' => $caption, 'name' => $name, 'value' => $value, 'width' => '100%', 'height' => '400px'));
176
-                }
177
-                break;
178
-
179
-            case 'koivi':
180
-                if (is_readable(XOOPS_ROOT_PATH . '/class/wysiwyg/formwysiwygtextarea.php')) {
181
-                    require_once(XOOPS_ROOT_PATH . '/class/wysiwyg/formwysiwygtextarea.php');
182
-                    $editor = new XoopsFormWysiwygTextArea($caption, $name, $value, $width, $height, '');
183
-                }
184
-                break;
185
-        }
186
-        if (!is_object($editor)) {
187
-            trigger_error('Error, impossible to get the requested text editor', E_USER_ERROR);
188
-        }
189
-
190
-        return $editor;
191
-    }
192
-
193
-    /**
194
-     * Create (in a link) a javascript confirmation's box
195
-     *
196
-     * @param  string  $message Message to display
197
-     * @param  boolean $form    Is this a confirmation for a form ?
198
-     * @return string  the javascript code to insert in the link (or in the form)
199
-     */
200
-    public static function javascriptLinkConfirm($message, $form = false)
201
-    {
202
-        if (!$form) {
203
-            return "onclick=\"javascript:return confirm('" . str_replace("'", ' ', $message) . "')\"";
204
-        } else {
205
-            return "onSubmit=\"javascript:return confirm('" . str_replace("'", ' ', $message) . "')\"";
206
-        }
207
-    }
208
-
209
-    /**
210
-     * Get current user IP
211
-     *
212
-     * @return string IP address (format Ipv4)
213
-     */
214
-    public static function IP()
215
-    {
216
-        $proxy_ip = '';
217
-        if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
218
-            $proxy_ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
219
-        } elseif (!empty($_SERVER['HTTP_X_FORWARDED'])) {
220
-            $proxy_ip = $_SERVER['HTTP_X_FORWARDED'];
221
-        } elseif (!empty($_SERVER['HTTP_FORWARDED_FOR'])) {
222
-            $proxy_ip = $_SERVER['HTTP_FORWARDED_FOR'];
223
-        } elseif (!empty($_SERVER['HTTP_FORWARDED'])) {
224
-            $proxy_ip = $_SERVER['HTTP_FORWARDED'];
225
-        } elseif (!empty($_SERVER['HTTP_VIA'])) {
226
-            $proxy_ip = $_SERVER['HTTP_VIA'];
227
-        } elseif (!empty($_SERVER['HTTP_X_COMING_FROM'])) {
228
-            $proxy_ip = $_SERVER['HTTP_X_COMING_FROM'];
229
-        } elseif (!empty($_SERVER['HTTP_COMING_FROM'])) {
230
-            $proxy_ip = $_SERVER['HTTP_COMING_FROM'];
231
-        }
232
-        $regs = array();
233
-        if (!empty($proxy_ip) && $is_ip = ereg('^([0-9]{1,3}\.){3,3}[0-9]{1,3}', $proxy_ip, $regs) && count($regs) > 0) {
234
-            $the_IP = $regs[0];
235
-        } else {
236
-            $the_IP = $_SERVER['REMOTE_ADDR'];
237
-        }
238
-
239
-        return $the_IP;
240
-    }
241
-
242
-    /**
243
-     * Set the page's title, meta description and meta keywords
244
-     * Datas are supposed to be sanitized
245
-     *
246
-     * @param  string $pageTitle       Page's Title
247
-     * @param  string $metaDescription Page's meta description
248
-     * @param  string $metaKeywords    Page's meta keywords
249
-     * @return void
250
-     */
251
-    public static function setMetas($pageTitle = '', $metaDescription = '', $metaKeywords = '')
252
-    {
253
-        global $xoTheme, $xoTheme, $xoopsTpl;
254
-        $xoopsTpl->assign('xoops_pagetitle', $pageTitle);
255
-        if (isset($xoTheme) && is_object($xoTheme)) {
256
-            if (!empty($metaKeywords)) {
257
-                $xoTheme->addMeta('meta', 'keywords', $metaKeywords);
258
-            }
259
-            if (!empty($metaDescription)) {
260
-                $xoTheme->addMeta('meta', 'description', $metaDescription);
261
-            }
262
-        } elseif (isset($xoopsTpl) && is_object($xoopsTpl)) {    // Compatibility for old Xoops versions
263
-            if (!empty($metaKeywords)) {
264
-                $xoopsTpl->assign('xoops_meta_keywords', $metaKeywords);
265
-            }
266
-            if (!empty($metaDescription)) {
267
-                $xoopsTpl->assign('xoops_meta_description', $metaDescription);
268
-            }
269
-        }
270
-    }
271
-
272
-    /**
273
-     * Send an email from a template to a list of recipients
274
-     *
275
-     * @param         $tplName
276
-     * @param  array  $recipients List of recipients
277
-     * @param  string $subject    Email's subject
278
-     * @param  array  $variables  Varirables to give to the template
279
-     * @return bool Result of the send
280
-     * @internal param string $tpl_name Template's name
281
-     */
282
-    public static function sendEmailFromTpl($tplName, $recipients, $subject, $variables)
283
-    {
284
-        global $xoopsConfig;
285
-        require_once XOOPS_ROOT_PATH . '/class/xoopsmailer.php';
286
-        if (!is_array($recipients)) {
287
-            if (trim($recipients) == '') {
288
-                return false;
289
-            }
290
-        } else {
291
-            if (count($recipients) == 0) {
292
-                return false;
293
-            }
294
-        }
295
-        if (function_exists('xoops_getMailer')) {
296
-            $xoopsMailer =& xoops_getMailer();
297
-        } else {
298
-            $xoopsMailer =& getMailer();
299
-        }
300
-
301
-        $xoopsMailer->useMail();
302
-        $xoopsMailer->setTemplateDir(XOOPS_ROOT_PATH . '/modules/' . self::MODULE_NAME . '/language/' . $xoopsConfig['language'] . '/mail_template');
303
-        $xoopsMailer->setTemplate($tplName);
304
-        $xoopsMailer->setToEmails($recipients);
305
-        // TODO: Change !
306
-        // $xoopsMailer->setFromEmail('[email protected]');
307
-        //$xoopsMailer->setFromName('MonSite');
308
-        $xoopsMailer->setSubject($subject);
309
-        foreach ($variables as $key => $value) {
310
-            $xoopsMailer->assign($key, $value);
311
-        }
312
-        $res = $xoopsMailer->send();
313
-        unset($xoopsMailer);
314
-        $filename = XOOPS_UPLOAD_PATH . '/logmail_' . self::MODULE_NAME . '.php';
315
-        if (!file_exists($filename)) {
316
-            $fp = @fopen($filename, 'a');
317
-            if ($fp) {
318
-                fwrite($fp, '<?php exit(); ?>');
319
-                fclose($fp);
320
-            }
321
-        }
322
-        $fp = @fopen($filename, 'a');
323
-
324
-        if ($fp) {
325
-            fwrite($fp, str_repeat('-', 120) . "\n");
326
-            fwrite($fp, date('d/m/Y H:i:s') . "\n");
327
-            fwrite($fp, 'Template name : ' . $tplName . "\n");
328
-            fwrite($fp, 'Email subject : ' . $subject . "\n");
329
-            if (is_array($recipients)) {
330
-                fwrite($fp, 'Recipient(s) : ' . implode(',', $recipients) . "\n");
331
-            } else {
332
-                fwrite($fp, 'Recipient(s) : ' . $recipients . "\n");
333
-            }
334
-            fwrite($fp, 'Transmited variables : ' . implode(',', $variables) . "\n");
335
-            fclose($fp);
336
-        }
337
-
338
-        return $res;
339
-    }
340
-
341
-    /**
342
-     * Remove module's cache
343
-     */
344
-    public static function updateCache()
345
-    {
346
-        global $xoopsModule;
347
-        $folder  = $xoopsModule->getVar('dirname');
348
-        $tpllist = array();
349
-        require_once XOOPS_ROOT_PATH . '/class/xoopsblock.php';
350
-        require_once XOOPS_ROOT_PATH . '/class/template.php';
351
-        $tplfile_handler = xoops_getHandler('tplfile');
352
-        $tpllist         = $tplfile_handler->find(null, null, null, $folder);
353
-        xoops_template_clear_module_cache($xoopsModule->getVar('mid'));            // Clear module's blocks cache
354
-
355
-        foreach ($tpllist as $onetemplate) {    // Remove cache for each page.
356
-            if ($onetemplate->getVar('tpl_type') === 'module') {
357
-                //  Note, I've been testing all the other methods (like the one of Smarty) and none of them run, that's why I have used this code
358
-                $files_del = array();
359
-                $files_del = glob(XOOPS_CACHE_PATH . '/*' . $onetemplate->getVar('tpl_file') . '*');
360
-                if (count($files_del) > 0 && is_array($files_del)) {
361
-                    foreach ($files_del as $one_file) {
362
-                        if (is_file($one_file)) {
363
-                            unlink($one_file);
364
-                        }
365
-                    }
366
-                }
367
-            }
368
-        }
369
-    }
370
-
371
-    /**
372
-     * Redirect user with a message
373
-     *
374
-     * @param string $message message to display
375
-     * @param string $url     The place where to go
376
-     * @param        integer  timeout Time to wait before to redirect
377
-     */
378
-    public static function redirect($message = '', $url = 'index.php', $time = 2)
379
-    {
380
-        redirect_header($url, $time, $message);
381
-        exit();
382
-    }
383
-
384
-    /**
385
-     * Internal function used to get the handler of the current module
386
-     *
387
-     * @return object The module
388
-     */
389
-    public static function getModule()
390
-    {
391
-        static $mymodule;
392
-        if (!isset($mymodule)) {
393
-            global $xoopsModule;
394
-            if (isset($xoopsModule) && is_object($xoopsModule) && $xoopsModule->getVar('dirname') == REFERENCES_DIRNAME) {
395
-                $mymodule =& $xoopsModule;
396
-            } else {
397
-                $hModule  = xoops_getHandler('module');
398
-                $mymodule = $hModule->getByDirname(REFERENCES_DIRNAME);
399
-            }
400
-        }
401
-
402
-        return $mymodule;
403
-    }
404
-
405
-    /**
406
-     * Returns the module's name (as defined by the user in the module manager) with cache
407
-     * @return string Module's name
408
-     */
409
-    public static function getModuleName()
410
-    {
411
-        static $moduleName;
412
-        if (!isset($moduleName)) {
413
-            $mymodule   = self::getModule();
414
-            $moduleName = $mymodule->getVar('name');
415
-        }
416
-
417
-        return $moduleName;
418
-    }
419
-
420
-    /**
421
-     * Create a title for the href tags inside html links
422
-     *
423
-     * @param  string $title Text to use
424
-     * @return string Formated text
425
-     */
426
-    public static function makeHrefTitle($title)
427
-    {
428
-        $s = "\"'";
429
-        $r = '  ';
430
-
431
-        return strtr($title, $s, $r);
432
-    }
433
-
434
-    /**
435
-     * Retourne la liste des utilisateurs appartenants � un groupe
436
-     *
437
-     * @param  int $groupId Searched group
438
-     * @return array Array of XoopsUsers
439
-     */
440
-    public static function getUsersFromGroup($groupId)
441
-    {
442
-        $users          = array();
443
-        $member_handler = xoops_getHandler('member');
444
-        $users          = $member_handler->getUsersByGroup($groupId, true);
445
-
446
-        return $users;
447
-    }
448
-
449
-    /**
450
-     * Retourne les ID des utilisateurs faisant partie de plusieurs groupes
451
-     * @param  array $groups Les ID des groupes dont on recherche les ID utilisateurs
452
-     * @return array Les ID utilisateurs
453
-     */
454
-    public static function getUsersIdsFromGroups($groups)
455
-    {
456
-        $usersIds       = array();
457
-        $member_handler = xoops_getHandler('member');
458
-        foreach ($groups as $groupId) {
459
-            $temporaryGroup = array();
460
-            $temporaryGroup = $member_handler->getUsersByGroup($groupId);
461
-            if (count($temporaryGroup) > 0) {
462
-                $usersIds = array_merge($usersIds, $temporaryGroup);
463
-            }
464
-        }
465
-
466
-        return array_unique($usersIds);
467
-    }
468
-
469
-    /**
470
-     * Retourne la liste des emails des utilisateurs membres d'un groupe
471
-     *
472
-     * @param $groupId
473
-     * @return array Emails list
474
-     * @internal param int $group_id Group's number
475
-     */
476
-    public static function getEmailsFromGroup($groupId)
477
-    {
478
-        $ret   = array();
479
-        $users = self::getUsersFromGroup($groupId);
480
-        foreach ($users as $user) {
481
-            $ret[] = $user->getVar('email');
482
-        }
483
-
484
-        return $ret;
485
-    }
486
-
487
-    /**
488
-     * V�rifie que l'utilisateur courant fait partie du groupe des administrateurs
489
-     *
490
-     * @return booleean Admin or not
491
-     */
492
-    public static function isAdmin()
493
-    {
494
-        global $xoopsUser, $xoopsModule;
495
-        if (is_object($xoopsUser)) {
496
-            if (in_array(XOOPS_GROUP_ADMIN, $xoopsUser->getGroups())) {
497
-                return true;
498
-            } elseif (isset($xoopsModule) && $xoopsUser->isAdmin($xoopsModule->getVar('mid'))) {
499
-                return true;
500
-            }
501
-        }
502
-
503
-        return false;
504
-    }
505
-
506
-    /**
507
-     * Returns the current date in the Mysql format
508
-     *
509
-     * @return string Date in the Mysql format
510
-     */
511
-    public static function getCurrentSQLDate()
512
-    {
513
-        return date('Y-m-d');    // 2007-05-02
514
-    }
515
-
516
-    public static function getCurrentSQLDateTime()
517
-    {
518
-        return date('Y-m-d H:i:s');    // 2007-05-02
519
-    }
520
-
521
-    /**
522
-     * Convert a Mysql date to the human's format
523
-     *
524
-     * @param  string $date The date to convert
525
-     * @param string  $format
526
-     * @return string The date in a human form
527
-     */
528
-    public static function SQLDateToHuman($date, $format = 'l')
529
-    {
530
-        if ($date != '0000-00-00' && xoops_trim($date) != '') {
531
-            return formatTimestamp(strtotime($date), $format);
532
-        } else {
533
-            return '';
534
-        }
535
-    }
536
-
537
-    /**
538
-     * Convert a timestamp to a Mysql date
539
-     *
540
-     * @param  integer $timestamp The timestamp to use
541
-     * @return string  The date in the Mysql format
542
-     */
543
-    public static function timestampToMysqlDate($timestamp)
544
-    {
545
-        return date('Y-m-d', (int)$timestamp);
546
-    }
547
-
548
-    /**
549
-     * Conversion d'un dateTime Mysql en date lisible en fran�ais
550
-     * @param $dateTime
551
-     * @return bool|string
552
-     */
553
-    public static function sqlDateTimeToFrench($dateTime)
554
-    {
555
-        return date('d/m/Y H:i:s', strtotime($dateTime));
556
-    }
557
-
558
-    /**
559
-     * Convert a timestamp to a Mysql datetime form
560
-     * @param  integer $timestamp The timestamp to use
561
-     * @return string  The date and time in the Mysql format
562
-     */
563
-    public static function timestampToMysqlDateTime($timestamp)
564
-    {
565
-        return date('Y-m-d H:i:s', $timestamp);
566
-    }
567
-
568
-    /**
569
-     * This function indicates if the current Xoops version needs to add asterisks to required fields in forms
570
-     *
571
-     * @return boolean Yes = we need to add them, false = no
572
-     */
573
-    public static function needsAsterisk()
574
-    {
575
-        if (self::isX23()) {
576
-            return false;
577
-        }
578
-        if (strpos(strtolower(XOOPS_VERSION), 'impresscms') !== false) {
579
-            return false;
580
-        }
581
-        if (strpos(strtolower(XOOPS_VERSION), 'legacy') === false) {
582
-            $xv = xoops_trim(str_replace('XOOPS ', '', XOOPS_VERSION));
583
-            if ((int)substr($xv, 4, 2) >= 17) {
584
-                return false;
585
-            }
586
-        }
587
-
588
-        return true;
589
-    }
590
-
591
-    /**
592
-     * Mark the mandatory fields of a form with a star
593
-     *
594
-     * @param  object $sform The form to modify
595
-     * @return object The modified form
596
-     * @internal param string $caracter The character to use to mark fields
597
-     */
598
-    public static function &formMarkRequiredFields(&$sform)
599
-    {
600
-        if (self::needsAsterisk()) {
601
-            $required = array();
602
-            foreach ($sform->getRequired() as $item) {
603
-                $required[] = $item->_name;
604
-            }
605
-            $elements = array();
606
-            $elements = &$sform->getElements();
607
-            $cnt      = count($elements);
608
-            for ($i = 0; $i < $cnt; ++$i) {
609
-                if (is_object($elements[$i]) && in_array($elements[$i]->_name, $required)) {
610
-                    $elements[$i]->_caption .= ' *';
611
-                }
612
-            }
613
-        }
614
-
615
-        return $sform;
616
-    }
617
-
618
-    /**
619
-     * Create an html heading (from h1 to h6)
620
-     *
621
-     * @param  string  $title The text to use
622
-     * @param  integer $level Level to return
623
-     * @return string  The heading
624
-     */
625
-    public static function htitle($title = '', $level = 1)
626
-    {
627
-        printf('<h%01d>%s</h%01d>', $level, $title, $level);
628
-    }
629
-
630
-    /**
631
-     * Create a unique upload filename
632
-     *
633
-     * @param  string  $folder   The folder where the file will be saved
634
-     * @param  string  $fileName Original filename (coming from the user)
635
-     * @param  boolean $trimName Do we need to create a short unique name ?
636
-     * @return string  The unique filename to use (with its extension)
637
-     */
638
-    public static function createUploadName($folder, $fileName, $trimName = false)
639
-    {
640
-        $workingfolder = $folder;
641
-        if (substr($workingfolder, strlen($workingfolder) - 1, 1) !== '/') {
642
-            $workingfolder .= '/';
643
-        }
644
-        $ext  = basename($fileName);
645
-        $ext  = explode('.', $ext);
646
-        $ext  = '.' . $ext[count($ext) - 1];
647
-        $true = true;
648
-        while ($true) {
649
-            $ipbits = explode('.', $_SERVER['REMOTE_ADDR']);
650
-            list($usec, $sec) = explode(' ', microtime());
651
-            $usec = (integer)($usec * 65536);
652
-            $sec  = ((integer)$sec) & 0xFFFF;
653
-
654
-            if ($trimName) {
655
-                $uid = sprintf('%06x%04x%04x', ($ipbits[0] << 24) | ($ipbits[1] << 16) | ($ipbits[2] << 8) | $ipbits[3], $sec, $usec);
656
-            } else {
657
-                $uid = sprintf('%08x-%04x-%04x', ($ipbits[0] << 24) | ($ipbits[1] << 16) | ($ipbits[2] << 8) | $ipbits[3], $sec, $usec);
658
-            }
659
-            if (!file_exists($workingfolder . $uid . $ext)) {
660
-                $true = false;
661
-            }
662
-        }
663
-
664
-        return $uid . $ext;
665
-    }
666
-
667
-    /**
668
-     * Replace html entities with their ASCII equivalent
669
-     *
670
-     * @param  string $chaine The string undecode
671
-     * @return string The undecoded string
672
-     */
673
-    public static function unhtml($chaine)
674
-    {
675
-        $search = $replace = array();
676
-        $chaine = html_entity_decode($chaine);
677
-
678
-        for ($i = 0; $i <= 255; ++$i) {
679
-            $search[]  = '&#' . $i . ';';
680
-            $replace[] = chr($i);
681
-        }
682
-        $replace[]='...'; $search[]='…';
683
-        $replace[]="'"; $search[]='‘';
684
-        $replace[]="'"; $search[]= '’';
685
-        $replace[]='-'; $search[] = '&bull;';   // $replace[] = '•';
686
-        $replace[]='—'; $search[]='&mdash;';
687
-        $replace[]='-'; $search[]='&ndash;';
688
-        $replace[]='-'; $search[]='&shy;';
689
-        $replace[]='"'; $search[]='&quot;';
690
-        $replace[]='&'; $search[]='&amp;';
691
-        $replace[]='ˆ'; $search[]='&circ;';
692
-        $replace[]='¡'; $search[]='&iexcl;';
693
-        $replace[]='¦'; $search[]='&brvbar;';
694
-        $replace[]='¨'; $search[]='&uml;';
695
-        $replace[]='¯'; $search[]='&macr;';
696
-        $replace[]='´'; $search[]='&acute;';
697
-        $replace[]='¸'; $search[]='&cedil;';
698
-        $replace[]='¿'; $search[]='&iquest;';
699
-        $replace[]='˜'; $search[]='&tilde;';
700
-        $replace[]="'"; $search[]='&lsquo;';    // $replace[]='‘';
701
-        $replace[]="'"; $search[]='&rsquo;';    // $replace[]='’';
702
-        $replace[]='‚'; $search[]='&sbquo;';
703
-        $replace[]="'"; $search[]='&ldquo;';    // $replace[]='“';
704
-        $replace[]="'"; $search[]='&rdquo;';    // $replace[]='”';
705
-        $replace[]='„'; $search[]='&bdquo;';
706
-        $replace[]='‹'; $search[]='&lsaquo;';
707
-        $replace[]='›'; $search[]='&rsaquo;';
708
-        $replace[]='<'; $search[]='&lt;';
709
-        $replace[]='>'; $search[]='&gt;';
710
-        $replace[]='±'; $search[]='&plusmn;';
711
-        $replace[]='«'; $search[]='&laquo;';
712
-        $replace[]='»'; $search[]='&raquo;';
713
-        $replace[]='×'; $search[]='&times;';
714
-        $replace[]='÷'; $search[]='&divide;';
715
-        $replace[]='¢'; $search[]='&cent;';
716
-        $replace[]='£'; $search[]='&pound;';
717
-        $replace[]='¤'; $search[]='&curren;';
718
-        $replace[]='¥'; $search[]='&yen;';
719
-        $replace[]='§'; $search[]='&sect;';
720
-        $replace[]='©'; $search[]='&copy;';
721
-        $replace[]='¬'; $search[]='&not;';
722
-        $replace[]='®'; $search[]='&reg;';
723
-        $replace[]='°'; $search[]='&deg;';
724
-        $replace[]='µ'; $search[]='&micro;';
725
-        $replace[]='¶'; $search[]='&para;';
726
-        $replace[]='·'; $search[]='&middot;';
727
-        $replace[]='†'; $search[]='&dagger;';
728
-        $replace[]='‡'; $search[]='&Dagger;';
729
-        $replace[]='‰'; $search[]='&permil;';
730
-        $replace[]='Euro'; $search[]='&euro;';      // $replace[]='€'
731
-        $replace[]='¼'; $search[]='&frac14;';
732
-        $replace[]='½'; $search[]='&frac12;';
733
-        $replace[]='¾'; $search[]='&frac34;';
734
-        $replace[]='¹'; $search[]='&sup1;';
735
-        $replace[]='²'; $search[]='&sup2;';
736
-        $replace[]='³'; $search[]='&sup3;';
737
-        $replace[]='á'; $search[]='&aacute;';
738
-        $replace[]='Á'; $search[]='&Aacute;';
739
-        $replace[]='â'; $search[]='&acirc;';
740
-        $replace[]='Â'; $search[]='&Acirc;';
741
-        $replace[]='à'; $search[]='&agrave;';
742
-        $replace[]='À'; $search[]='&Agrave;';
743
-        $replace[]='å'; $search[]='&aring;';
744
-        $replace[]='Å'; $search[]='&Aring;';
745
-        $replace[]='ã'; $search[]='&atilde;';
746
-        $replace[]='Ã'; $search[]='&Atilde;';
747
-        $replace[]='ä'; $search[]='&auml;';
748
-        $replace[]='Ä'; $search[]='&Auml;';
749
-        $replace[]='ª'; $search[]='&ordf;';
750
-        $replace[]='æ'; $search[]='&aelig;';
751
-        $replace[]='Æ'; $search[]='&AElig;';
752
-        $replace[]='ç'; $search[]='&ccedil;';
753
-        $replace[]='Ç'; $search[]='&Ccedil;';
754
-        $replace[]='ð'; $search[]='&eth;';
755
-        $replace[]='Ð'; $search[]='&ETH;';
756
-        $replace[]='é'; $search[]='&eacute;';
757
-        $replace[]='É'; $search[]='&Eacute;';
758
-        $replace[]='ê'; $search[]='&ecirc;';
759
-        $replace[]='Ê'; $search[]='&Ecirc;';
760
-        $replace[]='è'; $search[]='&egrave;';
761
-        $replace[]='È'; $search[]='&Egrave;';
762
-        $replace[]='ë'; $search[]='&euml;';
763
-        $replace[]='Ë'; $search[]='&Euml;';
764
-        $replace[]='ƒ'; $search[]='&fnof;';
765
-        $replace[]='í'; $search[]='&iacute;';
766
-        $replace[]='Í'; $search[]='&Iacute;';
767
-        $replace[]='î'; $search[]='&icirc;';
768
-        $replace[]='Î'; $search[]='&Icirc;';
769
-        $replace[]='ì'; $search[]='&igrave;';
770
-        $replace[]='Ì'; $search[]='&Igrave;';
771
-        $replace[]='ï'; $search[]='&iuml;';
772
-        $replace[]='Ï'; $search[]='&Iuml;';
773
-        $replace[]='ñ'; $search[]='&ntilde;';
774
-        $replace[]='Ñ'; $search[]='&Ntilde;';
775
-        $replace[]='ó'; $search[]='&oacute;';
776
-        $replace[]='Ó'; $search[]='&Oacute;';
777
-        $replace[]='ô'; $search[]='&ocirc;';
778
-        $replace[]='Ô'; $search[]='&Ocirc;';
779
-        $replace[]='ò'; $search[]='&ograve;';
780
-        $replace[]='Ò'; $search[]='&Ograve;';
781
-        $replace[]='º'; $search[]='&ordm;';
782
-        $replace[]='ø'; $search[]='&oslash;';
783
-        $replace[]='Ø'; $search[]='&Oslash;';
784
-        $replace[]='õ'; $search[]='&otilde;';
785
-        $replace[]='Õ'; $search[]='&Otilde;';
786
-        $replace[]='ö'; $search[]='&ouml;';
787
-        $replace[]='Ö'; $search[]='&Ouml;';
788
-        $replace[]='œ'; $search[]='&oelig;';
789
-        $replace[]='Œ'; $search[]='&OElig;';
790
-        $replace[]='š'; $search[]='&scaron;';
791
-        $replace[]='Š'; $search[]='&Scaron;';
792
-        $replace[]='ß'; $search[]='&szlig;';
793
-        $replace[]='þ'; $search[]='&thorn;';
794
-        $replace[]='Þ'; $search[]='&THORN;';
795
-        $replace[]='ú'; $search[]='&uacute;';
796
-        $replace[]='Ú'; $search[]='&Uacute;';
797
-        $replace[]='û'; $search[]='&ucirc;';
798
-        $replace[]='Û'; $search[]='&Ucirc;';
799
-        $replace[]='ù'; $search[]='&ugrave;';
800
-        $replace[]='Ù'; $search[]='&Ugrave;';
801
-        $replace[]='ü'; $search[]='&uuml;';
802
-        $replace[]='Ü'; $search[]='&Uuml;';
803
-        $replace[]='ý'; $search[]='&yacute;';
804
-        $replace[]='Ý'; $search[]='&Yacute;';
805
-        $replace[]='ÿ'; $search[]='&yuml;';
806
-        $replace[]='Ÿ'; $search[]='&Yuml;';
807
-        $chaine    = str_replace($search, $replace, $chaine);
808
-
809
-        return $chaine;
810
-    }
811
-
812
-    /**
813
-     * Création d'une titre pour être utilisé par l'url rewriting
814
-     *
815
-     * @param string  $content  Le texte à utiliser pour créer l'url
816
-     * @param integer $urw      La limite basse pour créer les mots
817
-     * @return string Le texte à utiliser pour l'url
818
-     *                          Note, some parts are from Solo's code
819
-     */
820
-    public static function makeSeoUrl($content, $urw = 1)
821
-    {
822
-        $s       = "ÀÁÂÃÄÅÒÓÔÕÖØÈÉÊËÇÌÍÎÏÙÚÛÜŸÑàáâãäåòóôõöøèéêëçìíîïùúûüÿñ '()";
823
-        $r       = 'AAAAAAOOOOOOEEEECIIIIUUUUYNaaaaaaooooooeeeeciiiiuuuuyn----';
824
-        $content = self::unhtml($content);    // First, remove html entities
825
-        $content = strtr($content, $s, $r);
826
-        $content = strip_tags($content);
827
-        $content = strtolower($content);
828
-        $content = htmlentities($content);    // TODO: Vérifier
829
-        $content = preg_replace('/&([a-zA-Z])(uml|acute|grave|circ|tilde);/', '$1', $content);
830
-        $content = html_entity_decode($content);
831
-        $content = eregi_replace('quot', ' ', $content);
832
-        $content = eregi_replace("'", ' ', $content);
833
-        $content = eregi_replace('-', ' ', $content);
834
-        $content = eregi_replace('[[:punct:]]', '', $content);
835
-        // Selon option mais attention au fichier .htaccess !
836
-        // $content = eregi_replace('[[:digit:]]','', $content);
837
-        $content = preg_replace('/[^a-z|A-Z|0-9]/', '-', $content);
838
-
839
-        $words    = explode(' ', $content);
840
-        $keywords = '';
841
-        foreach ($words as $word) {
842
-            if (strlen($word) >= $urw) {
843
-                $keywords .= '-' . trim($word);
844
-            }
845
-        }
846
-        if (!$keywords) {
847
-            $keywords = '-';
848
-        }
849
-        // Supprime les tirets en double
850
-        $keywords = str_replace('---', '-', $keywords);
851
-        $keywords = str_replace('--', '-', $keywords);
852
-        // Supprime un éventuel tiret à la fin de la chaine
853
-        if (substr($keywords, strlen($keywords) - 1, 1) == '-') {
854
-            $keywords = substr($keywords, 0, strlen($keywords) - 1);
855
-        }
856
-
857
-        return $keywords;
858
-    }
859
-
860
-    /**
861
-     * Create the meta keywords based on the content
862
-     *
863
-     * @param  string $content Content from which we have to create metakeywords
864
-     * @return string The list of meta keywords
865
-     */
866
-    public static function createMetaKeywords($content)
867
-    {
868
-        $keywordscount = REFERENCES_METAGEN_MAX_KEYWORDS;
869
-        $keywordsorder = REFERENCES_METAGEN_KEYWORDS_ORDER;
870
-
871
-        $tmp = array();
872
-        // Search for the "Minimum keyword length"
873
-        // TODO: Remplacer references_keywords_limit par une constante
874
-        if (isset($_SESSION['references_keywords_limit'])) {
875
-            $limit = $_SESSION['references_keywords_limit'];
876
-        } else {
877
-            $config_handler                        = xoops_getHandler('config');
878
-            $xoopsConfigSearch                     =& $config_handler->getConfigsByCat(XOOPS_CONF_SEARCH);
879
-            $limit                                 = $xoopsConfigSearch['keyword_min'];
880
-            $_SESSION['references_keywords_limit'] = $limit;
881
-        }
882
-        $myts            = MyTextSanitizer::getInstance();
883
-        $content         = str_replace('<br>', ' ', $content);
884
-        $content         = $myts->undoHtmlSpecialChars($content);
885
-        $content         = strip_tags($content);
886
-        $content         = strtolower($content);
887
-        $search_pattern  = array('&nbsp;', "\t", "\r\n", "\r", "\n", ',', '.', "'", ';', ':', ')', '(', '"', '?', '!', '{', '}', '[', ']', '<', '>', '/', '+', '-', '_', '\\', '*');
888
-        $replace_pattern = array(' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '');
889
-        $content         = str_replace($search_pattern, $replace_pattern, $content);
890
-        $keywords        = explode(' ', $content);
891
-        switch ($keywordsorder) {
892
-            case 0:    // Ordre d'apparition dans le texte
893
-                $keywords = array_unique($keywords);
894
-                break;
895
-            case 1:    // Ordre de fréquence des mots
896
-                $keywords = array_count_values($keywords);
897
-                asort($keywords);
898
-                $keywords = array_keys($keywords);
899
-                break;
900
-            case 2:    // Ordre inverse de la fréquence des mots
901
-                $keywords = array_count_values($keywords);
902
-                arsort($keywords);
903
-                $keywords = array_keys($keywords);
904
-                break;
905
-        }
906
-        // Remove black listed words
907
-        if (xoops_trim(self::getModuleOption('metagen_blacklist')) != '') {
908
-            $metagen_blacklist = str_replace("\r", '', self::getModuleOption('metagen_blacklist'));
909
-            $metablack         = explode("\n", $metagen_blacklist);
910
-            array_walk($metablack, 'trim');
911
-            $keywords = array_diff($keywords, $metablack);
912
-        }
913
-
914
-        foreach ($keywords as $keyword) {
915
-            if (strlen($keyword) >= $limit && !is_numeric($keyword)) {
916
-                $tmp[] = $keyword;
917
-            }
918
-        }
919
-        $tmp = array_slice($tmp, 0, $keywordscount);
920
-        if (count($tmp) > 0) {
921
-            return implode(',', $tmp);
922
-        } else {
923
-            if (!isset($config_handler) || !is_object($config_handler)) {
924
-                $config_handler = xoops_getHandler('config');
925
-            }
926
-            $xoopsConfigMetaFooter =& $config_handler->getConfigsByCat(XOOPS_CONF_METAFOOTER);
927
-            if (isset($xoopsConfigMetaFooter['meta_keywords'])) {
928
-                return $xoopsConfigMetaFooter['meta_keywords'];
929
-            } else {
930
-                return '';
931
-            }
932
-        }
933
-    }
934
-
935
-    /**
936
-     * Fonction chargée de gérer l'upload
937
-     *
938
-     * @param integer $indice L'indice du fichier à télécharger
939
-     * @param string  $dstpath
940
-     * @param null    $mimeTypes
941
-     * @param null    $uploadMaxSize
942
-     * @param null    $maxWidth
943
-     * @param null    $maxHeight
944
-     * @return mixed True si l'upload s'est bien déroulé sinon le message d'erreur correspondant
945
-     */
946
-    public static function uploadFile($indice, $dstpath = XOOPS_UPLOAD_PATH, $mimeTypes = null, $uploadMaxSize = null, $maxWidth = null, $maxHeight = null)
947
-    {
948
-        require_once XOOPS_ROOT_PATH . '/class/uploader.php';
949
-        global $destname;
950
-        if (isset($_POST['xoops_upload_file'])) {
951
-            require_once XOOPS_ROOT_PATH . '/class/uploader.php';
952
-            $fldname = '';
953
-            $fldname = $_FILES[$_POST['xoops_upload_file'][$indice]];
954
-            $fldname = get_magic_quotes_gpc() ? stripslashes($fldname['name']) : $fldname['name'];
955
-            if (xoops_trim($fldname != '')) {
956
-                $destname = self::createUploadName($dstpath, $fldname, true);
957
-                if ($mimeTypes === null) {
958
-                    $permittedtypes = explode("\n", str_replace("\r", '', self::getModuleOption('mimetypes')));
959
-                    array_walk($permittedtypes, 'trim');
960
-                } else {
961
-                    $permittedtypes = $mimeTypes;
962
-                }
963
-                if ($uploadMaxSize === null) {
964
-                    $uploadSize = self::getModuleOption('maxuploadsize');
965
-                } else {
966
-                    $uploadSize = $uploadMaxSize;
967
-                }
968
-                $uploader = new XoopsMediaUploader($dstpath, $permittedtypes, $uploadSize, $maxWidth, $maxHeight);
969
-                //$uploader->allowUnknownTypes = true;
970
-                $uploader->setTargetFileName($destname);
971
-                if ($uploader->fetchMedia($_POST['xoops_upload_file'][$indice])) {
972
-                    if ($uploader->upload()) {
973
-                        return true;
974
-                    } else {
975
-                        return _ERRORS . ' ' . htmlentities($uploader->getErrors());
976
-                    }
977
-                } else {
978
-                    return htmlentities($uploader->getErrors());
979
-                }
980
-            } else {
981
-                return false;
982
-            }
983
-        } else {
984
-            return false;
985
-        }
986
-    }
987
-
988
-    /**
989
-     * Resize a Picture to some given dimensions (using the wideImage library)
990
-     *
991
-     * @param string  $src_path      Picture's source
992
-     * @param string  $dst_path      Picture's destination
993
-     * @param integer $param_width   Maximum picture's width
994
-     * @param integer $param_height  Maximum picture's height
995
-     * @param boolean $keep_original Do we have to keep the original picture ?
996
-     * @param string  $fit           Resize mode (see the wideImage library for more information)
997
-     * @return bool
998
-     */
999
-    public static function resizePicture($src_path, $dst_path, $param_width, $param_height, $keep_original = false, $fit = 'inside')
1000
-    {
1001
-        //        require_once self::MODULE_PATH . 'class/wideimage/WideImage.php';
1002
-        $img    = WideImage::load($src_path);
1003
-        $result = $img->resize($param_width, $param_height, $fit);
1004
-        $result->saveToFile($dst_path, null);
1005
-        if (!$keep_original) {
1006
-            @unlink($src_path);
1007
-        }
1008
-
1009
-        return true;
1010
-    }
1011
-
1012
-    /**
1013
-     * Déclenchement d'une alerte Xoops suite à un évènement
1014
-     *
1015
-     * @param string       $category La catégorie de l'évènement
1016
-     * @param integer      $itemId   L'ID de l'élément (trop général pour être décris précisément)
1017
-     * @param unknown_type $event    L'évènement qui est déclencé
1018
-     * @param unknown_type $tags     Les variables à passer au template
1019
-     */
1020
-    public static function notify($category, $itemId, $event, $tags)
1021
-    {
1022
-        $notification_handler = xoops_getHandler('notification');
1023
-        $tags['X_MODULE_URL'] = REFERENCES_URL;
1024
-        $notification_handler->triggerEvent($category, $itemId, $event, $tags);
1025
-    }
1026
-
1027
-    /**
1028
-     * Ajoute des jours à une date et retourne la nouvelle date au format Date de Mysql
1029
-     *
1030
-     * @param int     $duration
1031
-     * @param integer $startingDate Date de départ (timestamp)
1032
-     * @return bool|string
1033
-     * @internal param int $durations Durée en jours
1034
-     */
1035
-    public static function addDaysToDate($duration = 1, $startingDate = 0)
1036
-    {
1037
-        if ($startingDate == 0) {
1038
-            $startingDate = time();
1039
-        }
1040
-        $endingDate = $startingDate + ($duration * 86400);
1041
-
1042
-        return date('Y-m-d', $endingDate);
1043
-    }
1044
-
1045
-    /**
1046
-     * Retourne un breadcrumb en fonction des paramètres passés et en partant (d'office) de la racine du module
1047
-     *
1048
-     * @param array  $path  Le chemin complet (excepté la racine) du breadcrumb sous la forme clé=url valeur=titre
1049
-     * @param string $raquo Le séparateur par défaut à utiliser
1050
-     * @return string le breadcrumb
1051
-     */
1052
-    public static function breadcrumb($path, $raquo = ' &raquo; ')
1053
-    {
1054
-        $breadcrumb        = '';
1055
-        $workingBreadcrumb = array();
1056
-        if (is_array($path)) {
1057
-            $moduleName          = self::getModuleName();
1058
-            $workingBreadcrumb[] = "<a href='" . REFERENCES_URL . "' title='" . self::makeHrefTitle($moduleName) . "'>" . $moduleName . '</a>';
1059
-            foreach ($path as $url => $title) {
1060
-                $workingBreadcrumb[] = "<a href='" . $url . "'>" . $title . '</a>';
1061
-            }
1062
-            $cnt = count($workingBreadcrumb);
1063
-            for ($i = 0; $i < $cnt; ++$i) {
1064
-                if ($i == $cnt - 1) {
1065
-                    $workingBreadcrumb[$i] = strip_tags($workingBreadcrumb[$i]);
1066
-                }
1067
-            }
1068
-            $breadcrumb = implode($raquo, $workingBreadcrumb);
1069
-        }
1070
-
1071
-        return $breadcrumb;
1072
-    }
1073
-
1074
-    public static function close_tags($string)
1075
-    {
1076
-        // match opened tags
1077
-        if (preg_match_all('/<([a-z\:\-]+)[^\/]>/', $string, $start_tags)) {
1078
-            $start_tags = $start_tags[1];
1079
-
1080
-            // match closed tags
1081
-            if (preg_match_all('/<\/([a-z]+)>/', $string, $end_tags)) {
1082
-                $complete_tags = array();
1083
-                $end_tags      = $end_tags[1];
1084
-
1085
-                foreach ($start_tags as $key => $val) {
1086
-                    $posb = array_search($val, $end_tags);
1087
-                    if (is_int($posb)) {
1088
-                        unset($end_tags[$posb]);
1089
-                    } else {
1090
-                        $complete_tags[] = $val;
1091
-                    }
1092
-                }
1093
-            } else {
1094
-                $complete_tags = $start_tags;
1095
-            }
1096
-
1097
-            $complete_tags = array_reverse($complete_tags);
1098
-            for ($i = 0; $i < count($complete_tags); ++$i) {
1099
-                $string .= '</' . $complete_tags[$i] . '>';
1100
-            }
1101
-        }
1102
-
1103
-        return $string;
1104
-    }
1105
-
1106
-    public static function truncate_tagsafe($string, $length = 80, $etc = '...', $break_words = false)
1107
-    {
1108
-        if ($length == 0) {
1109
-            return '';
1110
-        }
1111
-
1112
-        if (strlen($string) > $length) {
1113
-            $length -= strlen($etc);
1114
-            if (!$break_words) {
1115
-                $string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, $length + 1));
1116
-                $string = preg_replace('/<[^>]*$/', '', $string);
1117
-                $string = self::close_tags($string);
1118
-            }
1119
-
1120
-            return $string . $etc;
1121
-        } else {
1122
-            return $string;
1123
-        }
1124
-    }
1125
-
1126
-    /**
1127
-     * Create an infotip
1128
-     * @param $text
1129
-     * @return string
1130
-     */
1131
-    public static function makeInfotips($text)
1132
-    {
1133
-        $ret      = '';
1134
-        $infotips = self::getModuleOption('infotips');
1135
-        if ($infotips > 0) {
1136
-            $myts = MyTextSanitizer::getInstance();
1137
-            $ret  = $myts->htmlSpecialChars(substr(strip_tags($text), 0, $infotips));
1138
-        }
1139
-
1140
-        return $ret;
1141
-    }
1142
-
1143
-    /**
1144
-     * Retourne le type Mime d'un fichier en utilisant d'abord finfo puis mime_content
1145
-     *
1146
-     * @param string $filename Le fichier (avec son chemin d'accès complet) dont on veut connaître le type mime
1147
-     * @return string
1148
-     */
1149
-    public static function getMimeType($filename)
1150
-    {
1151
-        if (function_exists('finfo_open')) {
1152
-            $pathToMagic = REFERENCES_PATH . 'mime/magic';
1153
-            $finfo       = new finfo(FILEINFO_MIME, $pathToMagic);
1154
-            $mimetype    = $finfo->file($filename);
1155
-            finfo_close($finfo);
1156
-            unset($finfo);
1157
-
1158
-            return $mimetype;
1159
-        } else {
1160
-            if (function_exists('mime_content_type')) {
1161
-                return mime_content_type($filename);
1162
-            } else {
1163
-                return '';
1164
-            }
1165
-        }
1166
-    }
1167
-
1168
-    /**
1169
-     * Retourne une liste d'objets XoopsUsers à partir d'une liste d'identifiants
1170
-     *
1171
-     * @param  array $xoopsUsersIDs La liste des ID
1172
-     * @return array Les objets XoopsUsers
1173
-     */
1174
-    public static function getUsersFromIds($xoopsUsersIDs)
1175
-    {
1176
-        $users = array();
1177
-        if (is_array($xoopsUsersIDs) && count($xoopsUsersIDs) > 0) {
1178
-            $xoopsUsersIDs = array_unique($xoopsUsersIDs);
1179
-            sort($xoopsUsersIDs);
1180
-            if (count($xoopsUsersIDs) > 0) {
1181
-                $member_handler = xoops_getHandler('user');
1182
-                $criteria       = new Criteria('uid', '(' . implode(',', $xoopsUsersIDs) . ')', 'IN');
1183
-                $criteria->setSort('uid');
1184
-                $users = $member_handler->getObjects($criteria, true);
1185
-            }
1186
-        }
1187
-
1188
-        return $users;
1189
-    }
1190
-
1191
-    /**
1192
-     * Retourne l'ID de l'utilisateur courant (s'il est connecté)
1193
-     * @return integer L'uid ou 0
1194
-     */
1195
-    public static function getCurrentUserID()
1196
-    {
1197
-        global $xoopsUser;
1198
-        $uid = is_object($xoopsUser) ? $xoopsUser->getVar('uid') : 0;
1199
-
1200
-        return $uid;
1201
-    }
1202
-
1203
-    /**
1204
-     * Retourne la liste des groupes de l'utilisateur courant (avec cache)
1205
-     * @param int $uid
1206
-     * @return array Les ID des groupes auquel l'utilisateur courant appartient
1207
-     */
1208
-    public static function getMemberGroups($uid = 0)
1209
-    {
1210
-        static $buffer = array();
1211
-        if ($uid == 0) {
1212
-            $uid = self::getCurrentUserID();
1213
-        }
1214
-
1215
-        if (is_array($buffer) && count($buffer) > 0 && isset($buffer[$uid])) {
1216
-            return $buffer[$uid];
1217
-        } else {
1218
-            if ($uid > 0) {
1219
-                $member_handler = xoops_getHandler('member');
1220
-                $buffer[$uid]   = $member_handler->getGroupsByUser($uid, false);    // Renvoie un tableau d'ID (de groupes)
1221
-            } else {
1222
-                $buffer[$uid] = array(XOOPS_GROUP_ANONYMOUS);
1223
-            }
1224
-        }
1225
-
1226
-        return $buffer[$uid];
1227
-    }
1228
-
1229
-    /**
1230
-     * Indique si l'utilisateur courant fait partie d'une groupe donné (avec gestion de cache)
1231
-     *
1232
-     * @param integer $group Groupe recherché
1233
-     * @param int     $uid
1234
-     * @return bool vrai si l'utilisateur fait partie du groupe, faux sinon
1235
-     */
1236
-    public static function isMemberOfGroup($group = 0, $uid = 0)
1237
-    {
1238
-        static $buffer = array();
1239
-        $retval = false;
1240
-        if ($uid == 0) {
1241
-            $uid = self::getCurrentUserID();
1242
-        }
1243
-        if (is_array($buffer) && array_key_exists($group, $buffer)) {
1244
-            $retval = $buffer[$group];
1245
-        } else {
1246
-            $member_handler = xoops_getHandler('member');
1247
-            $groups         = $member_handler->getGroupsByUser($uid, false);    // Renvoie un tableau d'ID (de groupes)
1248
-            $retval         = in_array($group, $groups);
1249
-            $buffer[$group] = $retval;
1250
-        }
1251
-
1252
-        return $retval;
1253
-    }
1254
-
1255
-    /**
1256
-     * Indique si un utilisateur fait partie de plusieurs groupes
1257
-     * La fonction renvoie vrai dès qu'on trouve que le membre fait partir d'un des groupes
1258
-     * @param array    $groups La liste des groupes à vérifier
1259
-     * @param  integer $uid    L'ID de l'utilisateur
1260
-     * @return boolean
1261
-     */
1262
-    public static function isMemberOfGroups($groups, $uid = 0)
1263
-    {
1264
-        if (count($groups) == 0) {
1265
-            return false;
1266
-        }
1267
-        if ($uid == 0) {
1268
-            $uid = self::getCurrentUserID();
1269
-        }
1270
-        foreach ($groups as $groupId) {
1271
-            if (self::isMemberOfGroup($groupId, $uid)) {
1272
-                return true;
1273
-            }
1274
-        }
1275
-
1276
-        return false;
1277
-    }
1278
-
1279
-    /**
1280
-     * Retourne le nombre total de groupes (y compris les anonymes)
1281
-     */
1282
-    public static function getGroupsCount()
1283
-    {
1284
-        static $cache = -1;
1285
-        if ($cache == -1) {
1286
-            global $xoopsDB;
1287
-            $sql    = 'SELECT COUNT(*) FROM ' . $xoopsDB->prefix('groups');
1288
-            $result = $xoopsDB->query($sql);
1289
-            if (!$result) {
1290
-                return false;
1291
-            }
1292
-            list($cache) = $xoopsDB->fetchRow($result);
1293
-        }
1294
-
1295
-        return $cache;
1296
-    }
1297
-
1298
-    /**
1299
-     * Fonction chargée de vérifier qu'un répertoire existe, qu'on peut écrire dedans et création d'un fichier index.html
1300
-     *
1301
-     * @param string $folder Le chemin complet du répertoire à vérifier
1302
-     * @return void
1303
-     */
1304
-    public static function prepareFolder($folder)
1305
-    {
1306
-        if (!is_dir($folder)) {
1307
-            mkdir($folder, 0777);
1308
-            file_put_contents($folder . '/index.html', '<script>history.go(-1);</script>');
1309
-        } else {
1310
-            if (!is_writable($folder)) {
1311
-                chmod($folder, 0777);
1312
-            }
1313
-        }
1314
-    }
1315
-
1316
-    /**
1317
-     * Load a language file
1318
-     *
1319
-     * @param string $languageFile     The required language file
1320
-     * @param string $defaultExtension Default extension to use
1321
-     */
1322
-    public static function loadLanguageFile($languageFile, $defaultExtension = '.php')
1323
-    {
1324
-        global $xoopsConfig;
1325
-        $root = self::MODULE_PATH;
1326
-        if (strstr($languageFile, $defaultExtension) === false) {
1327
-            $languageFile .= $defaultExtension;
1328
-        }
1329
-        if (file_exists($root . 'language' . DIRECTORY_SEPARATOR . $xoopsConfig['language'] . DIRECTORY_SEPARATOR . $languageFile)) {
1330
-            require_once $root . 'language' . DIRECTORY_SEPARATOR . $xoopsConfig['language'] . DIRECTORY_SEPARATOR . $languageFile;
1331
-        } else {    // Fallback
1332
-            require_once $root . 'language' . DIRECTORY_SEPARATOR . 'english' . DIRECTORY_SEPARATOR . $languageFile;
1333
-        }
1334
-    }
1335
-
1336
-    /**
1337
-     * Création d'une vignette en tenant compte des options du module concernant le mode de création des vignettes
1338
-     *
1339
-     * @param  string  $src_path
1340
-     * @param  string  $dst_path
1341
-     * @param  integer $param_width
1342
-     * @param  integer $param_height
1343
-     * @param  boolean $keep_original
1344
-     * @param string   $fit Utilisé uniquement pour la méthode 0 (redimensionnement)
1345
-     * @return boolean
1346
-     */
1347
-    public static function createThumb($src_path, $dst_path, $param_width, $param_height, $keep_original = false, $fit = 'inside')
1348
-    {
1349
-        //        require_once self::MODULE_PATH . 'class/wideimage/WideImage.php';
1350
-        $resize = true;
1351
-        // On commence par vérifier que l'image originale n'est pas plus petite que les dimensions demandées auquel cas il n'y a rien à faire
1352
-        $pictureDimensions = getimagesize($src_path);
1353
-        if (is_array($pictureDimensions)) {
1354
-            $pictureWidth  = $pictureDimensions[0];
1355
-            $pictureHeight = $pictureDimensions[1];
1356
-            if ($pictureWidth < $param_width && $pictureHeight < $param_height) {
1357
-                $resize = false;
1358
-            }
1359
-        }
1360
-        $img = WideImage::load($src_path);
1361
-        if ($resize) { // L'image est suffisament grande pour être réduite
1362
-            $thumbMethod = 0;
1363
-            if ($thumbMethod == 0) { // Redimensionnement de l'image
1364
-                $result = $img->resize($param_width, $param_height, $fit);
1365
-            } else { // Récupération d'une partie de l'image depuis le centre
1366
-                // Calcul de left et top
1367
-                $left = $top = 0;
1368
-                if (is_array($pictureDimensions)) {
1369
-                    if ($pictureWidth > $param_width) {
1370
-                        $left = (int)(($pictureWidth / 2) - ($param_width / 2));
1371
-                    }
1372
-                    if ($pictureHeight > $param_height) {
1373
-                        $top = (int)(($pictureHeight / 2) - ($param_height / 2));
1374
-                    }
1375
-                }
1376
-                $result = $img->crop($left, $top, $param_width, $param_height);
1377
-            }
1378
-            $result->saveToFile($dst_path, null);
1379
-        } else {
1380
-            if ($src_path != $dst_path) {
1381
-                @copy($src_path, $dst_path);
1382
-            }
1383
-        }
1384
-        if (!$keep_original) {
1385
-            @unlink($src_path);
1386
-        }
1387
-
1388
-        return true;
1389
-    }
1390
-
1391
-    /**
1392
-     * Create the <option> of an html select
1393
-     *
1394
-     * @param  array $array   Array of index and labels
1395
-     * @param  mixed $default the default value
1396
-     * @param bool   $withNull
1397
-     * @return string
1398
-     */
1399
-    private static function htmlSelectOptions($array, $default = 0, $withNull = true)
1400
-    {
1401
-        $ret      = array();
1402
-        $selected = '';
1403
-        if ($withNull) {
1404
-            if (!is_array($default)) {
1405
-                if ($default === 0) {
1406
-                    $selected = " selected = 'selected'";
1407
-                }
1408
-            } else {
1409
-                if (in_array(0, $default)) {
1410
-                    $selected = " selected = 'selected'";
1411
-                }
1412
-            }
1413
-            $ret[] = '<option value=0' . $selected . '>---</option>';
1414
-        }
1415
-
1416
-        foreach ($array as $index => $label) {
1417
-            $selected = '';
1418
-            if (!is_array($default)) {
1419
-                if ($index == $default) {
1420
-                    $selected = " selected = 'selected'";
1421
-                }
1422
-            } else {
1423
-                if (in_array($index, $default)) {
1424
-                    $selected = " selected = 'selected'";
1425
-                }
1426
-            }
1427
-            $ret[] = "<option value=\"" . $index . "\"" . $selected . '>' . $label . '</option>';
1428
-        }
1429
-
1430
-        return implode("\n", $ret);
1431
-    }
1432
-
1433
-    /**
1434
-     * Creates an html select an returns its code
1435
-     *
1436
-     * @param  string  $selectName Select's name
1437
-     * @param  array   $array      Key = value of each option, value = label of each option
1438
-     * @param  mixed   $default    Default's value
1439
-     * @param  boolean $withNull   Do we want a null option
1440
-     * @param  string  $style      Is there a style to apply ?
1441
-     * @param  boolean $multiple   Can we select multiple elements ?
1442
-     * @param  integer $size       Size of the selectbox, only used with multiple selectboxes
1443
-     * @param string   $extra
1444
-     * @return string
1445
-     */
1446
-    public static function htmlSelect($selectName, $array, $default, $withNull = true, $style = '', $multiple = false, $size = 1, $extra = '')
1447
-    {
1448
-        $ret = '';
1449
-        $ret .= "<select name='" . $selectName . "' id='" . $selectName . "'";
1450
-        if (xoops_trim($style) != '') {
1451
-            $ret .= " style='" . $style . "' ";
1452
-        }
1453
-        if (xoops_trim($multiple) != '') {
1454
-            $ret .= " multiple = 'multiple' size='" . $size . "' ";
1455
-        }
1456
-        $ret .= $extra . ">\n";
1457
-        $ret .= self::htmlSelectOptions($array, $default, $withNull);
1458
-        $ret .= "</select>\n";
1459
-
1460
-        return $ret;
1461
-    }
1462
-
1463
-    /**
1464
-     * Verify that a mysql table exists
1465
-     * @param $tablename
1466
-     * @return bool
1467
-     */
1468
-    public static function tableExists($tablename)
1469
-    {
1470
-        global $xoopsDB;
1471
-        $result = $xoopsDB->queryF("SHOW TABLES LIKE '$tablename'");
1472
-
1473
-        return ($xoopsDB->getRowsNum($result) > 0);
1474
-    }
1475
-
1476
-    /**
1477
-     * Verify that a field exists inside a mysql table
1478
-     * @param $fieldname
1479
-     * @param $table
1480
-     * @return bool
1481
-     */
1482
-    public static function fieldExists($fieldname, $table)
1483
-    {
1484
-        global $xoopsDB;
1485
-        $result = $xoopsDB->queryF("SHOW COLUMNS FROM $table LIKE '$fieldname'");
1486
-
1487
-        return ($xoopsDB->getRowsNum($result) > 0);
1488
-    }
1489
-
1490
-    /**
1491
-     * Retourne la définition d'un champ
1492
-     *
1493
-     * @param  string $fieldname
1494
-     * @param  string $table
1495
-     * @return array
1496
-     */
1497
-    public static function getFieldDefinition($fieldname, $table)
1498
-    {
1499
-        global $xoopsDB;
1500
-        $result = $xoopsDB->queryF("SHOW COLUMNS FROM $table LIKE '$fieldname'");
1501
-        if ($result) {
1502
-            return $xoopsDB->fetchArray($result);
1503
-        }
1504
-
1505
-        return '';
1506
-    }
1507
-
1508
-    /**
1509
-     * Add a field to a mysql table
1510
-     * @param $field
1511
-     * @param $table
1512
-     * @return resource
1513
-     */
1514
-    public static function addField($field, $table)
1515
-    {
1516
-        global $xoopsDB;
1517
-        $result = $xoopsDB->queryF("ALTER TABLE $table ADD $field;");
1518
-
1519
-        return $result;
1520
-    }
1521
-
1522
-    /**
1523
-     * Maintenance des tables du module et de son cache de requêtes
1524
-     *
1525
-     * @return void
1526
-     */
1527
-    public static function maintainTablesCache()
1528
-    {
1529
-        global $xoopsDB;
1530
-        define('REFERENCES_MAINTAIN', true);
1531
-        require self::MODULE_PATH . 'xoops_version.php';
1532
-        $tables = array();
1533
-        foreach ($modversion['tables'] as $table) {
1534
-            $tables[] = $xoopsDB->prefix($table);
1535
-        }
1536
-        if (count($tables) > 0) {
1537
-            $list = implode(',', $tables);
1538
-            $xoopsDB->queryF('CHECK TABLE ' . $list);
1539
-            $xoopsDB->queryF('ANALYZE TABLE ' . $list);
1540
-            $xoopsDB->queryF('OPTIMIZE TABLE ' . $list);
1541
-        }
1542
-        self::updateCache();
1543
-        $handlers = references_handler::getInstance();
1544
-        $handlers->h_references_articles->forceCacheClean();
1545
-    }
1546
-
1547
-    /**
1548
-     * Indique si le module Tag existe et est activé
1549
-     *
1550
-     * @return boolean
1551
-     * @credit: smartfactory
1552
-     */
1553
-    public static function tagModuleExists()
1554
-    {
1555
-        static $moduleExistsAndIsActive;
1556
-        if (!isset($moduleExistsAndIsActive)) {
1557
-            $modules_handler = xoops_getHandler('module');
1558
-            $tagModule       = $modules_handler->getByDirName('tag');
1559
-            if (!$tagModule) {
1560
-                $moduleExistsAndIsActive = false;
1561
-            } else {
1562
-                $moduleExistsAndIsActive = $tagModule->getVar('isactive') == 1;
1563
-            }
1564
-        }
1565
-
1566
-        return $moduleExistsAndIsActive;
1567
-    }
39
+	// Pour la portabilité de module à module
40
+	const MODULE_NAME    = 'references';
41
+	const MODULE_DIRNAME = REFERENCES_DIRNAME;
42
+	const MODULE_PATH    = REFERENCES_PATH;
43
+	const MODULE_URL     = REFERENCES_URL;
44
+	const MODULE_JS_URL  = REFERENCES_JS_URL;
45
+
46
+	/**
47
+	 * Access the only instance of this class
48
+	 *
49
+	 * @return object
50
+	 *
51
+	 * @static
52
+	 * @staticvar   object
53
+	 */
54
+	public static function getInstance()
55
+	{
56
+		static $instance;
57
+		if (null === $instance) {
58
+			$instance = new static();
59
+		}
60
+
61
+		return $instance;
62
+	}
63
+
64
+	/**
65
+	 * Returns a module's option (with cache)
66
+	 *
67
+	 * @param  string  $option    module option's name
68
+	 * @param  boolean $withCache Do we have to use some cache ?
69
+	 * @return mixed   option's value
70
+	 */
71
+	public static function getModuleOption($option, $withCache = true)
72
+	{
73
+		global $xoopsModuleConfig, $xoopsModule;
74
+		$repmodule = self::MODULE_NAME;
75
+		static $options = array();
76
+		if (is_array($options) && array_key_exists($option, $options) && $withCache) {
77
+			return $options[$option];
78
+		}
79
+
80
+		$retval = false;
81
+		if (isset($xoopsModuleConfig) && (is_object($xoopsModule) && $xoopsModule->getVar('dirname') == $repmodule && $xoopsModule->getVar('isactive'))) {
82
+			if (isset($xoopsModuleConfig[$option])) {
83
+				$retval = $xoopsModuleConfig[$option];
84
+			}
85
+		} else {
86
+			$module_handler = xoops_getHandler('module');
87
+			$module         = $module_handler->getByDirname($repmodule);
88
+			$config_handler = xoops_getHandler('config');
89
+			if ($module) {
90
+				$moduleConfig = $config_handler->getConfigsByCat(0, $module->getVar('mid'));
91
+				if (isset($moduleConfig[$option])) {
92
+					$retval = $moduleConfig[$option];
93
+				}
94
+			}
95
+		}
96
+		$options[$option] = $retval;
97
+
98
+		return $retval;
99
+	}
100
+
101
+	/**
102
+	 * Is Xoops 2.3.x ?
103
+	 *
104
+	 * @return boolean need to say it ?
105
+	 */
106
+	public static function isX23()
107
+	{
108
+		$x23 = false;
109
+		$xv  = str_replace('XOOPS ', '', XOOPS_VERSION);
110
+		if ((int)substr($xv, 2, 1) >= 3) {
111
+			$x23 = true;
112
+		}
113
+
114
+		return $x23;
115
+	}
116
+
117
+	/**
118
+	 * Retreive an editor according to the module's option "form_options"
119
+	 *
120
+	 * @param  string $caption Caption to give to the editor
121
+	 * @param  string $name    Editor's name
122
+	 * @param  string $value   Editor's value
123
+	 * @param  string $width   Editor's width
124
+	 * @param  string $height  Editor's height
125
+	 * @param string  $supplemental
126
+	 * @return object The editor to use
127
+	 */
128
+	public static function getWysiwygForm($caption, $name, $value = '', $width = '100%', $height = '400px', $supplemental = '')
129
+	{
130
+		$editor                   = false;
131
+		$editor_configs           = array();
132
+		$editor_configs['name']   = $name;
133
+		$editor_configs['value']  = $value;
134
+		$editor_configs['rows']   = 35;
135
+		$editor_configs['cols']   = 60;
136
+		$editor_configs['width']  = '100%';
137
+		$editor_configs['height'] = '400px';
138
+
139
+		$editor_option = strtolower(self::getModuleOption('form_options'));
140
+
141
+		if (self::isX23()) {
142
+			$editor = new XoopsFormEditor($caption, $editor_option, $editor_configs);
143
+
144
+			return $editor;
145
+		}
146
+
147
+		// Only for Xoops 2.0.x
148
+		switch ($editor_option) {
149
+			case 'fckeditor':
150
+				if (is_readable(XOOPS_ROOT_PATH . '/class/fckeditor/formfckeditor.php')) {
151
+					require_once(XOOPS_ROOT_PATH . '/class/fckeditor/formfckeditor.php');
152
+					$editor = new XoopsFormFckeditor($caption, $name, $value);
153
+				}
154
+				break;
155
+
156
+			case 'htmlarea':
157
+				if (is_readable(XOOPS_ROOT_PATH . '/class/htmlarea/formhtmlarea.php')) {
158
+					require_once(XOOPS_ROOT_PATH . '/class/htmlarea/formhtmlarea.php');
159
+					$editor = new XoopsFormHtmlarea($caption, $name, $value);
160
+				}
161
+				break;
162
+
163
+			case 'dhtmltextarea':
164
+				$editor = new XoopsFormDhtmlTextArea($caption, $name, $value, 10, 50, $supplemental);
165
+				break;
166
+
167
+			case 'textarea':
168
+				$editor = new XoopsFormTextArea($caption, $name, $value);
169
+				break;
170
+
171
+			case 'tinyeditor':
172
+			case 'tinymce':
173
+				if (is_readable(XOOPS_ROOT_PATH . '/class/xoopseditor/tinyeditor/formtinyeditortextarea.php')) {
174
+					require_once XOOPS_ROOT_PATH . '/class/xoopseditor/tinyeditor/formtinyeditortextarea.php';
175
+					$editor = new XoopsFormTinyeditorTextArea(array('caption' => $caption, 'name' => $name, 'value' => $value, 'width' => '100%', 'height' => '400px'));
176
+				}
177
+				break;
178
+
179
+			case 'koivi':
180
+				if (is_readable(XOOPS_ROOT_PATH . '/class/wysiwyg/formwysiwygtextarea.php')) {
181
+					require_once(XOOPS_ROOT_PATH . '/class/wysiwyg/formwysiwygtextarea.php');
182
+					$editor = new XoopsFormWysiwygTextArea($caption, $name, $value, $width, $height, '');
183
+				}
184
+				break;
185
+		}
186
+		if (!is_object($editor)) {
187
+			trigger_error('Error, impossible to get the requested text editor', E_USER_ERROR);
188
+		}
189
+
190
+		return $editor;
191
+	}
192
+
193
+	/**
194
+	 * Create (in a link) a javascript confirmation's box
195
+	 *
196
+	 * @param  string  $message Message to display
197
+	 * @param  boolean $form    Is this a confirmation for a form ?
198
+	 * @return string  the javascript code to insert in the link (or in the form)
199
+	 */
200
+	public static function javascriptLinkConfirm($message, $form = false)
201
+	{
202
+		if (!$form) {
203
+			return "onclick=\"javascript:return confirm('" . str_replace("'", ' ', $message) . "')\"";
204
+		} else {
205
+			return "onSubmit=\"javascript:return confirm('" . str_replace("'", ' ', $message) . "')\"";
206
+		}
207
+	}
208
+
209
+	/**
210
+	 * Get current user IP
211
+	 *
212
+	 * @return string IP address (format Ipv4)
213
+	 */
214
+	public static function IP()
215
+	{
216
+		$proxy_ip = '';
217
+		if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
218
+			$proxy_ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
219
+		} elseif (!empty($_SERVER['HTTP_X_FORWARDED'])) {
220
+			$proxy_ip = $_SERVER['HTTP_X_FORWARDED'];
221
+		} elseif (!empty($_SERVER['HTTP_FORWARDED_FOR'])) {
222
+			$proxy_ip = $_SERVER['HTTP_FORWARDED_FOR'];
223
+		} elseif (!empty($_SERVER['HTTP_FORWARDED'])) {
224
+			$proxy_ip = $_SERVER['HTTP_FORWARDED'];
225
+		} elseif (!empty($_SERVER['HTTP_VIA'])) {
226
+			$proxy_ip = $_SERVER['HTTP_VIA'];
227
+		} elseif (!empty($_SERVER['HTTP_X_COMING_FROM'])) {
228
+			$proxy_ip = $_SERVER['HTTP_X_COMING_FROM'];
229
+		} elseif (!empty($_SERVER['HTTP_COMING_FROM'])) {
230
+			$proxy_ip = $_SERVER['HTTP_COMING_FROM'];
231
+		}
232
+		$regs = array();
233
+		if (!empty($proxy_ip) && $is_ip = ereg('^([0-9]{1,3}\.){3,3}[0-9]{1,3}', $proxy_ip, $regs) && count($regs) > 0) {
234
+			$the_IP = $regs[0];
235
+		} else {
236
+			$the_IP = $_SERVER['REMOTE_ADDR'];
237
+		}
238
+
239
+		return $the_IP;
240
+	}
241
+
242
+	/**
243
+	 * Set the page's title, meta description and meta keywords
244
+	 * Datas are supposed to be sanitized
245
+	 *
246
+	 * @param  string $pageTitle       Page's Title
247
+	 * @param  string $metaDescription Page's meta description
248
+	 * @param  string $metaKeywords    Page's meta keywords
249
+	 * @return void
250
+	 */
251
+	public static function setMetas($pageTitle = '', $metaDescription = '', $metaKeywords = '')
252
+	{
253
+		global $xoTheme, $xoTheme, $xoopsTpl;
254
+		$xoopsTpl->assign('xoops_pagetitle', $pageTitle);
255
+		if (isset($xoTheme) && is_object($xoTheme)) {
256
+			if (!empty($metaKeywords)) {
257
+				$xoTheme->addMeta('meta', 'keywords', $metaKeywords);
258
+			}
259
+			if (!empty($metaDescription)) {
260
+				$xoTheme->addMeta('meta', 'description', $metaDescription);
261
+			}
262
+		} elseif (isset($xoopsTpl) && is_object($xoopsTpl)) {    // Compatibility for old Xoops versions
263
+			if (!empty($metaKeywords)) {
264
+				$xoopsTpl->assign('xoops_meta_keywords', $metaKeywords);
265
+			}
266
+			if (!empty($metaDescription)) {
267
+				$xoopsTpl->assign('xoops_meta_description', $metaDescription);
268
+			}
269
+		}
270
+	}
271
+
272
+	/**
273
+	 * Send an email from a template to a list of recipients
274
+	 *
275
+	 * @param         $tplName
276
+	 * @param  array  $recipients List of recipients
277
+	 * @param  string $subject    Email's subject
278
+	 * @param  array  $variables  Varirables to give to the template
279
+	 * @return bool Result of the send
280
+	 * @internal param string $tpl_name Template's name
281
+	 */
282
+	public static function sendEmailFromTpl($tplName, $recipients, $subject, $variables)
283
+	{
284
+		global $xoopsConfig;
285
+		require_once XOOPS_ROOT_PATH . '/class/xoopsmailer.php';
286
+		if (!is_array($recipients)) {
287
+			if (trim($recipients) == '') {
288
+				return false;
289
+			}
290
+		} else {
291
+			if (count($recipients) == 0) {
292
+				return false;
293
+			}
294
+		}
295
+		if (function_exists('xoops_getMailer')) {
296
+			$xoopsMailer =& xoops_getMailer();
297
+		} else {
298
+			$xoopsMailer =& getMailer();
299
+		}
300
+
301
+		$xoopsMailer->useMail();
302
+		$xoopsMailer->setTemplateDir(XOOPS_ROOT_PATH . '/modules/' . self::MODULE_NAME . '/language/' . $xoopsConfig['language'] . '/mail_template');
303
+		$xoopsMailer->setTemplate($tplName);
304
+		$xoopsMailer->setToEmails($recipients);
305
+		// TODO: Change !
306
+		// $xoopsMailer->setFromEmail('[email protected]');
307
+		//$xoopsMailer->setFromName('MonSite');
308
+		$xoopsMailer->setSubject($subject);
309
+		foreach ($variables as $key => $value) {
310
+			$xoopsMailer->assign($key, $value);
311
+		}
312
+		$res = $xoopsMailer->send();
313
+		unset($xoopsMailer);
314
+		$filename = XOOPS_UPLOAD_PATH . '/logmail_' . self::MODULE_NAME . '.php';
315
+		if (!file_exists($filename)) {
316
+			$fp = @fopen($filename, 'a');
317
+			if ($fp) {
318
+				fwrite($fp, '<?php exit(); ?>');
319
+				fclose($fp);
320
+			}
321
+		}
322
+		$fp = @fopen($filename, 'a');
323
+
324
+		if ($fp) {
325
+			fwrite($fp, str_repeat('-', 120) . "\n");
326
+			fwrite($fp, date('d/m/Y H:i:s') . "\n");
327
+			fwrite($fp, 'Template name : ' . $tplName . "\n");
328
+			fwrite($fp, 'Email subject : ' . $subject . "\n");
329
+			if (is_array($recipients)) {
330
+				fwrite($fp, 'Recipient(s) : ' . implode(',', $recipients) . "\n");
331
+			} else {
332
+				fwrite($fp, 'Recipient(s) : ' . $recipients . "\n");
333
+			}
334
+			fwrite($fp, 'Transmited variables : ' . implode(',', $variables) . "\n");
335
+			fclose($fp);
336
+		}
337
+
338
+		return $res;
339
+	}
340
+
341
+	/**
342
+	 * Remove module's cache
343
+	 */
344
+	public static function updateCache()
345
+	{
346
+		global $xoopsModule;
347
+		$folder  = $xoopsModule->getVar('dirname');
348
+		$tpllist = array();
349
+		require_once XOOPS_ROOT_PATH . '/class/xoopsblock.php';
350
+		require_once XOOPS_ROOT_PATH . '/class/template.php';
351
+		$tplfile_handler = xoops_getHandler('tplfile');
352
+		$tpllist         = $tplfile_handler->find(null, null, null, $folder);
353
+		xoops_template_clear_module_cache($xoopsModule->getVar('mid'));            // Clear module's blocks cache
354
+
355
+		foreach ($tpllist as $onetemplate) {    // Remove cache for each page.
356
+			if ($onetemplate->getVar('tpl_type') === 'module') {
357
+				//  Note, I've been testing all the other methods (like the one of Smarty) and none of them run, that's why I have used this code
358
+				$files_del = array();
359
+				$files_del = glob(XOOPS_CACHE_PATH . '/*' . $onetemplate->getVar('tpl_file') . '*');
360
+				if (count($files_del) > 0 && is_array($files_del)) {
361
+					foreach ($files_del as $one_file) {
362
+						if (is_file($one_file)) {
363
+							unlink($one_file);
364
+						}
365
+					}
366
+				}
367
+			}
368
+		}
369
+	}
370
+
371
+	/**
372
+	 * Redirect user with a message
373
+	 *
374
+	 * @param string $message message to display
375
+	 * @param string $url     The place where to go
376
+	 * @param        integer  timeout Time to wait before to redirect
377
+	 */
378
+	public static function redirect($message = '', $url = 'index.php', $time = 2)
379
+	{
380
+		redirect_header($url, $time, $message);
381
+		exit();
382
+	}
383
+
384
+	/**
385
+	 * Internal function used to get the handler of the current module
386
+	 *
387
+	 * @return object The module
388
+	 */
389
+	public static function getModule()
390
+	{
391
+		static $mymodule;
392
+		if (!isset($mymodule)) {
393
+			global $xoopsModule;
394
+			if (isset($xoopsModule) && is_object($xoopsModule) && $xoopsModule->getVar('dirname') == REFERENCES_DIRNAME) {
395
+				$mymodule =& $xoopsModule;
396
+			} else {
397
+				$hModule  = xoops_getHandler('module');
398
+				$mymodule = $hModule->getByDirname(REFERENCES_DIRNAME);
399
+			}
400
+		}
401
+
402
+		return $mymodule;
403
+	}
404
+
405
+	/**
406
+	 * Returns the module's name (as defined by the user in the module manager) with cache
407
+	 * @return string Module's name
408
+	 */
409
+	public static function getModuleName()
410
+	{
411
+		static $moduleName;
412
+		if (!isset($moduleName)) {
413
+			$mymodule   = self::getModule();
414
+			$moduleName = $mymodule->getVar('name');
415
+		}
416
+
417
+		return $moduleName;
418
+	}
419
+
420
+	/**
421
+	 * Create a title for the href tags inside html links
422
+	 *
423
+	 * @param  string $title Text to use
424
+	 * @return string Formated text
425
+	 */
426
+	public static function makeHrefTitle($title)
427
+	{
428
+		$s = "\"'";
429
+		$r = '  ';
430
+
431
+		return strtr($title, $s, $r);
432
+	}
433
+
434
+	/**
435
+	 * Retourne la liste des utilisateurs appartenants � un groupe
436
+	 *
437
+	 * @param  int $groupId Searched group
438
+	 * @return array Array of XoopsUsers
439
+	 */
440
+	public static function getUsersFromGroup($groupId)
441
+	{
442
+		$users          = array();
443
+		$member_handler = xoops_getHandler('member');
444
+		$users          = $member_handler->getUsersByGroup($groupId, true);
445
+
446
+		return $users;
447
+	}
448
+
449
+	/**
450
+	 * Retourne les ID des utilisateurs faisant partie de plusieurs groupes
451
+	 * @param  array $groups Les ID des groupes dont on recherche les ID utilisateurs
452
+	 * @return array Les ID utilisateurs
453
+	 */
454
+	public static function getUsersIdsFromGroups($groups)
455
+	{
456
+		$usersIds       = array();
457
+		$member_handler = xoops_getHandler('member');
458
+		foreach ($groups as $groupId) {
459
+			$temporaryGroup = array();
460
+			$temporaryGroup = $member_handler->getUsersByGroup($groupId);
461
+			if (count($temporaryGroup) > 0) {
462
+				$usersIds = array_merge($usersIds, $temporaryGroup);
463
+			}
464
+		}
465
+
466
+		return array_unique($usersIds);
467
+	}
468
+
469
+	/**
470
+	 * Retourne la liste des emails des utilisateurs membres d'un groupe
471
+	 *
472
+	 * @param $groupId
473
+	 * @return array Emails list
474
+	 * @internal param int $group_id Group's number
475
+	 */
476
+	public static function getEmailsFromGroup($groupId)
477
+	{
478
+		$ret   = array();
479
+		$users = self::getUsersFromGroup($groupId);
480
+		foreach ($users as $user) {
481
+			$ret[] = $user->getVar('email');
482
+		}
483
+
484
+		return $ret;
485
+	}
486
+
487
+	/**
488
+	 * V�rifie que l'utilisateur courant fait partie du groupe des administrateurs
489
+	 *
490
+	 * @return booleean Admin or not
491
+	 */
492
+	public static function isAdmin()
493
+	{
494
+		global $xoopsUser, $xoopsModule;
495
+		if (is_object($xoopsUser)) {
496
+			if (in_array(XOOPS_GROUP_ADMIN, $xoopsUser->getGroups())) {
497
+				return true;
498
+			} elseif (isset($xoopsModule) && $xoopsUser->isAdmin($xoopsModule->getVar('mid'))) {
499
+				return true;
500
+			}
501
+		}
502
+
503
+		return false;
504
+	}
505
+
506
+	/**
507
+	 * Returns the current date in the Mysql format
508
+	 *
509
+	 * @return string Date in the Mysql format
510
+	 */
511
+	public static function getCurrentSQLDate()
512
+	{
513
+		return date('Y-m-d');    // 2007-05-02
514
+	}
515
+
516
+	public static function getCurrentSQLDateTime()
517
+	{
518
+		return date('Y-m-d H:i:s');    // 2007-05-02
519
+	}
520
+
521
+	/**
522
+	 * Convert a Mysql date to the human's format
523
+	 *
524
+	 * @param  string $date The date to convert
525
+	 * @param string  $format
526
+	 * @return string The date in a human form
527
+	 */
528
+	public static function SQLDateToHuman($date, $format = 'l')
529
+	{
530
+		if ($date != '0000-00-00' && xoops_trim($date) != '') {
531
+			return formatTimestamp(strtotime($date), $format);
532
+		} else {
533
+			return '';
534
+		}
535
+	}
536
+
537
+	/**
538
+	 * Convert a timestamp to a Mysql date
539
+	 *
540
+	 * @param  integer $timestamp The timestamp to use
541
+	 * @return string  The date in the Mysql format
542
+	 */
543
+	public static function timestampToMysqlDate($timestamp)
544
+	{
545
+		return date('Y-m-d', (int)$timestamp);
546
+	}
547
+
548
+	/**
549
+	 * Conversion d'un dateTime Mysql en date lisible en fran�ais
550
+	 * @param $dateTime
551
+	 * @return bool|string
552
+	 */
553
+	public static function sqlDateTimeToFrench($dateTime)
554
+	{
555
+		return date('d/m/Y H:i:s', strtotime($dateTime));
556
+	}
557
+
558
+	/**
559
+	 * Convert a timestamp to a Mysql datetime form
560
+	 * @param  integer $timestamp The timestamp to use
561
+	 * @return string  The date and time in the Mysql format
562
+	 */
563
+	public static function timestampToMysqlDateTime($timestamp)
564
+	{
565
+		return date('Y-m-d H:i:s', $timestamp);
566
+	}
567
+
568
+	/**
569
+	 * This function indicates if the current Xoops version needs to add asterisks to required fields in forms
570
+	 *
571
+	 * @return boolean Yes = we need to add them, false = no
572
+	 */
573
+	public static function needsAsterisk()
574
+	{
575
+		if (self::isX23()) {
576
+			return false;
577
+		}
578
+		if (strpos(strtolower(XOOPS_VERSION), 'impresscms') !== false) {
579
+			return false;
580
+		}
581
+		if (strpos(strtolower(XOOPS_VERSION), 'legacy') === false) {
582
+			$xv = xoops_trim(str_replace('XOOPS ', '', XOOPS_VERSION));
583
+			if ((int)substr($xv, 4, 2) >= 17) {
584
+				return false;
585
+			}
586
+		}
587
+
588
+		return true;
589
+	}
590
+
591
+	/**
592
+	 * Mark the mandatory fields of a form with a star
593
+	 *
594
+	 * @param  object $sform The form to modify
595
+	 * @return object The modified form
596
+	 * @internal param string $caracter The character to use to mark fields
597
+	 */
598
+	public static function &formMarkRequiredFields(&$sform)
599
+	{
600
+		if (self::needsAsterisk()) {
601
+			$required = array();
602
+			foreach ($sform->getRequired() as $item) {
603
+				$required[] = $item->_name;
604
+			}
605
+			$elements = array();
606
+			$elements = &$sform->getElements();
607
+			$cnt      = count($elements);
608
+			for ($i = 0; $i < $cnt; ++$i) {
609
+				if (is_object($elements[$i]) && in_array($elements[$i]->_name, $required)) {
610
+					$elements[$i]->_caption .= ' *';
611
+				}
612
+			}
613
+		}
614
+
615
+		return $sform;
616
+	}
617
+
618
+	/**
619
+	 * Create an html heading (from h1 to h6)
620
+	 *
621
+	 * @param  string  $title The text to use
622
+	 * @param  integer $level Level to return
623
+	 * @return string  The heading
624
+	 */
625
+	public static function htitle($title = '', $level = 1)
626
+	{
627
+		printf('<h%01d>%s</h%01d>', $level, $title, $level);
628
+	}
629
+
630
+	/**
631
+	 * Create a unique upload filename
632
+	 *
633
+	 * @param  string  $folder   The folder where the file will be saved
634
+	 * @param  string  $fileName Original filename (coming from the user)
635
+	 * @param  boolean $trimName Do we need to create a short unique name ?
636
+	 * @return string  The unique filename to use (with its extension)
637
+	 */
638
+	public static function createUploadName($folder, $fileName, $trimName = false)
639
+	{
640
+		$workingfolder = $folder;
641
+		if (substr($workingfolder, strlen($workingfolder) - 1, 1) !== '/') {
642
+			$workingfolder .= '/';
643
+		}
644
+		$ext  = basename($fileName);
645
+		$ext  = explode('.', $ext);
646
+		$ext  = '.' . $ext[count($ext) - 1];
647
+		$true = true;
648
+		while ($true) {
649
+			$ipbits = explode('.', $_SERVER['REMOTE_ADDR']);
650
+			list($usec, $sec) = explode(' ', microtime());
651
+			$usec = (integer)($usec * 65536);
652
+			$sec  = ((integer)$sec) & 0xFFFF;
653
+
654
+			if ($trimName) {
655
+				$uid = sprintf('%06x%04x%04x', ($ipbits[0] << 24) | ($ipbits[1] << 16) | ($ipbits[2] << 8) | $ipbits[3], $sec, $usec);
656
+			} else {
657
+				$uid = sprintf('%08x-%04x-%04x', ($ipbits[0] << 24) | ($ipbits[1] << 16) | ($ipbits[2] << 8) | $ipbits[3], $sec, $usec);
658
+			}
659
+			if (!file_exists($workingfolder . $uid . $ext)) {
660
+				$true = false;
661
+			}
662
+		}
663
+
664
+		return $uid . $ext;
665
+	}
666
+
667
+	/**
668
+	 * Replace html entities with their ASCII equivalent
669
+	 *
670
+	 * @param  string $chaine The string undecode
671
+	 * @return string The undecoded string
672
+	 */
673
+	public static function unhtml($chaine)
674
+	{
675
+		$search = $replace = array();
676
+		$chaine = html_entity_decode($chaine);
677
+
678
+		for ($i = 0; $i <= 255; ++$i) {
679
+			$search[]  = '&#' . $i . ';';
680
+			$replace[] = chr($i);
681
+		}
682
+		$replace[]='...'; $search[]='…';
683
+		$replace[]="'"; $search[]='‘';
684
+		$replace[]="'"; $search[]= '’';
685
+		$replace[]='-'; $search[] = '&bull;';   // $replace[] = '•';
686
+		$replace[]='—'; $search[]='&mdash;';
687
+		$replace[]='-'; $search[]='&ndash;';
688
+		$replace[]='-'; $search[]='&shy;';
689
+		$replace[]='"'; $search[]='&quot;';
690
+		$replace[]='&'; $search[]='&amp;';
691
+		$replace[]='ˆ'; $search[]='&circ;';
692
+		$replace[]='¡'; $search[]='&iexcl;';
693
+		$replace[]='¦'; $search[]='&brvbar;';
694
+		$replace[]='¨'; $search[]='&uml;';
695
+		$replace[]='¯'; $search[]='&macr;';
696
+		$replace[]='´'; $search[]='&acute;';
697
+		$replace[]='¸'; $search[]='&cedil;';
698
+		$replace[]='¿'; $search[]='&iquest;';
699
+		$replace[]='˜'; $search[]='&tilde;';
700
+		$replace[]="'"; $search[]='&lsquo;';    // $replace[]='‘';
701
+		$replace[]="'"; $search[]='&rsquo;';    // $replace[]='’';
702
+		$replace[]='‚'; $search[]='&sbquo;';
703
+		$replace[]="'"; $search[]='&ldquo;';    // $replace[]='“';
704
+		$replace[]="'"; $search[]='&rdquo;';    // $replace[]='”';
705
+		$replace[]='„'; $search[]='&bdquo;';
706
+		$replace[]='‹'; $search[]='&lsaquo;';
707
+		$replace[]='›'; $search[]='&rsaquo;';
708
+		$replace[]='<'; $search[]='&lt;';
709
+		$replace[]='>'; $search[]='&gt;';
710
+		$replace[]='±'; $search[]='&plusmn;';
711
+		$replace[]='«'; $search[]='&laquo;';
712
+		$replace[]='»'; $search[]='&raquo;';
713
+		$replace[]='×'; $search[]='&times;';
714
+		$replace[]='÷'; $search[]='&divide;';
715
+		$replace[]='¢'; $search[]='&cent;';
716
+		$replace[]='£'; $search[]='&pound;';
717
+		$replace[]='¤'; $search[]='&curren;';
718
+		$replace[]='¥'; $search[]='&yen;';
719
+		$replace[]='§'; $search[]='&sect;';
720
+		$replace[]='©'; $search[]='&copy;';
721
+		$replace[]='¬'; $search[]='&not;';
722
+		$replace[]='®'; $search[]='&reg;';
723
+		$replace[]='°'; $search[]='&deg;';
724
+		$replace[]='µ'; $search[]='&micro;';
725
+		$replace[]='¶'; $search[]='&para;';
726
+		$replace[]='·'; $search[]='&middot;';
727
+		$replace[]='†'; $search[]='&dagger;';
728
+		$replace[]='‡'; $search[]='&Dagger;';
729
+		$replace[]='‰'; $search[]='&permil;';
730
+		$replace[]='Euro'; $search[]='&euro;';      // $replace[]='€'
731
+		$replace[]='¼'; $search[]='&frac14;';
732
+		$replace[]='½'; $search[]='&frac12;';
733
+		$replace[]='¾'; $search[]='&frac34;';
734
+		$replace[]='¹'; $search[]='&sup1;';
735
+		$replace[]='²'; $search[]='&sup2;';
736
+		$replace[]='³'; $search[]='&sup3;';
737
+		$replace[]='á'; $search[]='&aacute;';
738
+		$replace[]='Á'; $search[]='&Aacute;';
739
+		$replace[]='â'; $search[]='&acirc;';
740
+		$replace[]='Â'; $search[]='&Acirc;';
741
+		$replace[]='à'; $search[]='&agrave;';
742
+		$replace[]='À'; $search[]='&Agrave;';
743
+		$replace[]='å'; $search[]='&aring;';
744
+		$replace[]='Å'; $search[]='&Aring;';
745
+		$replace[]='ã'; $search[]='&atilde;';
746
+		$replace[]='Ã'; $search[]='&Atilde;';
747
+		$replace[]='ä'; $search[]='&auml;';
748
+		$replace[]='Ä'; $search[]='&Auml;';
749
+		$replace[]='ª'; $search[]='&ordf;';
750
+		$replace[]='æ'; $search[]='&aelig;';
751
+		$replace[]='Æ'; $search[]='&AElig;';
752
+		$replace[]='ç'; $search[]='&ccedil;';
753
+		$replace[]='Ç'; $search[]='&Ccedil;';
754
+		$replace[]='ð'; $search[]='&eth;';
755
+		$replace[]='Ð'; $search[]='&ETH;';
756
+		$replace[]='é'; $search[]='&eacute;';
757
+		$replace[]='É'; $search[]='&Eacute;';
758
+		$replace[]='ê'; $search[]='&ecirc;';
759
+		$replace[]='Ê'; $search[]='&Ecirc;';
760
+		$replace[]='è'; $search[]='&egrave;';
761
+		$replace[]='È'; $search[]='&Egrave;';
762
+		$replace[]='ë'; $search[]='&euml;';
763
+		$replace[]='Ë'; $search[]='&Euml;';
764
+		$replace[]='ƒ'; $search[]='&fnof;';
765
+		$replace[]='í'; $search[]='&iacute;';
766
+		$replace[]='Í'; $search[]='&Iacute;';
767
+		$replace[]='î'; $search[]='&icirc;';
768
+		$replace[]='Î'; $search[]='&Icirc;';
769
+		$replace[]='ì'; $search[]='&igrave;';
770
+		$replace[]='Ì'; $search[]='&Igrave;';
771
+		$replace[]='ï'; $search[]='&iuml;';
772
+		$replace[]='Ï'; $search[]='&Iuml;';
773
+		$replace[]='ñ'; $search[]='&ntilde;';
774
+		$replace[]='Ñ'; $search[]='&Ntilde;';
775
+		$replace[]='ó'; $search[]='&oacute;';
776
+		$replace[]='Ó'; $search[]='&Oacute;';
777
+		$replace[]='ô'; $search[]='&ocirc;';
778
+		$replace[]='Ô'; $search[]='&Ocirc;';
779
+		$replace[]='ò'; $search[]='&ograve;';
780
+		$replace[]='Ò'; $search[]='&Ograve;';
781
+		$replace[]='º'; $search[]='&ordm;';
782
+		$replace[]='ø'; $search[]='&oslash;';
783
+		$replace[]='Ø'; $search[]='&Oslash;';
784
+		$replace[]='õ'; $search[]='&otilde;';
785
+		$replace[]='Õ'; $search[]='&Otilde;';
786
+		$replace[]='ö'; $search[]='&ouml;';
787
+		$replace[]='Ö'; $search[]='&Ouml;';
788
+		$replace[]='œ'; $search[]='&oelig;';
789
+		$replace[]='Œ'; $search[]='&OElig;';
790
+		$replace[]='š'; $search[]='&scaron;';
791
+		$replace[]='Š'; $search[]='&Scaron;';
792
+		$replace[]='ß'; $search[]='&szlig;';
793
+		$replace[]='þ'; $search[]='&thorn;';
794
+		$replace[]='Þ'; $search[]='&THORN;';
795
+		$replace[]='ú'; $search[]='&uacute;';
796
+		$replace[]='Ú'; $search[]='&Uacute;';
797
+		$replace[]='û'; $search[]='&ucirc;';
798
+		$replace[]='Û'; $search[]='&Ucirc;';
799
+		$replace[]='ù'; $search[]='&ugrave;';
800
+		$replace[]='Ù'; $search[]='&Ugrave;';
801
+		$replace[]='ü'; $search[]='&uuml;';
802
+		$replace[]='Ü'; $search[]='&Uuml;';
803
+		$replace[]='ý'; $search[]='&yacute;';
804
+		$replace[]='Ý'; $search[]='&Yacute;';
805
+		$replace[]='ÿ'; $search[]='&yuml;';
806
+		$replace[]='Ÿ'; $search[]='&Yuml;';
807
+		$chaine    = str_replace($search, $replace, $chaine);
808
+
809
+		return $chaine;
810
+	}
811
+
812
+	/**
813
+	 * Création d'une titre pour être utilisé par l'url rewriting
814
+	 *
815
+	 * @param string  $content  Le texte à utiliser pour créer l'url
816
+	 * @param integer $urw      La limite basse pour créer les mots
817
+	 * @return string Le texte à utiliser pour l'url
818
+	 *                          Note, some parts are from Solo's code
819
+	 */
820
+	public static function makeSeoUrl($content, $urw = 1)
821
+	{
822
+		$s       = "ÀÁÂÃÄÅÒÓÔÕÖØÈÉÊËÇÌÍÎÏÙÚÛÜŸÑàáâãäåòóôõöøèéêëçìíîïùúûüÿñ '()";
823
+		$r       = 'AAAAAAOOOOOOEEEECIIIIUUUUYNaaaaaaooooooeeeeciiiiuuuuyn----';
824
+		$content = self::unhtml($content);    // First, remove html entities
825
+		$content = strtr($content, $s, $r);
826
+		$content = strip_tags($content);
827
+		$content = strtolower($content);
828
+		$content = htmlentities($content);    // TODO: Vérifier
829
+		$content = preg_replace('/&([a-zA-Z])(uml|acute|grave|circ|tilde);/', '$1', $content);
830
+		$content = html_entity_decode($content);
831
+		$content = eregi_replace('quot', ' ', $content);
832
+		$content = eregi_replace("'", ' ', $content);
833
+		$content = eregi_replace('-', ' ', $content);
834
+		$content = eregi_replace('[[:punct:]]', '', $content);
835
+		// Selon option mais attention au fichier .htaccess !
836
+		// $content = eregi_replace('[[:digit:]]','', $content);
837
+		$content = preg_replace('/[^a-z|A-Z|0-9]/', '-', $content);
838
+
839
+		$words    = explode(' ', $content);
840
+		$keywords = '';
841
+		foreach ($words as $word) {
842
+			if (strlen($word) >= $urw) {
843
+				$keywords .= '-' . trim($word);
844
+			}
845
+		}
846
+		if (!$keywords) {
847
+			$keywords = '-';
848
+		}
849
+		// Supprime les tirets en double
850
+		$keywords = str_replace('---', '-', $keywords);
851
+		$keywords = str_replace('--', '-', $keywords);
852
+		// Supprime un éventuel tiret à la fin de la chaine
853
+		if (substr($keywords, strlen($keywords) - 1, 1) == '-') {
854
+			$keywords = substr($keywords, 0, strlen($keywords) - 1);
855
+		}
856
+
857
+		return $keywords;
858
+	}
859
+
860
+	/**
861
+	 * Create the meta keywords based on the content
862
+	 *
863
+	 * @param  string $content Content from which we have to create metakeywords
864
+	 * @return string The list of meta keywords
865
+	 */
866
+	public static function createMetaKeywords($content)
867
+	{
868
+		$keywordscount = REFERENCES_METAGEN_MAX_KEYWORDS;
869
+		$keywordsorder = REFERENCES_METAGEN_KEYWORDS_ORDER;
870
+
871
+		$tmp = array();
872
+		// Search for the "Minimum keyword length"
873
+		// TODO: Remplacer references_keywords_limit par une constante
874
+		if (isset($_SESSION['references_keywords_limit'])) {
875
+			$limit = $_SESSION['references_keywords_limit'];
876
+		} else {
877
+			$config_handler                        = xoops_getHandler('config');
878
+			$xoopsConfigSearch                     =& $config_handler->getConfigsByCat(XOOPS_CONF_SEARCH);
879
+			$limit                                 = $xoopsConfigSearch['keyword_min'];
880
+			$_SESSION['references_keywords_limit'] = $limit;
881
+		}
882
+		$myts            = MyTextSanitizer::getInstance();
883
+		$content         = str_replace('<br>', ' ', $content);
884
+		$content         = $myts->undoHtmlSpecialChars($content);
885
+		$content         = strip_tags($content);
886
+		$content         = strtolower($content);
887
+		$search_pattern  = array('&nbsp;', "\t", "\r\n", "\r", "\n", ',', '.', "'", ';', ':', ')', '(', '"', '?', '!', '{', '}', '[', ']', '<', '>', '/', '+', '-', '_', '\\', '*');
888
+		$replace_pattern = array(' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '');
889
+		$content         = str_replace($search_pattern, $replace_pattern, $content);
890
+		$keywords        = explode(' ', $content);
891
+		switch ($keywordsorder) {
892
+			case 0:    // Ordre d'apparition dans le texte
893
+				$keywords = array_unique($keywords);
894
+				break;
895
+			case 1:    // Ordre de fréquence des mots
896
+				$keywords = array_count_values($keywords);
897
+				asort($keywords);
898
+				$keywords = array_keys($keywords);
899
+				break;
900
+			case 2:    // Ordre inverse de la fréquence des mots
901
+				$keywords = array_count_values($keywords);
902
+				arsort($keywords);
903
+				$keywords = array_keys($keywords);
904
+				break;
905
+		}
906
+		// Remove black listed words
907
+		if (xoops_trim(self::getModuleOption('metagen_blacklist')) != '') {
908
+			$metagen_blacklist = str_replace("\r", '', self::getModuleOption('metagen_blacklist'));
909
+			$metablack         = explode("\n", $metagen_blacklist);
910
+			array_walk($metablack, 'trim');
911
+			$keywords = array_diff($keywords, $metablack);
912
+		}
913
+
914
+		foreach ($keywords as $keyword) {
915
+			if (strlen($keyword) >= $limit && !is_numeric($keyword)) {
916
+				$tmp[] = $keyword;
917
+			}
918
+		}
919
+		$tmp = array_slice($tmp, 0, $keywordscount);
920
+		if (count($tmp) > 0) {
921
+			return implode(',', $tmp);
922
+		} else {
923
+			if (!isset($config_handler) || !is_object($config_handler)) {
924
+				$config_handler = xoops_getHandler('config');
925
+			}
926
+			$xoopsConfigMetaFooter =& $config_handler->getConfigsByCat(XOOPS_CONF_METAFOOTER);
927
+			if (isset($xoopsConfigMetaFooter['meta_keywords'])) {
928
+				return $xoopsConfigMetaFooter['meta_keywords'];
929
+			} else {
930
+				return '';
931
+			}
932
+		}
933
+	}
934
+
935
+	/**
936
+	 * Fonction chargée de gérer l'upload
937
+	 *
938
+	 * @param integer $indice L'indice du fichier à télécharger
939
+	 * @param string  $dstpath
940
+	 * @param null    $mimeTypes
941
+	 * @param null    $uploadMaxSize
942
+	 * @param null    $maxWidth
943
+	 * @param null    $maxHeight
944
+	 * @return mixed True si l'upload s'est bien déroulé sinon le message d'erreur correspondant
945
+	 */
946
+	public static function uploadFile($indice, $dstpath = XOOPS_UPLOAD_PATH, $mimeTypes = null, $uploadMaxSize = null, $maxWidth = null, $maxHeight = null)
947
+	{
948
+		require_once XOOPS_ROOT_PATH . '/class/uploader.php';
949
+		global $destname;
950
+		if (isset($_POST['xoops_upload_file'])) {
951
+			require_once XOOPS_ROOT_PATH . '/class/uploader.php';
952
+			$fldname = '';
953
+			$fldname = $_FILES[$_POST['xoops_upload_file'][$indice]];
954
+			$fldname = get_magic_quotes_gpc() ? stripslashes($fldname['name']) : $fldname['name'];
955
+			if (xoops_trim($fldname != '')) {
956
+				$destname = self::createUploadName($dstpath, $fldname, true);
957
+				if ($mimeTypes === null) {
958
+					$permittedtypes = explode("\n", str_replace("\r", '', self::getModuleOption('mimetypes')));
959
+					array_walk($permittedtypes, 'trim');
960
+				} else {
961
+					$permittedtypes = $mimeTypes;
962
+				}
963
+				if ($uploadMaxSize === null) {
964
+					$uploadSize = self::getModuleOption('maxuploadsize');
965
+				} else {
966
+					$uploadSize = $uploadMaxSize;
967
+				}
968
+				$uploader = new XoopsMediaUploader($dstpath, $permittedtypes, $uploadSize, $maxWidth, $maxHeight);
969
+				//$uploader->allowUnknownTypes = true;
970
+				$uploader->setTargetFileName($destname);
971
+				if ($uploader->fetchMedia($_POST['xoops_upload_file'][$indice])) {
972
+					if ($uploader->upload()) {
973
+						return true;
974
+					} else {
975
+						return _ERRORS . ' ' . htmlentities($uploader->getErrors());
976
+					}
977
+				} else {
978
+					return htmlentities($uploader->getErrors());
979
+				}
980
+			} else {
981
+				return false;
982
+			}
983
+		} else {
984
+			return false;
985
+		}
986
+	}
987
+
988
+	/**
989
+	 * Resize a Picture to some given dimensions (using the wideImage library)
990
+	 *
991
+	 * @param string  $src_path      Picture's source
992
+	 * @param string  $dst_path      Picture's destination
993
+	 * @param integer $param_width   Maximum picture's width
994
+	 * @param integer $param_height  Maximum picture's height
995
+	 * @param boolean $keep_original Do we have to keep the original picture ?
996
+	 * @param string  $fit           Resize mode (see the wideImage library for more information)
997
+	 * @return bool
998
+	 */
999
+	public static function resizePicture($src_path, $dst_path, $param_width, $param_height, $keep_original = false, $fit = 'inside')
1000
+	{
1001
+		//        require_once self::MODULE_PATH . 'class/wideimage/WideImage.php';
1002
+		$img    = WideImage::load($src_path);
1003
+		$result = $img->resize($param_width, $param_height, $fit);
1004
+		$result->saveToFile($dst_path, null);
1005
+		if (!$keep_original) {
1006
+			@unlink($src_path);
1007
+		}
1008
+
1009
+		return true;
1010
+	}
1011
+
1012
+	/**
1013
+	 * Déclenchement d'une alerte Xoops suite à un évènement
1014
+	 *
1015
+	 * @param string       $category La catégorie de l'évènement
1016
+	 * @param integer      $itemId   L'ID de l'élément (trop général pour être décris précisément)
1017
+	 * @param unknown_type $event    L'évènement qui est déclencé
1018
+	 * @param unknown_type $tags     Les variables à passer au template
1019
+	 */
1020
+	public static function notify($category, $itemId, $event, $tags)
1021
+	{
1022
+		$notification_handler = xoops_getHandler('notification');
1023
+		$tags['X_MODULE_URL'] = REFERENCES_URL;
1024
+		$notification_handler->triggerEvent($category, $itemId, $event, $tags);
1025
+	}
1026
+
1027
+	/**
1028
+	 * Ajoute des jours à une date et retourne la nouvelle date au format Date de Mysql
1029
+	 *
1030
+	 * @param int     $duration
1031
+	 * @param integer $startingDate Date de départ (timestamp)
1032
+	 * @return bool|string
1033
+	 * @internal param int $durations Durée en jours
1034
+	 */
1035
+	public static function addDaysToDate($duration = 1, $startingDate = 0)
1036
+	{
1037
+		if ($startingDate == 0) {
1038
+			$startingDate = time();
1039
+		}
1040
+		$endingDate = $startingDate + ($duration * 86400);
1041
+
1042
+		return date('Y-m-d', $endingDate);
1043
+	}
1044
+
1045
+	/**
1046
+	 * Retourne un breadcrumb en fonction des paramètres passés et en partant (d'office) de la racine du module
1047
+	 *
1048
+	 * @param array  $path  Le chemin complet (excepté la racine) du breadcrumb sous la forme clé=url valeur=titre
1049
+	 * @param string $raquo Le séparateur par défaut à utiliser
1050
+	 * @return string le breadcrumb
1051
+	 */
1052
+	public static function breadcrumb($path, $raquo = ' &raquo; ')
1053
+	{
1054
+		$breadcrumb        = '';
1055
+		$workingBreadcrumb = array();
1056
+		if (is_array($path)) {
1057
+			$moduleName          = self::getModuleName();
1058
+			$workingBreadcrumb[] = "<a href='" . REFERENCES_URL . "' title='" . self::makeHrefTitle($moduleName) . "'>" . $moduleName . '</a>';
1059
+			foreach ($path as $url => $title) {
1060
+				$workingBreadcrumb[] = "<a href='" . $url . "'>" . $title . '</a>';
1061
+			}
1062
+			$cnt = count($workingBreadcrumb);
1063
+			for ($i = 0; $i < $cnt; ++$i) {
1064
+				if ($i == $cnt - 1) {
1065
+					$workingBreadcrumb[$i] = strip_tags($workingBreadcrumb[$i]);
1066
+				}
1067
+			}
1068
+			$breadcrumb = implode($raquo, $workingBreadcrumb);
1069
+		}
1070
+
1071
+		return $breadcrumb;
1072
+	}
1073
+
1074
+	public static function close_tags($string)
1075
+	{
1076
+		// match opened tags
1077
+		if (preg_match_all('/<([a-z\:\-]+)[^\/]>/', $string, $start_tags)) {
1078
+			$start_tags = $start_tags[1];
1079
+
1080
+			// match closed tags
1081
+			if (preg_match_all('/<\/([a-z]+)>/', $string, $end_tags)) {
1082
+				$complete_tags = array();
1083
+				$end_tags      = $end_tags[1];
1084
+
1085
+				foreach ($start_tags as $key => $val) {
1086
+					$posb = array_search($val, $end_tags);
1087
+					if (is_int($posb)) {
1088
+						unset($end_tags[$posb]);
1089
+					} else {
1090
+						$complete_tags[] = $val;
1091
+					}
1092
+				}
1093
+			} else {
1094
+				$complete_tags = $start_tags;
1095
+			}
1096
+
1097
+			$complete_tags = array_reverse($complete_tags);
1098
+			for ($i = 0; $i < count($complete_tags); ++$i) {
1099
+				$string .= '</' . $complete_tags[$i] . '>';
1100
+			}
1101
+		}
1102
+
1103
+		return $string;
1104
+	}
1105
+
1106
+	public static function truncate_tagsafe($string, $length = 80, $etc = '...', $break_words = false)
1107
+	{
1108
+		if ($length == 0) {
1109
+			return '';
1110
+		}
1111
+
1112
+		if (strlen($string) > $length) {
1113
+			$length -= strlen($etc);
1114
+			if (!$break_words) {
1115
+				$string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, $length + 1));
1116
+				$string = preg_replace('/<[^>]*$/', '', $string);
1117
+				$string = self::close_tags($string);
1118
+			}
1119
+
1120
+			return $string . $etc;
1121
+		} else {
1122
+			return $string;
1123
+		}
1124
+	}
1125
+
1126
+	/**
1127
+	 * Create an infotip
1128
+	 * @param $text
1129
+	 * @return string
1130
+	 */
1131
+	public static function makeInfotips($text)
1132
+	{
1133
+		$ret      = '';
1134
+		$infotips = self::getModuleOption('infotips');
1135
+		if ($infotips > 0) {
1136
+			$myts = MyTextSanitizer::getInstance();
1137
+			$ret  = $myts->htmlSpecialChars(substr(strip_tags($text), 0, $infotips));
1138
+		}
1139
+
1140
+		return $ret;
1141
+	}
1142
+
1143
+	/**
1144
+	 * Retourne le type Mime d'un fichier en utilisant d'abord finfo puis mime_content
1145
+	 *
1146
+	 * @param string $filename Le fichier (avec son chemin d'accès complet) dont on veut connaître le type mime
1147
+	 * @return string
1148
+	 */
1149
+	public static function getMimeType($filename)
1150
+	{
1151
+		if (function_exists('finfo_open')) {
1152
+			$pathToMagic = REFERENCES_PATH . 'mime/magic';
1153
+			$finfo       = new finfo(FILEINFO_MIME, $pathToMagic);
1154
+			$mimetype    = $finfo->file($filename);
1155
+			finfo_close($finfo);
1156
+			unset($finfo);
1157
+
1158
+			return $mimetype;
1159
+		} else {
1160
+			if (function_exists('mime_content_type')) {
1161
+				return mime_content_type($filename);
1162
+			} else {
1163
+				return '';
1164
+			}
1165
+		}
1166
+	}
1167
+
1168
+	/**
1169
+	 * Retourne une liste d'objets XoopsUsers à partir d'une liste d'identifiants
1170
+	 *
1171
+	 * @param  array $xoopsUsersIDs La liste des ID
1172
+	 * @return array Les objets XoopsUsers
1173
+	 */
1174
+	public static function getUsersFromIds($xoopsUsersIDs)
1175
+	{
1176
+		$users = array();
1177
+		if (is_array($xoopsUsersIDs) && count($xoopsUsersIDs) > 0) {
1178
+			$xoopsUsersIDs = array_unique($xoopsUsersIDs);
1179
+			sort($xoopsUsersIDs);
1180
+			if (count($xoopsUsersIDs) > 0) {
1181
+				$member_handler = xoops_getHandler('user');
1182
+				$criteria       = new Criteria('uid', '(' . implode(',', $xoopsUsersIDs) . ')', 'IN');
1183
+				$criteria->setSort('uid');
1184
+				$users = $member_handler->getObjects($criteria, true);
1185
+			}
1186
+		}
1187
+
1188
+		return $users;
1189
+	}
1190
+
1191
+	/**
1192
+	 * Retourne l'ID de l'utilisateur courant (s'il est connecté)
1193
+	 * @return integer L'uid ou 0
1194
+	 */
1195
+	public static function getCurrentUserID()
1196
+	{
1197
+		global $xoopsUser;
1198
+		$uid = is_object($xoopsUser) ? $xoopsUser->getVar('uid') : 0;
1199
+
1200
+		return $uid;
1201
+	}
1202
+
1203
+	/**
1204
+	 * Retourne la liste des groupes de l'utilisateur courant (avec cache)
1205
+	 * @param int $uid
1206
+	 * @return array Les ID des groupes auquel l'utilisateur courant appartient
1207
+	 */
1208
+	public static function getMemberGroups($uid = 0)
1209
+	{
1210
+		static $buffer = array();
1211
+		if ($uid == 0) {
1212
+			$uid = self::getCurrentUserID();
1213
+		}
1214
+
1215
+		if (is_array($buffer) && count($buffer) > 0 && isset($buffer[$uid])) {
1216
+			return $buffer[$uid];
1217
+		} else {
1218
+			if ($uid > 0) {
1219
+				$member_handler = xoops_getHandler('member');
1220
+				$buffer[$uid]   = $member_handler->getGroupsByUser($uid, false);    // Renvoie un tableau d'ID (de groupes)
1221
+			} else {
1222
+				$buffer[$uid] = array(XOOPS_GROUP_ANONYMOUS);
1223
+			}
1224
+		}
1225
+
1226
+		return $buffer[$uid];
1227
+	}
1228
+
1229
+	/**
1230
+	 * Indique si l'utilisateur courant fait partie d'une groupe donné (avec gestion de cache)
1231
+	 *
1232
+	 * @param integer $group Groupe recherché
1233
+	 * @param int     $uid
1234
+	 * @return bool vrai si l'utilisateur fait partie du groupe, faux sinon
1235
+	 */
1236
+	public static function isMemberOfGroup($group = 0, $uid = 0)
1237
+	{
1238
+		static $buffer = array();
1239
+		$retval = false;
1240
+		if ($uid == 0) {
1241
+			$uid = self::getCurrentUserID();
1242
+		}
1243
+		if (is_array($buffer) && array_key_exists($group, $buffer)) {
1244
+			$retval = $buffer[$group];
1245
+		} else {
1246
+			$member_handler = xoops_getHandler('member');
1247
+			$groups         = $member_handler->getGroupsByUser($uid, false);    // Renvoie un tableau d'ID (de groupes)
1248
+			$retval         = in_array($group, $groups);
1249
+			$buffer[$group] = $retval;
1250
+		}
1251
+
1252
+		return $retval;
1253
+	}
1254
+
1255
+	/**
1256
+	 * Indique si un utilisateur fait partie de plusieurs groupes
1257
+	 * La fonction renvoie vrai dès qu'on trouve que le membre fait partir d'un des groupes
1258
+	 * @param array    $groups La liste des groupes à vérifier
1259
+	 * @param  integer $uid    L'ID de l'utilisateur
1260
+	 * @return boolean
1261
+	 */
1262
+	public static function isMemberOfGroups($groups, $uid = 0)
1263
+	{
1264
+		if (count($groups) == 0) {
1265
+			return false;
1266
+		}
1267
+		if ($uid == 0) {
1268
+			$uid = self::getCurrentUserID();
1269
+		}
1270
+		foreach ($groups as $groupId) {
1271
+			if (self::isMemberOfGroup($groupId, $uid)) {
1272
+				return true;
1273
+			}
1274
+		}
1275
+
1276
+		return false;
1277
+	}
1278
+
1279
+	/**
1280
+	 * Retourne le nombre total de groupes (y compris les anonymes)
1281
+	 */
1282
+	public static function getGroupsCount()
1283
+	{
1284
+		static $cache = -1;
1285
+		if ($cache == -1) {
1286
+			global $xoopsDB;
1287
+			$sql    = 'SELECT COUNT(*) FROM ' . $xoopsDB->prefix('groups');
1288
+			$result = $xoopsDB->query($sql);
1289
+			if (!$result) {
1290
+				return false;
1291
+			}
1292
+			list($cache) = $xoopsDB->fetchRow($result);
1293
+		}
1294
+
1295
+		return $cache;
1296
+	}
1297
+
1298
+	/**
1299
+	 * Fonction chargée de vérifier qu'un répertoire existe, qu'on peut écrire dedans et création d'un fichier index.html
1300
+	 *
1301
+	 * @param string $folder Le chemin complet du répertoire à vérifier
1302
+	 * @return void
1303
+	 */
1304
+	public static function prepareFolder($folder)
1305
+	{
1306
+		if (!is_dir($folder)) {
1307
+			mkdir($folder, 0777);
1308
+			file_put_contents($folder . '/index.html', '<script>history.go(-1);</script>');
1309
+		} else {
1310
+			if (!is_writable($folder)) {
1311
+				chmod($folder, 0777);
1312
+			}
1313
+		}
1314
+	}
1315
+
1316
+	/**
1317
+	 * Load a language file
1318
+	 *
1319
+	 * @param string $languageFile     The required language file
1320
+	 * @param string $defaultExtension Default extension to use
1321
+	 */
1322
+	public static function loadLanguageFile($languageFile, $defaultExtension = '.php')
1323
+	{
1324
+		global $xoopsConfig;
1325
+		$root = self::MODULE_PATH;
1326
+		if (strstr($languageFile, $defaultExtension) === false) {
1327
+			$languageFile .= $defaultExtension;
1328
+		}
1329
+		if (file_exists($root . 'language' . DIRECTORY_SEPARATOR . $xoopsConfig['language'] . DIRECTORY_SEPARATOR . $languageFile)) {
1330
+			require_once $root . 'language' . DIRECTORY_SEPARATOR . $xoopsConfig['language'] . DIRECTORY_SEPARATOR . $languageFile;
1331
+		} else {    // Fallback
1332
+			require_once $root . 'language' . DIRECTORY_SEPARATOR . 'english' . DIRECTORY_SEPARATOR . $languageFile;
1333
+		}
1334
+	}
1335
+
1336
+	/**
1337
+	 * Création d'une vignette en tenant compte des options du module concernant le mode de création des vignettes
1338
+	 *
1339
+	 * @param  string  $src_path
1340
+	 * @param  string  $dst_path
1341
+	 * @param  integer $param_width
1342
+	 * @param  integer $param_height
1343
+	 * @param  boolean $keep_original
1344
+	 * @param string   $fit Utilisé uniquement pour la méthode 0 (redimensionnement)
1345
+	 * @return boolean
1346
+	 */
1347
+	public static function createThumb($src_path, $dst_path, $param_width, $param_height, $keep_original = false, $fit = 'inside')
1348
+	{
1349
+		//        require_once self::MODULE_PATH . 'class/wideimage/WideImage.php';
1350
+		$resize = true;
1351
+		// On commence par vérifier que l'image originale n'est pas plus petite que les dimensions demandées auquel cas il n'y a rien à faire
1352
+		$pictureDimensions = getimagesize($src_path);
1353
+		if (is_array($pictureDimensions)) {
1354
+			$pictureWidth  = $pictureDimensions[0];
1355
+			$pictureHeight = $pictureDimensions[1];
1356
+			if ($pictureWidth < $param_width && $pictureHeight < $param_height) {
1357
+				$resize = false;
1358
+			}
1359
+		}
1360
+		$img = WideImage::load($src_path);
1361
+		if ($resize) { // L'image est suffisament grande pour être réduite
1362
+			$thumbMethod = 0;
1363
+			if ($thumbMethod == 0) { // Redimensionnement de l'image
1364
+				$result = $img->resize($param_width, $param_height, $fit);
1365
+			} else { // Récupération d'une partie de l'image depuis le centre
1366
+				// Calcul de left et top
1367
+				$left = $top = 0;
1368
+				if (is_array($pictureDimensions)) {
1369
+					if ($pictureWidth > $param_width) {
1370
+						$left = (int)(($pictureWidth / 2) - ($param_width / 2));
1371
+					}
1372
+					if ($pictureHeight > $param_height) {
1373
+						$top = (int)(($pictureHeight / 2) - ($param_height / 2));
1374
+					}
1375
+				}
1376
+				$result = $img->crop($left, $top, $param_width, $param_height);
1377
+			}
1378
+			$result->saveToFile($dst_path, null);
1379
+		} else {
1380
+			if ($src_path != $dst_path) {
1381
+				@copy($src_path, $dst_path);
1382
+			}
1383
+		}
1384
+		if (!$keep_original) {
1385
+			@unlink($src_path);
1386
+		}
1387
+
1388
+		return true;
1389
+	}
1390
+
1391
+	/**
1392
+	 * Create the <option> of an html select
1393
+	 *
1394
+	 * @param  array $array   Array of index and labels
1395
+	 * @param  mixed $default the default value
1396
+	 * @param bool   $withNull
1397
+	 * @return string
1398
+	 */
1399
+	private static function htmlSelectOptions($array, $default = 0, $withNull = true)
1400
+	{
1401
+		$ret      = array();
1402
+		$selected = '';
1403
+		if ($withNull) {
1404
+			if (!is_array($default)) {
1405
+				if ($default === 0) {
1406
+					$selected = " selected = 'selected'";
1407
+				}
1408
+			} else {
1409
+				if (in_array(0, $default)) {
1410
+					$selected = " selected = 'selected'";
1411
+				}
1412
+			}
1413
+			$ret[] = '<option value=0' . $selected . '>---</option>';
1414
+		}
1415
+
1416
+		foreach ($array as $index => $label) {
1417
+			$selected = '';
1418
+			if (!is_array($default)) {
1419
+				if ($index == $default) {
1420
+					$selected = " selected = 'selected'";
1421
+				}
1422
+			} else {
1423
+				if (in_array($index, $default)) {
1424
+					$selected = " selected = 'selected'";
1425
+				}
1426
+			}
1427
+			$ret[] = "<option value=\"" . $index . "\"" . $selected . '>' . $label . '</option>';
1428
+		}
1429
+
1430
+		return implode("\n", $ret);
1431
+	}
1432
+
1433
+	/**
1434
+	 * Creates an html select an returns its code
1435
+	 *
1436
+	 * @param  string  $selectName Select's name
1437
+	 * @param  array   $array      Key = value of each option, value = label of each option
1438
+	 * @param  mixed   $default    Default's value
1439
+	 * @param  boolean $withNull   Do we want a null option
1440
+	 * @param  string  $style      Is there a style to apply ?
1441
+	 * @param  boolean $multiple   Can we select multiple elements ?
1442
+	 * @param  integer $size       Size of the selectbox, only used with multiple selectboxes
1443
+	 * @param string   $extra
1444
+	 * @return string
1445
+	 */
1446
+	public static function htmlSelect($selectName, $array, $default, $withNull = true, $style = '', $multiple = false, $size = 1, $extra = '')
1447
+	{
1448
+		$ret = '';
1449
+		$ret .= "<select name='" . $selectName . "' id='" . $selectName . "'";
1450
+		if (xoops_trim($style) != '') {
1451
+			$ret .= " style='" . $style . "' ";
1452
+		}
1453
+		if (xoops_trim($multiple) != '') {
1454
+			$ret .= " multiple = 'multiple' size='" . $size . "' ";
1455
+		}
1456
+		$ret .= $extra . ">\n";
1457
+		$ret .= self::htmlSelectOptions($array, $default, $withNull);
1458
+		$ret .= "</select>\n";
1459
+
1460
+		return $ret;
1461
+	}
1462
+
1463
+	/**
1464
+	 * Verify that a mysql table exists
1465
+	 * @param $tablename
1466
+	 * @return bool
1467
+	 */
1468
+	public static function tableExists($tablename)
1469
+	{
1470
+		global $xoopsDB;
1471
+		$result = $xoopsDB->queryF("SHOW TABLES LIKE '$tablename'");
1472
+
1473
+		return ($xoopsDB->getRowsNum($result) > 0);
1474
+	}
1475
+
1476
+	/**
1477
+	 * Verify that a field exists inside a mysql table
1478
+	 * @param $fieldname
1479
+	 * @param $table
1480
+	 * @return bool
1481
+	 */
1482
+	public static function fieldExists($fieldname, $table)
1483
+	{
1484
+		global $xoopsDB;
1485
+		$result = $xoopsDB->queryF("SHOW COLUMNS FROM $table LIKE '$fieldname'");
1486
+
1487
+		return ($xoopsDB->getRowsNum($result) > 0);
1488
+	}
1489
+
1490
+	/**
1491
+	 * Retourne la définition d'un champ
1492
+	 *
1493
+	 * @param  string $fieldname
1494
+	 * @param  string $table
1495
+	 * @return array
1496
+	 */
1497
+	public static function getFieldDefinition($fieldname, $table)
1498
+	{
1499
+		global $xoopsDB;
1500
+		$result = $xoopsDB->queryF("SHOW COLUMNS FROM $table LIKE '$fieldname'");
1501
+		if ($result) {
1502
+			return $xoopsDB->fetchArray($result);
1503
+		}
1504
+
1505
+		return '';
1506
+	}
1507
+
1508
+	/**
1509
+	 * Add a field to a mysql table
1510
+	 * @param $field
1511
+	 * @param $table
1512
+	 * @return resource
1513
+	 */
1514
+	public static function addField($field, $table)
1515
+	{
1516
+		global $xoopsDB;
1517
+		$result = $xoopsDB->queryF("ALTER TABLE $table ADD $field;");
1518
+
1519
+		return $result;
1520
+	}
1521
+
1522
+	/**
1523
+	 * Maintenance des tables du module et de son cache de requêtes
1524
+	 *
1525
+	 * @return void
1526
+	 */
1527
+	public static function maintainTablesCache()
1528
+	{
1529
+		global $xoopsDB;
1530
+		define('REFERENCES_MAINTAIN', true);
1531
+		require self::MODULE_PATH . 'xoops_version.php';
1532
+		$tables = array();
1533
+		foreach ($modversion['tables'] as $table) {
1534
+			$tables[] = $xoopsDB->prefix($table);
1535
+		}
1536
+		if (count($tables) > 0) {
1537
+			$list = implode(',', $tables);
1538
+			$xoopsDB->queryF('CHECK TABLE ' . $list);
1539
+			$xoopsDB->queryF('ANALYZE TABLE ' . $list);
1540
+			$xoopsDB->queryF('OPTIMIZE TABLE ' . $list);
1541
+		}
1542
+		self::updateCache();
1543
+		$handlers = references_handler::getInstance();
1544
+		$handlers->h_references_articles->forceCacheClean();
1545
+	}
1546
+
1547
+	/**
1548
+	 * Indique si le module Tag existe et est activé
1549
+	 *
1550
+	 * @return boolean
1551
+	 * @credit: smartfactory
1552
+	 */
1553
+	public static function tagModuleExists()
1554
+	{
1555
+		static $moduleExistsAndIsActive;
1556
+		if (!isset($moduleExistsAndIsActive)) {
1557
+			$modules_handler = xoops_getHandler('module');
1558
+			$tagModule       = $modules_handler->getByDirName('tag');
1559
+			if (!$tagModule) {
1560
+				$moduleExistsAndIsActive = false;
1561
+			} else {
1562
+				$moduleExistsAndIsActive = $tagModule->getVar('isactive') == 1;
1563
+			}
1564
+		}
1565
+
1566
+		return $moduleExistsAndIsActive;
1567
+	}
1568 1568
 }
Please login to merge, or discard this patch.
Spacing   +199 added lines, -199 removed lines patch added patch discarded remove patch
@@ -107,7 +107,7 @@  discard block
 block discarded – undo
107 107
     {
108 108
         $x23 = false;
109 109
         $xv  = str_replace('XOOPS ', '', XOOPS_VERSION);
110
-        if ((int)substr($xv, 2, 1) >= 3) {
110
+        if ((int) substr($xv, 2, 1) >= 3) {
111 111
             $x23 = true;
112 112
         }
113 113
 
@@ -147,15 +147,15 @@  discard block
 block discarded – undo
147 147
         // Only for Xoops 2.0.x
148 148
         switch ($editor_option) {
149 149
             case 'fckeditor':
150
-                if (is_readable(XOOPS_ROOT_PATH . '/class/fckeditor/formfckeditor.php')) {
151
-                    require_once(XOOPS_ROOT_PATH . '/class/fckeditor/formfckeditor.php');
150
+                if (is_readable(XOOPS_ROOT_PATH.'/class/fckeditor/formfckeditor.php')) {
151
+                    require_once(XOOPS_ROOT_PATH.'/class/fckeditor/formfckeditor.php');
152 152
                     $editor = new XoopsFormFckeditor($caption, $name, $value);
153 153
                 }
154 154
                 break;
155 155
 
156 156
             case 'htmlarea':
157
-                if (is_readable(XOOPS_ROOT_PATH . '/class/htmlarea/formhtmlarea.php')) {
158
-                    require_once(XOOPS_ROOT_PATH . '/class/htmlarea/formhtmlarea.php');
157
+                if (is_readable(XOOPS_ROOT_PATH.'/class/htmlarea/formhtmlarea.php')) {
158
+                    require_once(XOOPS_ROOT_PATH.'/class/htmlarea/formhtmlarea.php');
159 159
                     $editor = new XoopsFormHtmlarea($caption, $name, $value);
160 160
                 }
161 161
                 break;
@@ -170,15 +170,15 @@  discard block
 block discarded – undo
170 170
 
171 171
             case 'tinyeditor':
172 172
             case 'tinymce':
173
-                if (is_readable(XOOPS_ROOT_PATH . '/class/xoopseditor/tinyeditor/formtinyeditortextarea.php')) {
174
-                    require_once XOOPS_ROOT_PATH . '/class/xoopseditor/tinyeditor/formtinyeditortextarea.php';
173
+                if (is_readable(XOOPS_ROOT_PATH.'/class/xoopseditor/tinyeditor/formtinyeditortextarea.php')) {
174
+                    require_once XOOPS_ROOT_PATH.'/class/xoopseditor/tinyeditor/formtinyeditortextarea.php';
175 175
                     $editor = new XoopsFormTinyeditorTextArea(array('caption' => $caption, 'name' => $name, 'value' => $value, 'width' => '100%', 'height' => '400px'));
176 176
                 }
177 177
                 break;
178 178
 
179 179
             case 'koivi':
180
-                if (is_readable(XOOPS_ROOT_PATH . '/class/wysiwyg/formwysiwygtextarea.php')) {
181
-                    require_once(XOOPS_ROOT_PATH . '/class/wysiwyg/formwysiwygtextarea.php');
180
+                if (is_readable(XOOPS_ROOT_PATH.'/class/wysiwyg/formwysiwygtextarea.php')) {
181
+                    require_once(XOOPS_ROOT_PATH.'/class/wysiwyg/formwysiwygtextarea.php');
182 182
                     $editor = new XoopsFormWysiwygTextArea($caption, $name, $value, $width, $height, '');
183 183
                 }
184 184
                 break;
@@ -200,9 +200,9 @@  discard block
 block discarded – undo
200 200
     public static function javascriptLinkConfirm($message, $form = false)
201 201
     {
202 202
         if (!$form) {
203
-            return "onclick=\"javascript:return confirm('" . str_replace("'", ' ', $message) . "')\"";
203
+            return "onclick=\"javascript:return confirm('".str_replace("'", ' ', $message)."')\"";
204 204
         } else {
205
-            return "onSubmit=\"javascript:return confirm('" . str_replace("'", ' ', $message) . "')\"";
205
+            return "onSubmit=\"javascript:return confirm('".str_replace("'", ' ', $message)."')\"";
206 206
         }
207 207
     }
208 208
 
@@ -282,7 +282,7 @@  discard block
 block discarded – undo
282 282
     public static function sendEmailFromTpl($tplName, $recipients, $subject, $variables)
283 283
     {
284 284
         global $xoopsConfig;
285
-        require_once XOOPS_ROOT_PATH . '/class/xoopsmailer.php';
285
+        require_once XOOPS_ROOT_PATH.'/class/xoopsmailer.php';
286 286
         if (!is_array($recipients)) {
287 287
             if (trim($recipients) == '') {
288 288
                 return false;
@@ -293,13 +293,13 @@  discard block
 block discarded – undo
293 293
             }
294 294
         }
295 295
         if (function_exists('xoops_getMailer')) {
296
-            $xoopsMailer =& xoops_getMailer();
296
+            $xoopsMailer = & xoops_getMailer();
297 297
         } else {
298
-            $xoopsMailer =& getMailer();
298
+            $xoopsMailer = & getMailer();
299 299
         }
300 300
 
301 301
         $xoopsMailer->useMail();
302
-        $xoopsMailer->setTemplateDir(XOOPS_ROOT_PATH . '/modules/' . self::MODULE_NAME . '/language/' . $xoopsConfig['language'] . '/mail_template');
302
+        $xoopsMailer->setTemplateDir(XOOPS_ROOT_PATH.'/modules/'.self::MODULE_NAME.'/language/'.$xoopsConfig['language'].'/mail_template');
303 303
         $xoopsMailer->setTemplate($tplName);
304 304
         $xoopsMailer->setToEmails($recipients);
305 305
         // TODO: Change !
@@ -311,7 +311,7 @@  discard block
 block discarded – undo
311 311
         }
312 312
         $res = $xoopsMailer->send();
313 313
         unset($xoopsMailer);
314
-        $filename = XOOPS_UPLOAD_PATH . '/logmail_' . self::MODULE_NAME . '.php';
314
+        $filename = XOOPS_UPLOAD_PATH.'/logmail_'.self::MODULE_NAME.'.php';
315 315
         if (!file_exists($filename)) {
316 316
             $fp = @fopen($filename, 'a');
317 317
             if ($fp) {
@@ -322,16 +322,16 @@  discard block
 block discarded – undo
322 322
         $fp = @fopen($filename, 'a');
323 323
 
324 324
         if ($fp) {
325
-            fwrite($fp, str_repeat('-', 120) . "\n");
326
-            fwrite($fp, date('d/m/Y H:i:s') . "\n");
327
-            fwrite($fp, 'Template name : ' . $tplName . "\n");
328
-            fwrite($fp, 'Email subject : ' . $subject . "\n");
325
+            fwrite($fp, str_repeat('-', 120)."\n");
326
+            fwrite($fp, date('d/m/Y H:i:s')."\n");
327
+            fwrite($fp, 'Template name : '.$tplName."\n");
328
+            fwrite($fp, 'Email subject : '.$subject."\n");
329 329
             if (is_array($recipients)) {
330
-                fwrite($fp, 'Recipient(s) : ' . implode(',', $recipients) . "\n");
330
+                fwrite($fp, 'Recipient(s) : '.implode(',', $recipients)."\n");
331 331
             } else {
332
-                fwrite($fp, 'Recipient(s) : ' . $recipients . "\n");
332
+                fwrite($fp, 'Recipient(s) : '.$recipients."\n");
333 333
             }
334
-            fwrite($fp, 'Transmited variables : ' . implode(',', $variables) . "\n");
334
+            fwrite($fp, 'Transmited variables : '.implode(',', $variables)."\n");
335 335
             fclose($fp);
336 336
         }
337 337
 
@@ -346,17 +346,17 @@  discard block
 block discarded – undo
346 346
         global $xoopsModule;
347 347
         $folder  = $xoopsModule->getVar('dirname');
348 348
         $tpllist = array();
349
-        require_once XOOPS_ROOT_PATH . '/class/xoopsblock.php';
350
-        require_once XOOPS_ROOT_PATH . '/class/template.php';
349
+        require_once XOOPS_ROOT_PATH.'/class/xoopsblock.php';
350
+        require_once XOOPS_ROOT_PATH.'/class/template.php';
351 351
         $tplfile_handler = xoops_getHandler('tplfile');
352 352
         $tpllist         = $tplfile_handler->find(null, null, null, $folder);
353
-        xoops_template_clear_module_cache($xoopsModule->getVar('mid'));            // Clear module's blocks cache
353
+        xoops_template_clear_module_cache($xoopsModule->getVar('mid')); // Clear module's blocks cache
354 354
 
355 355
         foreach ($tpllist as $onetemplate) {    // Remove cache for each page.
356 356
             if ($onetemplate->getVar('tpl_type') === 'module') {
357 357
                 //  Note, I've been testing all the other methods (like the one of Smarty) and none of them run, that's why I have used this code
358 358
                 $files_del = array();
359
-                $files_del = glob(XOOPS_CACHE_PATH . '/*' . $onetemplate->getVar('tpl_file') . '*');
359
+                $files_del = glob(XOOPS_CACHE_PATH.'/*'.$onetemplate->getVar('tpl_file').'*');
360 360
                 if (count($files_del) > 0 && is_array($files_del)) {
361 361
                     foreach ($files_del as $one_file) {
362 362
                         if (is_file($one_file)) {
@@ -392,7 +392,7 @@  discard block
 block discarded – undo
392 392
         if (!isset($mymodule)) {
393 393
             global $xoopsModule;
394 394
             if (isset($xoopsModule) && is_object($xoopsModule) && $xoopsModule->getVar('dirname') == REFERENCES_DIRNAME) {
395
-                $mymodule =& $xoopsModule;
395
+                $mymodule = & $xoopsModule;
396 396
             } else {
397 397
                 $hModule  = xoops_getHandler('module');
398 398
                 $mymodule = $hModule->getByDirname(REFERENCES_DIRNAME);
@@ -510,12 +510,12 @@  discard block
 block discarded – undo
510 510
      */
511 511
     public static function getCurrentSQLDate()
512 512
     {
513
-        return date('Y-m-d');    // 2007-05-02
513
+        return date('Y-m-d'); // 2007-05-02
514 514
     }
515 515
 
516 516
     public static function getCurrentSQLDateTime()
517 517
     {
518
-        return date('Y-m-d H:i:s');    // 2007-05-02
518
+        return date('Y-m-d H:i:s'); // 2007-05-02
519 519
     }
520 520
 
521 521
     /**
@@ -542,7 +542,7 @@  discard block
 block discarded – undo
542 542
      */
543 543
     public static function timestampToMysqlDate($timestamp)
544 544
     {
545
-        return date('Y-m-d', (int)$timestamp);
545
+        return date('Y-m-d', (int) $timestamp);
546 546
     }
547 547
 
548 548
     /**
@@ -580,7 +580,7 @@  discard block
 block discarded – undo
580 580
         }
581 581
         if (strpos(strtolower(XOOPS_VERSION), 'legacy') === false) {
582 582
             $xv = xoops_trim(str_replace('XOOPS ', '', XOOPS_VERSION));
583
-            if ((int)substr($xv, 4, 2) >= 17) {
583
+            if ((int) substr($xv, 4, 2) >= 17) {
584 584
                 return false;
585 585
             }
586 586
         }
@@ -643,25 +643,25 @@  discard block
 block discarded – undo
643 643
         }
644 644
         $ext  = basename($fileName);
645 645
         $ext  = explode('.', $ext);
646
-        $ext  = '.' . $ext[count($ext) - 1];
646
+        $ext  = '.'.$ext[count($ext) - 1];
647 647
         $true = true;
648 648
         while ($true) {
649 649
             $ipbits = explode('.', $_SERVER['REMOTE_ADDR']);
650 650
             list($usec, $sec) = explode(' ', microtime());
651
-            $usec = (integer)($usec * 65536);
652
-            $sec  = ((integer)$sec) & 0xFFFF;
651
+            $usec = (integer) ($usec * 65536);
652
+            $sec  = ((integer) $sec)&0xFFFF;
653 653
 
654 654
             if ($trimName) {
655
-                $uid = sprintf('%06x%04x%04x', ($ipbits[0] << 24) | ($ipbits[1] << 16) | ($ipbits[2] << 8) | $ipbits[3], $sec, $usec);
655
+                $uid = sprintf('%06x%04x%04x', ($ipbits[0] << 24)|($ipbits[1] << 16)|($ipbits[2] << 8)|$ipbits[3], $sec, $usec);
656 656
             } else {
657
-                $uid = sprintf('%08x-%04x-%04x', ($ipbits[0] << 24) | ($ipbits[1] << 16) | ($ipbits[2] << 8) | $ipbits[3], $sec, $usec);
657
+                $uid = sprintf('%08x-%04x-%04x', ($ipbits[0] << 24)|($ipbits[1] << 16)|($ipbits[2] << 8)|$ipbits[3], $sec, $usec);
658 658
             }
659
-            if (!file_exists($workingfolder . $uid . $ext)) {
659
+            if (!file_exists($workingfolder.$uid.$ext)) {
660 660
                 $true = false;
661 661
             }
662 662
         }
663 663
 
664
-        return $uid . $ext;
664
+        return $uid.$ext;
665 665
     }
666 666
 
667 667
     /**
@@ -676,135 +676,135 @@  discard block
 block discarded – undo
676 676
         $chaine = html_entity_decode($chaine);
677 677
 
678 678
         for ($i = 0; $i <= 255; ++$i) {
679
-            $search[]  = '&#' . $i . ';';
679
+            $search[]  = '&#'.$i.';';
680 680
             $replace[] = chr($i);
681 681
         }
682
-        $replace[]='...'; $search[]='…';
683
-        $replace[]="'"; $search[]='‘';
684
-        $replace[]="'"; $search[]= '’';
685
-        $replace[]='-'; $search[] = '&bull;';   // $replace[] = '•';
686
-        $replace[]='—'; $search[]='&mdash;';
687
-        $replace[]='-'; $search[]='&ndash;';
688
-        $replace[]='-'; $search[]='&shy;';
689
-        $replace[]='"'; $search[]='&quot;';
690
-        $replace[]='&'; $search[]='&amp;';
691
-        $replace[]='ˆ'; $search[]='&circ;';
692
-        $replace[]='¡'; $search[]='&iexcl;';
693
-        $replace[]='¦'; $search[]='&brvbar;';
694
-        $replace[]='¨'; $search[]='&uml;';
695
-        $replace[]='¯'; $search[]='&macr;';
696
-        $replace[]='´'; $search[]='&acute;';
697
-        $replace[]='¸'; $search[]='&cedil;';
698
-        $replace[]='¿'; $search[]='&iquest;';
699
-        $replace[]='˜'; $search[]='&tilde;';
700
-        $replace[]="'"; $search[]='&lsquo;';    // $replace[]='‘';
701
-        $replace[]="'"; $search[]='&rsquo;';    // $replace[]='’';
702
-        $replace[]='‚'; $search[]='&sbquo;';
703
-        $replace[]="'"; $search[]='&ldquo;';    // $replace[]='“';
704
-        $replace[]="'"; $search[]='&rdquo;';    // $replace[]='”';
705
-        $replace[]='„'; $search[]='&bdquo;';
706
-        $replace[]='‹'; $search[]='&lsaquo;';
707
-        $replace[]='›'; $search[]='&rsaquo;';
708
-        $replace[]='<'; $search[]='&lt;';
709
-        $replace[]='>'; $search[]='&gt;';
710
-        $replace[]='±'; $search[]='&plusmn;';
711
-        $replace[]='«'; $search[]='&laquo;';
712
-        $replace[]='»'; $search[]='&raquo;';
713
-        $replace[]='×'; $search[]='&times;';
714
-        $replace[]='÷'; $search[]='&divide;';
715
-        $replace[]='¢'; $search[]='&cent;';
716
-        $replace[]='£'; $search[]='&pound;';
717
-        $replace[]='¤'; $search[]='&curren;';
718
-        $replace[]='¥'; $search[]='&yen;';
719
-        $replace[]='§'; $search[]='&sect;';
720
-        $replace[]='©'; $search[]='&copy;';
721
-        $replace[]='¬'; $search[]='&not;';
722
-        $replace[]='®'; $search[]='&reg;';
723
-        $replace[]='°'; $search[]='&deg;';
724
-        $replace[]='µ'; $search[]='&micro;';
725
-        $replace[]='¶'; $search[]='&para;';
726
-        $replace[]='·'; $search[]='&middot;';
727
-        $replace[]='†'; $search[]='&dagger;';
728
-        $replace[]='‡'; $search[]='&Dagger;';
729
-        $replace[]='‰'; $search[]='&permil;';
730
-        $replace[]='Euro'; $search[]='&euro;';      // $replace[]='€'
731
-        $replace[]='¼'; $search[]='&frac14;';
732
-        $replace[]='½'; $search[]='&frac12;';
733
-        $replace[]='¾'; $search[]='&frac34;';
734
-        $replace[]='¹'; $search[]='&sup1;';
735
-        $replace[]='²'; $search[]='&sup2;';
736
-        $replace[]='³'; $search[]='&sup3;';
737
-        $replace[]='á'; $search[]='&aacute;';
738
-        $replace[]='Á'; $search[]='&Aacute;';
739
-        $replace[]='â'; $search[]='&acirc;';
740
-        $replace[]='Â'; $search[]='&Acirc;';
741
-        $replace[]='à'; $search[]='&agrave;';
742
-        $replace[]='À'; $search[]='&Agrave;';
743
-        $replace[]='å'; $search[]='&aring;';
744
-        $replace[]='Å'; $search[]='&Aring;';
745
-        $replace[]='ã'; $search[]='&atilde;';
746
-        $replace[]='Ã'; $search[]='&Atilde;';
747
-        $replace[]='ä'; $search[]='&auml;';
748
-        $replace[]='Ä'; $search[]='&Auml;';
749
-        $replace[]='ª'; $search[]='&ordf;';
750
-        $replace[]='æ'; $search[]='&aelig;';
751
-        $replace[]='Æ'; $search[]='&AElig;';
752
-        $replace[]='ç'; $search[]='&ccedil;';
753
-        $replace[]='Ç'; $search[]='&Ccedil;';
754
-        $replace[]='ð'; $search[]='&eth;';
755
-        $replace[]='Ð'; $search[]='&ETH;';
756
-        $replace[]='é'; $search[]='&eacute;';
757
-        $replace[]='É'; $search[]='&Eacute;';
758
-        $replace[]='ê'; $search[]='&ecirc;';
759
-        $replace[]='Ê'; $search[]='&Ecirc;';
760
-        $replace[]='è'; $search[]='&egrave;';
761
-        $replace[]='È'; $search[]='&Egrave;';
762
-        $replace[]='ë'; $search[]='&euml;';
763
-        $replace[]='Ë'; $search[]='&Euml;';
764
-        $replace[]='ƒ'; $search[]='&fnof;';
765
-        $replace[]='í'; $search[]='&iacute;';
766
-        $replace[]='Í'; $search[]='&Iacute;';
767
-        $replace[]='î'; $search[]='&icirc;';
768
-        $replace[]='Î'; $search[]='&Icirc;';
769
-        $replace[]='ì'; $search[]='&igrave;';
770
-        $replace[]='Ì'; $search[]='&Igrave;';
771
-        $replace[]='ï'; $search[]='&iuml;';
772
-        $replace[]='Ï'; $search[]='&Iuml;';
773
-        $replace[]='ñ'; $search[]='&ntilde;';
774
-        $replace[]='Ñ'; $search[]='&Ntilde;';
775
-        $replace[]='ó'; $search[]='&oacute;';
776
-        $replace[]='Ó'; $search[]='&Oacute;';
777
-        $replace[]='ô'; $search[]='&ocirc;';
778
-        $replace[]='Ô'; $search[]='&Ocirc;';
779
-        $replace[]='ò'; $search[]='&ograve;';
780
-        $replace[]='Ò'; $search[]='&Ograve;';
781
-        $replace[]='º'; $search[]='&ordm;';
782
-        $replace[]='ø'; $search[]='&oslash;';
783
-        $replace[]='Ø'; $search[]='&Oslash;';
784
-        $replace[]='õ'; $search[]='&otilde;';
785
-        $replace[]='Õ'; $search[]='&Otilde;';
786
-        $replace[]='ö'; $search[]='&ouml;';
787
-        $replace[]='Ö'; $search[]='&Ouml;';
788
-        $replace[]='œ'; $search[]='&oelig;';
789
-        $replace[]='Œ'; $search[]='&OElig;';
790
-        $replace[]='š'; $search[]='&scaron;';
791
-        $replace[]='Š'; $search[]='&Scaron;';
792
-        $replace[]='ß'; $search[]='&szlig;';
793
-        $replace[]='þ'; $search[]='&thorn;';
794
-        $replace[]='Þ'; $search[]='&THORN;';
795
-        $replace[]='ú'; $search[]='&uacute;';
796
-        $replace[]='Ú'; $search[]='&Uacute;';
797
-        $replace[]='û'; $search[]='&ucirc;';
798
-        $replace[]='Û'; $search[]='&Ucirc;';
799
-        $replace[]='ù'; $search[]='&ugrave;';
800
-        $replace[]='Ù'; $search[]='&Ugrave;';
801
-        $replace[]='ü'; $search[]='&uuml;';
802
-        $replace[]='Ü'; $search[]='&Uuml;';
803
-        $replace[]='ý'; $search[]='&yacute;';
804
-        $replace[]='Ý'; $search[]='&Yacute;';
805
-        $replace[]='ÿ'; $search[]='&yuml;';
806
-        $replace[]='Ÿ'; $search[]='&Yuml;';
807
-        $chaine    = str_replace($search, $replace, $chaine);
682
+        $replace[] = '...'; $search[] = '…';
683
+        $replace[] = "'"; $search[] = '‘';
684
+        $replace[] = "'"; $search[] = '’';
685
+        $replace[] = '-'; $search[] = '&bull;'; // $replace[] = '•';
686
+        $replace[] = '—'; $search[] = '&mdash;';
687
+        $replace[] = '-'; $search[] = '&ndash;';
688
+        $replace[] = '-'; $search[] = '&shy;';
689
+        $replace[] = '"'; $search[] = '&quot;';
690
+        $replace[] = '&'; $search[] = '&amp;';
691
+        $replace[] = 'ˆ'; $search[] = '&circ;';
692
+        $replace[] = '¡'; $search[] = '&iexcl;';
693
+        $replace[] = '¦'; $search[] = '&brvbar;';
694
+        $replace[] = '¨'; $search[] = '&uml;';
695
+        $replace[] = '¯'; $search[] = '&macr;';
696
+        $replace[] = '´'; $search[] = '&acute;';
697
+        $replace[] = '¸'; $search[] = '&cedil;';
698
+        $replace[] = '¿'; $search[] = '&iquest;';
699
+        $replace[] = '˜'; $search[] = '&tilde;';
700
+        $replace[] = "'"; $search[] = '&lsquo;'; // $replace[]='‘';
701
+        $replace[] = "'"; $search[] = '&rsquo;'; // $replace[]='’';
702
+        $replace[] = '‚'; $search[] = '&sbquo;';
703
+        $replace[] = "'"; $search[] = '&ldquo;'; // $replace[]='“';
704
+        $replace[] = "'"; $search[] = '&rdquo;'; // $replace[]='”';
705
+        $replace[] = '„'; $search[] = '&bdquo;';
706
+        $replace[] = '‹'; $search[] = '&lsaquo;';
707
+        $replace[] = '›'; $search[] = '&rsaquo;';
708
+        $replace[] = '<'; $search[] = '&lt;';
709
+        $replace[] = '>'; $search[] = '&gt;';
710
+        $replace[] = '±'; $search[] = '&plusmn;';
711
+        $replace[] = '«'; $search[] = '&laquo;';
712
+        $replace[] = '»'; $search[] = '&raquo;';
713
+        $replace[] = '×'; $search[] = '&times;';
714
+        $replace[] = '÷'; $search[] = '&divide;';
715
+        $replace[] = '¢'; $search[] = '&cent;';
716
+        $replace[] = '£'; $search[] = '&pound;';
717
+        $replace[] = '¤'; $search[] = '&curren;';
718
+        $replace[] = '¥'; $search[] = '&yen;';
719
+        $replace[] = '§'; $search[] = '&sect;';
720
+        $replace[] = '©'; $search[] = '&copy;';
721
+        $replace[] = '¬'; $search[] = '&not;';
722
+        $replace[] = '®'; $search[] = '&reg;';
723
+        $replace[] = '°'; $search[] = '&deg;';
724
+        $replace[] = 'µ'; $search[] = '&micro;';
725
+        $replace[] = '¶'; $search[] = '&para;';
726
+        $replace[] = '·'; $search[] = '&middot;';
727
+        $replace[] = '†'; $search[] = '&dagger;';
728
+        $replace[] = '‡'; $search[] = '&Dagger;';
729
+        $replace[] = '‰'; $search[] = '&permil;';
730
+        $replace[] = 'Euro'; $search[] = '&euro;'; // $replace[]='€'
731
+        $replace[] = '¼'; $search[] = '&frac14;';
732
+        $replace[] = '½'; $search[] = '&frac12;';
733
+        $replace[] = '¾'; $search[] = '&frac34;';
734
+        $replace[] = '¹'; $search[] = '&sup1;';
735
+        $replace[] = '²'; $search[] = '&sup2;';
736
+        $replace[] = '³'; $search[] = '&sup3;';
737
+        $replace[] = 'á'; $search[] = '&aacute;';
738
+        $replace[] = 'Á'; $search[] = '&Aacute;';
739
+        $replace[] = 'â'; $search[] = '&acirc;';
740
+        $replace[] = 'Â'; $search[] = '&Acirc;';
741
+        $replace[] = 'à'; $search[] = '&agrave;';
742
+        $replace[] = 'À'; $search[] = '&Agrave;';
743
+        $replace[] = 'å'; $search[] = '&aring;';
744
+        $replace[] = 'Å'; $search[] = '&Aring;';
745
+        $replace[] = 'ã'; $search[] = '&atilde;';
746
+        $replace[] = 'Ã'; $search[] = '&Atilde;';
747
+        $replace[] = 'ä'; $search[] = '&auml;';
748
+        $replace[] = 'Ä'; $search[] = '&Auml;';
749
+        $replace[] = 'ª'; $search[] = '&ordf;';
750
+        $replace[] = 'æ'; $search[] = '&aelig;';
751
+        $replace[] = 'Æ'; $search[] = '&AElig;';
752
+        $replace[] = 'ç'; $search[] = '&ccedil;';
753
+        $replace[] = 'Ç'; $search[] = '&Ccedil;';
754
+        $replace[] = 'ð'; $search[] = '&eth;';
755
+        $replace[] = 'Ð'; $search[] = '&ETH;';
756
+        $replace[] = 'é'; $search[] = '&eacute;';
757
+        $replace[] = 'É'; $search[] = '&Eacute;';
758
+        $replace[] = 'ê'; $search[] = '&ecirc;';
759
+        $replace[] = 'Ê'; $search[] = '&Ecirc;';
760
+        $replace[] = 'è'; $search[] = '&egrave;';
761
+        $replace[] = 'È'; $search[] = '&Egrave;';
762
+        $replace[] = 'ë'; $search[] = '&euml;';
763
+        $replace[] = 'Ë'; $search[] = '&Euml;';
764
+        $replace[] = 'ƒ'; $search[] = '&fnof;';
765
+        $replace[] = 'í'; $search[] = '&iacute;';
766
+        $replace[] = 'Í'; $search[] = '&Iacute;';
767
+        $replace[] = 'î'; $search[] = '&icirc;';
768
+        $replace[] = 'Î'; $search[] = '&Icirc;';
769
+        $replace[] = 'ì'; $search[] = '&igrave;';
770
+        $replace[] = 'Ì'; $search[] = '&Igrave;';
771
+        $replace[] = 'ï'; $search[] = '&iuml;';
772
+        $replace[] = 'Ï'; $search[] = '&Iuml;';
773
+        $replace[] = 'ñ'; $search[] = '&ntilde;';
774
+        $replace[] = 'Ñ'; $search[] = '&Ntilde;';
775
+        $replace[] = 'ó'; $search[] = '&oacute;';
776
+        $replace[] = 'Ó'; $search[] = '&Oacute;';
777
+        $replace[] = 'ô'; $search[] = '&ocirc;';
778
+        $replace[] = 'Ô'; $search[] = '&Ocirc;';
779
+        $replace[] = 'ò'; $search[] = '&ograve;';
780
+        $replace[] = 'Ò'; $search[] = '&Ograve;';
781
+        $replace[] = 'º'; $search[] = '&ordm;';
782
+        $replace[] = 'ø'; $search[] = '&oslash;';
783
+        $replace[] = 'Ø'; $search[] = '&Oslash;';
784
+        $replace[] = 'õ'; $search[] = '&otilde;';
785
+        $replace[] = 'Õ'; $search[] = '&Otilde;';
786
+        $replace[] = 'ö'; $search[] = '&ouml;';
787
+        $replace[] = 'Ö'; $search[] = '&Ouml;';
788
+        $replace[] = 'œ'; $search[] = '&oelig;';
789
+        $replace[] = 'Œ'; $search[] = '&OElig;';
790
+        $replace[] = 'š'; $search[] = '&scaron;';
791
+        $replace[] = 'Š'; $search[] = '&Scaron;';
792
+        $replace[] = 'ß'; $search[] = '&szlig;';
793
+        $replace[] = 'þ'; $search[] = '&thorn;';
794
+        $replace[] = 'Þ'; $search[] = '&THORN;';
795
+        $replace[] = 'ú'; $search[] = '&uacute;';
796
+        $replace[] = 'Ú'; $search[] = '&Uacute;';
797
+        $replace[] = 'û'; $search[] = '&ucirc;';
798
+        $replace[] = 'Û'; $search[] = '&Ucirc;';
799
+        $replace[] = 'ù'; $search[] = '&ugrave;';
800
+        $replace[] = 'Ù'; $search[] = '&Ugrave;';
801
+        $replace[] = 'ü'; $search[] = '&uuml;';
802
+        $replace[] = 'Ü'; $search[] = '&Uuml;';
803
+        $replace[] = 'ý'; $search[] = '&yacute;';
804
+        $replace[] = 'Ý'; $search[] = '&Yacute;';
805
+        $replace[] = 'ÿ'; $search[] = '&yuml;';
806
+        $replace[] = 'Ÿ'; $search[] = '&Yuml;';
807
+        $chaine = str_replace($search, $replace, $chaine);
808 808
 
809 809
         return $chaine;
810 810
     }
@@ -821,11 +821,11 @@  discard block
 block discarded – undo
821 821
     {
822 822
         $s       = "ÀÁÂÃÄÅÒÓÔÕÖØÈÉÊËÇÌÍÎÏÙÚÛÜŸÑàáâãäåòóôõöøèéêëçìíîïùúûüÿñ '()";
823 823
         $r       = 'AAAAAAOOOOOOEEEECIIIIUUUUYNaaaaaaooooooeeeeciiiiuuuuyn----';
824
-        $content = self::unhtml($content);    // First, remove html entities
824
+        $content = self::unhtml($content); // First, remove html entities
825 825
         $content = strtr($content, $s, $r);
826 826
         $content = strip_tags($content);
827 827
         $content = strtolower($content);
828
-        $content = htmlentities($content);    // TODO: Vérifier
828
+        $content = htmlentities($content); // TODO: Vérifier
829 829
         $content = preg_replace('/&([a-zA-Z])(uml|acute|grave|circ|tilde);/', '$1', $content);
830 830
         $content = html_entity_decode($content);
831 831
         $content = eregi_replace('quot', ' ', $content);
@@ -840,7 +840,7 @@  discard block
 block discarded – undo
840 840
         $keywords = '';
841 841
         foreach ($words as $word) {
842 842
             if (strlen($word) >= $urw) {
843
-                $keywords .= '-' . trim($word);
843
+                $keywords .= '-'.trim($word);
844 844
             }
845 845
         }
846 846
         if (!$keywords) {
@@ -875,7 +875,7 @@  discard block
 block discarded – undo
875 875
             $limit = $_SESSION['references_keywords_limit'];
876 876
         } else {
877 877
             $config_handler                        = xoops_getHandler('config');
878
-            $xoopsConfigSearch                     =& $config_handler->getConfigsByCat(XOOPS_CONF_SEARCH);
878
+            $xoopsConfigSearch                     = & $config_handler->getConfigsByCat(XOOPS_CONF_SEARCH);
879 879
             $limit                                 = $xoopsConfigSearch['keyword_min'];
880 880
             $_SESSION['references_keywords_limit'] = $limit;
881 881
         }
@@ -923,7 +923,7 @@  discard block
 block discarded – undo
923 923
             if (!isset($config_handler) || !is_object($config_handler)) {
924 924
                 $config_handler = xoops_getHandler('config');
925 925
             }
926
-            $xoopsConfigMetaFooter =& $config_handler->getConfigsByCat(XOOPS_CONF_METAFOOTER);
926
+            $xoopsConfigMetaFooter = & $config_handler->getConfigsByCat(XOOPS_CONF_METAFOOTER);
927 927
             if (isset($xoopsConfigMetaFooter['meta_keywords'])) {
928 928
                 return $xoopsConfigMetaFooter['meta_keywords'];
929 929
             } else {
@@ -945,10 +945,10 @@  discard block
 block discarded – undo
945 945
      */
946 946
     public static function uploadFile($indice, $dstpath = XOOPS_UPLOAD_PATH, $mimeTypes = null, $uploadMaxSize = null, $maxWidth = null, $maxHeight = null)
947 947
     {
948
-        require_once XOOPS_ROOT_PATH . '/class/uploader.php';
948
+        require_once XOOPS_ROOT_PATH.'/class/uploader.php';
949 949
         global $destname;
950 950
         if (isset($_POST['xoops_upload_file'])) {
951
-            require_once XOOPS_ROOT_PATH . '/class/uploader.php';
951
+            require_once XOOPS_ROOT_PATH.'/class/uploader.php';
952 952
             $fldname = '';
953 953
             $fldname = $_FILES[$_POST['xoops_upload_file'][$indice]];
954 954
             $fldname = get_magic_quotes_gpc() ? stripslashes($fldname['name']) : $fldname['name'];
@@ -972,7 +972,7 @@  discard block
 block discarded – undo
972 972
                     if ($uploader->upload()) {
973 973
                         return true;
974 974
                     } else {
975
-                        return _ERRORS . ' ' . htmlentities($uploader->getErrors());
975
+                        return _ERRORS.' '.htmlentities($uploader->getErrors());
976 976
                     }
977 977
                 } else {
978 978
                     return htmlentities($uploader->getErrors());
@@ -1055,9 +1055,9 @@  discard block
 block discarded – undo
1055 1055
         $workingBreadcrumb = array();
1056 1056
         if (is_array($path)) {
1057 1057
             $moduleName          = self::getModuleName();
1058
-            $workingBreadcrumb[] = "<a href='" . REFERENCES_URL . "' title='" . self::makeHrefTitle($moduleName) . "'>" . $moduleName . '</a>';
1058
+            $workingBreadcrumb[] = "<a href='".REFERENCES_URL."' title='".self::makeHrefTitle($moduleName)."'>".$moduleName.'</a>';
1059 1059
             foreach ($path as $url => $title) {
1060
-                $workingBreadcrumb[] = "<a href='" . $url . "'>" . $title . '</a>';
1060
+                $workingBreadcrumb[] = "<a href='".$url."'>".$title.'</a>';
1061 1061
             }
1062 1062
             $cnt = count($workingBreadcrumb);
1063 1063
             for ($i = 0; $i < $cnt; ++$i) {
@@ -1096,7 +1096,7 @@  discard block
 block discarded – undo
1096 1096
 
1097 1097
             $complete_tags = array_reverse($complete_tags);
1098 1098
             for ($i = 0; $i < count($complete_tags); ++$i) {
1099
-                $string .= '</' . $complete_tags[$i] . '>';
1099
+                $string .= '</'.$complete_tags[$i].'>';
1100 1100
             }
1101 1101
         }
1102 1102
 
@@ -1117,7 +1117,7 @@  discard block
 block discarded – undo
1117 1117
                 $string = self::close_tags($string);
1118 1118
             }
1119 1119
 
1120
-            return $string . $etc;
1120
+            return $string.$etc;
1121 1121
         } else {
1122 1122
             return $string;
1123 1123
         }
@@ -1149,7 +1149,7 @@  discard block
 block discarded – undo
1149 1149
     public static function getMimeType($filename)
1150 1150
     {
1151 1151
         if (function_exists('finfo_open')) {
1152
-            $pathToMagic = REFERENCES_PATH . 'mime/magic';
1152
+            $pathToMagic = REFERENCES_PATH.'mime/magic';
1153 1153
             $finfo       = new finfo(FILEINFO_MIME, $pathToMagic);
1154 1154
             $mimetype    = $finfo->file($filename);
1155 1155
             finfo_close($finfo);
@@ -1179,7 +1179,7 @@  discard block
 block discarded – undo
1179 1179
             sort($xoopsUsersIDs);
1180 1180
             if (count($xoopsUsersIDs) > 0) {
1181 1181
                 $member_handler = xoops_getHandler('user');
1182
-                $criteria       = new Criteria('uid', '(' . implode(',', $xoopsUsersIDs) . ')', 'IN');
1182
+                $criteria       = new Criteria('uid', '('.implode(',', $xoopsUsersIDs).')', 'IN');
1183 1183
                 $criteria->setSort('uid');
1184 1184
                 $users = $member_handler->getObjects($criteria, true);
1185 1185
             }
@@ -1217,7 +1217,7 @@  discard block
 block discarded – undo
1217 1217
         } else {
1218 1218
             if ($uid > 0) {
1219 1219
                 $member_handler = xoops_getHandler('member');
1220
-                $buffer[$uid]   = $member_handler->getGroupsByUser($uid, false);    // Renvoie un tableau d'ID (de groupes)
1220
+                $buffer[$uid]   = $member_handler->getGroupsByUser($uid, false); // Renvoie un tableau d'ID (de groupes)
1221 1221
             } else {
1222 1222
                 $buffer[$uid] = array(XOOPS_GROUP_ANONYMOUS);
1223 1223
             }
@@ -1244,7 +1244,7 @@  discard block
 block discarded – undo
1244 1244
             $retval = $buffer[$group];
1245 1245
         } else {
1246 1246
             $member_handler = xoops_getHandler('member');
1247
-            $groups         = $member_handler->getGroupsByUser($uid, false);    // Renvoie un tableau d'ID (de groupes)
1247
+            $groups         = $member_handler->getGroupsByUser($uid, false); // Renvoie un tableau d'ID (de groupes)
1248 1248
             $retval         = in_array($group, $groups);
1249 1249
             $buffer[$group] = $retval;
1250 1250
         }
@@ -1284,7 +1284,7 @@  discard block
 block discarded – undo
1284 1284
         static $cache = -1;
1285 1285
         if ($cache == -1) {
1286 1286
             global $xoopsDB;
1287
-            $sql    = 'SELECT COUNT(*) FROM ' . $xoopsDB->prefix('groups');
1287
+            $sql    = 'SELECT COUNT(*) FROM '.$xoopsDB->prefix('groups');
1288 1288
             $result = $xoopsDB->query($sql);
1289 1289
             if (!$result) {
1290 1290
                 return false;
@@ -1305,7 +1305,7 @@  discard block
 block discarded – undo
1305 1305
     {
1306 1306
         if (!is_dir($folder)) {
1307 1307
             mkdir($folder, 0777);
1308
-            file_put_contents($folder . '/index.html', '<script>history.go(-1);</script>');
1308
+            file_put_contents($folder.'/index.html', '<script>history.go(-1);</script>');
1309 1309
         } else {
1310 1310
             if (!is_writable($folder)) {
1311 1311
                 chmod($folder, 0777);
@@ -1326,10 +1326,10 @@  discard block
 block discarded – undo
1326 1326
         if (strstr($languageFile, $defaultExtension) === false) {
1327 1327
             $languageFile .= $defaultExtension;
1328 1328
         }
1329
-        if (file_exists($root . 'language' . DIRECTORY_SEPARATOR . $xoopsConfig['language'] . DIRECTORY_SEPARATOR . $languageFile)) {
1330
-            require_once $root . 'language' . DIRECTORY_SEPARATOR . $xoopsConfig['language'] . DIRECTORY_SEPARATOR . $languageFile;
1329
+        if (file_exists($root.'language'.DIRECTORY_SEPARATOR.$xoopsConfig['language'].DIRECTORY_SEPARATOR.$languageFile)) {
1330
+            require_once $root.'language'.DIRECTORY_SEPARATOR.$xoopsConfig['language'].DIRECTORY_SEPARATOR.$languageFile;
1331 1331
         } else {    // Fallback
1332
-            require_once $root . 'language' . DIRECTORY_SEPARATOR . 'english' . DIRECTORY_SEPARATOR . $languageFile;
1332
+            require_once $root.'language'.DIRECTORY_SEPARATOR.'english'.DIRECTORY_SEPARATOR.$languageFile;
1333 1333
         }
1334 1334
     }
1335 1335
 
@@ -1367,10 +1367,10 @@  discard block
 block discarded – undo
1367 1367
                 $left = $top = 0;
1368 1368
                 if (is_array($pictureDimensions)) {
1369 1369
                     if ($pictureWidth > $param_width) {
1370
-                        $left = (int)(($pictureWidth / 2) - ($param_width / 2));
1370
+                        $left = (int) (($pictureWidth / 2) - ($param_width / 2));
1371 1371
                     }
1372 1372
                     if ($pictureHeight > $param_height) {
1373
-                        $top = (int)(($pictureHeight / 2) - ($param_height / 2));
1373
+                        $top = (int) (($pictureHeight / 2) - ($param_height / 2));
1374 1374
                     }
1375 1375
                 }
1376 1376
                 $result = $img->crop($left, $top, $param_width, $param_height);
@@ -1410,7 +1410,7 @@  discard block
 block discarded – undo
1410 1410
                     $selected = " selected = 'selected'";
1411 1411
                 }
1412 1412
             }
1413
-            $ret[] = '<option value=0' . $selected . '>---</option>';
1413
+            $ret[] = '<option value=0'.$selected.'>---</option>';
1414 1414
         }
1415 1415
 
1416 1416
         foreach ($array as $index => $label) {
@@ -1424,7 +1424,7 @@  discard block
 block discarded – undo
1424 1424
                     $selected = " selected = 'selected'";
1425 1425
                 }
1426 1426
             }
1427
-            $ret[] = "<option value=\"" . $index . "\"" . $selected . '>' . $label . '</option>';
1427
+            $ret[] = "<option value=\"".$index."\"".$selected.'>'.$label.'</option>';
1428 1428
         }
1429 1429
 
1430 1430
         return implode("\n", $ret);
@@ -1446,14 +1446,14 @@  discard block
 block discarded – undo
1446 1446
     public static function htmlSelect($selectName, $array, $default, $withNull = true, $style = '', $multiple = false, $size = 1, $extra = '')
1447 1447
     {
1448 1448
         $ret = '';
1449
-        $ret .= "<select name='" . $selectName . "' id='" . $selectName . "'";
1449
+        $ret .= "<select name='".$selectName."' id='".$selectName."'";
1450 1450
         if (xoops_trim($style) != '') {
1451
-            $ret .= " style='" . $style . "' ";
1451
+            $ret .= " style='".$style."' ";
1452 1452
         }
1453 1453
         if (xoops_trim($multiple) != '') {
1454
-            $ret .= " multiple = 'multiple' size='" . $size . "' ";
1454
+            $ret .= " multiple = 'multiple' size='".$size."' ";
1455 1455
         }
1456
-        $ret .= $extra . ">\n";
1456
+        $ret .= $extra.">\n";
1457 1457
         $ret .= self::htmlSelectOptions($array, $default, $withNull);
1458 1458
         $ret .= "</select>\n";
1459 1459
 
@@ -1528,16 +1528,16 @@  discard block
 block discarded – undo
1528 1528
     {
1529 1529
         global $xoopsDB;
1530 1530
         define('REFERENCES_MAINTAIN', true);
1531
-        require self::MODULE_PATH . 'xoops_version.php';
1531
+        require self::MODULE_PATH.'xoops_version.php';
1532 1532
         $tables = array();
1533 1533
         foreach ($modversion['tables'] as $table) {
1534 1534
             $tables[] = $xoopsDB->prefix($table);
1535 1535
         }
1536 1536
         if (count($tables) > 0) {
1537 1537
             $list = implode(',', $tables);
1538
-            $xoopsDB->queryF('CHECK TABLE ' . $list);
1539
-            $xoopsDB->queryF('ANALYZE TABLE ' . $list);
1540
-            $xoopsDB->queryF('OPTIMIZE TABLE ' . $list);
1538
+            $xoopsDB->queryF('CHECK TABLE '.$list);
1539
+            $xoopsDB->queryF('ANALYZE TABLE '.$list);
1540
+            $xoopsDB->queryF('OPTIMIZE TABLE '.$list);
1541 1541
         }
1542 1542
         self::updateCache();
1543 1543
         $handlers = references_handler::getInstance();
Please login to merge, or discard this patch.