Completed
Push — master ( 2a0f4b...be3b46 )
by cam
05:37
created

fonctions.php ➔ tri_champ_order()   B

Complexity

Conditions 8
Paths 17

Size

Total Lines 30

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 8
nc 17
nop 2
dl 0
loc 30
rs 8.1954
c 0
b 0
f 0
1
<?php
2
3
/***************************************************************************\
4
 *  SPIP, Systeme de publication pour l'internet                           *
5
 *                                                                         *
6
 *  Copyright (c) 2001-2019                                                *
7
 *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
8
 *                                                                         *
9
 *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
10
 *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
11
\***************************************************************************/
12
13
/**
14
 * Des fonctions diverses utilisees lors du calcul d'une page ; ces fonctions
15
 * bien pratiques n'ont guere de logique organisationnelle ; elles sont
16
 * appelees par certaines balises ou criteres au moment du calcul des pages. (Peut-on
17
 * trouver un modele de donnees qui les associe physiquement au fichier
18
 * definissant leur balise ???)
19
 *
20
 * Ce ne sont pas des filtres � part enti�re, il n'est donc pas logique de les retrouver dans inc/filtres
21
 *
22
 * @package SPIP\Core\Compilateur\Composer
23
 **/
24
25
if (!defined('_ECRIRE_INC_VERSION')) {
26
	return;
27
}
28
29
30
/**
31
 * Calcul d'une introduction
32
 *
33
 * L'introduction est prise dans le descriptif s'il est renseign�,
34
 * sinon elle est calcul�e depuis le texte : � ce moment l�,
35
 * l'introduction est prise dans le contenu entre les balises
36
 * `<intro>` et `</intro>` si pr�sentes, sinon en coupant le
37
 * texte � la taille indiqu�e.
38
 *
39
 * Cette fonction est utilis�e par la balise #INTRODUCTION
40
 *
41
 * @param string $descriptif
42
 *     Descriptif de l'introduction
43
 * @param string $texte
44
 *     Texte � utiliser en absence de descriptif
45
 * @param string $longueur
46
 *     Longueur de l'introduction
47
 * @param string $connect
48
 *     Nom du connecteur � la base de donn�es
49
 * @param string $suite
0 ignored issues
show
Documentation introduced by
Should the type for parameter $suite not be string|null?

This check looks for @param annotations where the type inferred by our type inference engine differs from the declared type.

It makes a suggestion as to what type it considers more descriptive.

Most often this is a case of a parameter that can be null in addition to its declared types.

Loading history...
50
 *     points de suite si on coupe (par defaut _INTRODUCTION_SUITE et sinon &nbsp;(...)
51
 * @return string
52
 *     Introduction calcul�e
53
 **/
54
function filtre_introduction_dist($descriptif, $texte, $longueur, $connect, $suite = null) {
55
	// Si un descriptif est envoye, on l'utilise directement
56
	if (strlen($descriptif)) {
57
		return appliquer_traitement_champ($descriptif, 'introduction', '', array(), $connect);
58
	}
59
60
	// De preference ce qui est marque <intro>...</intro>
61
	$intro = '';
62
	$texte = preg_replace(",(</?)intro>,i", "\\1intro>", $texte); // minuscules
63
	while ($fin = strpos($texte, "</intro>")) {
64
		$zone = substr($texte, 0, $fin);
65
		$texte = substr($texte, $fin + strlen("</intro>"));
66
		if ($deb = strpos($zone, "<intro>") or substr($zone, 0, 7) == "<intro>") {
67
			$zone = substr($zone, $deb + 7);
68
		}
69
		$intro .= $zone;
70
	}
71
72
	// [12025] On ne *PEUT* pas couper simplement ici car c'est du texte brut,
73
	// qui inclus raccourcis et modeles
74
	// un simple <articlexx> peut etre ensuite transforme en 1000 lignes ...
75
	// par ailleurs le nettoyage des raccourcis ne tient pas compte
76
	// des surcharges et enrichissement de propre
77
	// couper doit se faire apres propre
78
	//$texte = nettoyer_raccourcis_typo($intro ? $intro : $texte, $connect);
79
80
	// Cependant pour des questions de perfs on coupe quand meme, en prenant
81
	// large et en se mefiant des tableaux #1323
82
83
	if (strlen($intro)) {
84
		$texte = $intro;
85
	} else {
86
		if (strpos("\n" . $texte, "\n|") === false
87
			and strlen($texte) > 2.5 * $longueur
88
		) {
89
			if (strpos($texte, "<multi") !== false) {
90
				$texte = extraire_multi($texte);
91
			}
92
			$texte = couper($texte, 2 * $longueur);
93
		}
94
	}
95
96
	// ne pas tenir compte des notes
97
	if ($notes = charger_fonction('notes', 'inc', true)) {
98
		$notes('', 'empiler');
99
	}
100
	// Supprimer les mod�les avant le propre afin d'�viter qu'ils n'ajoutent du texte ind�sirable
101
	// dans l'introduction.
102
	$texte = supprime_img($texte, '');
103
	$texte = appliquer_traitement_champ($texte, 'introduction', '', array(), $connect);
104
105
	if ($notes) {
106
		$notes('', 'depiler');
107
	}
108
109
	if (is_null($suite) and defined('_INTRODUCTION_SUITE')) {
110
		$suite = _INTRODUCTION_SUITE;
111
	}
112
	$texte = couper($texte, $longueur, $suite);
113
	// comme on a coupe il faut repasser la typo (on a perdu les insecables)
114
	$texte = typo($texte, true, $connect, array());
115
116
	// et reparagrapher si necessaire (coherence avec le cas descriptif)
117
	// une introduction a tojours un <p>
118
	if ($GLOBALS['toujours_paragrapher']) // Fermer les paragraphes
119
	{
120
		$texte = paragrapher($texte, $GLOBALS['toujours_paragrapher']);
121
	}
122
123
	return $texte;
124
}
125
126
127
/**
128
 * Retourne pour une cl� primaire d'objet donn�e les identifiants ayant un logo
129
 *
130
 * @param string $type
131
 *     Nom de la cl� primaire de l'objet
132
 * @return string
133
 *     Liste des identifiants ayant un logo (s�par�s par une virgule)
134
 **/
