Template de page en fonction de l'URL et page d'erreur personnalisée

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Vous allez me dire ou est le rapport ?

J'ai besoin de créer des pages qui n'exploitent pas le template de base page.tpl.php
Je crée donc des fichiers template de type page-toto.tpl.php pour avoir une page spécifique dont l'URL est http://monsite.com/?q=toto (ou http://monsite.com/toto si les URLs simplifiées sont activées)

De la même façon j'ai créé le fichier page-error.tpl.php pour les pages d'erreur 403 et 404 que l'on trouvera donc logiquement à l'adresse http://monsite.com/?q=error.

Tout cela fonctionnait parfaitement jusqu'à ce que je paramètre dans Drupal (via la page Configuration des rapports d'erreur à l'adresse : http://monsite.com/?q=admin/settings/error-reporting) une URL pour mes pages d'erreur.
Dès que je spécifie une URL d'erreur la dedans, toutes les pages du type http://monsite.com/?q=toto ne sont pas envoyées vers les templates page-toto.tpl.php mais vers la page d'erreur paramétrée.

Quelqu'un aurait-il déjà rencontrer ce "problème", pour moi c'en est un vu que j'ai besoin de faire une page d'erreur personalisée, mais également de faire des pages fonctionnant sur les templates du type page-toto.tpl.php ?

Pour le moment, c'est l'un ou l'autre, et c'est bien dommage !!

Forum : 
Version de Drupal : 

La page http://monsite.com/toto existe elle ou bien voulez-vous que si une personne va sur la page http://monsite.com/toto et que celle si n'existe pas alors il verra une page d'erreur personnalisée ? Parce que je ne vois pas pourquoi activer l'error reporting pourrai déclencher une erreur, si vous souhaiter avoir une page d'erreur personnalisée il suffit dans erreur reporting de pointer vers la page personnalisée.

Pour votre problème il faut mettre dans "admin/settings/error-reporting" des pages qui existe déjà dans votre système et que vous pouvez modifier.

Par exemple crée une page avec "node/add/page" qui s'appelera Page d'erreur et qui deviendra par exemple node/50 ou si vous avez pathauto http://monsite.com/page-erreur puis il vous suffira d'ajouter dans "admin/settings/error-reporting" node/50 qui pointe vers votre page d'erreur.

Pour la personalisé il suffira alors de créer un tpl.php pour cet page d'erreur.

Je voudrais que le page http://monsite.com/toto existe (et utilise le template page-toto.tpl.php, sachant que l'URL http://monsite.com/toto ne correspond pas à un contenu dont le titre serait toto)

ET

que je puisse paramétrer une page d'erreur personnalisée dans l'interface dédiée dans Drupal (page qui dans mon cas correspond au template page-erreur.tpl.php, mais pour correspondre à un contenu classique créé dans le backoffice et dont on aurait copier-coller l'URL dans celle de personnalisation des erreurs).

Pour le moment, c'est l'un ou l'autre (je ne sais pas si j'ai été clair) !

MAJ : tant que le paramétrage d'une page d'erreur personnalisée n'est pas activée, l'URL http://monsite.com/?q=toto (en sachant bien que ce n'est pas un alias de contenu ou quoi que ce soit, bien sur) utilise le template de page page-toto.tpl.php, et si ce template n'existe pas, on a une page utilisant le template de base page.tpl.php, avec écrit dedans "La page n'a pas pu être trouvée", ou qqch dans le genre.

Cependant, la page dont l'URL est http://monsite.com/?q=toto, malgré qu'elle affiche qqch, renverra un header de 404.

Pour être plus parlant, faites le test :

1 - créer un template de page page-toto.tpl.php

2 - virez les pages d'erreur personnalisées si elle sont remplies à la page http://monsite.com/?q=admin/settings/error-reporting

3 - accédez à l'URL http://monsite.com/?q=toto (ou http://monsite.com/toto si les urls simplifiées sont activées) avec la console de FireBug ouverte sur l'onglet Réseau

4 - constatez que GET est en 404, alors que la page affiche bien qqch qui n'est pas une page d'erreur.

Qqn aurait-il des explications ?
Parce que du coup, quand on appelle une page de ce type en AJAX, y'a rien qui répond

Drupal ne fonctionne pas dans une relation 1-1 où chaque path d'un menu correspond à un fichier dans un répertoire d'installation. Drupal utilise plus une philosophie MVC avec un routing ou dispatching de toutes les url.

Pour résumer le fonctionnement, drupal appelle toujours index.php avec "q" en variable, et index.php dispatch à menu_execute_active_handler() qui prend $_GET['q'] et cherche dans la table menu_router la correspondance entre la page demander et le résultat à afficher. Si il n'y a pas d'entrée correspondant à la page demandée alors drupal, retourne une erreur 404 sinon effectue un contrôle d'accès (est-ce que l'utilisateur a le droit de voir cette page) et appelle le callback de la page.

Alors le problème qui ce passe et que vous avez pointé c'est que si aucune page d'erreur personnalisée n'existe drupal appelle theme('page', $return) et comme vous le savez la manière dans le templating sur drupal fonctionne page-toto.tpl.php à une prédominance sur page.tpl.php et donc affiche le contenue présent dans page-toto.tpl.php.

Le moyen donc d'appelle une page en AJAX est de créer un module comportant un hook_menu() avec son callback par exemple un cas où on crée un lien monsite.com/toto qui retourne an ajax un texte encodé en JSON :

<?php
function monModule_menu() {
 
$items = array();
 
$items['toto'] = array(
   
'title' => 'mon module',
   
'page callback' => 'monModule_ajax',
   
'type' => MENU_CALLBACK
 
);
  return
$items;
}

function monModule_ajax() {
 
$output = 'Je retourne ce que je veux ici';
 
drupal_json($output);
  exit;
}
?>

j'ai bien tout lu sur vos remarques et suggestions mais je ne comprends pas ce que vient faire AJAX ici...comment utiliser ce code ?

les tutos divers que j'ai pu lire ne mentionnent jamais ce genre de "détail" dans la mise en place de pages perso 404 et 403...pourquoi ? car apparemment le souci est récurrent et inévitable..non?