Skip to content

Array to string conversion when copying fe_users record with tx_femanager_log inline relation #702

@eckonator

Description

@eckonator

When copying a fe_users record in the TYPO3 backend, an exception is thrown if the user has related tx_femanager_domain_model_log records containing data in the additional_properties field.

Error

(1/1) #1476107295 TYPO3\CMS\Core\Error\Exception
PHP Warning: Array to string conversion
in /vendor/doctrine/dbal/src/Driver/Mysqli/Statement.php line 73

Root Cause

When TYPO3's DataHandler::copyRecord_raw() copies the log record, it reads the existing DB row directly via SQL. TYPO3 automatically decodes type = json TCA fields into PHP arrays during this process. The decoded array value is then passed directly into insertNewCopyVersion() → insertDB() without re-encoding it to a JSON string. The Extbase setter setAdditionalProperties(string $additionalProperties) is never invoked in this path.

As a result, Doctrine DBAL receives a raw PHP array instead of a JSON string and throws Array to string conversion.

The field is defined as:

// TCA
'additional_properties' => [
    'config' => [
        'type' => 'json',
        'readOnly' => true,
    ],
],

// Model setter
public function setAdditionalProperties(string $additionalProperties): void
{
    $this->additionalProperties = $additionalProperties;
}

Steps to Reproduce

  • Have a fe_users record with at least one related tx_femanager_domain_model_log entry (e.g. after a successful frontend login)
  • Copy the fe_users record in the TYPO3 backend list module
  • Exception is thrown immediately

Expected Behavior

The fe_users record and its related log records are copied without error. The additional_properties JSON field is properly re-encoded to a string before the INSERT.

Suggested Fix

Before inserting the copied record, ensure additional_properties is JSON-encoded if it is an array:

if (is_array($this->additionalProperties)) {
    $this->additionalProperties = json_encode(
        $this->additionalProperties,
        JSON_THROW_ON_ERROR | JSON_UNESCAPED_UNICODE
    );
}

Alternatively this should be handled generically in DataHandler::insertUpdateDB_preprocessBasedOnFieldType() for all type = json TCA fields.

Environment

  • TYPO3 Version: 13.4.27
  • femanager Version: 13.3.2
  • PHP Version: 8.2
  • Database: MariaDB

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions