Skip to main content

➕ Plugins Sammlung

setCreatedBy

setCreatedBy.png

<?php
/*
    V 2025-12-22a
    Plugin: setCreatedBy
    Event: OnDocFormSave

    - Wird nach dem Speichern einer Ressource im Manager-Formular ausgelöst.
    - Event-Parameter: $mode ('new'|'upd'), $resource (modResource-Objekt), $id (Ressourcen-ID).
    - TV-Werte können in diesem Event per setTVValue() gesetzt werden.

    TV Input Option Values (Anzeige = fullname, Wert = internalKey) EINZEILIG:
    @SELECT `fullname`, `internalKey` FROM `[[++table_prefix]]user_attributes` WHERE `blocked` = 0 ORDER BY `fullname` ASC
*/

use MODX\Revolution\modResource;
use MODX\Revolution\modUser;

if (empty($resource) || !($resource instanceof modResource)) {
    return;
}

/* createdby beim Anlegen und bei Updates (Korrektur) setzen */
if (!isset($mode) || ($mode !== 'new' && $mode !== 'upd')) {
    return;
}

$tvName = 'tvSetCreatedBy';

$mgrUserId = (int) $modx->user->get('id');
if ($mgrUserId <= 0) {
    return;
}

/* TV-Wert lesen (soll eine User-ID sein) */
$tvVal = (int) $resource->getTVValue($tvName);

/* Fallback: wenn TV leer ist, setze aktuellen Manager-User (auch bei Updates) */
if ($tvVal <= 0) {
    $tvVal = $mgrUserId;
    if ($tvVal > 0) {
        $resource->setTVValue($tvName, $tvVal);
    }
}

$authorId = (int) $tvVal;
if ($authorId <= 0) {
    return;
}

/* User muss existieren */
if (!$modx->getObject(modUser::class, $authorId)) {
    return;
}

/* createdby nur setzen, wenn abweichend */
if ((int) $resource->get('createdby') === $authorId) {
    return;
}

$resourceId = (int) $resource->get('id');
if ($resourceId <= 0) {
    return;
}

$table = $modx->getTableName(modResource::class);
if (empty($table)) {
    return;
}

$sql = "UPDATE {$table} SET createdby = :createdby WHERE id = :id";
$stmt = $modx->prepare($sql);
if (!$stmt) {
    return;
}

if (!$stmt->execute([
    ':createdby' => $authorId,
    ':id' => $resourceId,
])) {
    return;
}

/* Objekt im Speicher konsistent halten */
$resource->set('createdby', $authorId);