We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 34078
    • 76 Posts
    Bonjour à tous,

    Peut on personnaliser la génération des alias sous Revo (2.1.0-RC3) ? Je m’explique :

    Je souhaite pouvoir créer des ressources au même niveau portant le même pagetitle. Par exemple, 2 articles s’intitulant "Le beaujolais nouveau est arrivé" dans la rubrique "Vin". grin
    Or, comme je souhaite aussi que MODx me génère de belles Friendly URLs, il m’interdit d’avoir plusieurs ressources avec le même alias.

    Le plus simple serait de rajouter dans l’alias l’ID de la ressource pour avoir des alias du style : /vin/1-le-beaujolais-nouveau-est-arrive.html et /vin/2-le-beaujolais-nouveau-est-arrive.html
    J’ai bien pensé à générer des alias à l’aide d’un plugin lors du OnBeforeDocFormSave mais lorsqu’il s’agit de nouvelle resource, elle n’a pas encore d’ID.

    A la limite, à la place de l’ID on peut se servir de uniqid() ou alors de date() mais là où ça coince encore plus c’est que MODx vérifie l’alias avant même le OnBeforeDocFormSave.

    Une idée ? Quelqu’un a t’il déjà rencontré ce problème ?
    • Bonjour .ben,

      La lecture d’une api n’est pas mon fort, mais peut-être que http://api.modxcms.com/modx/modResource.html#cleanAlias te parlera plus qu’à moi.
      Tu pourrais également jeter un oeil à translit qui agit sur les alias.

      N’hésites pas à nous tenir informés de tes progrès éventuels wink
        • 34078
        • 76 Posts
        J’ai regardé du coté de cleanAlias. Cette fonction transforme une chaine de caractère en URL mais cette chaine de caractère peut aussi bien être le pagetitle de la ressource que son alias s’il existe. Alors même si je rajoute dans cette fonction un uniqid() à l’alias, à chaque fois que sera appelée cette fonction (c’est à dire lors de la creation, modification, duplication d’une ressource) un nouvel uniqid() sera ajouté à l’alias et je me retrouve avec des alias du style : /test-4dbbd86f0699b-4dbbd877a53ba-4dbbd945e1cc9 .

        En fait il faut s’intéresser à la fonction getAliasPath qui génère les URI des ressources. Il faut remplacer
        $fullAlias= $aliasPath . $fullAlias . $extension;

        par
        $fullAlias= $aliasPath . $fullAlias . '-' . uniqid() . $extension;


        Seulement celà implique de toucher au core de MODx et à la prochaine mise à jour, je l’ai dans l’os !! undecided
        Y a t’il un moyen de faire ça proprement ?

        • Creé un plugin sur l’evenemement ’OnDocFormSave’, et rajoute le nouvel id a l’alias de la nouvelle resource.
          Cela suppose bien entendu que la création d’alias automatique est activée.

          <?php
          if($modx->event->name == 'OnDocFormSave'){
          	if($mode == 'new'){
          		$alias = $resource->get('alias');
          		$newAlias = $id.'-'.$alias;
          		$resource->set('alias', $newAlias);
          		$resource-save();
          	}
          }
          


          Code non testé (pas sur si le propriétés sont directement accessible ou via $scriptProperties).
          Ceci dit, ça peut être une bonne piste si tu ne veux pas toucher au core.

          Doc sur l’evenement : http://rtfm.modx.com/display/revolution20/OnDocFormSave
            • 34078
            • 76 Posts
            Merci lossendae mais j’avais déjà tenté quelque chose dans ce gout là et ça pose 2 problème :

            • Pour les nouvelles ressources, la variable $id est égale à 0
            • MODx vérifie les doublons d’alias avant le OnDocFormSave et même avant le OnBeforeDocFormSave
            • Bien vu (en plus c’est écrit dans la doc)

              Essaie de remplacer:

              $newAlias = $id.’-’.$alias;

              par

              $newAlias = $resource->get(’id’).’-’.$alias;

              Normalement, ça devrait fonctionner puisque l’événement est lancé une fois la resource sauvée (Fires after a Resource is saved in the manager via the editing form.).

              Edit:
              J’ai relis ton post, en effet ça peut poser probleme avec les alias automatique.

              Ceci dit tu peux quand même y arriver:

              Désactive la création automatique d’alias et garde le plugin.
              Puis copie la function qui permet de générer des alias.

              <?php
              function generateAlias($title, $id){
              	// Copie de la function de création d'alias de MODx
              	// + Ton traitement spécifique
              	return $alias
              }
              
              if($modx->event->name == 'OnDocFormSave'){
              	if($mode == 'new'){
              		$alias = generateAlias($resource->get('pagetitle'),  $resource->get('id'));
              		$resource->set('alias', $alias);
              		$resource-save();
              	}
              }
              


                • 34078
                • 76 Posts
                Ah ! Ca marche ! grin

                En fait, ça bloquait parce que MODx vérifie les alias avant le OnDocFormSave et donc à chaque fois que je créais une ressource qui s’appelait "test" il trouvait une ancienne ressource test dont l’alias était déjà test.

                Pour être clair, si je créé une ressource test, MODx va l’enregistrer avec l’alias test puis faire appel au plugin, changer l’alias en test-123 et enfin la réenregistrer.

                Pour que ça marche, il faut que tous les alias soient construits sur ce modèle.

                Voici le code du plugin :

                <?php
                $eventName = $modx->event->name;
                switch($eventName) {
                  case 'OnDocFormSave':
                    if(!isset($_REQUEST['alias']) || empty($_REQUEST['alias'])) // Permet de conserver les alias personalises (ex : sitemap)
                    {
                      $alias = $resource->get('alias').'-'.$resource->get('id'); // Finalement j'ai mis l'ID a la fin, c'est peut etre mieux au niveau SEO
                      $resource->set('alias', $alias);
                      $resource->save();
                    }
                  break;
                }


                Meci lossendae pour ton aide.

                EDIT : ce plugin marche avec la création automatique des alias
                  • 34078
                  • 76 Posts
                  Et voici le snippet permettant de regénérer les alias et uri des ressources existantes :

                  <?php
                  $c = array(
                    'isfolder' => 0 // Dans mon cas, je ne modifie pas les conteneurs, je prefere conserver leurs alias.
                  );
                  $resources = $modx->getCollection('modResource', $c);
                  foreach($resources as $resource)
                  {
                    $resource->set('alias', $resource->cleanAlias($resource->get('pagetitle')).'-'.$resource->get('id'));
                    $resource->set('uri', $resource->getAliasPath($resource->get('alias')));
                    $resource->save();
                  }