135
function lister_objets_avec_logos($type) {
136
137
	$objet = objet_type($type);
138
	$ids = sql_allfetsel("L.id_objet", "spip_documents AS D JOIN spip_documents_liens AS L ON L.id_document=D.id_document", "D.mode=".sql_quote('logoon')." AND L.objet=".sql_quote($objet));
139
	if ($ids) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $ids of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
140
		$ids = array_column($ids, 'id_objet');
141
		return implode(',', $ids);
142
	}
143
	else {
144
		return "0";
145
	}
146
}
147
148
149
/**
150
 * Renvoie l'�tat courant des notes, le purge et en pr�pare un nouveau
151
 *
152
 * Fonction appel�e par la balise `#NOTES`
153
 *
154
 * @see  balise_NOTES_dist()
155
 * @uses inc_notes_dist()
156
 *
157
 * @return string
158
 *     Code HTML des notes
159
 **/
160
function calculer_notes() {
161
	$r = '';
162
	if ($notes = charger_fonction('notes', 'inc', true)) {
163
		$r = $notes(array());
164
		$notes('', 'depiler');
165
		$notes('', 'empiler');
166
	}
167
168
	return $r;
169
}
170
171
172
/**
173
 * Retrouver le rang du lien entre un objet source et un obet lie
174
 * utilisable en direct dans un formulaire d'edition des liens, mais #RANG doit faire le travail automatiquement
175
 * [(#ENV{objet_source}|rang_lien{#ID_AUTEUR,#ENV{objet},#ENV{id_objet},#ENV{_objet_lien}})]
176
 *
177
 * @param $objet_source
178
 * @param $ids
179
 * @param $objet_lie
180
 * @param $idl
181
 * @param $objet_lien
182
 * @return string
183
 */
184
function retrouver_rang_lien($objet_source, $ids, $objet_lie, $idl, $objet_lien){
185
	$res = lister_objets_liens($objet_source, $objet_lie, $idl, $objet_lien);
186
	$res = array_column($res, 'rang_lien', $objet_source);
187
188
	return (isset($res[$ids]) ? $res[$ids] : '');
189
}
190
191
192
/**
193
 * Lister les liens en le memoizant dans une static
194
 * pour utilisation commune par lister_objets_lies et retrouver_rang_lien dans un formuluaire d'edition de liens
195
 * (evite de multiplier les requetes)
196
 *
197
 * @param $objet_source
198
 * @param $objet
199
 * @param $id_objet
200
 * @param $objet_lien
201
 * @return mixed
202
 * @private
203
 */
204
function lister_objets_liens($objet_source, $objet, $id_objet, $objet_lien) {
205
	static $liens = array();
206
	if (!isset($liens["$objet_source-$objet-$id_objet-$objet_lien"])) {
207
		include_spip('action/editer_liens');
208
		// quand $objet == $objet_lien == $objet_source on reste sur le cas par defaut de $objet_lien == $objet_source
209 View Code Duplication
		if ($objet_lien == $objet and $objet_lien !== $objet_source) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
210
			$res = objet_trouver_liens(array($objet => $id_objet), array($objet_source => '*'));
211
		} else {
212
			$res = objet_trouver_liens(array($objet_source => '*'), array($objet => $id_objet));
213
		}
214
215
		$liens["$objet_source-$objet-$id_objet-$objet_lien"] = $res;
216
	}
