FriendsOfREDAXO / mform

Spielend einfach umfangreiche Modul-Input-Formulare erzeugen.
MIT License
77 stars 19 forks source link

MForm8 Wechsel von MBlock: Problem mit addCustomLinkField #341

Closed anveno closed 5 months ago

anveno commented 6 months ago

Description / Beschreibung

Hi. Wenn ich bei einem bestehenden Slice mit Inhalten $mblock->addCustomLinkField("$id.0.customlink",[...]) zu ->addCustomLinkField('customlink',[...]) ändere. Ist das Feld customlink plötzlich leer und Änderungen daran werden auch nicht mehr gespeichert.

Erstelle ich ein frischen Block mit dem selben Modul klappt es. Ändere ich den Namen vom Field klappt es.

Affected versions / Verwendete Versionen

MForm8

skerbis commented 6 months ago

Hast du die $id im repeater? Bitte mal die kompletten Codes zu mblock und dem repeater posten

anveno commented 6 months ago

alt (mform 6)


    // base ID
    $id = 1;

    $mblock = new MForm();
    $mblock->addFieldset('Startseite: Slider Item');
    $mblock->addSelectField("$id.0.status", array(
        ''=>'online',
        'offline'=>'offline',
    ), array('label'=>'Status'));
    $mblock->addTextField("$id.0.subline",array('label'=>'Overline','maxlength'=>'50'));
    $mblock->addTextField("$id.0.headline1",array('label'=>'Headline','maxlength'=>'75'));
    $mblock->addMediaField(1,array('types'=>'gif,jpg,png','preview'=>1,'label'=>'Bild','category'=>21));
    $mblock->addMediaField(2,array('types'=>'gif,jpg,png','preview'=>1,'label'=>'Bild, kleinere Auflösungen (optional)','category'=>21));
    $mblock->addCustomLinkField("$id.0.customlink",
        array(
            'label' => 'Link (optional)',
            'data-tel' => 'disable',
            'data-phone' => 'disable',
            'ylink' => fr_mform::$yLinkArray
        )
    );
    $mblock->addTextField("$id.0.linktext",array('label'=>'Linktext (Standard: Mehr erfahren)'));
    $mblock->addTextField("$id.0.linkanker",array('label'=>'Linkanker'));
    //$mblock->addTextField("$id.0.linkparameter",array('label'=>'Linkparameter'));
    $mblock->addTextField("$id.0.navtitle",array('label'=>'Navigationstitel','maxlength'=>'80'));
    $mblock->closeFieldset();

    echo MBlock::show($id, $mblock->show(), array('min'=>1));

neu

use FriendsOfRedaxo\MForm;
$mblock_id = 1;
$mform = MForm::factory()
        ->addRepeaterElement($mblock_id, MForm::factory()
            ->addFieldsetArea('Startseite: Slider Item', MForm::factory()
                ->addSelectField('status', array(
                    ''=>'online',
                    'offline'=>'offline',
                ), array('label'=>'Status'))
                ->addTextField('subline',array('label'=>'Overline','maxlength'=>'50'))
                ->addTextField('headline1',array('label'=>'Headline','maxlength'=>'75'))
                ->addMediaField('REX_MEDIA_1',array('types'=>'gif,jpg,png','preview'=>1,'label'=>'Bild','category'=>21))
                ->addMediaField('REX_MEDIA_2',array('types'=>'gif,jpg,png','preview'=>1,'label'=>'Bild, kleinere Auflösungen (optional)','category'=>21))
                ->addCustomLinkField('customlink', ['label' => 'Link (optional)', 'data-intern' => 'enable', 'data-extern' => 'enable', 'data-media' => 'enable', 'data-mailto' => 'enable', 'data-tel' => 'disable','ylink' => fr_mform::$yLinkArray])
                ->addTextField('linktext',array('label'=>'Linktext (Standard: Mehr erfahren)'))
                ->addTextField('linkanker',array('label'=>'Linkanker'))
                ->addTextField('navtitle',array('label'=>'Navigationstitel','maxlength'=>'80'))
            ), true, true, ['btn_text' => 'hinzufügen', 'max' => 15, 'min' => 1]
        );

echo $mform->show();
skerbis commented 6 months ago

Hi. Du hast recht das Feld ist nicht mehr kompatibel.

hiermit kannst du schon mal die Values konvertieren

<?php
// Define the parameters
$column = 'value1'; // column
$node = 'customlink'; //  node
$moduleId = 48; // module_id

// Fetch all records from the rex_article_slice table where module_id is the specified value
$sql = rex_sql::factory();
$sql->setQuery("SELECT id, $column FROM rex_article_slice WHERE module_id = ?", [$moduleId]);

foreach ($sql as $row) {
    $id = $row->getValue('id');
    $jsonData = $row->getValue($column);

    // Decode JSON data
    $data = json_decode($jsonData, true);

    // Check if decoding was successful and if the data is an array
    if (json_last_error() === JSON_ERROR_NONE && is_array($data)) {
        $modified = false;

        // Traverse the JSON array and modify customlink nodes
        foreach ($data as &$item) {
            if (isset($item[$node])) {
                $value = $item[$node];

                // Check if the value is already in the desired format
                $isNewFormat = is_array($value) && isset($value['name']) && isset($value['id']);

                if (!$isNewFormat) {
                    if (is_numeric($value)) {

                        $articleId = (int)$value;

                        // Artikelobjekt laden
                        $article = rex_article::get($articleId);
                        $articleName = "article not found: redaxo://$value";
                        if ($article) {
                            // Artikelname abrufen
                            $articleName = rex_escape($article->getName());
                        }

                        $item[$node] = [
                            'name' => "$articleName",
                            'id' => "redaxo://$value"
                        ];
                    } else {
                        $item[$node] = [
                            'name' => "$value",
                            'id' => "$value"
                        ];
                    }
                    $modified = true;
                }
            }
        }

        // If data was modified, update the database
        if ($modified) {
            $updatedJsonData = json_encode($data);
            $updateSql = rex_sql::factory();
            $updateSql->setTable('rex_article_slice');
            $updateSql->setWhere(['id' => $id]);
            $updateSql->setValue($column, $updatedJsonData);
            $updateSql->update();
            echo "Updated record ID $id<br>";
        }
    } else {
        // Log or handle invalid JSON data if necessary
        echo "Invalid JSON data in record ID $id<br>";
    }
}

echo "Conversion completed.<br>";
?>

<?php

echo '<pre>';
print_r(rex_var::toArray("REX_VALUE[1]"));
echo '</pre>';

?>
skerbis commented 6 months ago

@anveno beachte auch bei der Ausgabe dass nun die ID ausgelesen werden muss für das Value und dass links nun mit rex:// ... gespeichert werden

skerbis commented 6 months ago

die URL könnte man hiermit auslesen (kommt im nächsten Release)


function getCustomUrl(mixed $value, ?string $lang = null): string
{
    // Prüfen ob der Wert ein REDAXO Artikel ist (beginnt mit rex://)
    if (str_starts_with($value, 'rex://')) {
        $articleId = (int) substr($value, 6); // Entfernt 'rex://' und wandelt den Rest in eine Ganzzahl um
        return rex_getUrl($articleId, $lang);
    }

    // Prüfen ob der Wert numerisch ist
    if (is_numeric($value)) {
        $articleId = (int) $value;
        return rex_getUrl($articleId, $lang);
    }

    // Wenn der Wert weder eine REDAXO URL noch numerisch ist, gib ihn einfach zurück
    return (string) $value;
}```