143 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			143 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
namespace nur\v\vp;
 | 
						|
 | 
						|
use nulib\app;
 | 
						|
use nur\authz;
 | 
						|
use nur\b\authnz\IAuthzUser;
 | 
						|
use nur\config;
 | 
						|
use nur\v\base\TNavigablePage;
 | 
						|
use nur\v\fo;
 | 
						|
use nur\v\icon;
 | 
						|
use nur\v\model\INavigablePage;
 | 
						|
use nur\v\navbar;
 | 
						|
use nur\v\nb;
 | 
						|
use nur\v\v;
 | 
						|
 | 
						|
/**
 | 
						|
 * Class NavigablePage: un page navigable authentifiée
 | 
						|
 */
 | 
						|
class NavigablePage extends AInitAuthzPage implements INavigablePage {
 | 
						|
  use TNavigablePage;
 | 
						|
 | 
						|
  const NAVBAR_OPTIONS = null;
 | 
						|
  const NAVIGATION_SHOW_NAVIGATION = true;
 | 
						|
  const NAVIGATION_IMPLEMENTS_OWN_LAYOUT = false;
 | 
						|
  const CONTAINER_OPTIONS = null;
 | 
						|
 | 
						|
  const REQUIRE_AUTH = true;
 | 
						|
  const REQUIRE_AUTHZ = true;
 | 
						|
  const REQUIRE_ROLE = null;
 | 
						|
  const REQUIRE_PERM = null;
 | 
						|
 | 
						|
  function afterConfig(): void {
 | 
						|
    # initialiser la session avant setup. ainsi, dans les fonction beforeSetup(),
 | 
						|
    # setup() et afterSetup(), la session est disponible
 | 
						|
    $this->ensureAuthOrRedirect(static::REQUIRE_AUTH, static::REQUIRE_AUTHZ, static::REQUIRE_ROLE, static::REQUIRE_PERM);
 | 
						|
    parent::afterConfig();
 | 
						|
  }
 | 
						|
 | 
						|
  /** @return string|array */
 | 
						|
  protected function MENU() {
 | 
						|
    return static::MENU;
 | 
						|
  } const MENU = "menu";
 | 
						|
  protected function MENU_SELECT(): ?string {
 | 
						|
    return static::MENU_SELECT;
 | 
						|
  } const MENU_SELECT = null;
 | 
						|
  const MENU_LOGOUT = true;
 | 
						|
 | 
						|
  const MENU_SULOGIN = true;
 | 
						|
 | 
						|
  protected function getAppVersionNbtext(): ?array {
 | 
						|
    $app = app::get();
 | 
						|
    $projdir = $app->getProjdir();
 | 
						|
    $versionfile =  "$projdir/VERSION.txt";
 | 
						|
    if (file_exists($versionfile)) {
 | 
						|
      $name = $app->getName();
 | 
						|
      $version = file_get_contents($versionfile);
 | 
						|
      return nb::text([
 | 
						|
        "style" => "margin: 0 15px",
 | 
						|
        "$name v$version"
 | 
						|
      ]);
 | 
						|
    }
 | 
						|
    return null;
 | 
						|
  }
 | 
						|
 | 
						|
  protected function getAuthzNbtext(IAuthzUser $user): array {
 | 
						|
    $username = $user->getUsername();
 | 
						|
    $role = $user->getRole();
 | 
						|
    $profile = config::get_profile();
 | 
						|
    return nb::text([
 | 
						|
      "Connecté en tant que ", v::b($username),
 | 
						|
      v::if($role !== null, [" avec le rôle ", v::b($role)]),
 | 
						|
      " dans le profil ", v::b($profile),
 | 
						|
    ]);
 | 
						|
  }
 | 
						|
 | 
						|
  protected function getLoginNblink(): array {
 | 
						|
    return nb::link($this->getLoginUrl(), icon::login("Se connecter"), [
 | 
						|
      "class" => "login",
 | 
						|
      "accesskey" => "r",
 | 
						|
    ]);
 | 
						|
  }
 | 
						|
 | 
						|
  protected function getLogoutNblink(): array {
 | 
						|
    return nb::link($this->getLogoutUrl(), icon::logout("Se déconnecter"), [
 | 
						|
      "class" => "logout",
 | 
						|
      "accesskey" => "z",
 | 
						|
    ]);
 | 
						|
  }
 | 
						|
 | 
						|
  protected function printSuloginMenu(): void {
 | 
						|
    $am = authz::manager();
 | 
						|
    if ($this->SULOGIN_ALLOWED() && ($am->isSulogin() || authz::get()->isPerm("sulogin"))) {
 | 
						|
      navbar::nav(["align" => "right"]);
 | 
						|
      fo::start([
 | 
						|
        "type" => "navbar",
 | 
						|
        "method" => "post",
 | 
						|
        "action" => $this->getMainUrl(),
 | 
						|
        "class" => "navbar-form",
 | 
						|
      ]);
 | 
						|
      fo::text("!Chuser ", "su!", null, [
 | 
						|
        "style" => "width: 5rem; padding: 6px;",
 | 
						|
        "accesskey" => "x",
 | 
						|
      ]);
 | 
						|
      fo::end();
 | 
						|
      navbar::endnav();
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  protected function printLogoutMenu(): void {
 | 
						|
    if (authz::is_auth()) {
 | 
						|
      $user = authz::get();
 | 
						|
      navbar::nav(["align" => "right"], [
 | 
						|
        nb::menu(icon::user($user->getShortName()), [
 | 
						|
          $this->getAppVersionNbtext(),
 | 
						|
          $this->getAuthzNbtext($user),
 | 
						|
          $this->getLogoutNblink(),
 | 
						|
        ]),
 | 
						|
      ]);
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  function beforePrintNavigation(): void {
 | 
						|
    $menu = $this->MENU();
 | 
						|
    if ($menu !== null && !is_array($menu)) $menu = config::k($menu);
 | 
						|
    if ($menu) {
 | 
						|
      $selectedId = $this->MENU_SELECT();
 | 
						|
      if ($selectedId === null) $selectedId = static::class;
 | 
						|
 | 
						|
      $mm = navbar::menu_manager();
 | 
						|
      $mm->init($menu, $selectedId);
 | 
						|
      ["brand" => $brand, "navbar_items" => $navbarItems,
 | 
						|
      ] = $mm->get();
 | 
						|
      if ($brand) navbar::brand($brand);
 | 
						|
      if ($navbarItems) navbar::nav(null, $navbarItems);
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  function afterPrintNavigation(): void {
 | 
						|
    if (static::MENU_LOGOUT) $this->printLogoutMenu();
 | 
						|
    if (static::MENU_SULOGIN) $this->printSuloginMenu();
 | 
						|
  }
 | 
						|
}
 |