Go to main content

Textpattern CMS support forum

You are not logged in. Register | Login | Help

#1 2016-06-16 21:01:05

jakob
Admin
From: Germany
Registered: 2005-01-20
Posts: 4,596
Website

Passing an error to admin message bar

How does one pass an error message from a plugin so that it appears in the admin message/announce box?

I have:

$msg = array( gTxt('text_pack_error_message', array('{path}' => $curDir)), E_ERROR);

and at the top I have

pagetop(gTxt('text_pack_page_head'), $msg);

but how do I pass $msg back to the page reload?


TXP Builders – finely-crafted code, design and txp

Offline

#2 2016-06-16 21:40:33

GugUser
Member
From: Quito (Ecuador)
Registered: 2007-12-16
Posts: 1,473

Re: Passing an error to admin message bar

A related post without response.

Offline

#3 2016-06-16 22:19:29

Bloke
Developer
From: Leeds, UK
Registered: 2006-01-29
Posts: 11,271
Website GitHub

Re: Passing an error to admin message bar

jakob wrote #299790:

how do I pass $msg back to the page reload?

Normally it’s in the function signature of your main function that draws the interface. Here’s a skeleton plugin that demonstrates the idea.

register_callback('jcr_dispatcher', 'your_event');

...

/**
 * Jump off to relevant stub for handling actions.
 */
function jcr_dispatcher($evt, $stp)
{
   // true means a valid txp_token must be present or the action will fail.
   $available_steps = array(
      'jcr_store_info_ui'  => true,
      'jcr_update_info_ui' => true,
      ...
   );

   // Use default step if nothing matches.
   if (!$stp or !bouncer($stp, $available_steps)) {
      $stp = 'jcr_main';
   }

   // Run the function.
   $stp();
}

/**
 * Draw the main interface.
 *
 * Note the message is (optionally) passed in.
 */
function jcr_main($msg = '')
{
   pagetop(gTxt('textpack_page_head'), $msg);

   // ... draw UI here
}

/**
 * Stash new row in the database.
 */
function jcr_store_info()
{
   // Read values passed in from POST...
   $val = ps('your_value');
   ...
   // ... and store them...
   $ret = safe_insert('table', "column='" . doSlash($val) . "'");
   ...

   return $ret;
}

/**
 * Stub to handle saving and return to UI.
 */
function jcr_store_info_ui()
{
   // Call the function that does the work.
   $result = jcr_store_info();

   // Test the result and set the message accordingly.
   if ($result) {
      $msg = 'yay';
   } else {
      $msg = 'nope';
   }

   // Call the main function to redraw the UI and pass the message in.
   jcr_main($msg);
}

That’s the ‘functional’ approach. A better method is a class-based approach (I’m gradually porting my admin code over to that) but we’ll save that for another day.

The reason the save function is split into two, btw — one for the UI that is called from the plugin’s dispatcher, and one to do that actual job — is so that we, or other plugins, can reuse the “just do the job” function independently of your UI. Core should use this methodology, but doesn’t — at least not all the time: it’s on the todo list as we get round to refactoring the admin panels.

Hope that helps, but holler if anything’s unclear.


The smd plugin menagerie — for when you need one more gribble of power from Textpattern. Bleeding-edge code available on GitHub.

Txp Builders – finely-crafted code, design and Txp

Offline

#4 2016-06-16 23:34:08

jakob
Admin
From: Germany
Registered: 2005-01-20
Posts: 4,596
Website

Re: Passing an error to admin message bar

Thanks. That was a great help. I rejigged things and have it nearly working – only I’m getting a second set of txp menus nested within the original txp menu block (this is on a v4.5.7 txp with the “classic” theme). Obviously I need to effect a proper page reload?

EDIT: Maybe it’s not so important as it doesn’t happen with Hive on 4.6.


TXP Builders – finely-crafted code, design and txp

Offline

Board footer

Powered by FluxBB