217
	return $liens["$objet_source-$objet-$id_objet-$objet_lien"];
218
}
219
220
/**
221
 * Calculer la balise #RANG
222
 * quand ce n'est pas un champ rang :
223
 * peut etre le num titre, le champ rang_lien ou le rang du lien en edition des liens, a retrouver avec les infos du formulaire
224
 * @param $titre
225
 * @param $objet_source
226
 * @param $id
227
 * @param $env
228
 * @return int|string
229
 */
230
function calculer_rang_smart($titre, $objet_source, $id, $env) {
231
	// Cas du #RANG utilis� dans #FORMULAIRE_EDITER_LIENS -> attraper le rang du lien
232
	// permet de voir le rang du lien si il y en a un en base, meme avant un squelette xxxx-lies.html ne gerant pas les liens
233
	if (isset($env['form']) and $env['form']
234
		and isset($env['_objet_lien']) and $env['_objet_lien']
235
		and (function_exists('lien_triables') or include_spip('action/editer_liens'))
236
		and $r = objet_associable($env['_objet_lien'])
237
		and list($p, $table_lien) = $r
238
	  and lien_triables($table_lien)
239
	  and isset($env['objet']) and $env['objet']
240
		and isset($env['id_objet']) and $env['id_objet']
241
		and $objet_source
242
		and $id = intval($id)
243
	) {
244
		$rang = retrouver_rang_lien($objet_source, $id, $env['objet'], $env['id_objet'], $env['_objet_lien']);
245
		return ($rang ? $rang : '');
246
	}
247
	return recuperer_numero($titre);
248
}
249
250
251
/**
252
 * Proteger les champs passes dans l'url et utiliser dans {tri ...}
253
 * preserver l'espace pour interpreter ensuite num xxx et multi xxx
254
 *
255
 * @param string $t
256
 * @return string
257
 */
258
function tri_protege_champ($t) {
259
	return preg_replace(',[^\s\w.+],', '', $t);
260
}
261
262
/**
263
 * Interpreter les multi xxx et num xxx utilise comme tri
264
 * pour la clause order
265
 * 'multi xxx' devient simplement 'multi' qui est calcule dans le select
266
 *
267
 * @param string $t
268
 * @param array $from
0 ignored issues
show
Documentation introduced by
Should the type for parameter $from not be array|null? Also, consider making the array more specific, something like array<String>, or String[].

This check looks for @param annotations where the type inferred by our type inference engine differs from the declared type.

It makes a suggestion as to what type it considers more descriptive. In addition it looks for parameters that have the generic type array and suggests a stricter type like array<String>.

Most often this is a case of a parameter that can be null in addition to its declared types.

Loading history...
269
 * @return string
270
 */
271
function tri_champ_order($t, $from = null) {
272
	if (strncmp($t, 'multi ', 6) == 0) {
273
		return "multi";
274
	}
275
276
	$champ = $t;
277
278
	if (strncmp($t, 'num ', 4) == 0) {
279
		$champ = substr($t, 4);
280
	}
281
	// enlever les autres espaces non evacues par tri_protege_champ
282
	$champ = preg_replace(',\s,', '', $champ);
283
284
	if (is_array($from)) {
285
		$trouver_table = charger_fonction('trouver_table', 'base');
286
		foreach ($from as $idt => $table_sql) {
287
			if ($desc = $trouver_table($table_sql)
288
				and isset($desc['field'][$champ])
289
			) {
290
				$champ = "$idt.$champ";
291
				break;
292
			}
293
		}
294
	}
295
	if (strncmp($t, 'num ', 4) == 0) {
296
		return "0+$champ";
297
	} else {
298
		return $champ;
299
	}
300
}
301
302
/**
303
 * Interpreter les multi xxx et num xxx utilise comme tri
304
 * pour la clause select
305
 * 'multi xxx' devient select "...." as multi
306
 * les autres cas ne produisent qu'une chaine vide '' en select
307
 * 'hasard' devient 'rand() AS hasard' dans le select
308
 *
309
 * @param string $t
310
 * @return string
311
 */
312
function tri_champ_select($t) {
313
	if (strncmp($t, 'multi ', 6) == 0) {
314
		$t = substr($t, 6);
315
		$t = preg_replace(',\s,', '', $t);
316
		$t = sql_multi($t, $GLOBALS['spip_lang']);
317
318
		return $t;
319
	}
320
	if (trim($t) == 'hasard') {
321
		return 'rand() AS hasard';
322
	}
323
324
	return "''";
325
}
326