pntitle avec PNzClassifieds  Début

  • bonjour,
    Aprés avoir installé le fichier pnTitle.php dans le includes à la racine du site et modifié le header comme indiqué à la pagehttp://www.miragelab.com/modules.php?op=modload&name=News&file=index&catid=&topic=10
    une fatal error s'affiche ligne102 au niveau du pnModTitle.
    aprés plusieurs essais, je ne réussis pas à modifier l'erreur.Peut être cela vient-il de mon header car j'utilise pnmeta?
    Aurriez vous une piste s'il vous plait?
    cordialement
    Tunsia
    http://www.switchezvosmaisons.com/
  • Bonjour,
    Quelle version de Postnuke/Zikula utilisez vous ?
    Avec les dernières versions, il n'y a qu'à remplacer le fichier modules/Xanthia/plugins/function.title.php par le nouveau inclus et c'est tout inutile de modifier quelquechose dans includes.
    Je n'ai pas d'expérience avec pnMeta.
  • J'utilise le version 764 de postnuke mais mon theme est extralite (il me semble que ce n'est pas un theme xanthia).
    merci
  • Aucune importance !! Que ton thème soit ou pas un thème Xanthia çà marche quand même car si ton thème est Xanthia, tu auras

    Code

    <!--[title]-->

    dans le template du thème qui appelera ton plugin et c'est bon
    Et si ton thème n'est pas Xanthia il utilisera le module Header_Footer pour s'afficher or dans modules/Header_Footer/templates si tu regardes dans le fichier header_footer_page.htm tu verra qu'il y a aussi

    Code

    <!--[title]-->

    donc çà marchera aussi !!
    C'est là toute l'astuce mise au point par Mark West, malheureusement le site que tu as cité dans ton premier message soit n'a rien compris soit date de la préhistoire de PostNuke.
    Mais ce qui m'étonne c'est que tu sois arrivé à suivre leurs conseils car mon header.php contient juste

    Code

    if (eregi('header.php', $_SERVER['PHP_SELF'])) {
        die ('You can\'t access this file directly...');
    }

    function head()
    {
        if (!isset($GLOBALS['xanthia_theme'])) {
            // load header module
            ob_start();
        }

        // call theme header
        themeheader();
    }

    head();

    ?>

  • Code

    if (eregi('header.php', $_SERVER['PHP_SELF'])) {
        die ('You can\'t access this file directly...');
    }

    function head()
    {
        if (!isset($GLOBALS['xanthia_theme'])) {
            // load header module
            ob_start();
        }

        // call theme header
        themeheader();
    }
    /************ pnMeta *****************************/
        if (pnModAvailable('pnmeta')) {
          //Load user API
          pnModLoad('pnmeta', 'user');
          $page_infos =  pnModFunc('pnmeta', 'user', 'getpageinfos');
          if(is_array($page_infos)) {
                foreach($page_infos as $c) {
                    $page_title = $c['pagetitle'];
                    $metatags = $c['words'];
                    $page_description = $c['description'];
                }
            }
        }
    /************ End pnMeta *****************************/

    /**********************************************************/
        if ($artpage==1)
        {
        /**
         * article page output
         */

            global $info, $hometext;
            echo "<title>$info[title] :: ".pnConfigGetVar('sitename').' :: '.pnConfigGetVar('slogan')."</title>\n";
            if (pnConfigGetVar('dyn_keywords') == 1) {
               $htmlless = check_html($info['maintext'], $strip ='nohtml');
               $symbolLess = trim(ereg_replace('("|\?|!|:|\.|\(|\)|;|\\)+', ' ', $htmlless));
               $keywords = ereg_replace('( |'.chr(10).'|'.chr(13).')+', ',', $symbolLess);
               $metatags = ereg_replace(",+", ",",$keywords);
               echo "\n";
            } else {
               echo "\n";
               
               //moved for pnMeta
               echo '\n";
            }
        } else {
            /**
            * all other page output
            */
            /********* pnMeta ***************/
            echo "<title>";    
        echo pnConfigGetVar('
    sitename');
        if(isset($page_title)) echo " :: $page_title";
        if(pnConfigGetVar('
    slogan') != "") echo " :: ".pnConfigGetVar('slogan')."";
        echo "</title>\n";
           
        if(isset($metatags))
            echo "\n";
        else
            echo '
    \n";
        if(isset($page_description))
            echo '\n"
    ;
        else
            echo '\n";
        /******************************/   
           
            //old
            //echo '
    <title>'.pnConfigGetVar('sitename').' :: '.pnConfigGetVar('slogan')."</title>\n";
            //echo '
    \n";
        }
       
        //deleted  for pnmeta
        //echo '\n"
    ;
    /**********************************************************/    

    head();

    ?>



    merci pour ta réponse, plus haut mon fichier header.php pour faire fonctionner pnmeta.
    Le problème c'est qu'avec ce code pntitle ne fonctionne pas.
    Je suis pas assez doué en code pour bidouiller le fichier. il y a plantage systhématique.
    Le site citè est la seule source d'information que j'ai pu trouvé pour rendre compatible pnmeta et pntitle.
    Pourquoi pnmeta ?
    parce que mon site est multilingue et c'est le seul module que j'ai trouvé pour faire un référencement multilingue.
    Le setting de postnuke ou on note les metas n'est pas multilingue.
    Mais peut être aurais tu une méthode et des modules de référencement pour site multilingue ?
    cordialement
  • Si tu regarde l'affichage de ton code ci-dessus on voit bien au moins une erreur grâce aux couleurs (il y en a peut être d'autres)
    la ligne

    Code

    echo '\n";


    devrait être

    Code

    echo "\n";


    Mais tu ne devrais pas faire çà : ce header bidouillé a été fait pour une vieille version de PostNuke (à mon avis avant la .750) et même si tu finis par le faire "marcher" tu casse tout le fonctionnement normal de PostNuke .764 en faisant çà.
    Dis moi précisément ce que tu veux faire et on trouvera un moyen plus propre.
    Si je comprend bien le fonctionnement de pnMeta, tu definis dans l'Administration les headers title, meta et description
    (mais alors je me demande pourquoi tu as aussi besoin de titlehack puisqu'il semble y avoir un title dans pnMeta ?)
    Si j'arrive à comprendre le fonctionnement en détail, il devrait être possible d'écrire un petit plugin pnRender qui marche aussi bien avec les thèmes Xanthia que les non-Xanthia et sans être obligé de modifier header.php
  • Bon je n'ai pas pu résister ! Avant d'aller dormir j'ai écrit un peu de code et je t'ai fait un petit téléchargement http://www.vedrine.net/module-Downloads-display-lid-36.html avec 3 plugins pnRender à mettre dans modules/Xanthia/plugins pour remplacer ceux existants
    Ensuite tu remet ton header d'origine de PostNuke .764 et tu me dis si çà marche et si çà te convient.
    Je n'ai pas fait beaucoup de tests mais sur mon site de test ça a bien l'air de marcher pour les headers keywords , description et title.
  • Merci beaucoup de t'être penché sur ma question, tu as tout à fait cerné le problème pnMeta ne gère que les balises title, keywords et description par module et non pas pour chaque page, du coup chaque page générée par un même module porte le même title, keywords et description.
    Ce qui engendre un duplicate title qui pénalise le référencement.
    mon site en 6 langues à besoin de tout ce panel different pour être vu. Une seule description et une liste unique de keywords est trop juste pour un site de ce type.
    Le but est donc bien précisément d'avoir des metas personalisés pour chaque langue.
    Je télécharge les plugins et te tiens au courant du résultat.
    Mais au fait! dois je désinstaller pnMeta?
    cordialement
  • C'est génial icon_lol tout fonctionne trés bien ! GRAND MERCI ! pour cette réussite !

    J'ai encore une petite question qui me turlupine:
    Dans la barre de navigation apparait le titre du site, le titre de la page, mais au milieu d'ou vient la variable?
    exemple pour moi sur la page http://www.switchezvosmaisons.com/PN_zClassifieds-detail-cat-24-de-28.html j'ai switchezvosmaisons.com::Echange de maisons - Appartement 2 adultes et 1 enfant.
    Comment est récupéré "Echange de maisons" je ne le trouve nul part icon_confused
    D'autre part dans ton premier message tu me demandais comment j'avais pu faire fonctionner pnMeta.
    En me repenchant sur la chose, j'avais enlevé

    Code

    <title><!--[title]--></title><meta name="Description"<meta name="Keywords"


    du fichier /themes/ExtraLite/templates/modules/Header_Footer/header_footer_page.htm
    D'ailleurs pour que tes plugins fonctionnent j'ai du le remettre le fichier d'origine (c'est tout de même plus clean).
    Ce qui à soulevé une nouvelle intérogation de ma part:
    J'ai 2 fichiers header_footer_page.htm un dans /themes/ExtraLite/templates/modules/Header_Footer/header_footer_page.htm, l'autre dans modules/Header_Footer/templates.
    Etrange non !? ou est ce normal ?
    Ceci étant cela n'affecte pas le fonctionnement.
    Encore merci et bravo icon_wink
    cordialement A bientôt.
  • Bon alors je t'explique comment est fait le titre d'une page pour le module PN_zClassifieds, c'est facile, je suis l'auteur du fichier icon_wink et cela pourra te servir à le personnaliser.
    Le fichier est modules/PN_zClassifieds/pntitle.php

    Code

    list($catid, $adid) = pnVarCleanFromInput('cat', 'de');


    on récupère les variables car et de, comme ladresse de ta page est :
    http://www.switchezvosmaisons.com/PN_zClassifieds-detail-cat-24-de-28.html
    la variable $catid va contenir 24 et la variable $adid va contenir 28

    Code

    list($dbconn) = pnDBGetConn();
        $pntable = pnDBGetTables();
       
        if ($adid && $catid) {
            $prefix = pnConfigGetVar('prefix');
            $sql = "SELECT a.subject FROM {$prefix}_classifieds_ads a WHERE a.ad_id = '" . (int)pnVarPrepForStore($adid) ."'
            AND a.cat_id='"
    . (int)pnVarPrepForStore($catid) . "'";
            $result = $dbconn->Execute($sql);
            if ($dbconn->ErrorNo() != 0) {
                return false;
            }
            list($title) = $result->fields;
            $result->Close();
            return pnConfigGetVar('sitename') . ' :: ' . _TITLECLASSIFIEDS . ' - '. pnVarPrepForDisplay($title);    
        }


    C'est le premier cas celui où il y a à la fois un numéro d'annonce dans $adid et un numéro de catégorie dans $catid, on fait une requête dans la base de données pour récupéper le totre de l'annonce dans l'annonce et si tu regarde bien la ligne :

    Code

    return pnConfigGetVar('sitename') . ' :: ' . _TITLECLASSIFIEDS . ' - '. pnVarPrepForDisplay($title);


    Tu vois que le titre est fait de 3 parties :
    - le nom du site
    - la constante _TITLECLASSIFIEDS qui vient du fichier lang
    - le titre del'annonce
    Donc tu as ta réponse, Echange de maisons vient de ton fichier lang !!
    Je passe à la suite, le deuxième cas celui où on est sur une page où il n'y a qu'un numéro de catégorie (par exemple sur ton site http://www.switchezvosmaisons.com/PN_zClassifieds-index-cat-24.html
    Dans ce cas le code qui sert est

    Code

    if ($catid) {
            $prefix = pnConfigGetVar('prefix');
            $sql = "SELECT cat_name FROM {$prefix}_classifieds_category WHERE root_id = '" . (int)pnVarPrepForStore($catid) ."'";
            $result = $dbconn->Execute($sql);
            if ($dbconn->ErrorNo() != 0) {
                return false;
            }
            list($title) = $result->fields;
            $result->Close();
            return pnConfigGetVar('sitename') . ' :: ' . _TITLECLASSIFIEDS . ' - '. pnVarPrepForDisplay($title);    
        }


    Cette fois ci la requête à la base de données sert à récupérer le nom de la catégorie.
    Exercice (Je suis prof donc après le cours, les exercices !!)
    Supposons que dans le cas d'une annonce je veuille que le titre de la page soit de la forme :
    Nom du site :: Nom de la catégorie - Titre de l'annonce
    Par exemple pour ta page http://www.switchezvosmaisons.com/PN_zClassifieds-detail-cat-24-de-28.html
    Je voudrais que le titre soit :
    switchezvosmaisons.com ::Appartements, Studios - Appartement 2 adultes et 1 enfant
    Est-ce possible ? Oui bien sûr
    La solution "amateur" consiste si on n'est pas au top en langage sql à combiner les 2 bouts de code ci-dessus pour récupérer à la fois le nom de la catégorie et le titre de l'annonce, mais c'est un peu du gaspillage car c'est dommage de faire 2 requêtes, on peut en faire une seule

    Code

    list($dbconn) = pnDBGetConn();
        $pntable = pnDBGetTables();
       
        if ($adid && $catid) {
            $prefix = pnConfigGetVar('prefix');
            $sql = "SELECT a.subject, b.cat_name FROM {$prefix}_classifieds_ads a, {$prefix}_classifieds_category b WHERE a.ad_id = '" . (int)pnVarPrepForStore($adid) ."'
            AND a.cat_id=b.root_id AND b.root_id ='"
    . (int)pnVarPrepForStore($catid) . "'";
            $result = $dbconn->Execute($sql);
            if ($dbconn->ErrorNo() != 0) {
                return false;
            }
            list($title, $catname) = $result->fields;
            $result->Close();
            return pnConfigGetVar('sitename') . ' :: ' . pnVarPrepForDisplay($catname) . ' - '. pnVarPrepForDisplay($title);    
        }


    Et voila un beau titre bien significatif.
    Je suis tellement content de ma modif que je viens de l'installer sur mon site.
    Si tu as du mal à modifier le fichier ou du mal à me suivre écris moi à vedrine _AT_ vedrine _DOT_ net et je t'enverrai le fichier pntitle modifié.
  • bonjour JM,
    je souhaiterai remplacer dans ce dernier code

    Code

    return pnConfigGetVar('sitename') . ' :: ' . pnVarPrepForDisplay($catname) . ' - '. pnVarPrepForDisplay($title);    
        }

    "return pnConfigGetVar('sitename') ." par la constante " . _TITLECLASSIFIEDS . " est ce possible?
    aprés essai de

    Code

    return ' . _TITLECLASSIFIEDS . ' :: ' . pnVarPrepForDisplay($catname) . ' - '. pnVarPrepForDisplay($title);

    je constate que cela ne fonctionne pas pourrais tu m'indiquer d'ou vient l'erreur?
    cordialement
  • Bonjour,
    Aprés recherche, j'ai pu trouver la solution:

    Code

    return pnVarPrepForDisplay($title) . ' :: ' . pnVarPrepForDisplay($catname) . ' - ' . _TITLECLASSIFIEDS;    
        }


    A priori, ça fonctionne icon_smile
    cordialement
  • 13 visiteurs

Données pour les 15 dernières minutes