Valider 7a52fa08 rédigé par tcharlss@bravecassine.com's avatar tcharlss@bravecassine.com
Parcourir les fichiers

Bugfix du champ "vu" des rôles de documents, étape 2 (merci à Maïeul pour le...

Bugfix du champ "vu" des rôles de documents, étape 2 (merci à Maïeul pour le dépannage) : dès qu'on modifie un objet, on regarde s'il a des documents liés, si c'est le cas on synchronise tous les champs "vu" des liens portant des rôles avec le lien de base correspondant (sans rôle). C'est sans doute simplifiable et optimisable, mais pour l'instant ça fonctionne.
Dans l'idéal, il faudrait agir directement dans la fonction `marquer_doublons_docs` du plugin Médias, au moment où il met à jour le champ vu sur les liens des documents.
parent b5e81733
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+2 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
<paquet
	prefix="roles_documents"
	categorie="edition"
	version="0.1.5"
	version="0.1.6"
	etat="experimental"
	compatibilite="[3.0.0;3.1.*]"
	logo="prive/themes/spip/images/roles_documents-48.png"
@@ -26,5 +26,6 @@
	<pipeline nom="declarer_tables_interfaces" inclure="roles_documents_fonctions.php" />
	<pipeline nom="document_desc_actions" inclure="roles_documents_pipelines.php" />
	<pipeline nom="post_edition_lien" inclure="roles_documents_pipelines.php" />
	<pipeline nom="post_edition" inclure="roles_documents_pipelines.php" />

</paquet>
+47 −9
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -58,7 +58,7 @@ function roles_documents_document_desc_actions($flux) {


/**
 * Synchroniser le champ "vu" des liens de documents recevant des roles.
 * Synchroniser le champ "vu" lors de la création d'un nouveau lien de document portant un rôle.
 *
 * @pipeline post_edition_liens
 *
@@ -71,21 +71,59 @@ function roles_documents_post_edition_lien($flux) {
		$flux['args']['action'] == 'insert'             // il s'agit d'une création de lien
		and $flux['args']['objet_source'] == 'document' // on a affaire à un document
		and isset($flux['args']['role'])
		and $role = $flux['args']['role']               // et il y a un role donné
		and $role = $flux['args']['role']
		and strlen($role)                               // et il y a un role donné
		and isset($flux['args']['colonne_role'])
		and $colonne_role = $flux['args']['colonne_role']
		and $id_document = intval($flux['args']['id_objet_source'])
		and $objet = $flux['args']['objet']
		and $id_objet = intval($flux['args']['id_objet'])
		and $vu = sql_getfetsel('vu', 'spip_documents_liens', 'id_document=' .$id_document .' AND objet='.sql_quote($objet) .' AND id_objet='.$id_objet .' AND '.$colonne_role.'=\'\'')
	){
	
		// il y a forcément déjà un lien existant sans rôle
		// on récupère son vu, et on qualifie le nouveau lien avec
		if ($vu = sql_getfetsel('vu', 'spip_documents_liens', 'id_document=' .$id_document .' AND objet='.sql_quote($objet) .' AND id_objet='.$id_objet .' AND '.$colonne_role.'=\'\'')) {

		include_spip('action/editer_liens');
		objet_qualifier_liens(array('document'=>$id_document), array($objet=>$id_objet), array($colonne_role=>$role, 'vu'=>$vu));
	}

	return $flux;
}


/**
 * Après la modif d'un objet, synchroniser le vu de tous les document liés ayant un rôle avec celui du lien de base (sans rôle)
 *
 * @pipeline post_edition
 *
 * @param  array $flux Données du pipeline
 * @return array       Données du pipeline
 */
function roles_documents_post_edition($flux) {

		if (
			$flux['args']['action'] == 'modifier'           // on modifie un objet
			and $flux['args']['table'] !== 'spip_documents' // mais pas un document
			and $objet = $flux['args']['type']
			and $id_objet = intval($flux['args']['id_objet'])
		){

			// on regarde s'il y a des documents liés à l'objet modifié
			include_spip('inc/editer_liens');
			if (count($liens = objet_trouver_liens(array('document'=>'*'),array($objet=>$id_objet)))) {
				foreach ($liens as $l) {
					// on récupère le champ "vu" du lien sans rôle (= lien de base)
					$vu = sql_getfetsel(
						'vu',
						'spip_documents_liens',
						'id_document=' .$l['id_document'] .' AND objet='.sql_quote($objet) .' AND id_objet='.$id_objet .' AND role = \'\''
					);
					var_dump($vu);
					// on met à jour tous les liens avec rôle
					sql_updateq(
						'spip_documents_liens',
						array('vu'=>$vu),
						'id_document=' .$l['id_document'] .' AND objet='.sql_quote($objet) .' AND id_objet='.$id_objet .' AND role != \'\''
					);
				}
			}
		}

	return $flux;
+17 −5
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
- **Balises** : Prendre en charge tous les `LOGO_XXX` (pour l'instant seuls `#LOGO_ARTICLE` et `#LOGO_RUBRIQUE` sont pris en charge).
## Balises

- **Critères** : Ajouter la possibilité de filtrer les rôles avec des critères, `{role=truc}` est insuffisant car les rôles peuvent être multiples.
Prendre en charge tous les `LOGO_XXX` (pour l'instant seuls `#LOGO_ARTICLE` et `#LOGO_RUBRIQUE` sont pris en charge).

- **Déclarations** : Dans les déclarations, il faudrait pouvoir dire qu'un rôle DOIT être unique pour un même contenu, ou inversement qu'un autre rôle peut être multiple et quand on l'assigne à un autre document : ça l'enlève alors du précédent (pour le cas où le rôle doit être unique).
## Critères

Ajouter la possibilité de filtrer les rôles avec des critères, `{role=truc}` est insuffisant car les rôles peuvent être multiples.

## Déclarations

Dans les déclarations, il faudrait pouvoir dire qu'un rôle DOIT être unique pour un même contenu, ou inversement qu'un autre rôle peut être multiple et quand on l'assigne à un autre document : ça l'enlève alors du précédent (pour le cas où le rôle doit être unique).
En conséquence, dans l'interface, il faudrait prendre en compte ces limitations. Par ex. rendre impossible l'attribution d'un même rôle à plusieurs documents (cas des logos).
À noter : en ajoutant des rôles à un type d'objet, il faut prendre en compte les rôles portant sur tous les objets et qui ont la clé '*', et faire un merge.

- **Interface** : Rendre les rôles attribués plus visibles. Le rôle doit prendre la primeur sur le titre. Quand c'est le logo, ça devrait alors placer l'image dans dans un sous-titre "Logo", comme il y a "illustration" et "portfolio" (qui disparaitront ). Ça donnerait 3 listes de documents : Logo / Documents insérés / Documents joints . Après sélection d'un rôle, recharger tout le bloc des documents.
## Interface

Rendre les rôles attribués plus visibles. Le rôle doit prendre la primeur sur le titre. Quand c'est le logo, ça devrait alors placer l'image dans dans un sous-titre "Logo", comme il y a "illustration" et "portfolio" (qui disparaitront ). Ça donnerait 3 listes de documents : Logo / Documents insérés / Documents joints . Après sélection d'un rôle, recharger tout le bloc des documents.

## Bugs/limitations

- **Bugs/limitations** : Chaque rôle donné à un document crée une nouvelle ligne dans la table `spip_documents_liens`, donc si on boucle sur cette table pour afficher les documents liés à un objet, le même document ressortira autant de fois qu'il a de rôles (cf. `documents_colonne.html` du plugins Médias). De plus, ça rend le critère `{vu}` inopérant puisqu'un même document peut se retrouver à la fois vu et non vu après plusieurs manoeuvres. Pistes pour résoudre ça : une seul ligne par document lié, avec plusieurs rôles séparés par des virgules ? Ou alors par défaut faire en sorte que la boucle documents ne retourne qu'une seule fois un doc lié ayant plusieurs rôles ? 
- Chaque rôle donné à un document crée une nouvelle ligne dans la table `spip_documents_liens`, donc si on boucle sur cette table pour afficher les documents liés à un objet, le même document ressortira autant de fois qu'il a de rôles (cf. `documents_colonne.html` du plugins Médias).
- Le critère `{vu}` est inopérant puisqu'un même document peut se retrouver à la fois vu et non vu après plusieurs manoeuvres. Pistes pour résoudre ça : une seul ligne par document lié, avec plusieurs rôles séparés par des virgules ? Ou alors par défaut faire en sorte que la boucle documents ne retourne qu'une seule fois un doc lié ayant plusieurs rôles ?
- On ne peux pas détacher un document qui possède un rôle déclaré par un plugin désactivé.