Aller au contenu
Support de Zwii et Yocto
sylvainlelievre

Créer un module standard de recherche

Messages recommandés

Bonjour,

Sur une idée de @Fred je vais essayer de créer un module standard de Zwii permettant de disposer d'une recherche interne dans le site par mots clefs.

 

N'hésitez pas à participer en m'aidant dans les différentes étapes... merci d'avance !

 

Point de départ les conseils de @Fred :

 

Pourquoi ne pas créer un module standard de Zwii ?

 

Voila comment faire :

dans core.php déclarer le module "search" dans le tableau $coreModuleIds ligne 38

créer un dossier dans core/module/"search"

ce dossier contient :

  • rsearch.php qui contient les traitements.
  • un dossier view  dont le nom correspond à une fonction de search.php

A minima du dois donc avoir un dossier view/view/index.php et une fonction index

 

La structure de ton fichier search.php est la suivante :

class config extends common {

// déclaration de variables locales

// Liste de fonctions correspondant aux vues

	public function index () {
	}

// Liste de fonctions correspondants au module, ex :
	
	public function updateRobots() {
	}

}

Les fonctions internes sont des extensions de classe que tu appelles ainsi $this->updateRobots()

 

Lorsque tu ajoutes un formulaire à une vue, le traitement se fait dans la fonction après le test :

if($this->isPost()) {
}

qui contrôle si des variables sont transmises par POST

 

En fin de traitement addOutput détermine ce qu l'on fait :

			$this->addOutput([
				'redirect' => helper::baseUrl() . $this->getUrl(),
				'notification' => 'Modifications enregistrées',
				'state' => true
			]);

state false indique une erreur, donc notification en rouge

 

La sortie peut aussi tenir compte du traitement précédente avec des variables :

		$this->addOutput([
			'notification' => ($successSitemap === true && $successRobots >= 100) ? 'Création réussie' : 'Echec d\'écriture',
			'redirect' => helper::baseUrl() . 'config',
			'state' => ($successSitemap === true && $successRobots >=100)  ? true : false
		]);

Soit tu fais un test avant et tu indiques le résultat du test en valeur soit tu utilises un opérateur ternaire :

test ? si vrai : si faux

Modifié par sylvainlelievre
  • J'aime 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Une première étape, ajout dans core.php (9.1.12) du module search, création de :

dossier => core/module/search

dossier => core/module/search/view/index

fichier => core/module/search/search.php

fichier => core/module/search/view/index/index.php

 

Ecriture d'un formulaire dans index.php

 

Voir la pièce jointe.

 

Le formulaire apparaît bien au lancement de search mais je ne vois pas comment récupérer les données du formulaire dans une fonction interne à la class search ????

 

A suivre

 

Modifié par sylvainlelievre

Partager ce message


Lien à poster
Partager sur d’autres sites

A titre d'exemple, je t'invite à observer le fonctionnement du module de configuration de config.php et config/view/index.php :

 

Index.php et le formulaire, il utilise un template pour déclarer un formulaire :

<?php echo template::formOpen('installForm'); ?>

et le fermer

<?php echo template::formClose(); ?>

 

A l'intérieur on trouve un structure html qui ressemble à Bootstrap et qui permet de partage l'écran en bloc.

 

Pour saisir des champs, Zwii te propse aussi des templates :

template::text zone de texte

template::textarea zone de grand texte

template::mail mail

template::select sélect

template::checkbox

template::submit
template::button

 

Chaque template est renseigné avec des paramètres, dont son nom (important) et un tableau avec des valeurs à passer. Il te suffit de voir comment fonctionne les autres vues pour comprendre.

