PHP 8 fixes

This commit is contained in:
Ralf Becker 2021-03-28 20:48:55 +02:00
parent 02c3feb95d
commit 868135775c
32 changed files with 115 additions and 91 deletions

View File

@ -164,7 +164,7 @@ class addressbook_groupdav extends Api\CalDAV\Handler
if (isset($nresults)) if (isset($nresults))
{ {
$files['files'] = $this->propfind_callback($path, $filter, array(0, (int)$nresults)); $files['files'] = $this->propfind_callback2($path, $filter, array(0, (int)$nresults));
// hack to support limit with sync-collection report: contacts are returned in modified ASC order (oldest first) // hack to support limit with sync-collection report: contacts are returned in modified ASC order (oldest first)
// if limit is smaller then full result, return modified-1 as sync-token, so client requests next chunk incl. modified // if limit is smaller then full result, return modified-1 as sync-token, so client requests next chunk incl. modified
@ -184,14 +184,28 @@ class addressbook_groupdav extends Api\CalDAV\Handler
} }
/** /**
* Callback for profind iterator * Callback for propfind iterator
* *
* @param string $path * @param string $path
* @param array& $filter * @param array& $filter
* @param array|boolean $start =false false=return all or array(start,num) * @param array|boolean $start =false false=return all or array(start,num)
* @return array with "files" array with values for keys path and props * @return array with "files" array with values for keys path and props
*/ */
function &propfind_callback($path,array &$filter,$start=false,$report_not_found_multiget_ids=true) function &propfind_callback($path, array $filter, $start=false)
{
return $this->propfind_callback2($path, $filter, $start);
}
/**
* Callback for propfind iterator with ability to skip reporting not found ids
*
* @param string $path
* @param array& $filter
* @param array|boolean $start =false false=return all or array(start,num)
* @param boolean $report_not_found_multiget_ids=true
* @return array with "files" array with values for keys path and props
*/
function &propfind_callback2($path, array &$filter, $start=false, $report_not_found_multiget_ids=true)
{ {
//error_log(__METHOD__."('$path', ".array2string($filter).", ".array2string($start).", $report_not_found_multiget_ids)"); //error_log(__METHOD__."('$path', ".array2string($filter).", ".array2string($start).", $report_not_found_multiget_ids)");
$starttime = microtime(true); $starttime = microtime(true);
@ -299,7 +313,7 @@ class addressbook_groupdav extends Api\CalDAV\Handler
if ($sync_collection_report) $token_was = $this->sync_collection_token; if ($sync_collection_report) $token_was = $this->sync_collection_token;
self::$path_attr = 'id'; self::$path_attr = 'id';
self::$path_extension = '.vcf'; self::$path_extension = '.vcf';
$files = array_merge($files, $this->propfind_callback($path, $accounts_filter, false, false)); $files = array_merge($files, $this->propfind_callback2($path, $accounts_filter, false, false));
self::$path_attr = 'carddav_name'; self::$path_attr = 'carddav_name';
self::$path_extension = ''; self::$path_extension = '';
if ($sync_collection_report && $token_was > $this->sync_collection_token) if ($sync_collection_report && $token_was > $this->sync_collection_token)

View File

@ -59,7 +59,7 @@ class addressbook_hooks
'link' => "javascript:egw.open('','$appname','add')" 'link' => "javascript:egw.open('','$appname','add')"
), ),
'Advanced search' => "javascript:egw_openWindowCentered2('". 'Advanced search' => "javascript:egw_openWindowCentered2('".
Egw::link('/index.php',array('menuaction' => 'addressbook.addressbook_ui.search'),false). Egw::link('/index.php',array('menuaction' => 'addressbook.addressbook_ui.extSearch'),false).
"','_blank',870,610,'yes')", "','_blank',870,610,'yes')",
'Placeholders' => Egw::link('/index.php','menuaction=api.EGroupware\\Api\\Contacts\\Merge.show_replacements') 'Placeholders' => Egw::link('/index.php','menuaction=api.EGroupware\\Api\\Contacts\\Merge.show_replacements')
); );

View File

