Backend Snippets

Snippets und Tweaks zur Modifikation des Backends

  1. Navigation ausblenden
  2. AddOn ausblenden
  3. Seite eines AddOns durch eigene austauschen/ersetzen
  4. Subpage eines AddOns durch eigene entsprechend Recht austauschen/ersetzenn
  5. Sortierung des Medienpools ändern
  6. Nur zugelassenen IPs Zugriff aufs Backend gewähren
  7. Theme erzwingen ohne config.yml zu ändern

Es ist möglich, die Hauptnavigation und die AddOns auszublenden. Nutzt die Bootstrap-Funktionen.

Folgenden Code in die boot.php des Project-AddOns platzieren:

if (rex::isBackend() && rex_backend_login::hasSession()) {
    rex_extension::register('OUTPUT_FILTER', static function (rex_extension_point $ep) {
        $search = '<h4 class="rex-nav-main-title">' . rex_i18n::msg('navigation_addons') . '</h4>' . "\n        " . '<ul class="rex-nav-main-list nav nav-pills nav-stacked">';
        $replace = '<h4 class="rex-nav-main-title" data-toggle="collapse" data-target="#'.rex_i18n::msg('navigation_addons').'" style="cursor: pointer;" onclick="$(\'#collapsed-chevron\').toggleClass(\'fa-rotate-180\')">'.rex_i18n::msg('navigation_addons').'<i class="fa fa-chevron-circle-down pull-right" id="collapsed-chevron"></i></h4><ul class="rex-nav-main-list nav nav-pills nav-stacked collapse" id="'.rex_i18n::msg('navigation_addons').'">';
        $subject = str_replace($search, $replace, $ep->getSubject());
        $ep->setSubject($subject);
    });
}

AddOn ausblenden

Es ist möglich, einzelne AddOns (auch für Administratoren) auszublenden. In diesem Beispiel werden der Installer und die Systemverwaltung ausgeblendet.

Möglichkeit 1: Direkt via rex_be_controller

Folgenden Code in die boot.php des Project-AddOns platzieren:

if (rex::isBackend() && rex_backend_login::hasSession()) {
  $page = rex_be_controller::getPageObject('system');
  $page->setHidden(true);
  $page->setPath('...');

  $page = rex_be_controller::getPageObject('packages');
  $page->setHidden(true);
  $page->setPath('...');
}

Möglichkeit 2: Via Extension Point PAGES_PREPARED

Möchte man auch Systemseiten individualisiert ausgeben, kann man über den Extension Point.

In diesem Ausgangsszenario von Simon waren für Benutzer Admin-Rechte notwendig, aber diese Benutzer sollen dennoch nicht alles sehen und machen können. Diese Benutzer sollen bspw. Templates bearbeiten können, jedoch keine Module. Das war notwendig, da auf Grundlage der Templates von der Drittagentur eine Erweiterung geschrieben werden sollte, die sich am Grundtemplate der Seite orientiert.

Reines Ausblenden per CSS erfüllt diesen Zweck nicht.

Folgenden Snippet in die boot.php des Project-AddOns eingebunden.

Ausblenden für einen bestimmten User und URL aufheben:

if ( ( rex::isBackend() ) && ( rex::getUser()->getLogin() == 'LOGINNAME' ) ) {
   rex_extension::register('PAGES_PREPARED', function (rex_extension_point $ep) {
      $page = rex_be_controller::getPageObject( 'modules' );
      $page->setHidden( true );
      $page->setPath( '...' );
      });
}

Hier z.B. Menüpunkt verstecken bei allen Nicht-Admins, aber weiterhin verfügbar

if (( rex::isBackend() ) && ( !rex::getUser()->isAdmin()) ) {
rex_extension::register('PAGES_PREPARED', function (rex_extension_point $ep) {	
  $page = rex_be_controller::getPageObject('yform');
  $page->setHidden(true);
});
}

Seite eines AddOns durch eigene austauschen/ersetzen

