Changeset 58781 in spip-zone


Ignore:
Timestamp:
Feb 22, 2012, 10:02:04 PM (8 years ago)
Author:
fil@…
Message:

projection au format YAML, avec quelques jointures

File:
1 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/projection/inc/projection.php

    r57471 r58781  
    3434        }
    3535
     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
    3641        # fichier de projection
    37         $f = $dir.objet_type($objet).'-'.$id_objet.'.json';
     42        $type = objet_type($objet); # 'article'
     43        $f = $dir.$type.'-'.$id_objet.'.yaml';
    3844        spip_log($f, 'projection');
    3945
    40         # contenu à enregistrer
    41         include_spip('abstract_sql');
    42         $article = sql_fetsel('*', table_objet($objet), id_table_objet($objet).'='.$id_objet);
    43         # todo : retirer les champs inutiles, ajouter les jointures (auteurs, mots, documents)
     46        # recuperer la representation complete de l'objet
     47        $representation = projection_representation($obj, $type);
    4448
    4549        # on l'écrit et zou
    46         # à noter : json_encode est temporaire, on veut un vrai format avec de belles propriétés (par exemple un HTML bien structuré)
    47         return ecrire_fichier($f, json_encode($article));
     50        return ecrire_fichier($f, $representation);
    4851}
    4952
     
    5558                return $p;
    5659}
     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 TracChangeset for help on using the changeset viewer.