Jump to content
Andi

[SOLVED] Show permanent message in admin when option is selected by user

Recommended Posts

Getting a little deeper into the ProcessWire state-of-mind here. I seriously think I wouldn't have come back to webdev if it wasn't for this wonderful little gem of a CMS.

I have an "Options" field added to all users on a site. If the user has anything other then "default" selected, I would like to show a permanent message in the admin like the one in the screenshot, only so that the user can't close it. As a friendly reminder that he changed that option from default to something crazy 🙂

I've read up on how to send messages to users, but where would I hook into to make this show up all the time in the backend?

https://processwire.com/api/ref/wire/message/

Thanks in advance!

2020-04-17 09_40_37-Seiten.png

Share this post


Link to post
Share on other sites

You could just put it into templates/admin.php. The file should already be there. Here is the entire default file plus a line for the notice:

<?php namespace ProcessWire;

/**
 * Admin template just loads the admin application controller, 
 * and admin is just an application built on top of ProcessWire. 
 *
 * This demonstrates how you can use ProcessWire as a front-end 
 * to another application. 
 *
 * Feel free to hook admin-specific functionality from this file, 
 * but remember to leave the require() statement below at the end.
 * 
 */
if ($user->isLoggedin() && $myCrazySetting) $this->message("This is the notice text");
require($config->paths->adminTemplates . 'controller.php'); 

 

  • Like 1
  • Thanks 1

Share this post


Link to post
Share on other sites

Thanks a bunch @Jan Romero that was quick 🙂

Very elegant and simple. And works almost perfectly, but when I set the option from "crazy" back to "default", the message pops up one more time. When I refresh the backend or navigate to a different page in admin it's gone..

Going the other way around, from "default" to "crazy", the message pops up right away.

Nothing too major but I'm wondering how to work around that..

Share this post


Link to post
Share on other sites

Indeed, that’s because the the message is set before the admin controller actually runs and saves the the change.

Basically, every page in the admin backend executes a specific “Process”. You can hook into the base Process class to add your message only after a process has been executed:

$this->addHookAfter('Process::execute', function($event) {
    if ($this->wire('user')->isLoggedin() && $this->wire('config')->myCrazySetting)
        $this->message("Hope you know what you’re doing with that setting!");
});

This can be put in the same file, above the controller line.

  • Like 3
  • Thanks 1

Share this post


Link to post
Share on other sites

Works a treat. Thanks for explaining, that was very helpful!

Here's the finished hook for future reference.

In templates/admin.php

// user template switch warning in backend
$this->addHookAfter('Process::execute', function($event) {
	// only works for logged in users that have a custom frontend template enabled
	if ($this->wire('user')->isLoggedin() && $this->wire('user')->template_switch->value != 'default') {
		$u = $this->wire('user')->name;
		$t = $this->wire('user')->template_switch->title;
		$p = $this->wire('config')->urls->admin . "profile";
		$this->wire->warning("Frontend der Seite wird für User $u aktuell mit dem Template \"$t\" ausgegeben. <small>Einstellung \"Frontend Template\"im <a href='$p'>Benutzer-Profil</a></small>", Notice::allowMarkup);
	}
});

 

  • Like 3

Share this post


Link to post
Share on other sites

As it seems you are quite new to PW and motivated I suggest to avoid if(this AND that AND that):

// user template switch warning in backend
$this->addHookAfter('Process::execute', function($event) {
	$user = $this->wire('user');

	// early exit if user is not logged in
	if(!$user->isLoggedin()) return;

	// early exit if template is default
	if($user->template_switch->value == 'default') return;

	// show message to change template
	$u = $user->name;
	$t = $user->template_switch->title;
	$p = $this->wire('config')->urls->admin . "profile";
	$this->wire->warning("...", Notice::allowMarkup);
});

Of course this is totally up to you or anybody but IMHO this improves readability a lot. 🙂 

  • Like 2

Share this post


Link to post
Share on other sites

Thanks @bernhard, it really does 😉

I'm in my 5th or so project with PW but haven't really used hooks so far. Looks like the next best thing to a love affair 🙂

Thank you both again for your help, greatly appreciated!

 

Share this post


Link to post
Share on other sites

Hey again,

following @bernhard's suggestion of making stuff a little more readable, and after some refactoring, here's the result:

In templates/admin.php

// user custom theme warning in backend
$this->addHookAfter('Process::execute', function($event) {
	// make stuff more readable
	$user = $this->wire('user');
	// early exit if user is not logged in
	if(!$user->isLoggedin()) return;
	// array of themes that will be excluded
	$x = array('', 'default');
	// early exit if current user theme is in excluded array
	if(in_array($user->custom_theme->value, $x)) return;
	// set up message
	$u = $user->name;
	$t = $user->custom_theme->title;
	// set up path for profile link
	$p = $this->wire('config')->urls->admin . "profile";
	// send message
	$this->wire->warning("Frontend wird für Benutzer \"$u\" aktuell mit dem Theme \"$t\" ausgegeben.
						<small>Einstellung \"Frontend Theme\"im <a href=\"$p\">Benutzer-Profil</a></small>", Notice::allowMarkup);
});

