From a973c91c24d55379dc6ab31a84c708cb897df62c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur <eldy@destailleur.fr> Date: Sat, 19 Dec 2015 02:38:11 +0100 Subject: [PATCH] Fix pagination on cron jobs Fix perf when too much lines --- htdocs/core/modules/modCron.class.php | 2 +- htdocs/cron/card.php | 11 ++- htdocs/cron/list.php | 93 +++++++++++-------- .../install/mysql/tables/llx_cronjob.key.sql | 23 +++++ htdocs/install/mysql/tables/llx_cronjob.sql | 4 +- htdocs/langs/en_US/cron.lang | 4 +- 6 files changed, 90 insertions(+), 47 deletions(-) create mode 100644 htdocs/install/mysql/tables/llx_cronjob.key.sql diff --git a/htdocs/core/modules/modCron.class.php b/htdocs/core/modules/modCron.class.php index 86dbb021f26..aefb599a9b7 100644 --- a/htdocs/core/modules/modCron.class.php +++ b/htdocs/core/modules/modCron.class.php @@ -128,7 +128,7 @@ class modCron extends DolibarrModules $this->menu[$r]=array( 'fk_menu'=>'fk_mainmenu=home,fk_leftmenu=modulesadmintools', // Use 'fk_mainmenu=xxx' or 'fk_mainmenu=xxx,fk_leftmenu=yyy' where xxx is mainmenucode and yyy is a leftmenucode 'type'=>'left', // This is a Left menu entry 'titre'=>'CronList', - 'url'=>'/cron/list.php?status=-1', + 'url'=>'/cron/list.php?status=-2', 'langs'=>'cron', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. 'position'=>200, 'enabled'=>'$leftmenu==\'modulesadmintools\'', // Define condition to show or hide menu entry. Use '$conf->mymodule->enabled' if entry must be visible if module is enabled. Use '$leftmenu==\'system\'' to show if leftmenu system is selected. diff --git a/htdocs/cron/card.php b/htdocs/cron/card.php index 474670e27cc..60513588ef8 100644 --- a/htdocs/cron/card.php +++ b/htdocs/cron/card.php @@ -43,6 +43,11 @@ $action=GETPOST('action','alpha'); $confirm=GETPOST('confirm','alpha'); $cancel=GETPOST('cancel'); + +/* + * Actions + */ + $object = new Cronjob($db); if (!empty($id)) { @@ -53,7 +58,7 @@ if (!empty($id)) } } -if(!empty($cancel)) +if (!empty($cancel)) { if (!empty($id)) { @@ -61,7 +66,7 @@ if(!empty($cancel)) } else { - Header("Location: ".DOL_URL_ROOT.'/cron/list.php?status=1'); + Header("Location: ".DOL_URL_ROOT.'/cron/list.php?status=-2'); exit; } } @@ -78,7 +83,7 @@ if ($action == 'confirm_delete' && $confirm == "yes" && $user->rights->cron->del } else { - Header("Location: ".DOL_URL_ROOT.'/cron/list.php?status=1'); + Header("Location: ".DOL_URL_ROOT.'/cron/list.php?status=-2'); exit; } } diff --git a/htdocs/cron/list.php b/htdocs/cron/list.php index 65c2104b85f..6dca2218286 100644 --- a/htdocs/cron/list.php +++ b/htdocs/cron/list.php @@ -47,6 +47,7 @@ $sortorder=GETPOST('sortorder','alpha'); $sortfield=GETPOST('sortfield','alpha'); $page=GETPOST('page','int'); $status=GETPOST('status','int'); +if ($status == '') $status=-2; //Search criteria $search_label=GETPOST("search_label",'alpha'); @@ -116,7 +117,7 @@ if ($action == 'confirm_execute' && $confirm == "yes" && $user->rights->cron->ex } } - header("Location: ".DOL_URL_ROOT.'/cron/list.php?status=-1'); // Make a call to avoid to run twice job when using back + header("Location: ".DOL_URL_ROOT.'/cron/list.php?status=-2'); // Make a call to avoid to run twice job when using back exit; } @@ -131,52 +132,57 @@ $pagetitle=$langs->trans("CronList"); llxHeader('',$pagetitle); -print load_fiche_titre($pagetitle,'','title_setup'); +// list of jobs created +$object = new Cronjob($db); +$result=$object->fetch_all($sortorder, $sortfield, $limit, $offset, $status, $filter); +if ($result < 0) +{ + setEventMessages($object->error, $object->errors, 'errors'); +} +$nbtotalofrecord=0; +$num=count($object->lines); + +$param='&page='.$page.'&status='.$status.'&search_label='.$search_label; + + +print_barre_liste($pagetitle, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'title_setup'); + print $langs->trans('CronInfo'); +print "<br><br>"; + if ($action == 'delete') { - print $form->formconfirm($_SERVER['PHP_SELF']."?id=".$id.'&status='.$status,$langs->trans("CronDelete"),$langs->trans("CronConfirmDelete"),"confirm_delete",'','',1); + print $form->formconfirm($_SERVER['PHP_SELF']."?id=".$id.'&status='.$status,$langs->trans("CronDelete"),$langs->trans("CronConfirmDelete"),"confirm_delete",'','',1); } if ($action == 'execute') { - print $form->formconfirm($_SERVER['PHP_SELF']."?id=".$id.'&status='.$status,$langs->trans("CronExecute"),$langs->trans("CronConfirmExecute"),"confirm_execute",'','',1); + print $form->formconfirm($_SERVER['PHP_SELF']."?id=".$id.'&status='.$status,$langs->trans("CronExecute"),$langs->trans("CronConfirmExecute"),"confirm_execute",'','',1); } -// list of jobs created -$object = new Cronjob($db); -$result=$object->fetch_all($sortorder, $sortfield, $limit, $offset, $status, $filter); -if ($result < 0) -{ - setEventMessages($object->error, $object->errors, 'errors'); -} - - -print "<br><br>"; - print '<form method="GET" action="'.$url_form.'" name="search_form">'."\n"; print '<input type="hidden" name="status" value="'.$status.'" >'; print '<table width="100%" class="noborder">'; print '<tr class="liste_titre">'; -$arg_url='&page='.$page.'&status='.$status.'&search_label='.$search_label; -print_liste_field_titre($langs->trans("ID"),$_SERVER["PHP_SELF"],"t.rowid","",$arg_url,'',$sortfield,$sortorder); -print_liste_field_titre($langs->trans("CronLabel"),$_SERVER["PHP_SELF"],"t.label","",$arg_url,'',$sortfield,$sortorder); -print_liste_field_titre($langs->trans("CronTask"),'','',"",$arg_url,'',$sortfield,$sortorder); -print_liste_field_titre($langs->trans("CronDtStart"),$_SERVER["PHP_SELF"],"t.datestart","",$arg_url,'',$sortfield,$sortorder); -print_liste_field_titre($langs->trans("CronDtEnd"),$_SERVER["PHP_SELF"],"t.dateend","",$arg_url,'',$sortfield,$sortorder); -print_liste_field_titre($langs->trans("CronDtLastLaunch"),$_SERVER["PHP_SELF"],"t.datelastrun","",$arg_url,'',$sortfield,$sortorder); -print_liste_field_titre($langs->trans("CronDtNextLaunch"),$_SERVER["PHP_SELF"],"t.datenextrun","",$arg_url,'',$sortfield,$sortorder); -print_liste_field_titre($langs->trans("CronFrequency"),'',"","",$arg_url,'',$sortfield,$sortorder); -print_liste_field_titre($langs->trans("CronNbRun"),$_SERVER["PHP_SELF"],"t.nbrun","",$arg_url,'',$sortfield,$sortorder); -print_liste_field_titre($langs->trans("CronLastResult"),$_SERVER["PHP_SELF"],"t.lastresult","",$arg_url,'',$sortfield,$sortorder); -print_liste_field_titre($langs->trans("CronLastOutput"),$_SERVER["PHP_SELF"],"t.lastoutput","",$arg_url,'',$sortfield,$sortorder); -print_liste_field_titre($langs->trans("Enabled"),$_SERVER["PHP_SELF"],"t.status","",$arg_url,'align="center"',$sortfield,$sortorder); +print_liste_field_titre($langs->trans("ID"),$_SERVER["PHP_SELF"],"t.rowid","",$param,'',$sortfield,$sortorder); +print_liste_field_titre($langs->trans("CronLabel"),$_SERVER["PHP_SELF"],"t.label","",$param,'',$sortfield,$sortorder); +print_liste_field_titre($langs->trans("CronTask"),'','',"",$param,'',$sortfield,$sortorder); +print_liste_field_titre($langs->trans("CronDtStart"),$_SERVER["PHP_SELF"],"t.datestart","",$param,'',$sortfield,$sortorder); +print_liste_field_titre($langs->trans("CronDtEnd"),$_SERVER["PHP_SELF"],"t.dateend","",$param,'',$sortfield,$sortorder); +print_liste_field_titre($langs->trans("CronDtLastLaunch"),$_SERVER["PHP_SELF"],"t.datelastrun","",$param,'',$sortfield,$sortorder); +print_liste_field_titre($langs->trans("CronDtNextLaunch"),$_SERVER["PHP_SELF"],"t.datenextrun","",$param,'',$sortfield,$sortorder); +print_liste_field_titre($langs->trans("CronFrequency"),'',"","",$param,'',$sortfield,$sortorder); +print_liste_field_titre($langs->trans("CronNbRun"),$_SERVER["PHP_SELF"],"t.nbrun","",$param,'',$sortfield,$sortorder); +print_liste_field_titre($langs->trans("CronMaxRun"),$_SERVER["PHP_SELF"],"t.maxrun","",$param,'',$sortfield,$sortorder); +print_liste_field_titre($langs->trans("CronLastResult"),$_SERVER["PHP_SELF"],"t.lastresult","",$param,'',$sortfield,$sortorder); +print_liste_field_titre($langs->trans("CronLastOutput"),$_SERVER["PHP_SELF"],"t.lastoutput","",$param,'',$sortfield,$sortorder); +print_liste_field_titre($langs->trans("Status"),$_SERVER["PHP_SELF"],"t.status","",$param,'align="center"',$sortfield,$sortorder); print_liste_field_titre(''); print "</tr>\n"; @@ -194,8 +200,9 @@ print '<td> </td>'; print '<td> </td>'; print '<td> </td>'; print '<td> </td>'; +print '<td> </td>'; print '<td class="liste_titre" align="center">'; -print $form->selectarray('status', array('0'=>$langs->trans("No"),'1'=>$langs->trans("Yes")), $status, 1); +print $form->selectarray('status', array('0'=>$langs->trans("Disabled"), '1'=>$langs->trans("Enabled"), '-2'=>$langs->trans("EnabledAndDisabled"), '2'=>$langs->trans("Archived")), $status, 1); print '</td><td class="liste_titre" align="right">'; print '<input class="liste_titre" type="image" src="'.img_picto($langs->trans("Search"),'search.png','','',1).'" value="'.dol_escape_htmltag($langs->trans("Search")).'" title="'.dol_escape_htmltag($langs->trans("Search")).'">'; print '<input type="image" class="liste_titre" name="button_removefilter" src="'.img_picto($langs->trans("Search"),'searchclear.png','','',1).'" value="'.dol_escape_htmltag($langs->trans("RemoveFilter")).'" title="'.dol_escape_htmltag($langs->trans("RemoveFilter")).'">'; @@ -203,9 +210,9 @@ print '</td>'; print '</tr>'; -if (count($object->lines) > 0) +if ($num > 0) { - // Loop on each active job + // Loop on each job $style='pair'; foreach($object->lines as $line) { @@ -229,7 +236,7 @@ if (count($object->lines) > 0) } else { - print $langs->trans('CronNone'); + //print $langs->trans('CronNone'); } print '</td>'; @@ -253,19 +260,19 @@ if (count($object->lines) > 0) print '</td>'; print '<td>'; - if(!empty($line->datestart)) {print dol_print_date($line->datestart,'dayhour');} else {print $langs->trans('CronNone');} + if(!empty($line->datestart)) {print dol_print_date($line->datestart,'dayhour');} print '</td>'; print '<td>'; - if(!empty($line->dateend)) {print dol_print_date($line->dateend,'dayhour');} else {print $langs->trans('CronNone');} + if(!empty($line->dateend)) {print dol_print_date($line->dateend,'dayhour');} print '</td>'; print '<td>'; - if(!empty($line->datelastrun)) {print dol_print_date($line->datelastrun,'dayhour');} else {print $langs->trans('CronNone');} + if(!empty($line->datelastrun)) {print dol_print_date($line->datelastrun,'dayhour');} print '</td>'; print '<td>'; - if(!empty($line->datenextrun)) {print dol_print_date($line->datenextrun,'dayhour');} else {print $langs->trans('CronNone');} + if(!empty($line->datenextrun)) {print dol_print_date($line->datenextrun,'dayhour');} print '</td>'; print '<td>'; @@ -276,20 +283,26 @@ if (count($object->lines) > 0) print '</td>'; print '<td>'; - if(!empty($line->nbrun)) {print $line->nbrun;} else {print '0';} + if (!empty($line->nbrun)) {print $line->nbrun;} else {print '0';} print '</td>'; print '<td>'; - if(!empty($line->lastresult)) {print dol_trunc($line->lastresult);} else {print $langs->trans('CronNone');} + if (!empty($line->maxrun)) {print $line->maxrun;} + print '</td>'; + + print '<td>'; + if(!empty($line->lastresult)) {print dol_trunc($line->lastresult);} print '</td>'; print '<td>'; - if(!empty($line->lastoutput)) {print dol_trunc(nl2br($line->lastoutput),100);} else {print $langs->trans('CronNone');} + if(!empty($line->lastoutput)) {print dol_trunc(nl2br($line->lastoutput),100);} print '</td>'; // Status print '<td align="center">'; - print yn($line->status); + if ($line->status == 1) print $langs->trans("Enabled"); + elseif ($line->status == 2) print $langs->trans("Archived"); + else print $langs->trans("Disabled"); print '</td>'; print '<td align="right" class="nowrap">'; diff --git a/htdocs/install/mysql/tables/llx_cronjob.key.sql b/htdocs/install/mysql/tables/llx_cronjob.key.sql new file mode 100644 index 00000000000..063a793165e --- /dev/null +++ b/htdocs/install/mysql/tables/llx_cronjob.key.sql @@ -0,0 +1,23 @@ +-- =================================================================== +-- Copyright (C) 2015 Laurent Destailleur <eldy@users.sourceforge.net> +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. +-- +-- =================================================================== + +ALTER TABLE llx_cronjob ADD INDEX idx_cronjob_status (status); +ALTER TABLE llx_cronjob ADD INDEX idx_cronjob_datelastrun (datelastrun); +ALTER TABLE llx_cronjob ADD INDEX idx_cronjob_datenextrun (datenextrun); +ALTER TABLE llx_cronjob ADD INDEX idx_cronjob_datestart (datestart); +ALTER TABLE llx_cronjob ADD INDEX idx_cronjob_dateend (dateend); diff --git a/htdocs/install/mysql/tables/llx_cronjob.sql b/htdocs/install/mysql/tables/llx_cronjob.sql index 96784189b05..6e076d518a7 100644 --- a/htdocs/install/mysql/tables/llx_cronjob.sql +++ b/htdocs/install/mysql/tables/llx_cronjob.sql @@ -44,8 +44,8 @@ CREATE TABLE llx_cronjob frequency integer NOT NULL DEFAULT 0, maxrun integer NOT NULL DEFAULT 0, -- set this to 1 for a job queued for on run only nbrun integer, -- nb of run complete (failed or not) - autodelete integer DEFAULT 0, -- Job can be delete once finished - status integer NOT NULL DEFAULT 1, + autodelete integer DEFAULT 0, -- 1=Job must be deleted once finished, 2=Job must be archived once finished (archive = status 2) + status integer NOT NULL DEFAULT 1, -- 0=disabled, 1=enabled, 2=archived fk_user_author integer DEFAULT NULL, fk_user_mod integer DEFAULT NULL, fk_mailing integer DEFAULT NULL, -- id of emailing if job was queued to send mass emailing diff --git a/htdocs/langs/en_US/cron.lang b/htdocs/langs/en_US/cron.lang index 5369859bb8b..ae997d0a490 100644 --- a/htdocs/langs/en_US/cron.lang +++ b/htdocs/langs/en_US/cron.lang @@ -18,8 +18,9 @@ CronExplainHowToRunUnix=On Unix environment you should use the following crontab CronExplainHowToRunWin=On Microsoft(tm) Windows environement you can use Scheduled task tools to run the command line each 5 minutes # Menu CronJobs=Scheduled jobs -CronListActive=List of active/scheduled jobs +CronListActive=List of enabled/scheduled jobs CronListInactive=List of disabled jobs +EnabledAndDisabled=Enabled and disabled # Page list CronDateLastRun=Last run CronLastOutput=Last run output @@ -51,6 +52,7 @@ CronNoJobs=No jobs registered CronPriority=Priority CronLabel=Description CronNbRun=Nb. launch +CronMaxRun=Max nb. launch CronEach=Every JobFinished=Job launched and finished #Page card -- GitLab