Index: admin/system_presets/simple/event_schedules_event-schedule.php =================================================================== --- admin/system_presets/simple/event_schedules_event-schedule.php (revision 0) +++ admin/system_presets/simple/event_schedules_event-schedule.php (revision 0) @@ -0,0 +1,51 @@ + Array ('new_item', 'edit', 'delete', 'approve', 'decline', 'process', 'cancel', 'view', 'dbl-click'), + +// edit event_schedule +// 'event_schedule_edit' => Array ('select', 'cancel', 'reset_edit', 'prev', 'next'), + ); + + // fields to hide + $hidden_fields = Array ( + /* 'EventScheduleId', 'EventScheduleName', 'EventScheduleType', 'Status', 'Event', 'RunInterval', 'RunMode', 'LastRunOn', + 'LastRunStatus', 'NextRunOn', 'RunTime', */ + ); + + // virtual fields to hide + $virtual_hidden_fields = Array ( + ); + + // fields to make required + $required_fields = Array ( + /* 'EventScheduleId', 'EventScheduleName', 'EventScheduleType', 'Status', 'Event', 'RunInterval', 'RunMode', 'LastRunOn', + 'LastRunStatus', 'NextRunOn', 'RunTime', */ + ); + + // virtual fields to make required + $virtual_required_fields = Array ( ); + + // tabs during editing + $hide_edit_tabs = Array ( + ); + + // hide columns in grids + $hide_columns = Array ( +// currently not in user +// 'Default' => Array ( 'EventScheduleId', 'EventScheduleName', 'EventScheduleType', 'Status', 'Event', 'RunInterval', 'RunMode', 'LastRunOn', 'LastRunStatus', 'NextRunOn', ), + ); \ No newline at end of file Index: core/admin_templates/agents/agent_edit.tpl =================================================================== --- core/admin_templates/agents/agent_edit.tpl (revision 14646) +++ core/admin_templates/agents/agent_edit.tpl (working copy) @@ -1,92 +0,0 @@ - - - - - - - - - - - - -
- -
- - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - \ No newline at end of file Index: core/admin_templates/agents/agent_list.tpl =================================================================== --- core/admin_templates/agents/agent_list.tpl (revision 14646) +++ core/admin_templates/agents/agent_list.tpl (working copy) @@ -1,91 +0,0 @@ - - - - - - - - - - - -
- -
- - - - \ No newline at end of file Index: core/admin_templates/event_schedules/event_schedule_edit.tpl =================================================================== --- core/admin_templates/event_schedules/event_schedule_edit.tpl (revision 0) +++ core/admin_templates/event_schedules/event_schedule_edit.tpl (revision 0) @@ -0,0 +1,92 @@ + + + + + + + + + + + + +
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + \ No newline at end of file Index: core/admin_templates/event_schedules/event_schedule_list.tpl =================================================================== --- core/admin_templates/event_schedules/event_schedule_list.tpl (revision 0) +++ core/admin_templates/event_schedules/event_schedule_list.tpl (revision 0) @@ -0,0 +1,91 @@ + + + + + + + + + + + +
+ +
+ + + + \ No newline at end of file Index: core/admin_templates/img/icons/icon24_conf_agents.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: core/admin_templates/img/icons/icon24_conf_event_schedules.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: core\admin_templates\img\icons\icon24_conf_event_schedules.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Index: core/install/english.lang =================================================================== --- core/install/english.lang (revision 14646) +++ core/install/english.lang (working copy) @@ -641,9 +641,9 @@ PHVsPg0KICA8bGk+U2NhbnMgZm9yIG5ld2x5IGFkZGVkIEZyb250LWVuZCBUaGVtZSB0ZW1wbGF0ZXMgYWNyb3NzIGFsbCA8c3Ryb25nPjxpPmVuYWJsZWQ8L2k+PC9zdHJvbmc+IHRoZW1lcy4gVGhpcyBhY3Rpb24gaXMgcGVyZm9ybWVkIGF1dG9tYXRpY2FsbHkgd2hlbiBhIG5ldyB0aGVtZSBpcyBhZGRlZCBvciBleGlzdGluZyB0aGVtZSBpcyBlbmFibGVkLjwvbGk+DQogIDxsaT5BZGRpdGlvbmFsbHksIGRlbGV0ZXMgYWxsIGNvbXByZXNzZWQgYW5kIGNhY2hlZCBKYXZhc2NyaXB0L0NTUyBmaWxlcyAoLmpzIC5jc3MpIGxvYWRlZCB1c2luZyA8c3Ryb25nPjxpPiZsdDtpbnAyOm1fQ29tcHJlc3MgLi4uLyZndDs8L2k+PC9zdHJvbmc+IHRhZy48L2xpPg0KICA8bGk+VGhpcyBmdW5jdGlvbiBpcyBhbHNvIGF2YWlsYWJsZSBhcyBhICJSZWZyZXNoIiBidXR0b24gaW4gdGhlIFRoZW1lcyBzZWN0aW9uIHRvb2xiYXIgaW4gQWRtaW4gQ29uc29sZS48L2xpPg0KICA8bGk+VGhpcyBvcHRpb24gc2hvdWxkIGJlIHVzZWQgaW4gY2FzZSB3aGVuICI0MDQgTm90IEZvdW5kIiBwYWdlIGlzIHNob3duIGluc3RlYWQgb2YgZXhwZWN0ZWQgbmV3bHkgYWRkZWQgcGFnZSBvciB0ZW1wbGF0ZS48L2xpPg0KPC91bD4= PHVsPg0KICA8bGk+UmVzZXRzIHRoZSBjYWNoZSBvZiBBZG1pbiBDb25zb2xlIHNlY3Rpb25zIChsZWZ0IG1lbnUpLiBUaGUgZGVmaW5pdGlvbnMgb2Ygc2VjdGlvbnMgYXJlIHJlYWQgYW5kIGNvbGxlY3RlZCBmcm9tIDxzdHJvbmc+PGk+VW5pdCBDb25maWc8L2k+PC9zdHJvbmc+IGZpbGVzIHRoYXQgYWxyZWFkeSBiZWVuIHNjYW5uZWQgYW5kIGNhY2hlZCBieSB0aGUgc3lzdGVtLjwvbGk+DQogIDxsaT5Vc2UgdGhpcyByZXNldCBvcHRpb24gaWYgYSBuZXdseSBhZGRlZCBzZWN0aW9uIGRvZXNuJ3QgYXBwZWFyIGluIHRoZSBsZWZ0IEFkbWluIENvbnNvbGUgbWVudS48L2xpPg0KPC91bD4= PHVsPg0KICA8bGk+UmVzZXRzIDxzdHJvbmc+PGk+QWxsIERhdGE8L2k+PC9zdHJvbmc+IHN0b3JlZCBpbiB0aGUgTWVtb3J5IENhY2hlLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIFN5c3RlbSBEYXRhIGFuZCBEYXRhYmFzZSBJdGVtcy48L2xpPg0KICA8bGk+VXNlIHdpdGggY2F1dGlvbiBkdWUgdG8gcG9zc2liaWxpdHkgb2YgbG9uZyBleGVjdXRpb24gdGltZS48L2xpPg0KPC91bD4= - PHVsPg0KICA8bGk+U2NhbnMgPHN0cm9uZz48aT4iY29yZSI8L2k+PC9zdHJvbmc+IGFuZCA8c3Ryb25nPjxpPiJtb2R1bGVzIjwvaT48L3N0cm9uZz4gZm9sZGVycyB0byBjYWNoZSB0aGUgbG9jYXRpb24gb2YgYWxsIDxzdHJvbmc+PGk+VW5pdCBDb25maWc8L2k+PC9zdHJvbmc+IGZpbGVzLiBUaGUgZXhlY3V0aW9uIHRpbWUgZGVwZW5kcyBvbiB0aGUgbnVtYmVyIG9mIDxzdHJvbmc+PGk+VW5pdCBDb25maWc8L2k+PC9zdHJvbmc+IGZpbGVzIGZvdW5kLjwvbGk+DQogIDxsaT5SZXNldHMgdmFyaW91cyBjYWNoZWQgc3lzdGVtIGRhdGEgc3VjaCBhcyBkZWZpbmVkIFBIUCBDbGFzc2VzIChtYXBwaW5nIGJldHdlZW4gdGhlIGNsYXNzIG5hbWUgYW5kIHBoeXNpY2FsIGZpbGVuYW1lIGFuZCBsb2NhdGlvbiBvZiB0aGUgY2xhc3MpLCBIb29rcywgQWdlbnRzLCBDYWNoZWQgQ29uZmlndXJhdGlvbiBWYXJpYWJsZXMsIFJlcGxhY2VtZW50IFRlbXBsYXRlcywgUmV3cml0ZSBMaXN0ZW5lcnMgYW5kIExvYWRlZCBNb2R1bGVzLiBEYXRhIGlzIHJlYWQgYW5kIGNvbGxlY3RlZCBmcm9tIDxzdHJvbmc+PGk+VW5pdCBDb25maWc8L2k+PC9zdHJvbmc+IGZpbGVzIHRoYXQgYWxyZWFkeSBiZWVuIHNjYW5uZWQgYW5kIGNhY2hlZCBieSB0aGUgc3lzdGVtLjwvbGk+DQogIDxsaT5EZWxldGVzIGNvbXBpbGVkIHNraW5zIGZvciBBZG1pbiBDb25zb2xlIChjc3MgZmlsZXMpLjwvbGk+DQo8L3VsPg== + PHVsPg0KICA8bGk+U2NhbnMgPHN0cm9uZz48aT4iY29yZSI8L2k+PC9zdHJvbmc+IGFuZCA8c3Ryb25nPjxpPiJtb2R1bGVzIjwvaT48L3N0cm9uZz4gZm9sZGVycyB0byBjYWNoZSB0aGUgbG9jYXRpb24gb2YgYWxsIDxzdHJvbmc+PGk+VW5pdCBDb25maWc8L2k+PC9zdHJvbmc+IGZpbGVzLiBUaGUgZXhlY3V0aW9uIHRpbWUgZGVwZW5kcyBvbiB0aGUgbnVtYmVyIG9mIDxzdHJvbmc+PGk+VW5pdCBDb25maWc8L2k+PC9zdHJvbmc+IGZpbGVzIGZvdW5kLjwvbGk+DQogIDxsaT5SZXNldHMgdmFyaW91cyBjYWNoZWQgc3lzdGVtIGRhdGEgc3VjaCBhcyBkZWZpbmVkIFBIUCBDbGFzc2VzIChtYXBwaW5nIGJldHdlZW4gdGhlIGNsYXNzIG5hbWUgYW5kIHBoeXNpY2FsIGZpbGVuYW1lIGFuZCBsb2NhdGlvbiBvZiB0aGUgY2xhc3MpLCBIb29rcywgRXZlbnQgU2NoZWR1bGVzLCBDYWNoZWQgQ29uZmlndXJhdGlvbiBWYXJpYWJsZXMsIFJlcGxhY2VtZW50IFRlbXBsYXRlcywgUmV3cml0ZSBMaXN0ZW5lcnMgYW5kIExvYWRlZCBNb2R1bGVzLiBEYXRhIGlzIHJlYWQgYW5kIGNvbGxlY3RlZCBmcm9tIDxzdHJvbmc+PGk+VW5pdCBDb25maWc8L2k+PC9zdHJvbmc+IGZpbGVzIHRoYXQgYWxyZWFkeSBiZWVuIHNjYW5uZWQgYW5kIGNhY2hlZCBieSB0aGUgc3lzdGVtLjwvbGk+DQogIDxsaT5EZWxldGVzIGNvbXBpbGVkIHNraW5zIGZvciBBZG1pbiBDb25zb2xlIChjc3MgZmlsZXMpLjwvbGk+DQo8L3VsPg== PHVsPg0KICA8bGk+RGVsZXRlcyB0aGUgbWFwcGluZyBiZXR3ZWVuIHRoZSBGcm9udC1lbmQgVVJMcyBhbmQgYWN0dWFsIFRoZW1lIFRlbXBsYXRlcy4gVGhpcyBtYXBwaW5nIGlzIHVwZGF0ZWQgYXV0b21hdGljYWxseSwgd2hlbiB0aGUgd2Vic2l0ZSBTdHJ1Y3R1cmUgb3IgU2VjdGlvbnMgYXJlIGNoYW5nZWQuPC9saT4NCiAgPGxpPlVzZSB0aGlzIG9wdGlvbiBvbmx5IGluIGNhc2UgaWYgTW9kUmV3cml0ZSBtb2RlIGlzIGVuYWJsZWQgYW5kIGRpc3BsYXllZCBwYWdlIGRpZmZlcnMgZnJvbSB0aGUgcGFnZSB0aGF0IGl0IHNob3VsZCBiZSwgd2hlbiBnaXZlbiBVUkwgaXMgdmlzaXRlZC48L2xpPg0KPC91bD4= - PHVsPg0KICA8bGk+UmVzZXRzIHZhcmlvdXMgY2FjaGVkIHN5c3RlbSBkYXRhIHN1Y2ggYXMgZGVmaW5lZCBQSFAgQ2xhc3NlcyAobWFwcGluZyBiZXR3ZWVuIHRoZSBjbGFzcyBuYW1lIGFuZCBwaHlzaWNhbCBmaWxlbmFtZSBhbmQgbG9jYXRpb24gb2YgdGhlIGNsYXNzKSwgSG9va3MsIEFnZW50cywgQ2FjaGVkIENvbmZpZ3VyYXRpb24gVmFyaWFibGVzLCBSZXBsYWNlbWVudCBUZW1wbGF0ZXMsIFJld3JpdGUgTGlzdGVuZXJzIGFuZCBMb2FkZWQgTW9kdWxlcy4gRGF0YSBpcyByZWFkIGFuZCBjb2xsZWN0ZWQgZnJvbSA8c3Ryb25nPjxpPlVuaXQgQ29uZmlnPC9pPjwvc3Ryb25nPiBmaWxlcyB0aGF0IGFscmVhZHkgYmVlbiBzY2FubmVkIGFuZCBjYWNoZWQgYnkgdGhlIHN5c3RlbS48L2xpPg0KPC91bD4= + PHVsPg0KICA8bGk+UmVzZXRzIHZhcmlvdXMgY2FjaGVkIHN5c3RlbSBkYXRhIHN1Y2ggYXMgZGVmaW5lZCBQSFAgQ2xhc3NlcyAobWFwcGluZyBiZXR3ZWVuIHRoZSBjbGFzcyBuYW1lIGFuZCBwaHlzaWNhbCBmaWxlbmFtZSBhbmQgbG9jYXRpb24gb2YgdGhlIGNsYXNzKSwgSG9va3MsIEV2ZW50IFNjaGVkdWxlcywgQ2FjaGVkIENvbmZpZ3VyYXRpb24gVmFyaWFibGVzLCBSZXBsYWNlbWVudCBUZW1wbGF0ZXMsIFJld3JpdGUgTGlzdGVuZXJzIGFuZCBMb2FkZWQgTW9kdWxlcy4gRGF0YSBpcyByZWFkIGFuZCBjb2xsZWN0ZWQgZnJvbSA8c3Ryb25nPjxpPlVuaXQgQ29uZmlnPC9pPjwvc3Ryb25nPiBmaWxlcyB0aGF0IGFscmVhZHkgYmVlbiBzY2FubmVkIGFuZCBjYWNoZWQgYnkgdGhlIHN5c3RlbS48L2xpPg0KPC91bD4= PHVsPg0KICA8bGk+RGVsZXRlcyB0aGUgY2FjaGVkIHZlcnNpb24gb2YgRnJvbnQtZW5kIG1lbnUgKGRpc3BsYXllZCB2aWEgPHN0cm9uZz48aT4mbHQ7aW5wMjpzdF9DYWNoZWRNZW51IC4uLi8mZ3Q7PC9pPjwvc3Ryb25nPiB0YWcpLiBUaGlzIGNhY2hlIGlzIHVwZGF0ZWQgYXV0b21hdGljYWxseSwgd2hlbiB0aGUgd2Vic2l0ZSBzdHJ1Y3R1cmUgb3Igc2VjdGlvbnMgYXJlIGNoYW5nZWQuPC9saT4NCiAgPGxpPlVzZSB0aGlzIG9wdGlvbiBvbmx5IGluIGNhc2UgaWYgZGlzcGxheWVkIG1lbnUgb24gdGhlIEZyb250LWVuZCBkb2Vzbid0IG1hdGNoIHRoZSBtZW51IGRlZmluZWQgaW4gQWRtaW4gQ29uc29sZS48L2xpPg0KPC91bD4= PHVsPg0KICA8bGk+U2hvd3MgdGhlIHN0cnVjdHVyZSBvZiB0aGUgZGF0YWJhc2UgdGFibGUgbG9hZGluZyBpdCBieSB0aGUgVGFibGUgTmFtZSAodGFibGUgcHJlZml4IGlzIG9wdGlvbmFsKSBvciA8c3Ryb25nPjxpPlVuaXQgQ29uZmlnIFByZWZpeDwvaT48L3N0cm9uZz4gYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGFibGUuPC9saT4NCjwvdWw+ PHVsPg0KPGxpPkFzIGEgcmVzdWx0LCBzY3JpcHQgd2lsbCBWYWxpZGF0ZSBjdXJyZW50IDxiPjx1PnByb2plY3RfdXBncmFkZXMuc3FsPC91PjwvYj4gZmlsZSBhbmQgb3V0bGluZSBhbnkgZXJyb3JzIG9yIGluY29uc2lzdGVuY2llcywgYW5kIGF1dG8tcG9wdWxhdGUgYWxsIG1pc3NpbmcgREIgUmV2aXNpb25zIGZyb20gdGhlIGZpbGUgaW50byBBcHBsaWVkREJSZXZpc2lvbnMuPC9saT4NCjxsaT48YiBzdHlsZT0iY29sb3I6cmVkIj5OT1RFOjwvYj4gRGV2ZWxvcGVycyBzaG91bGQgT05MWSBydW4gdGhpcyBiZWZvcmUgdGhleSBwZXJmb3JtIFJlcG9zaXRvcnkgVXBkYXRlcyBvbiB0aGVpIHdvcmtpbmcgY29weSE8L2xpPg0KPC91bD4= @@ -1181,7 +1181,7 @@ VmFsaWQ= VmVyc2lvbg== Vmlldw== - QWRkaW5nIEFnZW50 + QWRkaW5nIEV2ZW50IFNjaGVkdWxl QWRkaW5nIEJhbiBSdWxl QWRkaW5nIENvdW50cnkvU3RhdGU= QWRkaW5nIEN1c3RvbSBGaWVsZA== @@ -1214,7 +1214,7 @@ QWRtaW5pc3RyYXRvcnM= QWR2YW5jZWQ= U2hvd2luZyBhbGwgcmVnYXJkbGVzcyBvZiBTdHJ1Y3R1cmU= - QWdlbnRz + RXZlbnQgU2NoZWR1bGVz QmFzZSBTdHlsZXM= QmxvY2sgU3R5bGVz Qm91bmNlIFBPUDMgU2VydmVyIFNldHRpbmdz @@ -1228,7 +1228,7 @@ Q1NWIEltcG9ydA== Q3VzdG9t Q3VzdG9tIEZpZWxkcw== - RWRpdGluZyBBZ2VudA== + RWRpdGluZyBFdmVudCBTY2hlZHVsZQ== RWRpdGluZyBCYW4gUnVsZQ== RWRpdGluZyBDaGFuZ2VzIExvZw== RWRpdGluZyBDb3VudHJ5L1N0YXRl @@ -1284,7 +1284,7 @@ TWFpbGluZ3M= TWVzc2FnZXM= TW9kdWxlcw== - TmV3IEFnZW50 + TmV3IEV2ZW50IFNjaGVkdWxl TmV3IEVtYWlsIEV2ZW50 TmV3IEZpbGU= TmV3IFJlcGx5 @@ -1375,7 +1375,7 @@ SW1wb3J0IExhbmd1YWdl TW92ZSBEb3du TW92ZSBVcA== - TmV3IEFnZW50 + TmV3IEV2ZW50IFNjaGVkdWxl TmV3IEJhc2UgU3R5bGU= TmV3IEJsb2NrIFN0eWxl TmV3IENvdW50cnkvU3RhdGU= @@ -1454,7 +1454,7 @@ VW5pY29kZQ== VXBkYXRpbmcgQ29uZmlndXJhdGlvbg== VXBsb2Fk - VXNlIENyb24gdG8gcnVuIEFnZW50cw== + VXNlIENyb24gdG8gcnVuIFNjaGVkdWxlZCBFdmVudHM= QXNzaWduIGFkbWluaXN0cmF0b3JzIHRvIGdyb3Vw QWxsb3cgbmV3IHVzZXIgcmVnaXN0cmF0aW9u QXNzaWduIEFsbCBVc2VycyBUbyBHcm91cA== Index: core/install/install_data.sql =================================================================== --- core/install/install_data.sql (revision 14646) +++ core/install/install_data.sql (working copy) @@ -552,10 +552,10 @@ INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:service.view', 11, 1, 1, 0); INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:service.edit', 11, 1, 1, 0); -INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:agents.delete', 11, 1, 1, 0); -INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:agents.edit', 11, 1, 1, 0); -INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:agents.add', 11, 1, 1, 0); -INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:agents.view', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:event_schedules.delete', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:event_schedules.edit', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:event_schedules.add', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:event_schedules.view', 11, 1, 1, 0); INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:site_domains.delete', 11, 1, 1, 0); INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:site_domains.edit', 11, 1, 1, 0); Index: core/install/install_schema.sql =================================================================== --- core/install/install_schema.sql (revision 14646) +++ core/install/install_schema.sql (working copy) @@ -660,10 +660,10 @@ KEY QueryCrc (QueryCrc) ); -CREATE TABLE Agents ( - AgentId int(11) NOT NULL auto_increment, - AgentName varchar(255) NOT NULL default '', - AgentType tinyint(3) unsigned NOT NULL default '1', +CREATE TABLE EventSchedules ( + EventScheduleId int(11) NOT NULL auto_increment, + EventScheduleName varchar(255) NOT NULL default '', + EventScheduleType tinyint(3) unsigned NOT NULL default '1', Status tinyint(3) unsigned NOT NULL default '1', Event varchar(255) NOT NULL default '', RunInterval int(10) unsigned NOT NULL default '0', @@ -673,11 +673,11 @@ NextRunOn int(11) default NULL, RunTime int(10) unsigned NOT NULL default '0', SiteDomainLimitation varchar(255) NOT NULL, - PRIMARY KEY (AgentId), + PRIMARY KEY (EventScheduleId), KEY Status (Status), KEY RunInterval (RunInterval), KEY RunMode (RunMode), - KEY AgentType (AgentType), + KEY EventScheduleType (EventScheduleType), KEY LastRunOn (LastRunOn), KEY LastRunStatus (LastRunStatus), KEY RunTime (RunTime), Index: core/install/remove_schema.sql =================================================================== --- core/install/remove_schema.sql (revision 14646) +++ core/install/remove_schema.sql (working copy) @@ -33,7 +33,7 @@ DROP TABLE SessionLogs; DROP TABLE StatisticsCapture; DROP TABLE SlowSqlCapture; -DROP TABLE Agents; +DROP TABLE EventSchedules; DROP TABLE SpellingDictionary; DROP TABLE Thesaurus; DROP TABLE LocalesList; Index: core/install/steps_db.xml =================================================================== --- core/install/steps_db.xml (revision 14646) +++ core/install/steps_db.xml (working copy) @@ -87,12 +87,12 @@

Additional Recommendations:

1. Use Cron (UNIX/BSD/Linux) or Task Scheduler (Windows) to run Regular Events in your In-Portal.
- It's highly recommended to setup your cron to run every minute so all system events that are enabled will run in the background based on their schedule. These events can be managed in Admin Console via Configuration -> Website -> Agents section. + It's highly recommended to setup your cron to run every minute so all system events that are enabled will run in the background based on their schedule. These events can be managed in Admin Console via Configuration -> Website -> Event Schedules section.

In-Portal cron file is located in /tools/cron.php folder and can be setup using hosting Control Panel or manually. In Plesk or CPanel interfaces use dialog to add a new cron job and specify the following (use correct paths)
   /absolute/path/to/bin/php -f /absolute/path/to/in-portal/tools/cron.php

-

2. Adjust Agents
- As was explained in the previous recommendation there is a Configuration -> Website -> Agents section where you can control Events triggered by the system. These events do their job to cleanup the data, old image files, check the data integrity, RSS feeds and other processes required for your In-Portal to run efficiently. We do recommend to review and enable/disable these events based on your website needs.

+

2. Adjust Event Schedules
+ As was explained in the previous recommendation there is a Configuration -> Website -> Event Schedules section where you can control Events triggered by the system. These events do their job to cleanup the data, old image files, check the data integrity, RSS feeds and other processes required for your In-Portal to run efficiently. We do recommend to review and enable/disable these events based on your website needs.

3. Set Mail Server
It's recommended to review and adjust your mail server settings once your In-Portal is up and running. This can be done in Admin Console under Configuration -> Website -> Advanced section.

Index: core/install/upgrades.sql =================================================================== --- core/install/upgrades.sql (revision 14646) +++ core/install/upgrades.sql (working copy) @@ -2142,3 +2142,74 @@ ALTER TABLE Skins ADD DisplaySiteNameInHeader TINYINT(1) NOT NULL DEFAULT '1'; DELETE FROM PersistantSessionData WHERE VariableName LIKE 'formsubs_Sort%' AND VariableValue = 'FormFieldId'; + +CREATE TABLE EventSchedules ( + EventScheduleId int(11) NOT NULL auto_increment, + EventScheduleName varchar(255) NOT NULL default '', + EventScheduleType tinyint(3) unsigned NOT NULL default '1', + Status tinyint(3) unsigned NOT NULL default '1', + Event varchar(255) NOT NULL default '', + RunInterval int(10) unsigned NOT NULL default '0', + RunMode tinyint(3) unsigned NOT NULL default '2', + LastRunOn int(10) unsigned default NULL, + LastRunStatus tinyint(3) unsigned NOT NULL default '1', + NextRunOn int(11) default NULL, + RunTime int(10) unsigned NOT NULL default '0', + SiteDomainLimitation varchar(255) NOT NULL, + PRIMARY KEY (EventScheduleId), + KEY Status (Status), + KEY RunInterval (RunInterval), + KEY RunMode (RunMode), + KEY EventScheduleType (EventScheduleType), + KEY LastRunOn (LastRunOn), + KEY LastRunStatus (LastRunStatus), + KEY RunTime (RunTime), + KEY NextRunOn (NextRunOn), + KEY SiteDomainLimitation (SiteDomainLimitation) +); + +DROP TABLE Agents; + +UPDATE Permissions SET Permission = REPLACE(Permission, 'in-portal:agents', 'in-portal:event_schedules'); + +UPDATE Phrase + SET l<%PRIMARY_LANGUAGE%>_Translation = 'Use Cron to run Scheduled Events' + WHERE PhraseKey = 'LA_USECRONFORREGULAREVENT' AND l<%PRIMARY_LANGUAGE%>_Translation = 'Use Cron to run Agents'; + +UPDATE Phrase + SET Phrase = 'la_title_EventSchedules', + PhraseKey = 'LA_TITLE_EVENTSCHEDULES', + l<%PRIMARY_LANGUAGE%>_Translation = 'Event Schedules' + WHERE Phrase = 'la_title_Agents'; + +UPDATE Phrase + SET Phrase = 'la_title_AddingEventSchedule', + PhraseKey = 'LA_TITLE_ADDINGEVENTSCHEDULE', + l<%PRIMARY_LANGUAGE%>_Translation = 'Adding Event Schedule' + WHERE Phrase = 'la_title_AddingAgent'; + +UPDATE Phrase + SET Phrase = 'la_title_EditingEventSchedule', + PhraseKey = 'LA_TITLE_EDITINGEVENTSCHEDULE', + l<%PRIMARY_LANGUAGE%>_Translation = 'Editing Event Schedule' + WHERE Phrase = 'la_title_EditingAgent'; + +UPDATE Phrase + SET Phrase = 'la_title_NewEventSchedule', + PhraseKey = 'LA_TITLE_NEWEVENTSCHEDULE', + l<%PRIMARY_LANGUAGE%>_Translation = 'New Event Schedule' + WHERE Phrase = 'la_title_NewAgent'; + +UPDATE Phrase + SET Phrase = 'la_ToolTip_NewEventSchedule', + PhraseKey = 'LA_TOOLTIP_NEWEVENTSCHEDULE', + l<%PRIMARY_LANGUAGE%>_Translation = 'New Event Schedule' + WHERE Phrase = 'la_ToolTip_NewAgent'; + +UPDATE Phrase + SET l<%PRIMARY_LANGUAGE%>_Translation = '
    \r\n
  • Scans "core" and "modules" folders to cache the location of all Unit Config files. The execution time depends on the number of Unit Config files found.
  • \r\n
  • Resets various cached system data such as defined PHP Classes (mapping between the class name and physical filename and location of the class), Hooks, Event Schedules, Cached Configuration Variables, Replacement Templates, Rewrite Listeners and Loaded Modules. Data is read and collected from Unit Config files that already been scanned and cached by the system.
  • \r\n
  • Deletes compiled skins for Admin Console (css files).
  • \r\n
' + WHERE Phrase = 'la_hint_SystemToolsResetConfigsAndParsedData'; + +UPDATE Phrase + SET l<%PRIMARY_LANGUAGE%>_Translation = '
    \r\n
  • Resets various cached system data such as defined PHP Classes (mapping between the class name and physical filename and location of the class), Hooks, Event Schedules, Cached Configuration Variables, Replacement Templates, Rewrite Listeners and Loaded Modules. Data is read and collected from Unit Config files that already been scanned and cached by the system.
  • \r\n
' + WHERE Phrase = 'la_hint_SystemToolsResetParsedCachedData'; \ No newline at end of file Index: core/kernel/application.php =================================================================== --- core/kernel/application.php (revision 14646) +++ core/kernel/application.php (working copy) @@ -697,7 +697,7 @@ $this->registerClass('kEventManager', KERNEL_PATH . '/event_manager.php', 'EventManager', 'kiCacheable'); $this->registerClass('kHookManager', KERNEL_PATH . '/managers/hook_manager.php', null, 'kiCacheable'); - $this->registerClass('kAgentManager', KERNEL_PATH . '/managers/agent_manager.php', null, 'kiCacheable'); + $this->registerClass('kEventScheduleManager', KERNEL_PATH . '/managers/event_schedule_manager.php', null, 'kiCacheable'); $this->registerClass('kRequestManager', KERNEL_PATH . '/managers/request_manager.php'); $this->registerClass('kUrlManager', KERNEL_PATH . '/managers/url_manager.php'); $this->registerClass('kCacheManager', KERNEL_PATH . '/managers/cache_manager.php', null, 'kiCacheable'); @@ -931,7 +931,7 @@ } $this->EventManager->ProcessRequest(); - $this->EventManager->runAgents(reBEFORE); + $this->EventManager->runEventSchedules(reBEFORE); $this->RequestProcessed = true; } @@ -1043,7 +1043,7 @@ } if ($debug_mode) { - $this->EventManager->runAgents(reAFTER); + $this->EventManager->runEventSchedules(reAFTER); $this->Session->SaveData(); if (kUtil::constOn('DBG_CACHE')) { @@ -1077,7 +1077,7 @@ flush(); if (!$debug_mode) { - $this->EventManager->runAgents(reAFTER); + $this->EventManager->runEventSchedules(reAFTER); $this->Session->SaveData(); } @@ -1743,18 +1743,18 @@ } /** - * Add new agent + * Add new event schedule * * @param string $short_name name to be used to store last maintenace run info * @param string $event_name * @param int $run_interval run interval in seconds - * @param int $type before or after agent + * @param int $type before or after event schedule * @param int $status * @access public */ - public function registerAgent($short_name, $event_name, $run_interval, $type = reBEFORE, $status = STATUS_ACTIVE) + public function registerEventSchedule($short_name, $event_name, $run_interval, $type = reBEFORE, $status = STATUS_ACTIVE) { - $this->EventManager->registerAgent($short_name, $event_name, $run_interval, $type, $status); + $this->EventManager->registerEventSchedule($short_name, $event_name, $run_interval, $type, $status); } /** Index: core/kernel/constants.php =================================================================== --- core/kernel/constants.php (revision 14646) +++ core/kernel/constants.php (working copy) @@ -63,9 +63,9 @@ define('EDITING_MODE_CONTENT', 2); // content blocks + phrase editing define('EDITING_MODE_DESIGN', 3); // all other blocks - class Agent { - const AGENT_TYPE_USER = 1; - const AGENT_TYPE_SYSTEM = 2; + class EventSchedule { + const EVENT_SCHEDULE_TYPE_USER = 1; + const EVENT_SCHEDULE_TYPE_SYSTEM = 2; const LAST_RUN_SUCCEDED = 1; const LAST_RUN_FAILED = 0; @@ -162,10 +162,10 @@ const USER = 0; const ADMIN = 1; } - + // selectors define('STYLE_BASE', 1); - define('STYLE_BLOCK', 2); + define('STYLE_BLOCK', 2); class Language { const SYNCHRONIZE_TO_OTHERS = 1; Index: core/kernel/event_manager.php =================================================================== --- core/kernel/event_manager.php (revision 14646) +++ core/kernel/event_manager.php (working copy) @@ -25,12 +25,12 @@ protected $Hooks = null; /** - * Instance of agent manager + * Instance of event schedule manager * - * @var kAgentManager + * @var kEventScheduleManager * @access protected */ - protected $Agents = null; + protected $EventSchedules = null; /** * Instance of request manager @@ -66,7 +66,7 @@ parent::__construct(); $this->Hooks =& $this->Application->makeClass('kHookManager'); - $this->Agents =& $this->Application->makeClass('kAgentManager'); + $this->EventSchedules =& $this->Application->makeClass('kEventScheduleManager'); $this->Request =& $this->Application->makeClass('kRequestManager'); } @@ -79,7 +79,7 @@ public function setFromCache(&$data) { $this->Hooks->setFromCache($data); - $this->Agents->setFromCache($data); + $this->EventSchedules->setFromCache($data); $this->buildEvents = $data['EventManager.buildEvents']; } @@ -94,7 +94,7 @@ { return array_merge( $this->Hooks->getToCache(), - $this->Agents->getToCache(), + $this->EventSchedules->getToCache(), Array ( 'EventManager.buildEvents' => $this->buildEvents, ) @@ -102,54 +102,54 @@ } /** - * Returns information about registered agents + * Returns information about registered event schedules * * @param bool $from_cache * @return Array * @access public */ - public function getAgents($from_cache = false) + public function getEventSchedules($from_cache = false) { - return $this->Agents->getAll($from_cache); + return $this->EventSchedules->getAll($from_cache); } /** - * Add new agent + * Add new event schedule * * @param string $short_name name to be used to store last maintenace run info * @param string $event_name * @param int $run_interval run interval in seconds - * @param int $type before or after agent + * @param int $type before or after event schedule * @param int $status * @access public */ - public function registerAgent($short_name, $event_name, $run_interval, $type = reBEFORE, $status = STATUS_ACTIVE) + public function registerEventSchedule($short_name, $event_name, $run_interval, $type = reBEFORE, $status = STATUS_ACTIVE) { - $this->Agents->add($short_name, $event_name, $run_interval, $type, $status); + $this->EventSchedules->add($short_name, $event_name, $run_interval, $type, $status); } /** - * Run registred agents with specified event type + * Run registred event schedules with specified event type * * @param int $event_type * @param bool $from_cron * @access public */ - public function runAgents($event_type = reBEFORE, $from_cron = false) + public function runEventSchedules($event_type = reBEFORE, $from_cron = false) { - $this->Agents->runAgents($event_type, $from_cron); + $this->EventSchedules->runEventSchedules($event_type, $from_cron); } /** - * Runs agent based on given data + * Runs event schedule based on given data * - * @param Array $agent_data + * @param Array $event_schedule_data * @return bool * @access public */ - public function runAgent($agent_data) + public function runEventSchedule($event_schedule_data) { - return $this->Agents->runAgent($agent_data); + return $this->EventSchedules->runEventSchedule($event_schedule_data); } /** Index: core/kernel/managers/agent_manager.php =================================================================== --- core/kernel/managers/agent_manager.php (revision 14646) +++ core/kernel/managers/agent_manager.php (working copy) @@ -1,248 +0,0 @@ -beforeAgents = $data['EventManager.beforeRegularEvents']; - $this->afterAgents = $data['EventManager.afterRegularEvents']; - } - - /** - * Gets object data for caching - * - * @return Array - * @access public - */ - public function getToCache() - { - return Array ( - 'EventManager.beforeRegularEvents' => $this->beforeAgents, - 'EventManager.afterRegularEvents' => $this->afterAgents, - ); - } - - /** - * Returns information about registered agents - * - * @param bool $from_cache - * @return Array - * @access public - */ - public function getAll($from_cache = false) - { - static $agents = null; - - if ($from_cache) { - return Array ( - reBEFORE => $this->beforeAgents, - reAFTER => $this->afterAgents, - ); - } - - if ( !isset($agents) ) { - $sql = 'SELECT * - FROM ' . $this->Application->getUnitOption('agent', 'TableName') . ' - WHERE Status = ' . STATUS_ACTIVE . ' AND LastRunStatus <> ' . Agent::LAST_RUN_RUNNING; - $all_agents = $this->Conn->Query($sql); - - $agents = Array ( - reBEFORE => Array (), - reAFTER => Array (), - ); - - foreach ($all_agents as $agent_data) { - $agents[ $agent_data['RunMode'] ][ $agent_data['AgentName'] ] = Array ( - 'EventName' => $agent_data['Event'], - 'RunInterval' => (int)$agent_data['RunInterval'], - 'LastRunOn' => (int)$agent_data['LastRunOn'], - 'NextRunOn' => (int)$agent_data['NextRunOn'], - 'Status' => $agent_data['Status'], - 'SiteDomainLimitation' => $agent_data['SiteDomainLimitation'], - ); - } - } - - return $agents; - } - - /** - * Returns agents by type - * - * @param int $type - * @return Array - * @access protected - */ - protected function &getAgentsByType($type) - { - if ($type == reBEFORE) { - return $this->beforeAgents; - } - - return $this->afterAgents; - } - - /** - * Add new agent - * - * @param string $short_name name to be used to store last maintenace run info - * @param string $event_name - * @param int $run_interval run interval in seconds - * @param int $type before or after agent - * @access public - */ - public function add($short_name, $event_name, $run_interval, $type = reBEFORE, $status = STATUS_ACTIVE) - { - $agents =& $this->getAgentsByType($type); - - $agents[$short_name] = Array ( - 'EventName' => $event_name, 'RunInterval' => $run_interval, 'Status' => $status - ); - } - - /** - * Run registred agents with specified event type - * - * @param int $event_type - * @param bool $from_cron - * @access public - */ - public function runAgents($event_type = reBEFORE, $from_cron = false) - { - if ( defined('IS_INSTALL') ) { - return ; - } - - if ( !$from_cron && $this->Application->ConfigValue('UseCronForRegularEvent') ) { - // if RegularEvents are set to run from cron - return ; - } - - $agents = $this->getAll(); - $events_source = $agents[$event_type]; - - $user_id = $this->Application->RecallVar('user_id'); - $this->Application->StoreVar('user_id', USER_ROOT, true); // to prevent permission checking inside events, true for optional storage - - $site_helper =& $this->Application->recallObject('SiteHelper'); - /* @var $site_helper SiteHelper */ - - $site_domain_id = $site_helper->getDomainByName('DomainName', DOMAIN); - - foreach ($events_source as $short_name => $event_data) { - if ( $site_domain_id && $event_data['SiteDomainLimitation'] != '' ) { - $site_domains = explode('|', substr($event_data['SiteDomainLimitation'], 1, -1)); - - if ( !in_array($site_domain_id, $site_domains) ) { - // agent isn't allowed on this site domain - continue; - } - } - - $next_run = $event_data['NextRunOn']; - - if ($next_run && ($next_run > adodb_mktime())) { - continue; - } - - $event_data['AgentName'] = $short_name; - $this->runAgent($event_data); - } - - $this->Application->StoreVar('user_id', $user_id, $user_id == USER_GUEST); - } - - /** - * Runs agent based on given data - * - * @param Array $agent_data - * @return bool - * @access public - */ - public function runAgent($agent_data) - { - $event = new kEvent($agent_data['EventName']); - - if ( !$this->Application->prefixRegistred($event->Prefix) ) { - // don't process agents, left from disabled modules - return false; - } - - $start_time = adodb_mktime(); - - // remember, when agent execution started - $fields_hash = Array ( - 'LastRunOn' => $start_time, - 'LastRunStatus' => Agent::LAST_RUN_RUNNING, - 'NextRunOn' => $start_time + $agent_data['RunInterval'], - ); - - $this->Conn->doUpdate( - $fields_hash, - $this->Application->getUnitOption('agent', 'TableName'), - 'AgentName = ' . $this->Conn->qstr($agent_data['AgentName']) - ); - - $event->redirect = false; - $this->Application->HandleEvent($event); - - $now = adodb_mktime(); - $next_run = $agent_data['RunInterval'] ? $start_time + $agent_data['RunInterval'] : $now; - - while ($next_run < $now) { - // in case event execution took longer, then RunInterval (don't use <=, because RunInterval can be 0) - $next_run += $agent_data['RunInterval']; - } - - // remember, when agent execution ended - $fields_hash = Array ( - 'NextRunOn' => $next_run, - 'RunTime' => round(($now - $start_time) / 60), - 'LastRunStatus' => $event->status == kEvent::erSUCCESS ? Agent::LAST_RUN_SUCCEDED : Agent::LAST_RUN_FAILED, - ); - - $this->Conn->doUpdate( - $fields_hash, - $this->Application->getUnitOption('agent', 'TableName'), - 'AgentName = ' . $this->Conn->qstr($agent_data['AgentName']) - ); - - return true; - } -} \ No newline at end of file Index: core/kernel/managers/cache_manager.php =================================================================== --- core/kernel/managers/cache_manager.php (revision 14646) +++ core/kernel/managers/cache_manager.php (working copy) @@ -50,7 +50,7 @@ protected $temporaryCache = Array ( 'registerAggregateTag' => Array (), - 'registerAgent' => Array (), + 'registerEventSchedule' => Array (), 'registerHook' => Array (), 'registerBuildEvent' => Array (), 'registerAggregateTag' => Array (), @@ -204,7 +204,7 @@ $this->DeleteUnitCache(); } - + /** * Loads data, that was cached during unit config parsing * Index: core/kernel/managers/event_schedule_manager.php =================================================================== --- core/kernel/managers/event_schedule_manager.php (revision 0) +++ core/kernel/managers/event_schedule_manager.php (revision 0) @@ -0,0 +1,248 @@ +beforeEventSchedules = $data['EventManager.beforeRegularEvents']; + $this->afterEventSchedules = $data['EventManager.afterRegularEvents']; + } + + /** + * Gets object data for caching + * + * @return Array + * @access public + */ + public function getToCache() + { + return Array ( + 'EventManager.beforeRegularEvents' => $this->beforeEventSchedules, + 'EventManager.afterRegularEvents' => $this->afterEventSchedules, + ); + } + + /** + * Returns information about registered event_schedules + * + * @param bool $from_cache + * @return Array + * @access public + */ + public function getAll($from_cache = false) + { + static $event_schedules = null; + + if ($from_cache) { + return Array ( + reBEFORE => $this->beforeEventSchedules, + reAFTER => $this->afterEventSchedules, + ); + } + + if ( !isset($event_schedules) ) { + $sql = 'SELECT * + FROM ' . $this->Application->getUnitOption('event-schedule', 'TableName') . ' + WHERE Status = ' . STATUS_ACTIVE . ' AND LastRunStatus <> ' . EventSchedule::LAST_RUN_RUNNING; + $all_event_schedules = $this->Conn->Query($sql); + + $event_schedules = Array ( + reBEFORE => Array (), + reAFTER => Array (), + ); + + foreach ($all_event_schedules as $event_schedule_data) { + $event_schedules[ $event_schedule_data['RunMode'] ][ $event_schedule_data['EventScheduleName'] ] = Array ( + 'EventName' => $event_schedule_data['Event'], + 'RunInterval' => (int)$event_schedule_data['RunInterval'], + 'LastRunOn' => (int)$event_schedule_data['LastRunOn'], + 'NextRunOn' => (int)$event_schedule_data['NextRunOn'], + 'Status' => $event_schedule_data['Status'], + 'SiteDomainLimitation' => $event_schedule_data['SiteDomainLimitation'], + ); + } + } + + return $event_schedules; + } + + /** + * Returns event_schedules by type + * + * @param int $type + * @return Array + * @access protected + */ + protected function &getEventSchedulesByType($type) + { + if ($type == reBEFORE) { + return $this->beforeEventSchedules; + } + + return $this->afterEventSchedules; + } + + /** + * Add new event_schedule + * + * @param string $short_name name to be used to store last maintenace run info + * @param string $event_name + * @param int $run_interval run interval in seconds + * @param int $type before or after event_schedule + * @access public + */ + public function add($short_name, $event_name, $run_interval, $type = reBEFORE, $status = STATUS_ACTIVE) + { + $event_schedules =& $this->getEventSchedulesByType($type); + + $event_schedules[$short_name] = Array ( + 'EventName' => $event_name, 'RunInterval' => $run_interval, 'Status' => $status + ); + } + + /** + * Run registred event_schedules with specified event type + * + * @param int $event_type + * @param bool $from_cron + * @access public + */ + public function runEventSchedules($event_type = reBEFORE, $from_cron = false) + { + if ( defined('IS_INSTALL') ) { + return ; + } + + if ( !$from_cron && $this->Application->ConfigValue('UseCronForRegularEvent') ) { + // if RegularEvents are set to run from cron + return ; + } + + $event_schedules = $this->getAll(); + $events_source = $event_schedules[$event_type]; + + $user_id = $this->Application->RecallVar('user_id'); + $this->Application->StoreVar('user_id', USER_ROOT, true); // to prevent permission checking inside events, true for optional storage + + $site_helper =& $this->Application->recallObject('SiteHelper'); + /* @var $site_helper SiteHelper */ + + $site_domain_id = $site_helper->getDomainByName('DomainName', DOMAIN); + + foreach ($events_source as $short_name => $event_data) { + if ( $site_domain_id && $event_data['SiteDomainLimitation'] != '' ) { + $site_domains = explode('|', substr($event_data['SiteDomainLimitation'], 1, -1)); + + if ( !in_array($site_domain_id, $site_domains) ) { + // event_schedule isn't allowed on this site domain + continue; + } + } + + $next_run = $event_data['NextRunOn']; + + if ($next_run && ($next_run > adodb_mktime())) { + continue; + } + + $event_data['EventScheduleName'] = $short_name; + $this->runEventSchedule($event_data); + } + + $this->Application->StoreVar('user_id', $user_id, $user_id == USER_GUEST); + } + + /** + * Runs event_schedule based on given data + * + * @param Array $event_schedule_data + * @return bool + * @access public + */ + public function runEventSchedule($event_schedule_data) + { + $event = new kEvent($event_schedule_data['EventName']); + + if ( !$this->Application->prefixRegistred($event->Prefix) ) { + // don't process event_schedules, left from disabled modules + return false; + } + + $start_time = adodb_mktime(); + + // remember, when event_schedule execution started + $fields_hash = Array ( + 'LastRunOn' => $start_time, + 'LastRunStatus' => EventSchedule::LAST_RUN_RUNNING, + 'NextRunOn' => $start_time + $event_schedule_data['RunInterval'], + ); + + $this->Conn->doUpdate( + $fields_hash, + $this->Application->getUnitOption('event-schedule', 'TableName'), + 'EventScheduleName = ' . $this->Conn->qstr($event_schedule_data['EventScheduleName']) + ); + + $event->redirect = false; + $this->Application->HandleEvent($event); + + $now = adodb_mktime(); + $next_run = $event_schedule_data['RunInterval'] ? $start_time + $event_schedule_data['RunInterval'] : $now; + + while ($next_run < $now) { + // in case event execution took longer, then RunInterval (don't use <=, because RunInterval can be 0) + $next_run += $event_schedule_data['RunInterval']; + } + + // remember, when event_schedule execution ended + $fields_hash = Array ( + 'NextRunOn' => $next_run, + 'RunTime' => round(($now - $start_time) / 60), + 'LastRunStatus' => $event->status == kEvent::erSUCCESS ? EventSchedule::LAST_RUN_SUCCEDED : EventSchedule::LAST_RUN_FAILED, + ); + + $this->Conn->doUpdate( + $fields_hash, + $this->Application->getUnitOption('event-schedule', 'TableName'), + 'EventScheduleName = ' . $this->Conn->qstr($event_schedule_data['EventScheduleName']) + ); + + return true; + } +} \ No newline at end of file Index: core/kernel/session/session.php =================================================================== --- core/kernel/session/session.php (revision 14646) +++ core/kernel/session/session.php (working copy) @@ -289,7 +289,7 @@ return ; } -// $this->DeleteExpired(); // called from u:OnDeleteExpiredSessions agent now +// $this->DeleteExpired(); // called from u:OnDeleteExpiredSessions event schedule now if ($this->expired || ($this->CachedSID && !$this->_fromGet && !$this->SessionSet)) { $this->RemoveSessionCookie(); @@ -480,7 +480,7 @@ if (!$get_sid) { $http_query =& $this->Application->recallObject('HTTPQuery'); /* @var $http_query kHTTPQuery */ - + $get_sid = getArrayValue($http_query->Get, $this->GETName); } Index: core/kernel/utility/unit_config_reader.php =================================================================== --- core/kernel/utility/unit_config_reader.php (revision 14646) +++ core/kernel/utility/unit_config_reader.php (working copy) @@ -415,7 +415,7 @@ function parseConfig($prefix) { $this->parseClasses($prefix); - $this->parseAgents($prefix); + $this->parseEventSchedules($prefix); $this->parseHooks($prefix); $this->parseAggregatedTags($prefix); } @@ -453,7 +453,7 @@ } } - protected function parseAgents($prefix) + protected function parseEventSchedules($prefix) { $config =& $this->configData[$prefix]; @@ -465,7 +465,7 @@ foreach ($regular_events as $short_name => $regular_event_info) { $event_status = array_key_exists('Status', $regular_event_info) ? $regular_event_info['Status'] : STATUS_ACTIVE; - $this->Application->delayUnitProcessing('registerAgent', Array ( $short_name, $config['Prefix'] . ':' . $regular_event_info['EventName'], $regular_event_info['RunInterval'], $regular_event_info['Type'], $event_status )); + $this->Application->delayUnitProcessing('registerEventSchedule', Array ( $short_name, $config['Prefix'] . ':' . $regular_event_info['EventName'], $regular_event_info['RunInterval'], $regular_event_info['Type'], $event_status )); } } Index: core/units/admin/admin_events_handler.php =================================================================== --- core/units/admin/admin_events_handler.php (revision 14646) +++ core/units/admin/admin_events_handler.php (working copy) @@ -1406,7 +1406,7 @@ } /** - * [AGENT] + * [EVENT SCHEDULE] * 1. Delete all Debug files from system/.restricted folder (format debug_@977827436@.txt) * 2. Run MySQL OPTIMIZE SQL one by one on all In-Portal tables (found by prefix). * Index: core/units/agents/agent_eh.php =================================================================== --- core/units/agents/agent_eh.php (revision 14646) +++ core/units/agents/agent_eh.php (working copy) @@ -1,181 +0,0 @@ - Array ('self' => 'add|edit'), - 'OnRunAgents' => Array ('self' => 'add|edit'), - ); - - $this->permMapping = array_merge($this->permMapping, $permissions); - } - - /** - * [HOOK] Refreshes agents list in database based on cached data from unit configs - * - * @param kEvent $event - */ - function OnRefreshAgents(&$event) - { - $regular_events = $this->Application->EventManager->getAgents(true); - - $object =& $event->getObject( Array ('skip_autoload' => true) ); - /* @var $object kDBItem */ - - $processed_ids = Array (); - $agents = $this->Conn->Query($object->GetSelectSQL(), 'AgentName'); - - foreach ($regular_events as $run_mode => $events) { - - foreach ($events as $agent_name => $agent_params) { - if ( !isset($agents[$agent_name]) ) { - $fields_hash = Array ( - 'Event' => $agent_params['EventName'], - 'AgentName' => $agent_name, - 'AgentType' => Agent::AGENT_TYPE_SYSTEM, - 'Status' => array_key_exists('Status', $agent_params) ? $agent_params['Status'] : STATUS_ACTIVE, - 'RunInterval' => $agent_params['RunInterval'], - 'RunMode' => $run_mode, - ); - - $object->Clear(); - $object->SetDBFieldsFromHash($fields_hash); - $object->Create(); - } - else { - $object->LoadFromHash( $agents[$agent_name] ); - } - - $processed_ids[] = $object->GetID(); - } - - } - - // delete all non-processed agents (ones, that were deleted from unit configs) - $sql = 'SELECT ' . $object->IDField . ' - FROM ' . $object->TableName . ' - WHERE (AgentType = ' . Agent::AGENT_TYPE_SYSTEM . ') AND (' . $object->IDField . ' NOT IN (' . implode(',', $processed_ids) . '))'; - $delete_ids = $this->Conn->GetCol($sql); - - if ($delete_ids) { - $temp_handler =& $this->Application->recallObject($event->getPrefixSpecial().'_TempHandler', 'kTempTablesHandler'); - /* @var $temp_handler kTempTablesHandler */ - - $temp_handler->DeleteItems($event->Prefix, $event->Special, $delete_ids); - } - - $this->Application->removeObject($event->getPrefixSpecial()); - } - - /** - * Don't allow to delete other user's messages - * - * @param kEvent $event - * @param string $type - * @return void - * @access protected - */ - protected function customProcessing(&$event, $type) - { - if ($event->Name == 'OnMassDelete' && $type == 'before') { - if ($this->Application->isDebugMode()) { - // allow to delete system agents in debug mode - return ; - } - - $ids = $event->getEventParam('ids'); - if ($ids) { - $id_field = $this->Application->getUnitOption($event->Prefix, 'IDField'); - $table_name = $this->Application->getUnitOption($event->Prefix, 'TableName'); - - $sql = 'SELECT ' . $id_field . ' - FROM ' . $table_name . ' - WHERE ' . $id_field . ' IN (' . implode(',', $ids) . ') AND AgentType <> ' . Agent::AGENT_TYPE_SYSTEM; - $allowed_ids = $this->Conn->GetCol($sql); - - $event->setEventParam('ids', $allowed_ids); - } - } - } - - /** - * Cancels agents, that are currenty running - * - * @param kEvent $event - */ - function OnMassCancel(&$event) - { - $ids = $this->StoreSelectedIDs($event); - - if ($ids) { - $object =& $event->getObject( Array ('skip_autoload' => true) ); - /* @var $object kDBItem */ - - foreach ($ids as $id) { - $object->Load($id); - - if ($object->GetDBField('LastRunStatus') == Agent::LAST_RUN_RUNNING) { - // only changes status, doesn't affect currency running agents - $object->SetDBField('LastRunStatus', Agent::LAST_RUN_FAILED); - $object->Update(); - } - } - } - - $this->clearSelectedIDs($event); - } - - /** - * Runs selected agents - * - * @param kEvent $event - */ - function OnRunAgents(&$event) - { - $ids = $this->StoreSelectedIDs($event); - - if ($ids) { - $object =& $event->getObject( Array ('skip_autoload' => true) ); - /* @var $object kDBItem */ - - $where_clause = Array ( - $object->TableName . '.' . $object->IDField . ' IN (' . implode(',', $ids) . ')', - $object->TableName . '.Status = ' . STATUS_ACTIVE, - $object->TableName . '.LastRunStatus <> ' . Agent::LAST_RUN_RUNNING, - ); - - $sql = $object->GetSelectSQL() . ' - WHERE (' . implode(') AND (', $where_clause) . ')'; - $agents = $this->Conn->Query($sql); - - foreach ($agents as $agent_data) { - $agent_data['EventName'] = $agent_data['Event']; - $this->Application->EventManager->runAgent($agent_data); - } - } - - $this->clearSelectedIDs($event); - } - } \ No newline at end of file Index: core/units/agents/agents_config.php =================================================================== --- core/units/agents/agents_config.php (revision 14646) +++ core/units/agents/agents_config.php (working copy) @@ -1,165 +0,0 @@ - 'agent', - 'ItemClass' => Array ('class' => 'kDBItem', 'file' => '', 'build_event' => 'OnItemBuild'), - 'ListClass' => Array ('class' => 'kDBList', 'file' => '', 'build_event' => 'OnListBuild'), - 'EventHandlerClass' => Array ('class' => 'AgentEventHandler', 'file' => 'agent_eh.php', 'build_event' => 'OnBuild'), - 'TagProcessorClass' => Array ('class' => 'kDBTagProcessor', 'file' => '', 'build_event' => 'OnBuild'), - - 'AutoLoad' => true, - - 'QueryString' => Array ( - 1 => 'id', - 2 => 'Page', - 3 => 'PerPage', - 4 => 'event', - 5 => 'mode', - ), - - 'Hooks' => Array ( - Array ( - 'Mode' => hAFTER, - 'Conditional' => false, - 'HookToPrefix' => 'adm', - 'HookToSpecial' => '*', - 'HookToEvent' => Array ('OnAfterCacheRebuild'), - 'DoPrefix' => '', - 'DoSpecial' => '*', - 'DoEvent' => 'OnRefreshAgents', - ), - ), - - 'IDField' => 'AgentId', - - 'TableName' => TABLE_PREFIX . 'Agents', - - 'TitleField' => 'AgentName', - - 'StatusField' => Array ('Status'), - - 'TitlePresets' => Array ( - 'default' => Array ( - 'new_status_labels' => Array ('agent' => '!la_title_AddingAgent!'), - 'edit_status_labels' => Array ('agent' => '!la_title_EditingAgent!'), - 'new_titlefield' => Array ('agent' => '!la_title_NewAgent!'), - ), - - 'agent_list' => Array ( - 'prefixes' => Array ('agent_List'), 'format' => "!la_title_Agents!", - 'toolbar_buttons' => Array ('new_item', 'edit', 'delete', 'approve', 'decline', 'process', 'cancel', 'view', 'dbl-click'), - ), - - 'agent_edit' => Array ('prefixes' => Array ('agent'), 'format' => "#agent_status# '#agent_titlefield#'", - 'toolbar_buttons' => Array ('select', 'cancel', 'reset_edit', 'prev', 'next'), - ), - ), - - 'PermSection' => Array('main' => 'in-portal:agents'), - - 'Sections' => Array ( - 'in-portal:agents' => Array ( - 'parent' => 'in-portal:website_setting_folder', - 'icon' => 'conf_agents', - 'label' => 'la_title_Agents', - 'url' => Array('t' => 'agents/agent_list', 'pass' => 'm'), - 'permissions' => Array('view', 'add', 'edit', 'delete'), - 'priority' => 6, - 'type' => stTREE, - ), - ), - - 'ListSQLs' => Array ( - '' => ' SELECT %1$s.* %2$s FROM %1$s', - ), - - 'ListSortings' => Array ( - '' => Array ( - 'Sorting' => Array ('AgentName' => 'asc'), - ) - ), - - 'Fields' => Array ( - 'AgentId' => Array ('type' => 'int', 'not_null' => 1, 'default' => 0), - - 'AgentName' => Array ( - 'type' => 'string', 'max_len' => 255, - 'unique' => Array (), - 'required' => 1, 'not_null' => 1, 'default' => '' - ), - - 'AgentType' => Array ( - 'type' => 'int', - 'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'la_opt_User', 2 => 'la_opt_System'), 'use_phrases' => 1, - 'required' => 1, 'not_null' => 1, 'default' => 1 - ), - 'Status' => Array ( - 'type' => 'int', - 'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'la_opt_Active', 0 => 'la_opt_Disabled'), 'use_phrases' => 1, - 'required' => 1, 'not_null' => 1, 'default' => 1 - ), - 'Event' => Array ( - 'type' => 'string', 'max_len' => 255, - 'formatter' => 'kFormatter', 'regexp' => '/^[a-z-]*[.]{0,1}[a-z-]*:On[A-Za-z0-9]*$/', - 'required' => 1, 'not_null' => 1, 'default' => '' - ), - 'RunInterval' => Array ('type' => 'int', 'required' => 1, 'not_null' => 1, 'default' => 0), - 'RunMode' => Array ( - 'type' => 'int', - 'formatter' => 'kOptionsFormatter', 'options' => Array (reBEFORE => 'la_opt_Before', reAFTER => 'la_opt_After'), 'use_phrases' => 1, - 'required' => 1, 'not_null' => 1, 'default' => 2 - ), - 'LastRunOn' => Array ('type' => 'int', 'formatter' => 'kDateFormatter', 'default' => NULL), - - 'LastRunStatus' => Array ( - 'type' => 'int', - 'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'la_opt_Success', 0 => 'la_opt_Failed', 2 => 'la_opt_Running'), 'use_phrases' => 1, - 'not_null' => 1, 'default' => 1 - ), - - 'NextRunOn' => Array ('type' => 'int', 'formatter' => 'kDateFormatter', 'required' => 1, 'default' => '#NOW#'), - 'RunTime' => Array ('type' => 'int', 'not_null' => 1, 'default' => 0), - 'SiteDomainLimitation' => Array ( - 'type' => 'string', 'max_len' => 255, - 'formatter' => 'kOptionsFormatter', 'options_sql' => 'SELECT %s FROM ' . TABLE_PREFIX . 'SiteDomains ORDER BY DomainName ASC', 'option_key_field' => 'DomainId', 'option_title_field' => 'DomainName', 'multiple' => 1, - 'not_null' => 1, 'default' => '' - ), - ), - - 'Grids' => Array ( - 'Default' => Array ( - 'Icons' => Array ( - 'default' => 'icon16_item.png', - 0 => 'icon16_disabled.png', - ), - 'Fields' => Array ( - 'AgentId' => Array ('title' => 'column:la_fld_Id', 'data_block' => 'grid_checkbox_td', 'filter_block' => 'grid_range_filter', 'width' => 50, ), - 'AgentName' => Array ('title' => 'column:la_fld_Name', 'filter_block' => 'grid_like_filter', 'width' => 200, ), - 'AgentType' => Array ('title' => 'column:la_fld_Type', 'filter_block' => 'grid_options_filter', 'width' => 60, ), - 'Event' => Array ('filter_block' => 'grid_like_filter', 'width' => 280, ), - 'RunInterval' => Array ('filter_block' => 'grid_range_filter', 'width' => 100, ), - 'RunMode' => Array ('filter_block' => 'grid_options_filter', 'width' => 85, ), - 'LastRunOn' => Array ('filter_block' => 'grid_date_range_filter', 'width' => 145, ), - 'RunTime' => Array ('filter_block' => 'grid_float_range_filter', 'width' => 145, ), - 'LastRunStatus' => Array ('filter_block' => 'grid_options_filter', 'width' => 120, ), - 'NextRunOn' => Array ('filter_block' => 'grid_date_range_filter', 'width' => 145, ), - 'Status' => Array ('filter_block' => 'grid_options_filter', 'width' => 65, ), - 'SiteDomainLimitation' => Array ('data_block' => 'grid_picker_td', 'filter_block' => 'grid_multioptions_filter', 'separator' => ', ', 'width' => 145), - ), - ), - ), - ); \ No newline at end of file Index: core/units/event_schedules/event_schedule_eh.php =================================================================== --- core/units/event_schedules/event_schedule_eh.php (revision 0) +++ core/units/event_schedules/event_schedule_eh.php (revision 0) @@ -0,0 +1,181 @@ + Array ('self' => 'add|edit'), + 'OnRunEventSchedules' => Array ('self' => 'add|edit'), + ); + + $this->permMapping = array_merge($this->permMapping, $permissions); + } + + /** + * [HOOK] Refreshes event-schedules list in database based on cached data from unit configs + * + * @param kEvent $event + */ + function OnRefreshEventSchedules(&$event) + { + $regular_events = $this->Application->EventManager->getEventSchedules(true); + + $object =& $event->getObject( Array ('skip_autoload' => true) ); + /* @var $object kDBItem */ + + $processed_ids = Array (); + $event_schedules = $this->Conn->Query($object->GetSelectSQL(), 'EventScheduleName'); + + foreach ($regular_events as $run_mode => $events) { + + foreach ($events as $event_schedule_name => $event_schedule_params) { + if ( !isset($event_schedules[$event_schedule_name]) ) { + $fields_hash = Array ( + 'Event' => $event_schedule_params['EventName'], + 'EventScheduleName' => $event_schedule_name, + 'EventScheduleType' => EventSchedule::EVENT_SCHEDULE_TYPE_SYSTEM, + 'Status' => array_key_exists('Status', $event_schedule_params) ? $event_schedule_params['Status'] : STATUS_ACTIVE, + 'RunInterval' => $event_schedule_params['RunInterval'], + 'RunMode' => $run_mode, + ); + + $object->Clear(); + $object->SetDBFieldsFromHash($fields_hash); + $object->Create(); + } + else { + $object->LoadFromHash( $event_schedules[$event_schedule_name] ); + } + + $processed_ids[] = $object->GetID(); + } + + } + + // delete all non-processed event-schedules (ones, that were deleted from unit configs) + $sql = 'SELECT ' . $object->IDField . ' + FROM ' . $object->TableName . ' + WHERE (EventScheduleType = ' . EventSchedule::EVENT_SCHEDULE_TYPE_SYSTEM . ') AND (' . $object->IDField . ' NOT IN (' . implode(',', $processed_ids) . '))'; + $delete_ids = $this->Conn->GetCol($sql); + + if ($delete_ids) { + $temp_handler =& $this->Application->recallObject($event->getPrefixSpecial().'_TempHandler', 'kTempTablesHandler'); + /* @var $temp_handler kTempTablesHandler */ + + $temp_handler->DeleteItems($event->Prefix, $event->Special, $delete_ids); + } + + $this->Application->removeObject($event->getPrefixSpecial()); + } + + /** + * Don't allow to delete other user's messages + * + * @param kEvent $event + * @param string $type + * @return void + * @access protected + */ + protected function customProcessing(&$event, $type) + { + if ($event->Name == 'OnMassDelete' && $type == 'before') { + if ($this->Application->isDebugMode()) { + // allow to delete system event-schedules in debug mode + return ; + } + + $ids = $event->getEventParam('ids'); + if ($ids) { + $id_field = $this->Application->getUnitOption($event->Prefix, 'IDField'); + $table_name = $this->Application->getUnitOption($event->Prefix, 'TableName'); + + $sql = 'SELECT ' . $id_field . ' + FROM ' . $table_name . ' + WHERE ' . $id_field . ' IN (' . implode(',', $ids) . ') AND EventScheduleType <> ' . EventSchedule::EVENT_SCHEDULE_TYPE_SYSTEM; + $allowed_ids = $this->Conn->GetCol($sql); + + $event->setEventParam('ids', $allowed_ids); + } + } + } + + /** + * Cancels event-schedules, that are currenty running + * + * @param kEvent $event + */ + function OnMassCancel(&$event) + { + $ids = $this->StoreSelectedIDs($event); + + if ($ids) { + $object =& $event->getObject( Array ('skip_autoload' => true) ); + /* @var $object kDBItem */ + + foreach ($ids as $id) { + $object->Load($id); + + if ($object->GetDBField('LastRunStatus') == EventSchedule::LAST_RUN_RUNNING) { + // only changes status, doesn't affect currency running event-schedules + $object->SetDBField('LastRunStatus', EventSchedule::LAST_RUN_FAILED); + $object->Update(); + } + } + } + + $this->clearSelectedIDs($event); + } + + /** + * Runs selected event-schedules + * + * @param kEvent $event + */ + function OnRunEventSchedules(&$event) + { + $ids = $this->StoreSelectedIDs($event); + + if ($ids) { + $object =& $event->getObject( Array ('skip_autoload' => true) ); + /* @var $object kDBItem */ + + $where_clause = Array ( + $object->TableName . '.' . $object->IDField . ' IN (' . implode(',', $ids) . ')', + $object->TableName . '.Status = ' . STATUS_ACTIVE, + $object->TableName . '.LastRunStatus <> ' . EventSchedule::LAST_RUN_RUNNING, + ); + + $sql = $object->GetSelectSQL() . ' + WHERE (' . implode(') AND (', $where_clause) . ')'; + $event_schedules = $this->Conn->Query($sql); + + foreach ($event_schedules as $event_schedule_data) { + $event_schedule_data['EventName'] = $event_schedule_data['Event']; + $this->Application->EventManager->runEventSchedule($event_schedule_data); + } + } + + $this->clearSelectedIDs($event); + } + } \ No newline at end of file Index: core/units/event_schedules/event_schedules_config.php =================================================================== --- core/units/event_schedules/event_schedules_config.php (revision 0) +++ core/units/event_schedules/event_schedules_config.php (revision 0) @@ -0,0 +1,165 @@ + 'event-schedule', + 'ItemClass' => Array ('class' => 'kDBItem', 'file' => '', 'build_event' => 'OnItemBuild'), + 'ListClass' => Array ('class' => 'kDBList', 'file' => '', 'build_event' => 'OnListBuild'), + 'EventHandlerClass' => Array ('class' => 'EventScheduleEventHandler', 'file' => 'event_schedule_eh.php', 'build_event' => 'OnBuild'), + 'TagProcessorClass' => Array ('class' => 'kDBTagProcessor', 'file' => '', 'build_event' => 'OnBuild'), + + 'AutoLoad' => true, + + 'QueryString' => Array ( + 1 => 'id', + 2 => 'Page', + 3 => 'PerPage', + 4 => 'event', + 5 => 'mode', + ), + + 'Hooks' => Array ( + Array ( + 'Mode' => hAFTER, + 'Conditional' => false, + 'HookToPrefix' => 'adm', + 'HookToSpecial' => '*', + 'HookToEvent' => Array ('OnAfterCacheRebuild'), + 'DoPrefix' => '', + 'DoSpecial' => '*', + 'DoEvent' => 'OnRefreshEventSchedules', + ), + ), + + 'IDField' => 'EventScheduleId', + + 'TableName' => TABLE_PREFIX . 'EventSchedules', + + 'TitleField' => 'EventScheduleName', + + 'StatusField' => Array ('Status'), + + 'TitlePresets' => Array ( + 'default' => Array ( + 'new_status_labels' => Array ('event-schedule' => '!la_title_AddingEventSchedule!'), + 'edit_status_labels' => Array ('event-schedule' => '!la_title_EditingEventSchedule!'), + 'new_titlefield' => Array ('event-schedule' => '!la_title_NewEventSchedule!'), + ), + + 'event_schedule_list' => Array ( + 'prefixes' => Array ('event-schedule_List'), 'format' => "!la_title_EventSchedules!", + 'toolbar_buttons' => Array ('new_item', 'edit', 'delete', 'approve', 'decline', 'process', 'cancel', 'view', 'dbl-click'), + ), + + 'event_schedule_edit' => Array ('prefixes' => Array ('event-schedule'), 'format' => "#event-schedule_status# '#event-schedule_titlefield#'", + 'toolbar_buttons' => Array ('select', 'cancel', 'reset_edit', 'prev', 'next'), + ), + ), + + 'PermSection' => Array('main' => 'in-portal:event_schedules'), + + 'Sections' => Array ( + 'in-portal:event_schedules' => Array ( + 'parent' => 'in-portal:website_setting_folder', + 'icon' => 'conf_event_schedules', + 'label' => 'la_title_EventSchedules', + 'url' => Array('t' => 'event_schedules/event_schedule_list', 'pass' => 'm'), + 'permissions' => Array('view', 'add', 'edit', 'delete'), + 'priority' => 6, + 'type' => stTREE, + ), + ), + + 'ListSQLs' => Array ( + '' => ' SELECT %1$s.* %2$s FROM %1$s', + ), + + 'ListSortings' => Array ( + '' => Array ( + 'Sorting' => Array ('EventScheduleName' => 'asc'), + ) + ), + + 'Fields' => Array ( + 'EventScheduleId' => Array ('type' => 'int', 'not_null' => 1, 'default' => 0), + + 'EventScheduleName' => Array ( + 'type' => 'string', 'max_len' => 255, + 'unique' => Array (), + 'required' => 1, 'not_null' => 1, 'default' => '' + ), + + 'EventScheduleType' => Array ( + 'type' => 'int', + 'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'la_opt_User', 2 => 'la_opt_System'), 'use_phrases' => 1, + 'required' => 1, 'not_null' => 1, 'default' => 1 + ), + 'Status' => Array ( + 'type' => 'int', + 'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'la_opt_Active', 0 => 'la_opt_Disabled'), 'use_phrases' => 1, + 'required' => 1, 'not_null' => 1, 'default' => 1 + ), + 'Event' => Array ( + 'type' => 'string', 'max_len' => 255, + 'formatter' => 'kFormatter', 'regexp' => '/^[a-z-]*[.]{0,1}[a-z-]*:On[A-Za-z0-9]*$/', + 'required' => 1, 'not_null' => 1, 'default' => '' + ), + 'RunInterval' => Array ('type' => 'int', 'required' => 1, 'not_null' => 1, 'default' => 0), + 'RunMode' => Array ( + 'type' => 'int', + 'formatter' => 'kOptionsFormatter', 'options' => Array (reBEFORE => 'la_opt_Before', reAFTER => 'la_opt_After'), 'use_phrases' => 1, + 'required' => 1, 'not_null' => 1, 'default' => 2 + ), + 'LastRunOn' => Array ('type' => 'int', 'formatter' => 'kDateFormatter', 'default' => NULL), + + 'LastRunStatus' => Array ( + 'type' => 'int', + 'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'la_opt_Success', 0 => 'la_opt_Failed', 2 => 'la_opt_Running'), 'use_phrases' => 1, + 'not_null' => 1, 'default' => 1 + ), + + 'NextRunOn' => Array ('type' => 'int', 'formatter' => 'kDateFormatter', 'required' => 1, 'default' => '#NOW#'), + 'RunTime' => Array ('type' => 'int', 'not_null' => 1, 'default' => 0), + 'SiteDomainLimitation' => Array ( + 'type' => 'string', 'max_len' => 255, + 'formatter' => 'kOptionsFormatter', 'options_sql' => 'SELECT %s FROM ' . TABLE_PREFIX . 'SiteDomains ORDER BY DomainName ASC', 'option_key_field' => 'DomainId', 'option_title_field' => 'DomainName', 'multiple' => 1, + 'not_null' => 1, 'default' => '' + ), + ), + + 'Grids' => Array ( + 'Default' => Array ( + 'Icons' => Array ( + 'default' => 'icon16_item.png', + 0 => 'icon16_disabled.png', + ), + 'Fields' => Array ( + 'EventScheduleId' => Array ('title' => 'column:la_fld_Id', 'data_block' => 'grid_checkbox_td', 'filter_block' => 'grid_range_filter', 'width' => 50, ), + 'EventScheduleName' => Array ('title' => 'column:la_fld_Name', 'filter_block' => 'grid_like_filter', 'width' => 200, ), + 'EventScheduleType' => Array ('title' => 'column:la_fld_Type', 'filter_block' => 'grid_options_filter', 'width' => 60, ), + 'Event' => Array ('filter_block' => 'grid_like_filter', 'width' => 280, ), + 'RunInterval' => Array ('filter_block' => 'grid_range_filter', 'width' => 100, ), + 'RunMode' => Array ('filter_block' => 'grid_options_filter', 'width' => 85, ), + 'LastRunOn' => Array ('filter_block' => 'grid_date_range_filter', 'width' => 145, ), + 'RunTime' => Array ('filter_block' => 'grid_float_range_filter', 'width' => 145, ), + 'LastRunStatus' => Array ('filter_block' => 'grid_options_filter', 'width' => 120, ), + 'NextRunOn' => Array ('filter_block' => 'grid_date_range_filter', 'width' => 145, ), + 'Status' => Array ('filter_block' => 'grid_options_filter', 'width' => 65, ), + 'SiteDomainLimitation' => Array ('data_block' => 'grid_picker_td', 'filter_block' => 'grid_multioptions_filter', 'separator' => ', ', 'width' => 145), + ), + ), + ), + ); \ No newline at end of file Index: core/units/images/image_event_handler.php =================================================================== --- core/units/images/image_event_handler.php (revision 14646) +++ core/units/images/image_event_handler.php (working copy) @@ -366,7 +366,7 @@ } /** - * [AGENT] Remove unused images from "/system/images" and "/system/images/pending" folders + * [EVENT SCHEDULE] Remove unused images from "/system/images" and "/system/images/pending" folders * * @param kEvent $event */ @@ -457,7 +457,7 @@ } /** - * [AGENT] Remove all images from "/system/images/resized" and "/system/images/pending/resized" folders + * [EVENT SCHEDULE] Remove all images from "/system/images/resized" and "/system/images/pending/resized" folders * * @param kEvent $event */ Index: core/units/users/users_event_handler.php =================================================================== --- core/units/users/users_event_handler.php (revision 14646) +++ core/units/users/users_event_handler.php (working copy) @@ -225,7 +225,7 @@ } /** - * [AGENT] Deletes expired sessions + * [EVENT SCHEDULE] Deletes expired sessions * * @param kEvent $event */ Index: tools/cron.php =================================================================== --- tools/cron.php (revision 14646) +++ tools/cron.php (working copy) @@ -36,8 +36,8 @@ $application->Init(); // events from request are not processed, only predefined regular events - $application->EventManager->runAgents(reBEFORE, true); - $application->EventManager->runAgents(reAFTER, true); + $application->EventManager->runEventSchedules(reBEFORE, true); + $application->EventManager->runEventSchedules(reAFTER, true); $application->Done();