[pmwiki-users-fr] Importation et catégories

Dominique Faure dominique.faure at gmail.com
Mer 19 Sep 08:22:12 CDT 2007


On 9/19/07, Michel <srt at vergne.org> wrote:
> Bonjour,
>
> Je cherche des conseils sur la manière de faire fonctionner les
> catégories sur des pages créées à l'extérieur de PmWiki.
>
> Le contexte et les détails :
> Je souhaite importer dans un PmWiki un peu plus de 3.500 pages
> gérées actuellement avec un autre outil.
>
> J'ai converti mes pages au format PmWiki en suivant ces
> spécifications : http://www.pmwiki.org/wiki/PmWiki/PageFileFormat
>
> Je les ensuite copiées directement sous wiki.d/, et elles s'affichent
> normalement.
>
> Les pages d'origine contenaient des catégories. La moulinette de
> conversion des pages ajoute dans le texte des pages pour
> PmWiki les balises qui vont bien. J'ai aussi créé les pages
> Category.xxxx et Category.GroupFooter
>
> Lorsque j'affiche une page importée, les liens de catégorie sont
> actifs. Quand je clique dessus, j'obtiens bien la page Category.xxx
> attendue, mais avec une liste vide.
>
> Il suffit que j'édite manuellement la page importée, et que je
> l'enregistre sans la modifier pour qu'elle apparaisse ensuite dans la
> liste de la page de catégorie.
>
> Je pense donc que l'enregistrement de la page met à jour d'autres
> informations que la page elle-même, et en rapport avec les listes de
> catégories.
>
> J'ai remarqué que, suite à l'enregistrement, il était apparu plusieurs
> champs dans la page, dont un champ targets= qui liste les pages de
> catégories et de trail. J'ai ajouté ce champ dans toutes les pages
> importées, mais cela n'a rien réglé.
>
>
> Mon problème me semble être soit d'automatiser la séquence
> ouverture/enregistrement pour chaque page (ce me semble un palliatif),
> soit de créer directement les informations nécessaires pour que les
> catégories fonctionnent (mais je n'ai pas encore trouvé les infos).
>
>
> Pour l'automatisation, j'ai essayé un traitement sur chaque page pour
> ouvrir puis réenregistrer en utilisant cette recette :
> http://www.pmwiki.org/wiki/Cookbook/GlobalOperations
>
> Je rencontre deux problèmes :
>
> 1) la fonction WritePage($pagename, $page) semble se contenter de
> réécrire la page seule.
> J'ai vu ensuite sur http://www.pmwiki.org/wiki/PmWiki/Functions qu'il
> existait une fonction UpdatePage mais un premier essai n'a pas été
> concluant (à confirmer).
> Question : est-ce bien UpdatePage qu'il faut utiliser, ou existe-t'il une
> autre fonction pour mettre à jour ce qui concerne les catégories ?
>
> 2) le script est interrompu par un time-out en cours de fonctionnement.
> Là, je pourrai temporairement donner un coup de tournevis.
>
>
> Je n'aime pas beaucoup l'idée de faire tourner un script PHP sur toutes
> les pages. Je préfèrerais compléter la moulinette qui a créé les
> pages pour qu'elle fasse aussi ce qu'il faut pour que les listes de
> catégories fonctionnent. Mais je sèche un peu...
>
> Merci donc pour toutes les pistes, y compris des approches différentes,
> pour procéder à cette importation avec catégories.
>
> Amicalement,
>
> Michel
>

Dans la v2.2.0b63, pmwiki.php(1530-...):

## UpdatePage goes through all of the steps needed to update a page,
## preserving page history, computing link targets, page titles,
## and other page attributes.  It does this by calling each entry
## in $EditFunctions.  $pagename is the name of the page to be updated,
## $page is the old version of the page (used for page history),
## $new is the new version of the page to be saved, and $fnlist is
## an optional list of functions to use instead of $EditFunctions.
function UpdatePage(&$pagename, &$page, &$new, $fnlist = NULL) {
...

J'aurais donc tendance à dire qu'il "suffirait" donc (en se basant sur
Cookbook/GlobalOperations), d'utiliser quelque chose comme ce qui suit
pour passer sur toutes les pages (code non testé):

  if ($action=='foo_all') {
    Lock(2);
    $page = RetrieveAuthPage($pagename, "admin");
    if (!$page) { Abort("?admin password required"); }
    $pagelist = $WikiDir->ls();

    global $EnablePost, $EditFunctions;
    $EnablePost = true;
    $fnlist = array_unshift($EditFunctions, "MyPageOperation");

    foreach($pagelist as $pagename) {
      echo "$pagename\n";
      $page = ReadPage($pagename);
      $new = $page;

      UpdatePage($pagename, $page, $new, $fnlist);

    }
    exit;
  }

  function MyPageOperation($pagename, &$page, &$new) {
    global $EnablePost, $IsPagePosted;

    ### Do something with $page...
    ### ...and put the result in $new.
  }

La fonction "MyPageOperation" pouvant être chargée d'appliquer un
traitement spécifique. A noter qu'idéalement la fonction devra:

* prendre en compte le "time-out" de temps d'excution dépassé si le
nombre de page à traiter est grand,

* être capable de sauter les pages déjà traitée lors d'une reprise
d'un traitement interrompu.

-- 
Dominique



Plus d'informations sur la liste de diffusion pmwiki-users-fr