@ -67,12 +67,11 @@ class addressbook_import_contacts_csv extends importexport_basic_import_csv {
/** /**
* imports entries according to given definition object. * imports entries according to given definition object.
* @param resource $_stream * @param importexport_definition $definition
* @param string $_charset * @param importexport_import_csv|null $import_csv
* @param definition $_definition
*/ */
public function init(importexport_definition &$_definition ) { protected function init(importexport_definition $definition, importexport_import_csv $import_csv = null)
{
// fetch the addressbook bo // fetch the addressbook bo
$this->bocontacts = new addressbook_bo(); $this->bocontacts = new addressbook_bo();

View File

@ -26,7 +26,7 @@ use EGroupware\Kanban\Hooks;
class addressbook_ui extends addressbook_bo class addressbook_ui extends addressbook_bo
{ {
public $public_functions = array( public $public_functions = array(
'search' => True, 'extSearch' => True,
'edit' => True, 'edit' => True,
'view' => True, 'view' => True,
'index' => True, 'index' => True,
@ -3301,7 +3301,7 @@ class addressbook_ui extends addressbook_bo
* @param array $_content * @param array $_content
* @return string * @return string
*/ */
function search($_content=array()) function extSearch($_content=array())
{ {
if(!empty($_content)) if(!empty($_content))
{ {
@ -3481,7 +3481,7 @@ class addressbook_ui extends addressbook_bo
* Migrate contacts to or from LDAP (called by Admin >> Addressbook >> Site configuration (Admin only) * Migrate contacts to or from LDAP (called by Admin >> Addressbook >> Site configuration (Admin only)
* *
*/ */
function migrate2ldap() function migrate2ldap($type=null)
{ {
$GLOBALS['egw_info']['flags']['app_header'] = lang('Addressbook').' - '.lang('Migration to LDAP'); $GLOBALS['egw_info']['flags']['app_header'] = lang('Addressbook').' - '.lang('Migration to LDAP');
echo $GLOBALS['egw']->framework->header(); echo $GLOBALS['egw']->framework->header();
@ -3493,7 +3493,7 @@ class addressbook_ui extends addressbook_bo
} }
else else
{ {
parent::migrate2ldap($_GET['type']); parent::migrate2ldap($type ?? $_GET['type']);
echo '<p style="margin-top: 20px;"><b>'.lang('Migration finished')."</b></p>\n"; echo '<p style="margin-top: 20px;"><b>'.lang('Migration finished')."</b></p>\n";
} }
echo $GLOBALS['egw']->framework->footer(); echo $GLOBALS['egw']->framework->footer();

View File

@ -31,7 +31,7 @@ class admin_asyncservice
echo $GLOBALS['egw']->framework->header(); echo $GLOBALS['egw']->framework->header();
$async = $GLOBALS['egw']->asyncservice; // use an own instance, as we might set debug=True $async = new Api\Asyncservice(); // use an own instance, as we might set debug=True
$async->debug = !!$_POST['debug']; $async->debug = !!$_POST['debug'];

View File

@ -146,11 +146,11 @@ class admin_customfields
// Handle incoming - types, options, etc. // Handle incoming - types, options, etc.
if($this->manage_content_types) if($this->manage_content_types)
{ {
if(count($this->content_types) == 0) if(empty($this->content_types))
{ {
$this->content_types = Api\Config::get_content_types($this->appname); $this->content_types = Api\Config::get_content_types($this->appname);
} }
if (count($this->content_types)==0) if (empty($this->content_types))
{ {
// if you define your default types of your app with the search_link hook, they are available here, if no types were found // if you define your default types of your app with the search_link hook, they are available here, if no types were found
$this->content_types = (array)Api\Link::get_registry($this->appname,'default_types'); $this->content_types = (array)Api\Link::get_registry($this->appname,'default_types');

View File

@ -659,7 +659,7 @@ class Asyncservice
$webserver = posix_getpwuid(posix_getuid ()); $webserver = posix_getpwuid(posix_getuid ());
echo '<p>'.lang("You need to add the webserver user '%1' to the group '%2'.",$webserver['name'],$group['name'])."</p>\n"; } echo '<p>'.lang("You need to add the webserver user '%1' to the group '%2'.",$webserver['name'],$group['name'])."</p>\n"; }
} }
if (($fd = popen('/bin/sh -c "type -p '.$name.'"','r'))) if (function_exists('popen') && ($fd = popen('/bin/sh -c "type -p '.$name.'"','r')))
{ {
$this->$name = fgets($fd,256); $this->$name = fgets($fd,256);
@pclose($fd); @pclose($fd);
@ -707,7 +707,7 @@ class Asyncservice
} }
$times = False; $times = False;
$other_cronlines = array(); $other_cronlines = array();
if (($crontab = popen('/bin/sh -c "'.$this->crontab.' -l" 2>&1','r')) !== False) if (function_exists('popen') && ($crontab = popen('/bin/sh -c "'.$this->crontab.' -l" 2>&1','r')) !== False)
{ {
$n = 0; $n = 0;
while ($line = fgets($crontab,256)) while ($line = fgets($crontab,256))
@ -762,7 +762,7 @@ class Asyncservice
$other_cronlines = array(); $other_cronlines = array();
$this->installed($other_cronlines); // find other installed cronlines $this->installed($other_cronlines); // find other installed cronlines
if (($crontab = popen('/bin/sh -c "'.$this->crontab.' -" 2>&1','w')) !== False) if (function_exists('popen') && ($crontab = popen('/bin/sh -c "'.$this->crontab.' -" 2>&1','w')) !== False)
{ {
foreach ($other_cronlines as $cronline) foreach ($other_cronlines as $cronline)
{ {

View File

@ -76,9 +76,6 @@ class Cache extends Etemplate\Request
{ {
$this->id = $_id ? $_id : self::request_id(); $this->id = $_id ? $_id : self::request_id();
//error_log(__METHOD__."($_id) this->id=$this->id"); //error_log(__METHOD__."($_id) this->id=$this->id");
// hack to quiten IDE Warning for not calling parent::__construct, which we can not!
if (false) parent::__construct();
} }
/** /**
@ -96,9 +93,10 @@ class Cache extends Etemplate\Request
* Factory method to get a new request object or the one for an existing request * Factory method to get a new request object or the one for an existing request
* *
* @param string $id =null * @param string $id =null
* @return Request|boolean the object or false if $id is not found * @param bool $handle_not_found =true true: handle not found by trying to redirect, false: just return null
* @return Request|null null if Request not found and $handle_not_found === false
*/ */
static function read($id=null) public static function read($id=null, $handle_not_found=true)
{ {
$request = new Cache($id); $request = new Cache($id);

View File

@ -204,7 +204,8 @@ class Nextmatch extends Etemplate\Widget
{ {
$value['options-cat_id'][''] = lang('All categories'); $value['options-cat_id'][''] = lang('All categories');
} }
$value['options-cat_id'] += Select::typeOptions('select-cat', ',,'.$cat_app,$no_lang=true,false,$value['cat_id']); $no_lang = true;
$value['options-cat_id'] += Select::typeOptions('select-cat', ',,'.$cat_app,$no_lang,false,$value['cat_id']);
Select::fix_encoded_options($value['options-cat_id']); Select::fix_encoded_options($value['options-cat_id']);
} }

View File

@ -654,12 +654,12 @@ class Select extends Etemplate\Widget
$options[$cat['id']] += $cat['data']; $options[$cat['id']] += $cat['data'];
} }
} }
// preserv unavailible cats (eg. private user-cats) // preserve unavailable cats (eg. private user-cats)
if ($value && ($unavailible = array_diff(is_array($value) ? $value : explode(',',$value),array_keys((array)$options)))) if (isset(self::$request) && $value && ($unavailable = array_diff(is_array($value) ? $value : explode(',',$value),array_keys((array)$options))))
{ {
// unavailable cats need to be merged in again // unavailable cats need to be merged in again
$unavailable_name = $form_name.self::UNAVAILABLE_CAT_POSTFIX; $unavailable_name = $form_name.self::UNAVAILABLE_CAT_POSTFIX;
self::$request->preserv[$unavailable_name] = $unavailible; self::$request->preserv[$unavailable_name] = $unavailable;
} }
$no_lang = True; $no_lang = True;
break; break;

View File

@ -308,7 +308,7 @@ class Tree extends Etemplate\Widget
{ {
// += to keep further options set by app code // += to keep further options set by app code
self::$request->sel_options[$form_name] += self::typeOptions($this->attrs['type'], $this->attrs['options'], self::$request->sel_options[$form_name] += self::typeOptions($this->attrs['type'], $this->attrs['options'],
$no_lang=null, $this->attrs['readonly'], self::get_array(self::$request->content, $form_name), $form_name); $no_lang, $this->attrs['readonly'], self::get_array(self::$request->content, $form_name), $form_name);
// if no_lang was modified, forward modification to the client // if no_lang was modified, forward modification to the client
if ($no_lang != $this->attr['no_lang']) if ($no_lang != $this->attr['no_lang'])

View File

@ -1015,7 +1015,7 @@ class Link extends Link\Storage
$view[$name] = $id[$n]; $view[$name] = $id[$n];
} }
} }
else elseif(is_array($view))
{ {
$view[$reg['view_id']] = $id; $view[$reg['view_id']] = $id;
} }

View File

@ -24,10 +24,6 @@ use EGroupware\Api\Egw;
// Declaration of <extended method> should be compatible with <parent method>, varios places where method parameters change // Declaration of <extended method> should be compatible with <parent method>, varios places where method parameters change
// --> switching it off for now, as it makes error-log unusable // --> switching it off for now, as it makes error-log unusable
error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED); error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED);
if (function_exists('get_magic_quotes_runtime') && get_magic_quotes_runtime())
{
set_magic_quotes_runtime(false);
}
$egw_min_php_version = '7.3'; $egw_min_php_version = '7.3';
if (!function_exists('version_compare') || version_compare(PHP_VERSION,$egw_min_php_version) < 0) if (!function_exists('version_compare') || version_compare(PHP_VERSION,$egw_min_php_version) < 0)
@ -35,7 +31,7 @@ if (!function_exists('version_compare') || version_compare(PHP_VERSION,$egw_min_
die("EGroupware requires PHP $egw_min_php_version or greater.<br />Please contact your System Administrator to upgrade PHP!"); die("EGroupware requires PHP $egw_min_php_version or greater.<br />Please contact your System Administrator to upgrade PHP!");
} }
if (!defined('EGW_API_INC')) define('EGW_API_INC',PHPGW_API_INC); // this is to support the header upgrade if (!defined('EGW_API_INC') && defined('PHPGW_API_INC')) define('EGW_API_INC',PHPGW_API_INC); // this is to support the header upgrade
/* Make sure the header.inc.php is current. */ /* Make sure the header.inc.php is current. */
if (!isset($GLOBALS['egw_domain']) || $GLOBALS['egw_info']['server']['versions']['header'] < $GLOBALS['egw_info']['server']['versions']['current_header']) if (!isset($GLOBALS['egw_domain']) || $GLOBALS['egw_info']['server']['versions']['header'] < $GLOBALS['egw_info']['server']['versions']['current_header'])
@ -80,7 +76,7 @@ if (Session::init_handler())
if (is_object($GLOBALS['egw']) && ($GLOBALS['egw'] instanceof Egw)) // only egw object has wakeup2, setups egw_minimal eg. has not! if (is_object($GLOBALS['egw']) && ($GLOBALS['egw'] instanceof Egw)) // only egw object has wakeup2, setups egw_minimal eg. has not!
{ {
$GLOBALS['egw']->wakeup2(); // adapt the restored egw-object/enviroment to this request (eg. changed current app) $GLOBALS['egw']->wakeup2(); // adapt the restored egw-object/environment to this request (eg. changed current app)
$GLOBALS['egw_info']['flags']['session_restore_time'] = microtime(true) - $GLOBALS['egw_info']['flags']['page_start_time']; $GLOBALS['egw_info']['flags']['session_restore_time'] = microtime(true) - $GLOBALS['egw_info']['flags']['page_start_time'];
if (is_object($GLOBALS['egw']->translation)) return; // exit this file, as the rest of the file creates a new egw-object and -enviroment if (is_object($GLOBALS['egw']->translation)) return; // exit this file, as the rest of the file creates a new egw-object and -enviroment

View File

@ -426,7 +426,11 @@ if (!function_exists('display_sidebox'))
*/ */
function display_sidebox($appname,$menu_title,$_file) function display_sidebox($appname,$menu_title,$_file)
{ {
$file = str_replace('preferences.uisettings.index', 'preferences.preferences_settings.index', $_file); $file = array_map(function($item)
{
return is_array($item) ? $item :
str_replace('preferences.uisettings.index', 'preferences.preferences_settings.index', $item);
}, $_file);
$GLOBALS['egw']->framework->sidebox($appname,$menu_title,$file); $GLOBALS['egw']->framework->sidebox($appname,$menu_title,$file);
} }
} }

View File

@ -1160,7 +1160,7 @@ class calendar_groupdav extends Api\CalDAV\Handler
if (preg_match('/^METHOD:(PUBLISH|REQUEST)(\r\n|\r|\n)(.*)^BEGIN:VEVENT/ism', $options['content'])) if (preg_match('/^METHOD:(PUBLISH|REQUEST)(\r\n|\r|\n)(.*)^BEGIN:VEVENT/ism', $options['content']))
{ {
$handler = $this->_get_handler(); $handler = $this->_get_handler();
if (($foundEvents = $handler->search($vCalendar, null, false, $charset))) if (($foundEvents = $handler->iCalSearch($vCalendar, null, false, $charset)))
{ {
$id = array_shift($foundEvents); $id = array_shift($foundEvents);
list($eventId) = explode(':', $id); list($eventId) = explode(':', $id);
@ -1548,11 +1548,12 @@ class calendar_groupdav extends Api\CalDAV\Handler
* @param string $path * @param string $path
* @param int|string $retval * @param int|string $retval
* @param boolean $path_attr_is_name =true true: path_attr is ca(l|rd)dav_name, false: id (GroupDAV needs Location header) * @param boolean $path_attr_is_name =true true: path_attr is ca(l|rd)dav_name, false: id (GroupDAV needs Location header)
* @param string $etag =null etag, to not calculate it again (if != null)
*/ */
function put_response_headers($entry, $path, $retval, $path_attr_is_name=true) function put_response_headers($entry, $path, $retval, $path_attr_is_name=true, $etag=null)
{ {
$schedule_tag = null; $schedule_tag = null;
$etag = $this->get_etag($entry, $schedule_tag); if (!isset($etag)) $etag = $this->get_etag($entry, $schedule_tag);
if ($this->use_schedule_tag) if ($this->use_schedule_tag)
{ {

View File

@ -3218,7 +3218,7 @@ class calendar_ical extends calendar_boupdate
return $event; return $event;
} }
function search($_vcalData, $contentID=null, $relax=false, $charset=null) function iCalSearch($_vcalData, $contentID=null, $relax=false, $charset=null)
{ {
if (($events = $this->icaltoegw($_vcalData, $charset))) if (($events = $this->icaltoegw($_vcalData, $charset)))
{ {

View File

@ -43,8 +43,10 @@ class calendar_import_csv extends importexport_basic_import_csv {
/** /**
* Set up import * Set up import
* @param importexport_definition $definition
* @param importexport_import_csv|null $import_csv
*/ */
protected function init(importexport_definition &$definition, importexport_import_csv &$import_csv=NULL) protected function init(importexport_definition $definition, importexport_import_csv $import_csv=NULL)
{ {
// fetch the addressbook bo // fetch the addressbook bo
$this->bo= new calendar_boupdate(); $this->bo= new calendar_boupdate();
@ -76,8 +78,9 @@ class calendar_import_csv extends importexport_basic_import_csv {
* *
* @return boolean success * @return boolean success
*/ */
public function import_record(\calendar_egw_record &$record, &$import_csv) public function import_record(importexport_iface_egw_record &$record, &$import_csv)
{ {
if (!is_a($record, calendar_egw_record::class)) throw new TypeError();
// set eventOwner // set eventOwner
$options =& $this->definition->plugin_options; $options =& $this->definition->plugin_options;
$options['owner'] = $options['owner'] ? $options['owner'] : $this->user; $options['owner'] = $options['owner'] ? $options['owner'] : $this->user;

View File

@ -119,11 +119,11 @@ class calendar_merge extends Api\Storage\Merge
* @param string $charset=null charset to override default set by mimetype or export charset * @param string $charset=null charset to override default set by mimetype or export charset
* @return string|boolean merged document or false on error * @return string|boolean merged document or false on error
*/ */
function merge_string($content,$ids,$err,$mimetype,$fix) function &merge_string($content, $ids, &$err, $mimetype, array $fix=null, $charset=null)
{ {
$ids = $this->validate_ids((array)$ids, $content); $ids = $this->validate_ids((array)$ids, $content);
return parent::merge_string($content, $ids, $err, $mimetype,$fix); return parent::merge_string($content, $ids, $err, $mimetype, $fix, $charset);
} }
/** /**

View File

@ -217,7 +217,7 @@ class calendar_owner_etemplate_widget extends Etemplate\Widget\Taglist
); );
foreach($lists as $list_id => $list) foreach($lists as $list_id => $list)
{ {
$_results[''+$list_id] = array( $_results[(string)$list_id] = array(
'label' => $list, 'label' => $list,
'resources' => $bo->enum_mailing_list($type.$list_id) 'resources' => $bo->enum_mailing_list($type.$list_id)
); );

View File

@ -220,8 +220,10 @@ abstract class importexport_basic_import_csv implements importexport_iface_impor
/** /**
* Stub to hook into import initialization - set lookups, etc. * Stub to hook into import initialization - set lookups, etc.
* @param importexport_definition $definition
* @param importexport_import_csv|null $import_csv
*/ */
protected function init(importexport_definition &$definition, importexport_import_csv &$import_csv = null) protected function init(importexport_definition $definition, importexport_import_csv $import_csv = null)
{ {
} }

View File

@ -21,7 +21,7 @@
<nextmatch-accountfilter empty_label="Owner" id="owner"/> <nextmatch-accountfilter empty_label="Owner" id="owner"/>
</row> </row>
<row class="row $row_cont[class]"> <row class="row $row_cont[class]">
<image src="${row}[type]" no_lang="1" onclick="window.open(egw::link('/index.php','menuaction=importexport.importexport_${row_cont[type]}_ui.{$row_cont[type]}_dialog&amp;appname=${row_cont[application]}&amp;definition=${row_cont[definition_id]}'),'_blank','dependent=yes,width=850,height=440,scrollbars=yes,status=yes'); return false;" class="lr_padding button"/> <image src="${row}[type]" no_lang="1" onclick="window.open(egw::link('/index.php','menuaction=importexport.importexport_${row_cont[type]}_ui.${row_cont[type]}_dialog&amp;appname=${row_cont[application]}&amp;definition=${row_cont[definition_id]}'),'_blank','dependent=yes,width=850,height=440,scrollbars=yes,status=yes'); return false;" class="lr_padding button"/>
<description id="${row}[name]" no_lang="1" class="lr_padding"/> <description id="${row}[name]" no_lang="1" class="lr_padding"/>
<description id="${row}[application]" class="lr_padding"/> <description id="${row}[application]" class="lr_padding"/>
<listbox type="select-account" id="${row}[allowed_users]" no_lang="1" readonly="true" rows="5" empty_label='Private' class="lr_padding"/> <listbox type="select-account" id="${row}[allowed_users]" no_lang="1" readonly="true" rows="5" empty_label='Private' class="lr_padding"/>

View File

@ -38,7 +38,7 @@
<description/> <description/>
</row> </row>
<row valign="top"> <row valign="top">
<grid width="100%" class="schedule" id="{$row}"> <grid width="100%" class="schedule" id="$row">
<columns> <columns>
<column width="50"/> <column width="50"/>
<column width="60"/> <column width="60"/>
@ -74,8 +74,8 @@
<description id="times" no_lang="1"/> <description id="times" no_lang="1"/>
</vbox> </vbox>
<hbox options="0,0"> <hbox options="0,0">
<button id="edit[{$_cont[id]}]" onclick="window.open(egw::link('/index.php','menuaction=importexport.importexport_schedule_ui.edit&amp;id={$_cont[id]}'),'_blank','dependent=yes,width=600,height=450,scrollbars=yes,status=yes'); return false;" image="edit"/> <button id="edit[$_cont[id]]" onclick="window.open(egw::link('/index.php','menuaction=importexport.importexport_schedule_ui.edit&amp;id=$_cont[id]'),'_blank','dependent=yes,width=600,height=450,scrollbars=yes,status=yes'); return false;" image="edit"/>
<button id="delete[{$_cont[id]}]" onclick="1" image="delete"/> <button id="delete[$_cont[id]]" onclick="1" image="delete"/>
</hbox> </hbox>
</row> </row>
<row class="th" disabled="!@result"> <row class="th" disabled="!@result">

View File

@ -27,7 +27,7 @@
</row> </row>
<row> <row>
<description id="${row}[name]" no_lang="1"/> <description id="${row}[name]" no_lang="1"/>
<checkbox id="export[${row}]" no_lang="1" options="{$row_cont[field]}"/> <checkbox id="export[${row}]" no_lang="1" options="$row_cont[field]"/>
</row> </row>
</rows> </rows>
</grid> </grid>

View File

@ -28,8 +28,8 @@
<description value="Translation"/> <description value="Translation"/>
</row> </row>
<row> <row>
<description id="{$row_cont[index]}" value="${row_cont[index]}" no_lang="1"/> <description id="$row_cont[index]" value="$row_cont[index]" no_lang="1"/>
<description value="{$row_cont[title]}" no_lang="1"/> <description value="$row_cont[title]" no_lang="1"/>
<listbox id="{$row}[field]" no_lang="1"/> <listbox id="{$row}[field]" no_lang="1"/>
<textbox id="{$row}[conversion]"/> <textbox id="{$row}[conversion]"/>
</row> </row>

View File

@ -1447,9 +1447,10 @@ class infolog_bo
function link_titles(array $ids) function link_titles(array $ids)
{ {
$titles = array(); $titles = array();
foreach ($this->search($params=array( $params = array(
'col_filter' => array('info_id' => $ids), 'col_filter' => array('info_id' => $ids),
)) as $info) );
foreach ($this->search($params) as $info)
{ {
$titles[$info['info_id']] = $this->link_title($info); $titles[$info['info_id']] = $this->link_title($info);
} }

View File

@ -142,7 +142,7 @@ class infolog_tracking extends Api\Storage\Tracking
* @param array $old * @param array $old
* @return string * @return string
*/ */
function get_subject($data,$old) function get_subject($data, $old, $deleted = null, $receiver = null)
{ {
if ($data['prefix']) if ($data['prefix'])
{ {
@ -170,7 +170,7 @@ class infolog_tracking extends Api\Storage\Tracking
* @param array $old * @param array $old
* @return string * @return string
*/ */
function get_message($data,$old) function get_message($data, $old, $receiver = null)
{ {
if ($data['message']) return $data['message']; // async notification if ($data['message']) return $data['message']; // async notification

View File

@ -137,7 +137,7 @@ class resources_acl_ui
$row['icon_url'] = $GLOBALS['egw_info']['server']['webserver_url']. resources_bo::ICON_PATH.'/'.$row['data']['icon']; $row['icon_url'] = $GLOBALS['egw_info']['server']['webserver_url']. resources_bo::ICON_PATH.'/'.$row['data']['icon'];
} }
$row['subs'] = count($row['children']); $row['subs'] = count($row['children'] ?? []);
$row['class'] = 'level'.$row['level']; $row['class'] = 'level'.$row['level'];

View File

@ -28,12 +28,11 @@ class resources_import_csv extends importexport_basic_import_csv {
/** /**
* imports entries according to given definition object. * imports entries according to given definition object.
* @param resource $_stream * @param importexport_definition $definition $definition
* @param string $_charset * @param ?importexport_import_csv $import_csv
* @param definition $_definition
*/ */
public function init(importexport_definition $_definition ) { protected function init(importexport_definition $definition, importexport_import_csv $import_csv = null)
{
// fetch the resource bo // fetch the resource bo
$this->bo = new resources_bo(); $this->bo = new resources_bo();

View File

@ -47,21 +47,23 @@ class resources_so extends Api\Storage
* Reimplemented to do some minimal caching (re-use already read data) * Reimplemented to do some minimal caching (re-use already read data)
* *
* @param int|array $res_id res_id * @param int|array $res_id res_id
* @param string|array $extra_cols string or array of strings to be added to the SELECT, eg. "count(*) as num"
* @param string $join sql to do a join, added as is after the table-name, eg. ", table2 WHERE x=y" or
* @return array|boolean data if row could be retrived else False * @return array|boolean data if row could be retrived else False
*/ */
function read($res_id) function read($keys, $extra_cols='', $join='')
{ {
if (is_array($res_id) && count($res_id) == 1 && isset($res_id['res_id'])) $res_id = $res_id['res_id']; if (is_array($keys) && count($keys) == 1 && isset($keys['keys'])) $keys = $keys['keys'];
/*if (!is_array($res_id) && $res_id == $this->data['res_id']) /*if (!is_array($keys) && $keys == $this->data['keys'])
{ {
error_log(__METHOD__.'('.array2string($res_id).') this->data[res_id]='.array2string($this->data['res_id']).' --> returning this->data'); error_log(__METHOD__.'('.array2string($keys).') this->data[keys]='.array2string($this->data['keys']).' --> returning this->data');
} }
else else
{ {
error_log(__METHOD__.'('.array2string($res_id).') this->data[res_id]='.array2string($this->data['res_id']).' --> returning parent::read()'); error_log(__METHOD__.'('.array2string($keys).') this->data[keys]='.array2string($this->data['keys']).' --> returning parent::read()');
}*/ }*/
return !is_array($res_id) && $res_id == $this->data['res_id'] ? $this->data : parent::read($res_id); return !is_array($keys) && $keys == $this->data['keys'] ? $this->data : parent::read($keys, $extra_cols, $join);
} }
/** /**
@ -70,11 +72,12 @@ class resources_so extends Api\Storage
* Reimplemented to do some minimal caching (re-use already read data) * Reimplemented to do some minimal caching (re-use already read data)
* *
* @param int|array $res_id id of resource * @param int|array $res_id id of resource
* @param boolean $only_return_ids =false return $ids of delete call to db object, but not run it (can be used by extending classes!)
* @return int|array affected rows, should be 1 if ok, 0 if an error or array with id's if $only_return_ids * @return int|array affected rows, should be 1 if ok, 0 if an error or array with id's if $only_return_ids
*/ */
function delete($res_id) function delete($keys=null,$only_return_ids=false)
{ {
if (($ok = parent::delete($res_id)) && !is_array($res_id) && $res_id == $this->data['res_id']) if (($ok = parent::delete($keys, $only_return_ids)) && !$only_return_ids && !is_array($keys) && $keys == $this->data['res_id'])
{ {
unset($this->data); unset($this->data);
} }
@ -85,12 +88,13 @@ class resources_so extends Api\Storage
* saves a resource including extra fields * saves a resource including extra fields
* *
* @param array $resource key => value * @param array $resource key => value
* @return mixed id of resource if all right, false if fale * @param string|array $extra_where =null extra where clause, eg. to check an etag, returns true if no affected rows!
* @return int|boolean 0 on success, or errno != 0 on error, or true if $extra_where is given and no rows affected
*/ */
function save($resource) function save($keys=null,$extra_where=null)
{ {
$this->data = $resource; $this->data = $keys;
if(parent::save() != 0) return false; if(parent::save(null, $extra_where) != 0) return false;
$res_id = $this->data['res_id']; $res_id = $this->data['res_id'];
return $res_id; return $res_id;

View File

@ -552,7 +552,7 @@ class timesheet_bo extends Api\Storage
($this->quantity_sum ? "SUM(ts_quantity) AS ts_quantity" : '0'), ($this->quantity_sum ? "SUM(ts_quantity) AS ts_quantity" : '0'),
'0','NULL','0','0','0','0','0','0',"SUM($total_sql) AS ts_total" '0','NULL','0','0','0','0','0','0',"SUM($total_sql) AS ts_total"
),'GROUP BY '.$sum_sql[$type],$sum_extra_cols,$wildcard,$empty,$op,'UNION',$filter,$join,$need_full_no_count); ),'GROUP BY '.$sum_sql[$type],$sum_extra_cols,$wildcard,$empty,$op,'UNION',$filter,$join,$need_full_no_count);
$sum_extra_cols[$type]{0} = '0'; $sum_extra_cols[$type][0] = '0';
} }
$union_order[] = 'ts_start '.$sort; $union_order[] = 'ts_start '.$sort;
return parent::search('','',implode(',',$union_order),'','',false,'',$start); return parent::search('','',implode(',',$union_order),'','',false,'',$start);
@ -565,10 +565,12 @@ class timesheet_bo extends Api\Storage
* *
* @param int $ts_id * @param int $ts_id
* @param boolean $ignore_acl =false should the Acl be checked * @param boolean $ignore_acl =false should the Acl be checked
* @param string $join ='' *UNSUPPORTED*
* @return array|boolean array with timesheet entry, null if timesheet not found or false if no rights * @return array|boolean array with timesheet entry, null if timesheet not found or false if no rights
*/ */
function read($ts_id,$ignore_acl=false) function read($ts_id,$ignore_acl=false,$join='')
{ {
if (!is_bool($ignore_acl)) throw new TypeError();
//error_log(__METHOD__."($ts_id,$ignore_acl) ".function_backtrace()); //error_log(__METHOD__."($ts_id,$ignore_acl) ".function_backtrace());
if (!(int)$ts_id || (int)$ts_id != $this->data['ts_id'] && !parent::read($ts_id)) if (!(int)$ts_id || (int)$ts_id != $this->data['ts_id'] && !parent::read($ts_id))
{ {

View File

@ -46,9 +46,10 @@ class timesheet_import_csv extends importexport_basic_import_csv
/** /**
* Initialize for import * Initialize for import
* *
* @param definition $_definition * @param importexport_definition $definition
* @param ?importexport_import_csv $import_csv
*/ */
protected function init( importexport_definition $_definition, importexport_import_csv &$import_csv ) protected function init(importexport_definition $definition, importexport_import_csv $import_csv=null)
{ {
// fetch the bo // fetch the bo
$this->bo = new timesheet_bo(); $this->bo = new timesheet_bo();
@ -60,10 +61,10 @@ class timesheet_import_csv extends importexport_basic_import_csv
$import_csv->conversion_class = $this; $import_csv->conversion_class = $this;
// set Owner // set Owner
$plugin_options = $_definition->plugin_options; $plugin_options = $definition->plugin_options;
$plugin_options['record_owner'] = isset( $_definition->plugin_options['record_owner'] ) ? $plugin_options['record_owner'] = isset( $definition->plugin_options['record_owner'] ) ?
$_definition->plugin_options['record_owner'] : $this->user; $definition->plugin_options['record_owner'] : $this->user;
$_definition->plugin_options = $plugin_options; $definition->plugin_options = $plugin_options;
// For converting human-friendly lookups // For converting human-friendly lookups
$this->lookups = array( $this->lookups = array(
@ -483,7 +484,7 @@ class timesheet_import_csv extends importexport_basic_import_csv
// end of iface_export_plugin // end of iface_export_plugin
// Extra conversion functions - must be static // Extra conversion functions - must be static
public static function addr_id( $n_family,$n_given=null,$org_name=null ) public static function addr_id( $n_family,$n_given=null,$org_name=null, &$record=null)
{ {
// find in Addressbook, at least n_family AND (n_given OR org_name) have to match // find in Addressbook, at least n_family AND (n_given OR org_name) have to match
@ -497,7 +498,7 @@ class timesheet_import_csv extends importexport_basic_import_csv
if(!is_null($n_given)) $n_given = trim($n_given); if(!is_null($n_given)) $n_given = trim($n_given);
if (!is_object($contacts)) if (!is_object($contacts))
{ {
$contacts =& CreateObject('phpgwapi.contacts'); $contacts = new Api\Contacts();
} }
if (!is_null($org_name)) // org_name given? if (!is_null($org_name)) // org_name given?
{ {
@ -523,4 +524,3 @@ class timesheet_import_csv extends importexport_basic_import_csv
return False; return False;
} }
} }
?>

View File

@ -500,7 +500,7 @@ class timesheet_ui extends timesheet_bo
* @param boolean $id_only if true only return (via $rows) an array of contact-ids, dont save state to session * @param boolean $id_only if true only return (via $rows) an array of contact-ids, dont save state to session
* @return int total number of contacts matching the selection * @return int total number of contacts matching the selection
*/ */
function get_rows(&$query_in,&$rows,&$readonlys,$id_only=false) function get_rrows(&$query_in,&$rows,&$readonlys,$id_only=false)
{ {
$this->show_sums = false; $this->show_sums = false;
$end_date = false; $end_date = false;
@ -935,7 +935,7 @@ class timesheet_ui extends timesheet_bo
$date_filters['custom'] = 'custom'; $date_filters['custom'] = 'custom';
$content['nm'] = array( $content['nm'] = array(
'get_rows' => TIMESHEET_APP.'.timesheet_ui.get_rows', 'get_rows' => TIMESHEET_APP.'.timesheet_ui.get_rrows',
'options-filter' => $date_filters, 'options-filter' => $date_filters,
'options-filter2' => array('No details','Details'), 'options-filter2' => array('No details','Details'),
'order' => 'ts_start',// IO name of the column to sort after (optional for the sortheaders) 'order' => 'ts_start',// IO name of the column to sort after (optional for the sortheaders)
@ -1170,7 +1170,7 @@ class timesheet_ui extends timesheet_bo
@set_time_limit(0); // switch off the execution time limit, as it's for big selections to small @set_time_limit(0); // switch off the execution time limit, as it's for big selections to small
$query['num_rows'] = -1; // all $query['num_rows'] = -1; // all
$readonlys = null; $readonlys = null;
$this->get_rows($query,$checked,$readonlys,true); // true = only return the id's $this->get_rrows($query,$checked,$readonlys,true); // true = only return the id's
} }
} }
//error_log(__METHOD__."('$action', ".array2string($checked).', '.array2string($use_all).",,, '$session_name')"); //error_log(__METHOD__."('$action', ".array2string($checked).', '.array2string($use_all).",,, '$session_name')");