2016-04-07 22:42:06 +02:00
|
|
|
<?php
|
|
|
|
/**
|
|
|
|
* EGroupware API - Framework extra
|
|
|
|
*
|
|
|
|
* @link http://www.egroupware.org
|
|
|
|
* @author Ralf Becker <RalfBecker-AT-outdoor-training.de>
|
|
|
|
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
|
|
|
|
* @package api
|
|
|
|
* @subpackage framework
|
|
|
|
* @access public
|
|
|
|
* @version $Id$
|
|
|
|
*/
|
|
|
|
|
|
|
|
namespace EGroupware\Api\Framework;
|
|
|
|
|
|
|
|
use EGroupware\Api\Link;
|
|
|
|
use EGroupware\Api\Json;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Framework extra - handling of server-responses either send via data attribute
|
|
|
|
*/
|
|
|
|
abstract class Extra
|
|
|
|
{
|
|
|
|
/**
|
|
|
|
* Extra values send as data attributes to script tag of egw.js
|
|
|
|
*
|
|
|
|
* @var array
|
|
|
|
*/
|
|
|
|
protected static $extra = array();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Refresh given application $targetapp display of entry $app $id, incl. outputting $msg
|
|
|
|
*
|
|
|
|
* Calling egw_refresh and egw_message on opener in a content security save way
|
|
|
|
*
|
|
|
|
* To provide more information about necessary refresh an automatic 9th parameter is added
|
|
|
|
* containing an object with application-name as attributes containing an array of linked ids
|
|
|
|
* (adding happens in get_extras to give apps time to link new entries!).
|
|
|
|
*
|
|
|
|
* @param string $msg message (already translated) to show, eg. 'Entry deleted'
|
|
|
|
* @param string $app application name
|
|
|
|
* @param string|int $id =null id of entry to refresh
|
|
|
|
* @param string $type =null either 'update', 'edit', 'delete', 'add' or null
|
|
|
|
* - update: request just modified data from given rows.
|
|
|
|
* Sorting and filtering are not considered, so if the sort field is changed,
|
|
|
|
* the row will not be moved. If the current filtering could include or exclude
|
|
|
|
* the record, use edit.
|
|
|
|
* - edit: rows changed, but sorting or filtering may be affected. Requires full reload.
|
|
|
|
* - delete: just delete the given rows clientside (no server interaction neccessary)
|
|
|
|
* - add: requires full reload for proper sorting
|
|
|
|
* - null: full reload
|
|
|
|
* @param string $targetapp =null which app's window should be refreshed, default current
|
2021-03-31 17:49:43 +02:00
|
|
|
* @param string $replace =null regular expression to replace in url
|
2016-04-07 22:42:06 +02:00
|
|
|
* @param string $with =null
|
|
|
|
* @param string $msg_type =null 'error', 'warning' or 'success' (default)
|
|
|
|
*/
|
|
|
|
public static function refresh_opener($msg, $app, $id=null, $type=null, $targetapp=null, $replace=null, $with=null, $msg_type=null)
|
|
|
|
{
|
2020-07-24 09:07:13 +02:00
|
|
|
// if we have real push available and a regular single-entry refresh of a push supporting app, no need to refresh
|
|
|
|
if (!Json\Push::onlyFallback() &&
|
|
|
|
!empty($type) && !empty($id) && // $type === null --> full reload
|
|
|
|
Link::get_registry($app, 'push_data') !== null)
|
|
|
|
{
|
2020-07-24 09:23:44 +02:00
|
|
|
$app = 'msg-only-push-refresh';
|
2020-07-24 09:07:13 +02:00
|
|
|
}
|
2016-04-07 22:42:06 +02:00
|
|
|
//error_log(__METHOD__.'('.array2string(func_get_args()).')');
|
|
|
|
self::$extra['refresh-opener'] = func_get_args();
|
|
|
|
|
|
|
|
unset($msg, $app, $id, $type, $targetapp, $replace, $with, $msg_type); // used only via func_get_args();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Display an error or regular message
|
|
|
|
*
|
|
|
|
* Calls egw_message on client-side in a content security save way
|
|
|
|
*
|
|
|
|
* @param string $msg message to show
|
|
|
|
* @param string $type ='success' 'error', 'warning' or 'success' (default)
|
|
|
|
*/
|
|
|
|
public static function message($msg, $type='success')
|
|
|
|
{
|
|
|
|
self::$extra['message'] = func_get_args();
|
|
|
|
|
|
|
|
unset($msg, $type); // used only via func_get_args();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Open a popup independent if we run as json or regular request
|
|
|
|
*
|
|
|
|
* @param string $link
|
|
|
|
* @param string $target
|
|
|
|
* @param string $popup
|
|
|
|
*/
|
|
|
|
public static function popup($link, $target='_blank', $popup='640x480')
|
|
|
|
{
|
|
|
|
// default params are not returned by func_get_args!
|
|
|
|
$args = func_get_args()+array(null, '_blank', '640x480');
|
|
|
|
|
|
|
|
unset($link, $target, $popup); // used only via func_get_args()
|
|
|
|
|
|
|
|
if (Json\Request::isJSONRequest())
|
|
|
|
{
|
|
|
|
Json\Response::get()->apply('egw.open_link', $args);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
self::$extra['popup'] = $args;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Close (popup) window, use to replace egw_framework::onload('window.close()') in a content security save way
|
|
|
|
*
|
|
|
|
* @param string $alert_msg ='' optional message to display as alert, before closing the window
|
|
|
|
*/
|
|
|
|
public static function window_close($alert_msg='')
|
|
|
|
{
|
|
|
|
//error_log(__METHOD__."()");
|
|
|
|
self::$extra['window-close'] = $alert_msg ? $alert_msg : true;
|
|
|
|
|
|
|
|
// are we in ajax_process_content -> just return extra data, with close instructions
|
2016-05-05 18:43:39 +02:00
|
|
|
if (preg_match('/(Etemplate|etemplate_new)(::|\.)ajax_process_content/', $_GET['menuaction']))
|
2016-04-07 22:42:06 +02:00
|
|
|
{
|
|
|
|
$response = Json\Response::get();
|
|
|
|
$response->generic('et2_load', self::get_extra());
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
$GLOBALS['egw']->framework->render('', false, false);
|
|
|
|
}
|
2020-11-22 11:50:20 +01:00
|
|
|
// run egw destructor now explicit, in case a (notification) email is send via Egw::on_shutdown(),
|
|
|
|
// as stream-wrappers used by Horde Smtp fail when PHP is already in destruction
|
2020-07-27 16:08:00 +02:00
|
|
|
$GLOBALS['egw']->__destruct();
|
2016-04-07 22:42:06 +02:00
|
|
|
exit;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Close (popup) window, use to replace egw_framework::onload('window.close()') in a content security save way
|
|
|
|
*/
|
|
|
|
public static function window_focus()
|
|
|
|
{
|
|
|
|
//error_log(__METHOD__."()");
|
|
|
|
self::$extra['window-focus'] = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Allow app to store arbitray values in egw script tag
|
|
|
|
*
|
|
|
|
* Attribute name will be "data-$app-$name" and value will be json serialized, if not scalar.
|
|
|
|
*
|
|
|
|
* @param string $app
|
|
|
|
* @param string $name
|
|
|
|
* @param mixed $value
|
|
|
|
*/
|
|
|
|
public static function set_extra($app, $name, $value)
|
|
|
|
{
|
|
|
|
self::$extra[$app.'-'.$name] = $value;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Clear all extra data
|
|
|
|
*/
|
|
|
|
public static function clear_extra()
|
|
|
|
{
|
|
|
|
self::$extra = array();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Allow eg. ajax to query content set via refresh_opener or window_close
|
|
|
|
*
|
|
|
|
* @return array content of egw_framework::$extra
|
|
|
|
*/
|
|
|
|
public static function get_extra()
|
|
|
|
{
|
|
|
|
// adding links of refreshed entry, to give others apps more information about necessity to refresh
|
|
|
|
if (isset(self::$extra['refresh-opener']) && count(self::$extra['refresh-opener']) <= 8 && // do not run twice
|
|
|
|
!empty(self::$extra['refresh-opener'][1]) && !empty(self::$extra['refresh-opener'][2])) // app/id given
|
|
|
|
{
|
|
|
|
$links = Link::get_links(self::$extra['refresh-opener'][1], self::$extra['refresh-opener'][2]);
|
|
|
|
$apps = array();
|
|
|
|
foreach($links as $link)
|
|
|
|
{
|
|
|
|
$apps[$link['app']][] = $link['id'];
|
|
|
|
}
|
|
|
|
while (count(self::$extra['refresh-opener']) < 8)
|
|
|
|
{
|
|
|
|
self::$extra['refresh-opener'][] = null;
|
|
|
|
}
|
|
|
|
self::$extra['refresh-opener'][] = $apps;
|
|
|
|
}
|
|
|
|
return self::$extra;
|
|
|
|
}
|
|
|
|
}
|