Contao\Database\Updater::convertMultiField PHP Method

convertMultiField() public static method

Convert a multi source field to UUIDs
public static convertMultiField ( string $table, string $field )
$table string The table name
$field string The field name
    public static function convertMultiField($table, $field)
    {
        $objDatabase = \Database::getInstance();
        // Get the non-empty rows
        $objRow = $objDatabase->query("SELECT id, {$field} FROM {$table} WHERE {$field}!=''");
        // Check the column type
        $objDesc = $objDatabase->query("DESC {$table} {$field}");
        // Change the column type
        if ($objDesc->Type != 'blob') {
            $objDatabase->query("ALTER TABLE `{$table}` CHANGE `{$field}` `{$field}` blob NULL");
            $objDatabase->query("UPDATE `{$table}` SET `{$field}`=NULL WHERE `{$field}`=''");
        }
        while ($objRow->next()) {
            $arrValues = \StringUtil::deserialize($objRow->{$field}, true);
            if (empty($arrValues)) {
                continue;
            }
            $objHelper = static::generateHelperObject($arrValues);
            // UUID already
            if ($objHelper->isUuid) {
                continue;
            }
            foreach ($arrValues as $k => $v) {
                // Numeric ID to UUID
                if ($objHelper->isNumeric) {
                    $objFile = \FilesModel::findByPk($objHelper->value[$k]);
                    $arrValues[$k] = $objFile->uuid;
                } else {
                    $objFile = \FilesModel::findByPath($objHelper->value[$k]);
                    $arrValues[$k] = $objFile->uuid;
                }
            }
            $objDatabase->prepare("UPDATE {$table} SET {$field}=? WHERE id=?")->execute(serialize($arrValues), $objRow->id);
        }
    }

Usage Example

Example #1
0
 private function updateDbafsUuid()
 {
     // As of Contao 3.2 assisted fileTree widgets store tl_files.uuid instead of tl_files.id
     $arrConvertFields = array('single' => array('tl_form' => array('confirmationMailTemplate', 'formattedMailTemplate'), 'tl_form_field' => array('efgBackSingleSRC')), 'multiple' => array('tl_form' => array('confirmationMailAttachments', 'formattedMailAttachments'), 'tl_form_field' => array('efgMultiSRC')));
     foreach ($arrConvertFields['single'] as $strTable => $arrFields) {
         foreach ($arrFields as $strField) {
             \Contao\Database\Updater::convertSingleField($strTable, $strField);
         }
     }
     foreach ($arrConvertFields['multiple'] as $strTable => $arrFields) {
         foreach ($arrFields as $strField) {
             \Contao\Database\Updater::convertMultiField($strTable, $strField);
         }
     }
 }