[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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.