Will man eine alternative Seite in einem AddOn darstellen und die vorhandene ersetzen, kann dies mit dem nachfolgenden Codes erfogen. In diesem Beispiel wird die index.php des Struktur-AddOns ausgetauscht.

Startseite eines Addons zur Laufzeit verändern

$addon = rex_addon::get('addonname');
$page = $addon->getProperty('page');
$page['href'] = ['page' => 'cronjob/log'];
$addon->setProperty('page', $page);

Ersetzen durch Seite eines anderen AddOns

Folgenden Code in die boot.php des Project-AddOns platzieren:

rex_extension::register('PAGES_PREPARED',function($ep) {
  if (rex_be_controller::getCurrentPage() == 'structure') {
    $Page = rex_be_controller::getCurrentPageObject();
    $Page->setPath($this->getPath('pages/index.php'));
  }
});

Verwendeter Extension point: PAGES_PREPARED

Subpage eines AddOns durch eigene entsprechend Recht austauschen/ersetzen

if (is_object(rex::getUser()) && rex::getUser()->hasPerm('addonname[recht]') && !rex::getUser()->isAdmin()):
$addon = rex_addon::get('addonname');
$page = $addon->getProperty('page');
        $page['subpages']['config'] = [
        'title' => 'Mein neuer Menüpunkt', 
        'icon' => 'rex-icon fa-wrench'
        ];  //neuen Menüpunkt nachträglich einfügen
        
        unset($page['subpages']['default']); //alten Menüpunkt nachträglich entfernen
$addon->setProperty('page', $page);

endif;

Sortierung des Medienpools ändern

Die Standard-Sortierung im Medienpool ist immer chronologisch. Die folgende Lösung sorgt für eine alphabetische Sortierung.

Verwendeter Extension point: MEDIA_LIST_QUERY

Folgenden Code in die boot.php des Project-AddOns platzieren:

Bis REDAXO 5.12.1

// Sortierung Medienpool aufsteigend
if (rex::isBackend() && rex::getUser()) {
  rex_extension::register('MEDIA_LIST_QUERY', function (rex_extension_point $ep) {
    $subject = $ep->getSubject();
    $subject = str_replace("f.updatedate", "f.filename, f.updatedate", $subject);
    $subject = str_replace("desc", "asc", $subject);
    return $subject;
  });
}

Danach gabe es einen Bug der dazu führte dass es erst ab 5.13.3 wieder genutzt werden kann.

Ab REDAXO 5.13.3

// Sortierung Medienpool aufsteigend
if (rex::isBackend() && rex::getUser()) {
  rex_extension::register('MEDIA_LIST_QUERY', function (rex_extension_point $ep) {
    $subject = $ep->getSubject();
    $subject = str_replace("m.updatedate", "m.filename, m.updatedate", $subject);
    $subject = str_replace("desc", "asc", $subject);
    return $subject;
  });
}

Nur zugelassenen IPs Zugriff aufs Backend gewähren

Den nachfolgenden Code in die boot.php des project-Addons kopieren und IPs anpassen:

	if (rex::isBackend())
	{
	  $ips= array("00.00.00.00", "00.00.00.00");	
	   if (!in_array(rex_server('REMOTE_ADDR'),$ips)) {
	      rex_response::sendRedirect('https://google.com');
	      }
	}

Theme erzwingen ohne config.yml zu ändern

In die boot.php des projekt-Addons oder eines eigenen AddOns:

if (rex::isBackend())
{ 
   rex_extension::register('PACKAGES_INCLUDED', static function (rex_extension_point $ep) {
   rex::setProperty('theme', 'light');
   // CKE5 fix   
   rex_view::setJsProperty('cke5theme', 'light');   
   }, rex_extension::EARLY);  
}

oder für dunkel

<?php
if (rex::isBackend())
{ 
   rex_extension::register('PACKAGES_INCLUDED', static function (rex_extension_point $ep) {
   rex::setProperty('theme', 'dark');
   // CKE5 fix   
   rex_view::setJsProperty('cke5theme', 'dark');   
   }, rex_extension::EARLY);  
}