source: spip-zone/_plugins_/projection/inc/projection.php @ 58781

Last change on this file since 58781 was 58781, checked in by fil@…, 9 years ago

projection au format YAML, avec quelques jointures

File size: 4.8 KB
Line 
1<?php
2
3# la projection d'un objet c'est le contenu de cet objet au format
4# HTML pour affichage plaisant mais contenant toutes les données
5# pour permettre une recopie
6
7# dans quel répertoire on fait ça… local/projection/
8
9
10function projection($objet, $id_objet) {
11        spip_log("projection $objet:$id_objet", "projection");
12        spip_log($_SERVER['REQUEST_URI'], 'projection'); # verifier qu'on s'execute bien sur le cron
13
14        if ($projection = charger_fonction('projection_'.$objet, 'inc', true)) {
15        spip_log("a $projection", 'projection');
16                $projection($objet, $id_objet);
17        } else {
18                projection_dist($objet, $id_objet);
19        }
20
21        spip_log("a $projection", 'projection');
22}
23
24
25function projection_dist($objet, $id_objet) {
26        spip_log("Je ne sais pas faire la projection de $objet:$id_objet", "projection");
27
28}
29
30function inc_projection_articles_dist($objet, $id_objet) {
31        if (!$dir = projection_dir($objet, $id_objet)) {
32                spip_log('echec', 'projection');
33                return false;
34        }
35
36        # contenu à enregistrer
37        include_spip('abstract_sql');
38        $obj = sql_fetsel('*', table_objet($objet), id_table_objet($objet).'='.$id_objet);
39        # todo : retirer les champs inutiles, ajouter les jointures (auteurs, mots, documents)
40
41        # fichier de projection
42        $type = objet_type($objet); # 'article'
43        $f = $dir.$type.'-'.$id_objet.'.yaml';
44        spip_log($f, 'projection');
45
46        # recuperer la representation complete de l'objet
47        $representation = projection_representation($obj, $type);
48
49        # on l'écrit et zou
50        return ecrire_fichier($f, $representation);
51}
52
53
54
55function projection_dir($objet, $id_objet) {
56        if ($p = sous_repertoire(_DIR_VAR, 'projection')
57        AND $p = sous_repertoire($p,$objet))  # on pourrait organiser par rubrique
58                return $p;
59}
60
61# à noter : json_encode est temporaire, on veut un vrai format
62# avec de belles propriétés
63function projection_representation($obj, $type) {
64        include_spip('inc/yaml');
65
66        // fallback json si yaml absent
67        if (!function_exists('yaml_encode'))
68                return json_encode($obj);
69
70        // eliminer les champs vides ou null ou ayant une valeur par defaut
71        $data = array_filter($obj);
72        if ($data['date_redac'] == '0000-00-00 00:00:00')
73                unset($data['date_redac']);
74        if ($data['statut'] == 'publie')
75                unset($data['statut']);
76
77        // eliminer les champs inutiles
78        foreach (explode(' ',
79        'id_article id_rubrique id_secteur export date_modif lang langue_choisie accepter_forum maj'
80        ) as $i)
81                unset($data[$i]);
82
83        //
84        // ajouter les jointures
85        //
86       
87        # authors
88        if (count($auteurs = sql_allfetsel('nom, bio', 'spip_auteurs a left join spip_auteurs_articles b on a.id_auteur=b.id_auteur', 'b.id_article='.$obj['id_article']))) {
89                $data['authors'] = array_filter(array_map('projection_auteur', $auteurs));
90                if (count($data['authors']) == 1)
91                        $data['authors'] = array_pop($data['authors']);
92        } else
93                $data['error'] .= sql_error();
94
95        # tags
96        if (count($mots = sql_allfetsel('titre, descriptif, texte', 'spip_mots a left join spip_mots_articles b on a.id_mot=b.id_mot', 'b.id_article='.$obj['id_article']))) {
97                $data['tags'] = array_filter(array_map('projection_mot', $mots));
98        } else
99                $data['error'] .= sql_error();
100
101        # documents
102        if (count($docs = sql_allfetsel('titre, descriptif, fichier, a.id_document, vu, mode', 'spip_documents a left join spip_documents_liens b on a.id_document=b.id_document', "b.objet='$type' AND b.id_objet=".$obj['id_article']))) {
103                $data['docs'] = array_filter(array_map('projection_doc', $docs));
104        } else
105                $data['error'] .= sql_error();
106
107        # category
108        if ($rub = sql_allfetsel('titre, descriptif, texte', 'spip_rubriques', "id_rubrique=".$obj['id_rubrique'])) {
109                $data['category'] = projection_rubrique($rub[0]);
110        } else
111                $data['error'] .= sql_error();
112
113
114        ## le texte, c'est l'essentiel mais il ne figure pas dans l'entete
115        unset($data['texte']);
116
117        $rep = "##### projection de l'article $obj[id_article]\n"
118                . "--- # metadata\n"
119                . yaml_encode(array_filter($data))
120                . "--- # content\n";
121
122        $rep .= $obj['texte'];
123
124        return $rep;
125}
126
127
128function projection_auteur($auteur) {
129        $auteur = array_filter($auteur);
130        if (count($auteur) == 1
131        AND isset($auteur['nom']))
132                $auteur = $auteur['nom'];
133        return $auteur;
134}
135function projection_mot($mot) {
136        $mot = array_filter($mot);
137        if (count($mot) == 1
138        AND isset($mot['titre']))
139                $mot = $mot['titre'];
140        return $mot;
141}
142function projection_doc($doc) {
143        $doc = array_filter($doc);
144
145        // URL absolue de maniere a pouvoir exporter
146        if (isset($doc['fichier'])
147        AND !preg_match(',://,', $fichier))
148                $doc['fichier'] = url_absolue(_DIR_IMG.$doc['fichier']);
149
150        if ($doc['vu'] == 'non') {
151                unset($doc['id_document']);
152                if ($doc['mode'] == 'image')
153                        $doc = array();
154        }
155        unset($doc['vu']);
156        if ($doc['mode'] == 'document') unset($doc['mode']);
157
158        if (count($doc) == 1
159        AND isset($doc['fichier']))
160                $doc = $doc['fichier'];
161        return $doc;
162}
163function projection_rubrique($rub) {
164        $rub = array_filter($rub);
165        if (count($rub) == 1
166        AND isset($rub['titre']))
167                $rub = $rub['titre'];
168        return $rub;
169}
170
Note: See TracBrowser for help on using the repository browser.