En revanche le nom que tu donnes au champ est très important ( il faut mieux utiliser la codification actuelle pour s'y retrouver ).

Ainsi le checkbox 'configSocialYoutubeId' ligne 97 sera identifié dans la fonction index par son nom et lu avec $this->getInput(configSocialYoutubeId)

le $this->setData sert à écrire dans les données de Zwii mais toi tu n'en auras pas besoin :

 

	/**
	 * Configuration
	 */
	public function index() {
		// Soumission du formulaire
		if($this->isPost()) {
			$this->setData([
				'config',
				[
					'analyticsId' => $this->getInput('configAnalyticsId'),
					'autoBackup' => $this->getInput('configAutoBackup', helper::FILTER_BOOLEAN),
					'maintenance' => $this->getInput('configMaintenance', helper::FILTER_BOOLEAN),
					'cookieConsent' => $this->getInput('configCookieConsent', helper::FILTER_BOOLEAN),
					'favicon' => $this->getInput('configFavicon'),
					'homePageId' => $this->getInput('configHomePageId', helper::FILTER_ID, true),
					'metaDescription' => $this->getInput('configMetaDescription', helper::FILTER_STRING_LONG, true),
					'social' => [
						'facebookId' => $this->getInput('configSocialFacebookId'),
						'linkedinId' => $this->getInput('configSocialLinkedinId'),
						'instagramId' => $this->getInput('configSocialInstagramId'),
						'pinterestId' => $this->getInput('configSocialPinterestId'),
						'twitterId' => $this->getInput('configSocialTwitterId'),
						'youtubeId' => $this->getInput('configSocialYoutubeId'),
						'githubId' => $this->getInput('configSocialGithubId')
					],
					'timezone' => $this->getInput('configTimezone', helper::FILTER_STRING_SHORT, true),
					'title' => $this->getInput('configTitle', helper::FILTER_STRING_SHORT, true),
					'itemsperPage' => $this->getInput('itemsperPage', helper::FILTER_INT,true)
				]
			]);

 

 

 

 

  • Merci 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour,

Un premier résultat fonctionnel... merci à @Fred

Le résultat est visible sur mon site de dev en cliquant sur Search dans la page d'accueil :

https://www.vivreenborddebaie.fr/dev9.1

 

Fonctionnel mais pas très structuré :

 

Le script principal de la classe (search.php) appelle à l'exécution un script d'affichage du formulaire de recherche (view/index/index.php).

Sur détection isPost il appelle alternativement un script qui reprend mon script de recherche et réalise l'affichage (view/resultat/resultat.php), tout le traitement est dans le module de view resultat.php...

 

Prochaine étape : intégrer l'appel au module de recherche dans le site (menu ? bandeau ? footer ? ??)

 

A suivre...

 

search.zip

Partager ce message


Lien à poster
Partager sur d’autres sites

Il te faut juste insérer un lien vers l’URL de la page en pensant à avoir donné les droits à tout le monde. 

Je fais un test quand je trouve deux secondes. 

Partager ce message


Lien à poster
Partager sur d’autres sites

C'est pas mal !!!!

Je vais le restructurer et voir pour l'appel dans le pied de page ou autre.

  • J'aime 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Tu as mélangé une vue avec un traitement mais c'est pas grave je te remets ça d’aplomb ;)

 

Ton code sera intégré dans la 9.1.13 ;)

  • J'aime 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui, c'est ça une vue contenant du traitement.

 

J'avais vu ça mais comme dans mon script "recherche.php" l'affichage se fait à l'intérieur du traitement, séparer les 2 me semblait un gros travail pour quelque chose qui ne serait plus valable en version 9.2... J'imagine que dans le traitement il faut écrire dans un "tableau" et ensuite dans la vue afficher son contenu ?

 

Pour le lien vers le module de recherche intégré ce serait bien de disposer d'une loupe dans le menu ou de la mention "Recherche", avec la possibilité en mode configuration du site de faire apparaître ce lien ou pas (à la façon de "Connexion") ?

 

Encore merci @Fred, c'est sympa de me conseiller et de me permettre de progresser.

 

Sylvain

Partager ce message


Lien à poster
Partager sur d’autres sites

Ton travail sera valable dans la version 9.2, l'adaptation sera très facile.

Voici le code modifié, tu pourras voir comment procéder pour que la structure soit compacte.

  • il faut utiliser des espaces entre les opérateurs.
  • Quand tu ouvres un SI ou une boucle

SI (blabla) {

     truc;

}

Pour le do while

do {

   truc;

} while();

 

Le résultat est stocké dans une chaine puis affiché, j'ai fait au plus simple.

Pour passer du traitement à la vue, j'utilise des variables dans le POST

 

On positionne drapeaux en cours de route, ce qui donnent le statut de la recherche

 

Par contre je n'ai pas creusé comment fonctionne la recherche, parfois il affiche des ...

La recherche exacte se fait entre guillemets ?

 

Sur la partie qui concerne ton moteur, je préfère ne pas toucher.

 

search.zip

  • Merci 2

Partager ce message


Lien à poster
Partager sur d’autres sites

Sans vouloir être rabat-joie, il y a un problème de sécurité posé par ce formulaire de recherche :
Les recherches se font y compris dans les pages ou articles du blog réservés aux membres ou a une autre catégorie que visiteur, les résultats affichent ceux trouvés dans ces pages, faisant alors apparaitre une ligne du texte dans lequel l'expression recherchée est trouvée, ainsi qu'un lien vers la page concernée, ce qui évidemment pose problème pour du contenu normalement non accessible aux visiteurs, bien que la page ne puisse être affichée (403), le visiteur a connaissance qu'une telle page existe et dispose de son adresse.

  • J'aime 1

Partager ce message


Lien à poster
Partager sur d’autres sites
Il y a 2 heures, Gilux a dit :

Sans vouloir être rabat-joie, il y a un problème de sécurité posé par ce formulaire de recherche :
Les recherches se font y compris dans les pages ou articles du blog réservés aux membres ou a une autre catégorie que visiteur, les résultats affichent ceux trouvés dans ces pages, faisant alors apparaitre une ligne du texte dans lequel l'expression recherchée est trouvée, ainsi qu'un lien vers la page concernée, ce qui évidemment pose problème pour du contenu normalement non accessible aux visiteurs, bien que la page ne puisse être affichée (403), le visiteur a connaissance qu'une telle page existe et dispose de son adresse.

C’est en effet une très bonne remarque.

 

@sylvainlelievre il faudrait remplacer la procédure de bas niveau de lecture du fichier core.php par un appel en parcourant le jeu de données déjà chargé en mémoire et qui contient toutes les informations.

 

Dans core  il y a un exemple de routine qui fait cela dans la fonction showBar (2341)

 

En 2351 on récupère la hiérarchie des pages (et donc des modules) dans une boucle foreach qui parcourt les clés $parentPageId et les valeurs recherchées, ici les pages filles.

Ensuite pour accéder à chaque page on fait un $foo = $this->getData(['page', $parentPageId, 'x']); où x est une clé parmi les données stockées pour chaque page à savoir

				'typeMenu' => 'text',
				'iconUrl' => '',
                'disable' => false,								
				'content' => 'Contenu de votre nouvelle page.',
				'hideTitle' => false,
				'breadCrumb' => false,
				'metaDescription' => '',
				'metaTitle' => '',
				'moduleId' => '',
				'parentPageId' => '',
				'modulePosition' => 'bottom',
				'position' => 0,
				'group' => self::GROUP_VISITOR,
				'targetBlank' => false,
				'title' => $pageTitle,
				'block' => '12',
				'barLeft' => '',
				'barRight' => '',
				'displayMenu' => '0',
				'hideMenuSide' => false,
				'hideMenuHead' => false,
				'hideMenuChildren' => false

Celles qui vont t'intéresser sont :

  • 'group' pour un check avec celui du visiteur
  • 'title' le nom de la page
  • 'content' pour la recherche
  • et moduleId dont tu auras besoin s'il existe pour aller récupérer les données du module de la page avec :

 $bar = $this->getData(['module', $parentPageId, $articleId'x']);

 

Si j'étais toit je reprendrai la structure de la fonction qui génère le sitemap, bien que ce soit un mixte html/php, tu trouveras toutes les boucles et les bons appels.

 

 

 

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 1 minute, sylvainlelievre a dit :

Bonjour @Gilux et merci pour ta remontée.

 

Oui, je sais un extrait de texte s'affiche même pour les pages réservées. Il faudra voir ça...

 

Bonne soirée

 

Sylvain

 

Je t'ai répondu au-dessus 😉

 

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 1 minute, sylvainlelievre a dit :

 

La recherche d'un terme exact est encore en cours de dev.

 

Je vais découvrir ta solution...

 

Tu peux aussi te baser sur le fonction du core qui génère sitemap.xml c'est le même principe. Une fois que tu as chopé les contenus des pages, tu fais tes petites affaires de recherche sur le contenu.

 

le sujet est très intéressant mais je te laisse phosphorer.

 

Partager ce message


Lien à poster
Partager sur d’autres sites

@Fred

 

J'ai testé ta solution et j'ai trouvé un bug dans l'affichage des résultats, la recherche matche pour "......"

ça n'existait pas avec la précédente solution, tu peux d'ailleurs t'en rendre compte en lançant une recherche avec la loupe dans le menu puis avec Search sur la page d'accueil sur mon site de dev :

https://www.vivreenborddebaie.fr/dev9.1

 

C'est probablement ma ligne $motclef=$this->getInput('searchMotphraseclef'); qui placée à ce niveau renvoie une chaîne avec des points de suspension, il faut peut-être récupérer uniquement la value de cet objet ?

[RESOLU]

 

D'autre part je ne sais pas si sur les vues le bouton retour et surtout le bouton enregistrement sont indispensables.

Modifié par sylvainlelievre
idee

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 12 minutes, sylvainlelievre a dit :

@Fred

 

J'ai testé ta solution et j'ai trouvé un bug dans l'affichage des résultats, la recherche matche pour "......"

ça n'existait pas avec la précédente solution, tu peux d'ailleurs t'en rendre compte en lançant une recherche avec la loupe dans le menu puis avec Search sur la page d'accueil sur mon site de dev :

https://www.vivreenborddebaie.fr/dev9.1

 

D'autre part je ne sais pas si sur les vues le bouton retour et surtout le bouton enregistrement sont indispensables.

Ce sont des détails de mise au point. de toute façon comme il faut réécrire le module...

Pour les boutons c'est histoire de respecter la charte de Zwii mais rien n'est figé.

Partager ce message


Lien à poster
Partager sur d’autres sites
Il y a 14 heures, Fred a dit :

Dans core  il y a un exemple de routine qui fait cela dans la fonction showBar (2341)

 

En 2351 on récupère la hiérarchie des pages (et donc des modules) dans une boucle foreach qui parcourt les clés $parentPageId et les valeurs recherchées, ici les pages filles.

Ensuite pour accéder à chaque page on fait un $foo = $this->getData(['page', $parentPageId, 'x']); où x est une clé parmi les données stockées pour chaque page à savoir


				'typeMenu' => 'text',
				'iconUrl' => '',
                'disable' => false,								
				'content' => 'Contenu de votre nouvelle page.',
				'hideTitle' => false,
				'breadCrumb' => false,
				'metaDescription' => '',
				'metaTitle' => '',
				'moduleId' => '',
				'parentPageId' => '',
				'modulePosition' => 'bottom',
				'position' => 0,
				'group' => self::GROUP_VISITOR,
				'targetBlank' => false,
				'title' => $pageTitle,
				'block' => '12',
				'barLeft' => '',
				'barRight' => '',
				'displayMenu' => '0',
				'hideMenuSide' => false,
				'hideMenuHead' => false,
				'hideMenuChildren' => false

Celles qui vont t'intéresser sont :

  • 'group' pour un check avec celui du visiteur
  • 'title' le nom de la page
  • 'content' pour la recherche
  • et moduleId dont tu auras besoin s'il existe pour aller récupérer les données du module de la page avec :

 $bar = $this->getData(['module', $parentPageId, $articleId'x']);

 

Si j'étais toit je reprendrai la structure de la fonction qui génère le sitemap, bien que ce soit un mixte html/php, tu trouveras toutes les boucles et les bons appels.

 

 

 

 

 

Bonjour @Fred,

 

Merci, je vais donc revoir le module standard de recherche complètement, ça risque d'être un peu long car je vais être moins disponible prochainement. Il vaut mieux oublier ce module pour la version 9.1.13....

 

En attendant j'ai résolu le problème d'affichage des fausses occurrences avec "......", c'était un "if(occu !='')" qui avait été remplacé par "if(occu !== '') ".

 

Bonne journée

 

Sylvain

Modifié par sylvainlelievre

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour @Fred,

 

En attendant de reprendre différemment le module, j'ai repris le moule search que tu m'as transmis hier pour y apporter les modifications :

 

1 - comme je le disais plus haut supprimer les fausses occurrences de type "......" : fait

2 - gérer les droits d'utilisateurs : 100%

J'ai résolu partiellement ce problème en comparant les droits de l'utilisateur connecté avec les droits de la page :

 

if ( $utilisateur >= $array[$key1][$key2]['group'])  avec $utilisateur = $this->getUser('group');  

 

ça fonctionne bien pour les pages mais pas pour les modules blog; Je me suis rendu compte que dans le core.json il n'y avait pas de paramètre "group" pour les blogs ... et pourtant Zwii gère bien les accès !

 

Comment faire pour gérer les droits d'accès à une page contenue dans un blog ?

[RESOLU]

 

Pour info j'ai apporté des modifications analogues dans le script de recherche contenu dans la rubrique Trucs et Astuces.

 

Merci

 

Sylvain

 

Modifié par sylvainlelievre

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour Sylvain,

 

La 9.1.13 est déjà sortie afin de corriger un bug.

 

De toute évidence ton module de recherche sera publié une fois parfaitement fonctionnel, il n'y a donc pas d'urgence. Moi-même je serai moins dispo la semaine prochaine.

 

Il y a 2 heures, sylvainlelievre a dit :

En attendant j'ai résolu le problème d'affichage des fausses occurrences avec "......", c'était un "if(occu !='')" qui avait été remplacé par "if(occu !== '') ".

Ok les types ne sont pas pareils.

 

Je vais donc mettre ton code en stand-by le temps de te laisser progresser.

 

Bonne journée,

Fred

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour @Fred

 

Merci. A l'occasion tu pourras faire une mise à jour.

 

1 - comme je le disais plus haut j'ai supprimé les fausses occurrences de type "......" : fait

2 - gérer les droits d'utilisateurs : fait

 

Les droits d'accès aux données sont maintenant gérés pour les pages et les articles de blog.

 

3- j'ai rajouté sur la view result une zone de saisie pour faire une nouvelle recherche

4- j'ai respecté la charte graphique mais j'ai supprimé les boutons retour et enregistrement qui n'avaient pas ou plus d'utilité.

 

J'ai gardé mon exploration du core.json par array pour le moment.

 

Bonne journée

 

Sylvain

 

 

search.zip

Partager ce message


Lien à poster
Partager sur d’autres sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.


×
×
  • Créer...