Also added an array of values to be excluded to make this more reusable in the future.

1042169837_2020-04-1807_54_22-ProfilProcessWirelocalhost.thumb.png.2769f4a1466aec1a26d444afcaadf63c.png

Looking neat, working as expected. Thanks again and servus from Bavaria!

 

  • Like 1

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By codevark
      The Minimal Site works fine, but if I try to login as admin, I have no idea what the credentials are.
      I did not do the "install" process myself. The OVA came with everything set up, but there's no mention of the PW admin credentials being set to some initial value.
      Wondering if anyone else has tried the Bitnami OVA and if there's a simple answer.
      --Pete
    • By vwatson
      I don't have any fontawesome icons in the admin section. Not sure what's wrong. They used to appear. I've tried all the user profiles and they're gone in all of them.
      Using the browser inspector tool, I see this message:
      Access to font at 'https://www.domain.com/wire/templates-admin/styles/font-awesome/fonts/fontawesome-webfont.ttf?v=4.7.0' from origin 'http://domain.com' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
      I'm not sure why this is occurring or how to fix it. Any help would be greatly appreciated. 
    • By Andi
      Continuing my journey into PW hooks, I'm trying to find a way to retrieve all images from a page that explicitly *do not* have a certain tag (or tags) attached to them.
      Found this post from 2015
      But I'm wondering if there's a more elegant way to go about this.
      Let's say I have a multi-image field called "images_header" and instead of
      $page->images_header->findTag('mytag'); I would like to do this:
      $page->images_header->excludeTag('mytag'); So I'd be able to do
      // find images that don't have the tag "mytag" $images = $page->images_header->excludeTag('mytag'); // check if there's any images if (count($images)>0) { // do something.. } Would this be possible by hooking into Pagefiles somehow?
      There's this bit in /wire/core/Pagefiles.php Line 626 that I'd basically just need to reverse (or at least in my mind 😄 )
      public function findTag($tag) { $items = $this->makeNew(); foreach($this as $pagefile) { if($pagefile->hasTag($tag)) $items->add($pagefile); } return $items; } Any ideas on how this could be done in a graceful manner?
      Thanks in advance!
    • By celfred
      Hello,
       
      Here's what I'm trying to achieve : I have a textarea field that is frontend editable on any page I want to. If a user with a specific role updates it, I want to tick a checkbox field on the parent page where the textarea resides. So I tried to hook as follows in my ready.php file :

        $this->addHookBefore('Fieldtype::savePageField', function(HookEvent $event) {       $page = $event->argument[0];       $field = $event->argument[1];       if($this->user->hasRole('teacher')) {      $page->alertBox = 1;       } // DEBUG HERE (bd($page),  l($field)... ????   }); Of course (!) it doesn't work (yet !) but the thing is I have no idea how to debug this since my bd() never triggers. I've tried the 'Event interceptor' of Tracy debugger which helped me setting up my hook. I guess my $page and $field are correct... but how could I go any further ?
      The road is long to become a dev (when you're not one 🙂 )...
      For further information in case someone wonders : I'd like to set up a textarea that is modified by a user (having a 'player' role, ie 'student'). When front-end modified, I wish it would automatically alert me (the teacher) by ticking a box. So when I log in with my teacher role, I get a list of all textareas I have to read over. When I read/correct/update them (front-end), I would like my hook to automatically untick the box to remove it from my list. In other words, the 'textarea' status should go back and forth according to who modified it last. For the time being, I have managed to make it work with a checkbox that the user has to manually tick/untick, but I've noticed many kids forget to tick the box so they edit their text and I don't get a notice 😞
      Thanks if anyone takes time to try and help me on that one !
    • By celfred
      Hello,
      I'm struggling with hooks to try and do this : adding user page to a page field when visiting a particular page on my website. In fact, I want to have a list of connected users on a particular page (called meeting-hall).
      I've tried all kinds of things (which I don't really understand, sorry) but the latest is this :

        $wire->addHookBefore('Page::render', function($e) {     $page = $e->arguments(0);     if ($page->is("name=meeting-hall")) {       $page->connected->add($user); // connected is a Page field       $page->save();     } else {       $meeting = wire("pages")->get("name=meeting-hall");       $meeting->connected->remove($user);       $meeting->save();     }   }); I put this in my _init.php file but nothing works...
      The best I managed was updating my 'connected' field when the user loads the 'meeting hall' page by having this on the page template :

          if ($user->isLoggedin()) {       $page->connected->add($user);       $page->of(false);       $page->save();       $page->of(true);     } But I wanted to remove the user when he or she leaves the page... hence my thought about using hooks...
      If you can give me a hint, I'd greatly appreciate !
×
×
  • Create New...