Forums Développement Multimédia

Aller au contenu

Des RFE pour l'indexation des sites Silex ?

CMS Silex

15 réponses à ce sujet

#1 Żabojad

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 114 messages

Posté 17 March 2010 - 18:37 PM

Hello,

J'ai quelques remarques sur l'indexation des sites Silex qui pourraient éventuellement faire l'objet d'améliorations. Il ne s'agit de rien de prétentieux mais juste quelques points, rencontrés lors de la réalisation de mon premier site Silex, qui ne m'ont pas parus optimales :

1 - J'ai remarqué que les balises meta <title> et <meta http-equiv="description"> des pages d'un site Silex contiennent toujours la même chose, et ce quelque soit la page où l'on se trouve. Pour ce qui est de la balise description, elle contient les descriptions des éléments du calque "start" seulement. La balise titre ne contient que la valeur du champs htmlTitle du conf.txt (que l'on saisi dans les propriétés de son site silex dans le manager), sans contenir le nom de la page courante (nom de l'icone du calque courant).

Ça n'est pas un bug, mais selon les best practices recommandées en matière de SEO (sources), il serait plus efficace et pertinent pour un référencement plus fin d'avoir une balise <title> et une description uniques pour chaque page (soit basée sur les éléments contenus dans chaque page, soit en ayant la possibilité de choisir arbitrairement le contenu de ces balises pour chaque page).


2 - Deuxième point, qui serait plus lourd à implémenter, serait de changer système actuel d'indexation des sites Silex. Actuellement, il est nécessaire de lancer manuellement la fonctionnalité d'indexation (via le manager) après chaque modification du site. C'est un peu "lourd", et ça ne marche pas toujours chez les hébergeurs (chez le mien par ex).

Autre problème, tous les contenus dynamiques (récupérés via les composants oof par exemple) ne sont pas indexés alors qu'ils peuvent parfois représenter les informations les plus importantes qu'un site contient...

Si une version 2.0 de Silex devait sortir (ce dont je ne doute pas ^^), je pense qu'il serait génial qu'elle ait un nouveau système d'indexation du contenu, prenant en compte contenu dynamique et statique, et étant complètement automatisé (instantané même, de par son design...).


a+

#2 _lex

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 1016 messages

Posté 19 March 2010 - 12:26 PM

Salut Zabojad

Je suis en plein débugage, donc tes remarques tombent bien. Je vais voir si je peux les intégrer dans la v1.5.4 sur laquelle je bosse.

Le problème que je vois c'est que dans une page il y a des images, des textes etc. Et que si on colle tous les textes dans description c'est chaud

Je regarde ce que je peux faire...

Autre problème, tous les contenus dynamiques (récupérés via les composants oof par exemple) ne sont pas indexés alors qu'ils peuvent parfois représenter les informations les plus importantes qu'un site contient...

Dans le cas des listes remplies "a la main" comme dans le tuto sur les menus oof (voir ici), les pages sont bien indexées

#3 _lex

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 1016 messages

Posté 19 March 2010 - 12:36 PM

Pour les composants oof, je viens de me rendre compte que la classe d'indexation indexe le composants comme ceci :

si un composant ajoute un attribut className à l'objet seoObject lorsque silex appelle UiBase::getSeoData (dans le code ActioonScript du composant), l'indexation crée la classe [className] qui doit être dans cgi/services/[className].php
c'est le cas du dataselecteur, qui met ce qui est dans source dans className

a+

#4 _lex

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 1016 messages

Posté 19 March 2010 - 13:22 PM

ok alors voila ce que j'ai fait
- title = website title (conf.txt) + start page name + current page name
- description = website title (conf.txt) + all the descriptions of the medias on the current page (property "description" of the medias in Silex WYSIWYG)
- keywords = all the tags of the medias on the current page (property "tags" of the medias in Silex WYSIWYG) + website keywords (conf.txt) + start page name + current page name
- content-language = default language (conf.txt)
- Generator = Silex + version
- dans la page (dans <noembed>) = page keywords + website Keywords + HTML EQUIVALENT of the page

#5 Żabojad

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 114 messages

Posté 20 March 2010 - 17:53 PM

lexa a écrit:Pour les composants oof, je viens de me rendre compte que la classe d'indexation indexe le composants comme ceci :

si un composant ajoute un attribut className à l'objet seoObject lorsque silex appelle UiBase::getSeoData (dans le code ActioonScript du composant), l'indexation crée la classe [className] qui doit être dans cgi/services/[className].php
c'est le cas du dataselecteur, qui met ce qui est dans source dans className

a+


Salut Lexa,

Cette partie m'intéresse particulièrement mais je ne suis pas sur de comprendre ce que tu as écrit : est-ce qu'il s'agit d'un mécanisme qui permet d'indexer les données dynamiques (stoquées en base ou dans un fichier par exemple, et récupérées via un connector+selector) ?

Quand tu dis "l'indexation crée la classe [className]", tu veux dire "instancie" ?

J'ai fait un petit test : dans mon site Silex, j'ai une galerie implémentée avec deux connectors et un selector pour chacun. Mon premier selector est lié à un database connector et donc a déjà la propriété source définie (le nom de la table dans lequel il va lire). J'ai donc créé dans cgi/services/ le fichier dossiers.php ("dossiers" est le nom de ma table) contenant simplement :

Code: Tout sélectionner
<?php
class dossiers
{

   // ***********
   // constructor
   function dossiers()
   {
      echo "TEST REUSSI <br />";
   }
   
}

J'ai ensuite ré-indexé mon site et vérifié le contenu de ma galerie lorsque j'y accède sans javascript (j'utilise lynx pour tester) mais rien n'a changé (pas de texte "TEST REUSSI <br />" ajouté à ma page)...

Pourrais-tu m'éclairer sur le fonctionnement de ce point particulier ?

Merci d'avance
a+

#6 Żabojad

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 114 messages

Posté 20 March 2010 - 18:11 PM

lexa a écrit:ok alors voila ce que j'ai fait
- title = website title (conf.txt) + start page name + current page name
- description = website title (conf.txt) + all the descriptions of the medias on the current page (property "description" of the medias in Silex WYSIWYG)
- keywords = all the tags of the medias on the current page (property "tags" of the medias in Silex WYSIWYG) + website keywords (conf.txt) + start page name + current page name
- content-language = default language (conf.txt)
- Generator = Silex + version
- dans la page (dans <noembed>) = page keywords + website Keywords + HTML EQUIVALENT of the page


excellent ^^ !

#7 _lex

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 1016 messages

Posté 20 March 2010 - 18:49 PM

salut

Quand tu dis "l'indexation crée la classe [className]", tu veux dire "instancie" ?

> oui exactement

Mon premier selector est lié à un database connector et donc a déjà la propriété source définie (le nom de la table dans lequel il va lire).

je croiyais que dans source du data selector il devait y avoir le nom du service non?
normalement, le script qui sera instancié devrait être le service amfphp qui est utilisé par le connector. tu ne devrais pas avoir a créer une nouvelle classe en fait. ton DataSelector, il ouvre une page? c'est une icone?

#8 Żabojad

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 114 messages

Posté 20 March 2010 - 23:16 PM

lexa a écrit:je croiyais que dans source du data selector il devait y avoir le nom du service non?


Nop ^^, le nom du service se trouve dans la propriété "serviceName" du connector. En tout cas en OOF 1.2, c'était peut-être différent dans les versions précédentes.

La propriété source du selector doit bien spécifier le nom de la table, dans le cas où tu utilises un database connector.

Du coup je me pose la question, l'indexation instancierait donc le service lié au connector mais que se passe-t-il ensuite ? est-ce qu'elle appelle une autre méthode du service (implémentation custom dans chaque cas) qui récupérerait par exemple les données dynamiques à indexer ?

#9 _lex

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 1016 messages

Posté 21 March 2010 - 17:05 PM

Alors en fait c est assez simple...

Concidérons que ton selector est lié a un connector et à une liste, et qu'il est un icone.

Toute l'indexation se passe dans "silex_server/cgi/includes/silex_search.php", dans la methode "indexComponent", ligne 386

silex instancie la classe du service amfphp dont le nom est dans serviceName
Code: Tout sélectionner
// include the component's server side script
$componentScriptFile=ROOTPATH.self::componentClassFolder.$player[self::seoClassNameComponentTag].".php";
(...)
include_once($componentScriptFile);
(...)
// instanciate the component's serverside class
$componentClass=new $player[self::seoClassNameComponentTag];

Récupération des paramètres du sélecteur
Code: Tout sélectionner
if(isset($player[self::seoComponentParamsComponentTag][self::seoResultContainerComponentTag]))
   $_resultContainerPath=$player[self::seoComponentParamsComponentTag][self::seoResultContainerComponentTag];
   
if(isset($player[self::seoComponentParamsComponentTag][self::seoFormNameComponentTag]))
   $formName=$player[self::seoComponentParamsComponentTag][self::seoFormNameComponentTag];
   
if(isset($player[self::seoComponentParamsComponentTag][self::seoIdFieldComponentTag]))
   $idField=$player[self::seoComponentParamsComponentTag][self::seoIdFieldComponentTag];
   
if(isset($player[self::seoComponentParamsComponentTag][self::seoLimitComponentTag]))
   $limit=$player[self::seoComponentParamsComponentTag][self::seoLimitComponentTag];
   
if(isset($player[self::seoComponentParamsComponentTag][self::seoTemplateComponentTag]))
   $template=$player[self::seoComponentParamsComponentTag][self::seoTemplateComponentTag];
   
if(isset($player[self::seoComponentParamsComponentTag][self::seoOffsetComponentTag]))
   $offset=$player[self::seoComponentParamsComponentTag][self::seoOffsetComponentTag];
   
if(isset($player[self::seoComponentParamsComponentTag][self::seoOrderByComponentTag]))
   $orderBy=$player[self::seoComponentParamsComponentTag][self::seoOrderByComponentTag];
   
if(isset($player[self::seoComponentParamsComponentTag][self::seoSelectedFieldNamesComponentTag]))
   $selectedFieldNames=$player[self::seoComponentParamsComponentTag][self::seoSelectedFieldNamesComponentTag];
   
if(isset($player[self::seoComponentParamsComponentTag][self::seoWhereClauseComponentTag]))
   $whereClause=$player[self::seoComponentParamsComponentTag][self::seoWhereClauseComponentTag];
   
if(isset($player[self::seoComponentParamsComponentTag][self::seoSelectedFieldNamesComponentTag]))
   $selectedFieldNames=$player[self::seoComponentParamsComponentTag][self::seoSelectedFieldNamesComponentTag];
   
if(isset($player[self::seoComponentParamsComponentTag][self::seoDeeplinkFormatComponentTag]))
   $deeplinkFormat=$player[self::seoComponentParamsComponentTag][self::seoDeeplinkFormatComponentTag];


En particulier, la $template est le nom de la page ouverte par le sélecteur et $whereClause la propriété whereClause du sélecteur. Ces paramètres peuvent contenir des accesseurs. Donc on les traduits en valeurs :
Code: Tout sélectionner
$whereClause=$this->revealAccessors($whereClause,$dataContainer_array);
$template=$this->revealAccessors($template,$dataContainer_array);


Ensuite silex appelle la methode getRecords avec les params du selector
Code: Tout sélectionner
$dynData=$componentClass->getRecords($formName,$selectedFieldNames,$whereClause,$orderBy,$limit,$offset);


Enfin on indexe toutes les pages qui peuvent être ouvertes par le selector : pour chacun des enregistrement retournés par getRecords, on appelle getSingleRecord et on indexe une nouvelle page. Si cette dernère contient des accesseurs, ils seront "résolus" avec les valeurs retournées par getSingleRecord.
Code: Tout sélectionner
// index each results
if ($dynData)
   foreach ($dynData as $element) {
      //$this->logger->debug("silex_search.php indexComponent getRecords returned ".print_r($element,true));
      if ($this->logger) $this->logger->debug("silex_search.php indexComponent - about to call getSingleRecord. params : $_resultContainerPath , $deeplinkFormat , $template , $idField");
      if ($_resultContainerPath){
         // store the data from getRecords call
         foreach ($element as $tmp_key => $tmp_value)
            $dataContainer_array[$_resultContainerPath.".".$tmp_key]=$tmp_value;
         
         // call getSingleRecord
         $tmp_array=$componentClass->getSingleRecord($formName,$element[$idField]);
         // add results to dataContainer_array
         if ($tmp_array)
            foreach ($tmp_array as $tmp_key => $tmp_value)
               $dataContainer_array[$_resultContainerPath.".".$tmp_key]=$tmp_value;
               
         //$this->logger->debug("silex_search.php indexComponent - getSingleRecord returned ".print_r($dataContainer_array,true));
         // get deeplink
         // deeplink accessor is relative to resultContainerPath (<<name>> should be interpreted as <<gsmDataContainer.dbdata_gsm.name>>)
         $deeplink=$deeplinkSection.$this->revealAccessors($deeplinkFormat,$dataContainer_array,$_resultContainerPath);
      }
      $index=$this->indexFilesRecursively($websiteContentFolderPath,$template,$index,$dataContainer_array,$deeplink);
   }


#10 Żabojad

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 114 messages

Posté 24 March 2010 - 12:25 PM

Salut Lexa,

Désolé de ne répondre que maintenant, je travaillais sur autre chose...

Merci pour cette réponse détaillée. Laisse-moi tester ça de mon côté et revenir vers toi si j'ai encore des questions.

Tu as l'air de dire que l'indexation ne fonctionnerait que si le selector est un icône (et donc qu'à chaque fois que je clique sur un choix de la liste, ça m'ouvre une nouvelle page, c'est ça ?).

Est-ce que l'indexation des données dynamiques (selector+connector+liste) ne fonctionne pas si le selector n'est pas un icône ?

a plus tard

?abojad

#11 _lex

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 1016 messages

Posté 24 March 2010 - 12:43 PM

Tu as l'air de dire que l'indexation ne fonctionnerait que si le selector est un icône (et donc qu'à chaque fois que je clique sur un choix de la liste, ça m'ouvre une nouvelle page, c'est ça ?).

> oui c est ce que je voulqis dire
Est-ce que l'indexation des données dynamiques (selector+connector+liste) ne fonctionne pas si le selector n'est pas un icône ?

> en fait je n'en suis pas sur mais je pense... une page ouverte par le selecteur c'est un peu comme une template qui affiche des données dynamiques à l'aide des accesseurs. C'est + simple que d'utiliser les actions avec un selecteur

#12 Żabojad

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 114 messages

Posté 24 March 2010 - 14:38 PM

Je viens d'essayer de mettre un selector en icône avec pour "nom de la page" la valeur "<<id>>". Le selector est lié avec un database connector.

Lors de la navigation, si je clique sur un choix de la liste liée, aucune nouvelle page n'est ouverte (l'URL dans la barre d'adresse du navigateur ne change pas)... Il y a quelque chose de spéciale à faire ou est-ce que c'est normal ? J'ai aussi essayé de taper directement l'url d'une des pages que ça devrait créer mais sans résultat.

Théoriquement, je devrais aussi avoir deux nouveaux fichiers par nouvelle page créée dans le répertoire contents de mon site (créées au moins lorsque j'accède à ces pages) ?

#13 _lex

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 1016 messages

Posté 24 March 2010 - 15:05 PM

le truc que tout le monde oublie c est le parametre "deeplink format" du selector. il peut être "template" par exemple, mais le mieux c'est de mettre un truc genre "<<id>>" pour que chaque enregistrement ait son url :)

#14 Żabojad

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 114 messages

Posté 24 March 2010 - 19:55 PM

Re,

Alors, maintenant je fais bien fonctionner les listes qui ouvrent une nouvelle page pour chaque choix de la liste.

J'ai fait un test comme ça : j'ai ma page start qui contient un database connector, un selector en icone, et une richTextList.

Dans chaque page ouverte, j'ai des champs de texte (pas des singleLineIO mais de simples champs de texte) ayant pour label : <<DataSelector.selectedItem.description>> pour qu'il affichent le champs "description" de la ligne sélectionnée par le selector dans la table de la base de données associée. Ainsi je ne passe pas par des actions pour renseigner le contenu dynamique dans mes players...

Tout fonctionne bien à la navigation, les champs s'affichent correctement, OK !

Je lance l'indexation sur mon site de test pour voir : j'obtiens bien alors le message "votre modification est enregistrée" et le répertoire "search_index" est bien créé dans le répertoire contents de mon site.

Je lance Lynx et j'accède à mon site pour voir le résultat de l'indexation : je navigue sur chaque page mais là, aucune d'entre elle ne contient le contenu dynamique que je cherche à indexer : ni la richtextlist, ni les champs de texte.

Est-ce qu'il manque quelque chose à la démarche que j'ai suivi ou est-ce qu'il ne sera pas possible même avec un selector en icône d'indexer le contenu dynamique (les cellules de la rich text list, le contenu des champs de texte ...) ?

merci et à+

#15 _lex

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 1016 messages

Posté 25 March 2010 - 11:24 AM

et c est bien un DataBaseConnector ?
tu as un exemple en ligne ?

#16 Żabojad

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 114 messages

Posté 25 March 2010 - 18:22 PM

lexa a écrit:et c est bien un DataBaseConnector ?


Oui, c'est bien un DataBaseConnector.

lexa a écrit:tu as un exemple en ligne ?


En ligne non, mais tu peux essayer, si tu veux, de faire tourner mon test case sur ton poste. Tu le trouveras ici (MD5 checksum : a753b2e44bbdf784a1610a80b773a342). Pour le lancer, tu devras créer une base nommée "zks" en local et exécuter le code SQL suivant :

Code: Tout sélectionner
CREATE TABLE IF NOT EXISTS `dossiers` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `titre` varchar(100) COLLATE utf8_bin DEFAULT NULL,
  `description` text COLLATE utf8_bin,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=38 ;

--
-- Contenu de la table `dossiers`
--

INSERT INTO `dossiers` (`id`, `titre`, `description`) VALUES
(2, 'Promedic', 'Budowa hal magazynowych i rozbudowa budynków biurowych hurtowni leków PROMEDIC w Kielcach.'),
(1, 'Hale DEFRO', 'Budowa trzech hal produkcyjnych dla firmy DEFRO w Rudzie Strawczy?skiej.'),
(3, 'Inter Cars', 'Budowa salonu handlowego dla hurtowni INTERCARS.'),
(11, 'Metalowe ogrodzenia', 'Metalowe ogrodzenia z bramami otwieranymi lub przesuwnymi, sterowanymi  elektrycznie lub otwieranymi r?cznie. Balustrady balkonowe, schody.'),
(7, 'Alma-Alpinex', 'Rozbudowa sieci sklepów firmy Alma-Alpinex. TEST MODIF'),
(8, 'Jezierski', 'Budowa hali magazynowej dla firmy JEZIERSKI.'),
(9, 'Multipak', 'Budowa hali produkcyjno-magazynowej dla firmy MULTIPAK w Nowinach.');




1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)