[TikiWiki-commits] [Git][tikiwiki/tiki][master] [NEW] Trackers: Add an option to prevent field updates from changing last modification info
Benoit Grégoire (@benoitg) via TikiWiki-cvs <[email protected]>
| Newsgroups | gmane.comp.cms.tiki.cvs |
|---|---|
| Message-ID | <69f386d73a02e_381d5f27c65170@gitlab-sidekiq-low-urgency-cpu-bound-v2-756fc6779-jxw7f.mail> |
Benoit Grégoire pushed to branch master at Tiki Wiki CMS Groupware / Tiki
Commits:
b7c8172d by Moïse Nturubika at 2026-04-30T16:05:47+00:00
[NEW] Trackers: Add an option to prevent field updates from changing last modification info
---
* [REF] Refactor Tracker Item metadata management and standardize field schema
* [FIX] Fix phpcs errors
* [REF] Trackers: Implement modification tracking as a field handler
* [FIX] Fix phpcs
* [FIX] Trackers: Refactor item lastModif exclusion logic based on code review
* [FIX] Trackers: Refactor item lastModif exclusion logic based on code review
* [ENH] [ENH] Tiki filter on tiki-print_pages.php
* [ENH] [ENH] Tiki filter on tiki-poll_results.php
* [ENH] [ENH] Tiki filter on tiki-plugins.php
* [ENH] [ENH] Tiki filter on tiki-pick_avatar.php
* [ENH] [ENH] Tiki filter on tiki-performance_stats.php
* [ENH] [ENH] Tiki filter on tiki-peertube_video.php
* [ENH] [ENH] Tiki filter on tiki-pagehistory.php
* [ENH] [ENH] Tiki filter on tiki-page_contribution.php
* [ENH] [ENH] Tiki filter on tiki-old_polls.php
* [ENH] [ENH] Tiki filter on tiki-objectpermissions.php
* [ENH] [ENH] Tiki filter on tiki-notepad_write.php
* [ENH] [ENH] Tiki filter on tiki-notepad_read.php
* [ENH] [ENH] Tiki filter on tiki-notepad_list.php
* [NEW] trackers: Add option to prevent field updates from changing last modification date
See merge request tikiwiki/tiki!7638
- - - - -
9 changed files:
- db/tiki.sql
- + installer/schema/20260210_excludeFromTrackerItemLastModificationDate_tiki.sql
- lib/core/Services/Tracker/Controller.php
- lib/core/Services/Tracker/Utilities.php
- lib/core/Tiki/Profile/InstallHandler/TrackerField.php
- lib/core/Tracker/Field/AbstractTrackerField.php
- lib/core/Tracker/Item.php
- lib/trackers/trackerlib.php
- templates/tracker/edit_field.tpl
Changes:
=====================================
db/tiki.sql
=====================================
@@ -2522,6 +2522,7 @@ CREATE TABLE `tiki_tracker_fields` (
`rules` TEXT,
`encryptionKeyId` int(11) NULL,
`excludeFromNotification` char(1) default 'n',
+ `excludeFromTrackerItemLastModificationDate` char(1) NOT NULL default 'n',
`visibleInViewMode` char(1) NOT NULL default 'y',
`visibleInEditMode` char(1) NOT NULL default 'y',
`visibleInHistoryMode` char(1) NOT NULL default 'y',
=====================================
installer/schema/20260210_excludeFromTrackerItemLastModificationDate_tiki.sql
=====================================
@@ -0,0 +1,2 @@
+ALTER TABLE `tiki_tracker_fields`
+ADD COLUMN `excludeFromTrackerItemLastModificationDate` CHAR(1) NOT NULL DEFAULT 'n' AFTER `excludeFromNotification`;
\ No newline at end of file
=====================================
lib/core/Services/Tracker/Controller.php
=====================================
@@ -493,6 +493,7 @@ class Services_Tracker_Controller
'rules' => $rules,
'encryptionKeyId' => $input->encryption_key_id->int(),
'excludeFromNotification' => $input->exclude_from_notification->int() ? 'y' : 'n',
+ 'excludeFromTrackerItemLastModificationDate' => $input->exclude_from_lastmodif->int() ? 'y' : 'n',
'visibleInViewMode' => $input->visible_in_view_mode->int() ? 'y' : 'n',
'visibleInEditMode' => $input->visible_in_edit_mode->int() ? 'y' : 'n',
'visibleInHistoryMode' => $input->visible_in_history_mode->int() ? 'y' : 'n',
=====================================
lib/core/Services/Tracker/Utilities.php
=====================================
@@ -196,6 +196,8 @@ class Services_Tracker_Utilities
false,
$data['visibleInViewMode'] ?? 'y',
$data['visibleInEditMode'] ?? 'y',
+ $data['visibleInHistoryMode'] ?? 'y',
+ $data['excludeFromTrackerItemLastModificationDate'] ?? 'n',
);
}
@@ -244,7 +246,8 @@ class Services_Tracker_Utilities
$properties['excludeFromNotification'] ?? $field['excludeFromNotification'] ?? null,
$properties['visibleInViewMode'] ?? $field['visibleInViewMode'] ?? null,
$properties['visibleInEditMode'] ?? $field['visibleInEditMode'] ?? null,
- $properties['visibleInHistoryMode'] ?? ($field['visibleInHistoryMode'] ?? null)
+ $properties['visibleInHistoryMode'] ?? $field['visibleInHistoryMode'] ?? null,
+ $properties['excludeFromTrackerItemLastModificationDate'] ?? $field['excludeFromTrackerItemLastModificationDate'] ?? null
);
}
=====================================
lib/core/Tiki/Profile/InstallHandler/TrackerField.php
=====================================
@@ -47,6 +47,7 @@ class Tiki_Profile_InstallHandler_TrackerField extends Tiki_Profile_InstallHandl
'rules' => '',
'encryptionKeyId' => null,
'excludeFromNotification' => false,
+ 'excludeFromTrackerItemLastModificationDate' => 'n',
'visibleInViewMode' => 'y',
'visibleInEditMode' => 'y',
'visibleInHistoryMode' => 'y',
@@ -142,6 +143,7 @@ class Tiki_Profile_InstallHandler_TrackerField extends Tiki_Profile_InstallHandl
'rules' => 'rules',
'encryptionKeyId' => 'encryptionKeyId',
'excludeFromNotification' => 'excludeFromNotification',
+ 'excludeFromTrackerItemLastModificationDate' => 'excludeFromTrackerItemLastModificationDate',
'visibleInViewMode' => 'visibleInViewMode',
'visibleInEditMode' => 'visibleInEditMode',
'visibleInHistoryMode' => 'visibleInHistoryMode',
@@ -230,7 +232,8 @@ class Tiki_Profile_InstallHandler_TrackerField extends Tiki_Profile_InstallHandl
$data['excludeFromNotification'],
$data['visibleInViewMode'],
$data['visibleInEditMode'],
- $data['visibleInHistoryMode']
+ $data['visibleInHistoryMode'],
+ $data['excludeFromTrackerItemLastModificationDate']
);
}
=====================================
lib/core/Tracker/Field/AbstractTrackerField.php
=====================================
@@ -46,6 +46,7 @@ abstract class AbstractTrackerField
* rules
* encryptionKeyId
* excludeFromNotification
+ * excludeFromTrackerItemLastModificationDate
* visibleInViewMode
* visibleInEditMode
* visibleInHistoryMode
@@ -157,4 +158,28 @@ abstract class AbstractTrackerField
return $this->options->getParam($key, $default);
}
}
+
+ /**
+ * Handle the save of a tracker item field.
+ *
+ * This method is called after the field values are saved. It can be used to
+ * determine additional updates that should be performed on the item, for
+ * example updating the lastModif/lastModifBy metadata.
+ *
+ * @param array $trackerOldDbRow The raw database row of the tracker item.
+ * @return array The values for the columns to be updated (if any).
+ */
+ public function handleTrackerItemSave(array $trackerOldDbRow): array
+ {
+ global $tikilib, $user;
+
+ if (($this->fieldRow['excludeFromTrackerItemLastModificationDate'] ?? 'n') === 'y') {
+ return [];
+ }
+
+ return [
+ \Tracker_Item::LAST_MODIF => $tikilib->now,
+ \Tracker_Item::LAST_MODIF_BY => $user,
+ ];
+ }
}
=====================================
lib/core/Tracker/Item.php
=====================================
@@ -9,6 +9,8 @@ use Tracker\Field\AbstractItemField;
class Tracker_Item
{
+ public const LAST_MODIF = 'lastModif';
+ public const LAST_MODIF_BY = 'lastModifBy';
public const PERM_NAME_MAX_ALLOWED_SIZE = 50;
/**
=====================================
lib/trackers/trackerlib.php
=====================================
@@ -2062,18 +2062,10 @@ class TrackerLib extends TikiLib
$status = $status ? $status : $oldStatus;
$fil['status'] = $status;
$old_values['status'] = $oldStatus;
+ $fieldsModified = [];
if ($status != $oldStatus) {
$this->change_status([$itemId], $status);
- } else {
- $this->update_items(
- [$itemId],
- [
- 'lastModif' => $tikilib->now,
- 'lastModifBy' => $user,
- ],
- false
- );
}
$version = $this->last_log_version($itemId) + 1;
@@ -2180,6 +2172,7 @@ class TrackerLib extends TikiLib
if ($old_value != $value) {
// Save old value
$this->log($version, $currentItemId, $array['fieldId'], $old_value);
+ $fieldsModified[$array['fieldId']] = $array;
}
$fil[$fieldId] = $value;
}
@@ -2196,6 +2189,7 @@ class TrackerLib extends TikiLib
if ($old_value != $value) {
// Save old value
$this->log($version, $currentItemId, $array['fieldId'], $old_value);
+ $fieldsModified[$array['fieldId']] = $array;
}
$fil[$fieldId] = $value;
}
@@ -2390,6 +2384,23 @@ class TrackerLib extends TikiLib
'notify_watchers' => $notify_watchers,
];
+ if (! empty($itemId) && ! empty($fieldsModified)) {
+ $rowUpdatedColumns = [];
+ $definition = \Tracker_Definition::get($trackerId);
+ foreach ($fieldsModified as $fieldId => $array) {
+ $trackerField = $definition->getFieldInstance($fieldId);
+ if ($trackerField) {
+ $updatedColumns = $trackerField->handleTrackerItemSave($item_info);
+ $item_info = array_merge($item_info, $updatedColumns);
+ $rowUpdatedColumns = array_merge($rowUpdatedColumns, $updatedColumns);
+ }
+ }
+
+ if (! empty($rowUpdatedColumns)) {
+ $this->update_items([$itemId], $rowUpdatedColumns, false);
+ }
+ }
+
// this needs to trigger no matter of the size as trackeritem categorization depends on this and other event types as well
TikiLib::events()->trigger(
$final_event,
@@ -3543,7 +3554,7 @@ class TrackerLib extends TikiLib
* @param int $fieldId 0 has special meaning: insert a new field
* @return int the field id inserted or operated on.
*/
- public function replace_tracker_field($trackerId, int $fieldId, $name, $type, $isMain, $isSearchable, $isTblVisible, $isPublic, $isHidden, $isMandatory, $position, $options, $description = '', $isMultilingual = '', $itemChoices = null, $errorMsg = '', $visibleBy = null, $editableBy = null, $descriptionIsParsed = 'n', $validation = '', $validationParam = '', $validationMessage = '', $permName = null, $rules = null, $encryptionKeyId = null, $excludeFromNotification = false, $visibleInViewMode = 'y', $visibleInEditMode = 'y', $visibleInHistoryMode = 'y'): int
+ public function replace_tracker_field($trackerId, int $fieldId, $name, $type, $isMain, $isSearchable, $isTblVisible, $isPublic, $isHidden, $isMandatory, $position, $options, $description = '', $isMultilingual = '', $itemChoices = null, $errorMsg = '', $visibleBy = null, $editableBy = null, $descriptionIsParsed = 'n', $validation = '', $validationParam = '', $validationMessage = '', $permName = null, $rules = null, $encryptionKeyId = null, $excludeFromNotification = false, $visibleInViewMode = 'y', $visibleInEditMode = 'y', $visibleInHistoryMode = 'y', $excludeFromTrackerItemLastModificationDate = 'n'): int
{
global $prefs;
$fieldId = (int) $fieldId;
@@ -3607,6 +3618,7 @@ class TrackerLib extends TikiLib
'rules' => $rules,
'encryptionKeyId' => $encryptionKeyId,
'excludeFromNotification' => $excludeFromNotification,
+ 'excludeFromTrackerItemLastModificationDate' => $excludeFromTrackerItemLastModificationDate,
'visibleInViewMode' => $visibleInViewMode ?? 'y',
'visibleInEditMode' => $visibleInEditMode ?? 'y',
'visibleInHistoryMode' => $visibleInHistoryMode ?? 'y'
@@ -4531,7 +4543,8 @@ class TrackerLib extends TikiLib
$field['excludeFromNotification'],
$field['visibleInViewMode'],
$field['visibleInEditMode'],
- $field['visibleInHistoryMode']
+ $field['visibleInHistoryMode'],
+ $field['excludeFromTrackerItemLastModificationDate']
);
if ($options['defaultOrderKey'] == $field['fieldId']) {
$options['defaultOrderKey'] = $newFieldId;
=====================================
templates/tracker/edit_field.tpl
=====================================
@@ -295,6 +295,16 @@
{tr}Data and changes to this field are not included in email notifications.{/tr}
</div>
</div>
+ <div class="mb-3 mx-0">
+ <label for="type" class="col-form-label">{tr}Exclude from tracker item last modification date{/tr}</label>
+ <select name="exclude_from_lastmodif" class="form-select" data-original="{$field.excludeFromTrackerItemLastModificationDate}">
+ <option value="0" {if $field.excludeFromTrackerItemLastModificationDate eq 'n'}selected="selected"{/if}>{tr}No{/tr}</option>
+ <option value="1" {if $field.excludeFromTrackerItemLastModificationDate eq 'y'}selected="selected"{/if}>{tr}Yes{/tr}</option>
+ </select>
+ <div class="form-text">
+ {tr}When this field is modified, if set to "Yes", it will NOT update the item's last modification date and user.{/tr}
+ </div>
+ </div>
<div class="mb-3 mx-0">
<label for="type" class="col-form-label">{tr}Visible in view mode{/tr}</label>
<select name="visible_in_view_mode" class="form-select" data-original="{$field.visibleInViewMode}">
View it on GitLab: https://gitlab.com/tikiwiki/tiki/-/commit/b7c8172df080eb8eb4a763076a1e222e077280d0
--
View it on GitLab: https://gitlab.com/tikiwiki/tiki/-/commit/b7c8172df080eb8eb4a763076a1e222e077280d0
You're receiving this email because of your account on gitlab.com. Manage all notifications: https://gitlab.com/-/profile/notifications | Help: https://gitlab.com/help
_______________________________________________
TikiWiki-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tikiwiki-cvs