Pages et routage dans les shells
Pages et routage dans les shells
Une page (doctype Page) peut s'ouvrir dans trois contextes de navigation différents selon sa nature. La barre latérale du desk s'appuie sur deux indicateurs pour décider dans quel shell (module) une page doit s'afficher.
Les trois types de page
Le comportement de routage d'une page dépend de deux champs du doctype Page : system_page et shared_page. Une page ne peut pas porter les deux indicateurs à la fois.
Page système (system_page)
Une page système fait partie du desk lui-même plutôt que d'un module. Elle s'ouvre sans shell : son URL reste nue et la barre latérale ne change pas.
- L'URL ne contient pas de segment de shell.
/desk/desktopreste/desk/desktop. - La barre latérale affichée avant l'ouverture de la page reste visible.
- La page n'apparaît pas dans la liste des entités routables d'un module.
Page partagée (shared_page)
Une page partagée agit sur un document depuis n'importe où. Elle s'ouvre dans le shell actuellement à l'écran, quel qu'il soit. La page print (impression) en est l'exemple livré avec le framework.
- Si l'utilisateur se trouve dans le shell Utilisateurs et imprime un document, l'URL devient
/desk/users/print/User/Administratoret la barre latérale reste sur Utilisateurs. - Lors d'un saut (awesomebar, raccourci), la page partagée reste dans le shell en cours, y compris Private.
- Si aucune shell n'est nommé dans l'URL, la page s'ouvre dans le shell de son propre module.
Page standard (ni system_page, ni shared_page)
Une page standard s'ouvre dans le shell du module sous lequel elle est classée.
Configurer une page
Les champs system_page et shared_page sont des cases à cocher sur le doctype Page. Une page avec les deux cases cochées est refusée à l'enregistrement. Seul l'Administrator peut modifier une page, et la création demande le mode développeur.
# Exemple : créer une page partagée par code
page = frappe.new_doc("Page")
page.page_name = "Mon action partagée"
page.module = "Stock"
page.shared_page = 1
page.insert()
La validation empêche de poser les deux indicateurs simultanément :
if self.system_page and self.shared_page:
frappe.throw(_("A page is either a System Page, which opens in no sidebar, or a Shared Page, which opens in any. It cannot be both."))
Comportement du routeur
Le routeur (frappe.router) lit les indicateurs depuis frappe.boot.page_info pour décider du shell à écrire dans l'URL.
- Page système :
shell_for_routerenvoienull. Le routeur supprime tout segment de shell déjà présent dans l'URL viadrop_shell_from_url. - Page partagée :
shell_can_showrenvoie toujourstrue, ce qui permet à la page de rester dans le shell à l'écran.shell_for_routeconserve le shell courant même lors d'un saut, y compris depuis Private. - Liens :
sidebar_item.get_routene préfixe pas une page système avec un shell, car le routeur le retirerait à l'arrivée.
Une URL qui contient encore un segment de shell pour une page système est corrigée à l'ouverture : le routeur retire ce segment.