Ergebnis 1 bis 12 von 12

Thema: FE-Bearbeitung ändert Author-Wert

  1. #1
    Contao-Nutzer
    Registriert seit
    24.10.2016.
    Beiträge
    22

    Standard FE-Bearbeitung ändert Author-Wert

    Hallo. ich habe da ein kleines Problem, vielleicht könnt ihr mir dabei helfen?
    PHP 7.4
    Contao 4.9

    Und zwar habe ich auf einer Kundenseite eine Art Vereinsportal mit Detailansicht angelegt. Es gibt jeweils ein Mitglied für die FE-Bearbeitung.
    Wenn sich dieses Mitglied nun im FE einloggt und den Datensatz bearbeitet, werden die Werte übernommen, aber dabei verliert das Mitglied die Rechte zur Bearbeitung.
    Mitglied-ID ist die 55. so steht das auch als author im Datensatz, aber nach dem speichern ist im Datensatz nur noch 5 zu sehen. Schneide ich da versehentlich was oder woran liegt das?

    PHP-Code:
    foreach($arrItem['raw'] as $key => $value){
      
    $arrItem['raw'][$key] = \Input::post($key);

    Wenn ich mir die Daten ausgeben lasse erhalte ich bei
    Code:
    \Input::post('author')
    den Wert 55 aber nach dem Anpassen des Datensatzes ist der Wert von
    Code:
    $arrItem['raw']['author']
    ein Array mit den Werten des Mitglieds und in der Datenbank steht der Wert 5.

    Ich kann mir das vorgehen nicht wirklich erklären.
    Hat da jemand eine Idee?

  2. #2
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.719
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von Stephan_84 Beitrag anzeigen
    Ich kann mir das Vorgehen nicht wirklich erklären.
    Wenn das Select-Attribut für den Autor nicht in der FEE-Eingabemaske ist, sollte sich der Wert nicht ändern.

    Ich sehe aber zwei Probleme:

    1.) automatisches Speichern des Autors beim Anlegen des Datensatzes
    2.) Rechteprüfung beim Öffnen und Speichern der Eingabemaske

    In MM 2.3 ist der typische Fall "jeder Autor darf nur seine Datensätze bearbeiten" mit inkludiert - für alle anderen MM-Versionen oder andere Rechtevorgaben muss man mit den entsprechenden Events arbeiten.

    Beschrieben ist das in https://metamodels.readthedocs.io/de...chteverwaltung

  3. #3
    Contao-Nutzer
    Registriert seit
    24.10.2016.
    Beiträge
    22

    Standard

    Der Wert wird über
    PHP-Code:
    <input type="hidden" name="author" value="{{user::id}}"
    mitgegeben.
    Soll ich das einfach löschen?

    Auf der Seite läuft noch MM 2.1.1

  4. #4
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.719
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von Stephan_84 Beitrag anzeigen
    Es gibt jeweils ein Mitglied für die FE-Bearbeitung.
    sieht für mich nach FEE aus ...

    Dein

    <input type="hidden" name="author" value="{{user::id}}">
    eher als hättest Du was mit einem Formular gebastelt...

    Vllt. zunächst noch etwas mehr Futter zu Deinem generellen Aufbau!

  5. #5
    Contao-Nutzer
    Registriert seit
    24.10.2016.
    Beiträge
    22

    Standard

    Ja selbst gebaut trifft es wohl.

    Dioe Seite wurde unter Contao 3.5 erstellt. Dort habe ich mehrere eigene Module gebastelt und den Bedürfnissen gerecht zu werden.
    Vereine, Adressverwaltung für öffentliche Bereiche der einzelnen Kommunen, und ein etwas umfangreicheres Comunity-Modul ähnlich den Kleinanzeigen.

    Nach dem Update auf Contao 4.9 bin ich dann auf MM umgestiegen und habe versucht, soweit es geht, ohne großen Aufwand die Anpassungen vorzunehmen, weil die vorgegebene Zeit leider einfach nicht ausgereicht hat.

    Deswegen werden die Formulare auch händisch programmiert (Vorlagen kommen aus der alten Erweiterung).

    Da ich mit MM-FEE nicht wirklich zurecht kam, ahbe ich mir da was mit der Contao "Elemente schützen" Funktion zusammengebaut.

    Das Formular wird nur angezeigt, wenn die Mitgliedergruppe passt. und im MM habe ich einen Filter
    HTML-Code:
    SELECT `id` 
    FROM {{table}}
    WHERE `author` = {{user::id}}
    welcher mir dann den richtigen Verein anzeigt.


    Also ist im Grunde das komplette Formular selbst erstellt und wird mittels
    HTML-Code:
    $ObjItem = new \MetaModels\Item($model, $arrItem['raw']); 
    $ObjItem->save();
    in der DB gespeichert.

    Ich weiß, dass die Umsetzung ziemlich dirty war, aber bisher hat noch keiner gemeckert. Bis jetzt halt.
    Ich denke, dass der Fehler schon länger besteht, sich aber keiner gemeldet hat, weil das Portal kaum benutzt wird.

  6. #6
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.719
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von Stephan_84 Beitrag anzeigen
    Also ist im Grunde das komplette Formular selbst erstellt und wird mittels
    HTML-Code:
    $ObjItem = new \MetaModels\Item($model, $arrItem['raw']); 
    $ObjItem->save();
    in der DB gespeichert.
    Ich vermute, das steht in einem processFormData-Hook bei Dir - oder?

    Da müsstest Du schon etwas mehr erklären was du machst oder gedenkst zu machen und wie Dein Quelltext aussieht - die zwei Zeilen für sich sind nicht falsch, ob passend kann ich nicht sehen

  7. #7
    Contao-Nutzer
    Registriert seit
    24.10.2016.
    Beiträge
    22

    Standard

    Nein das findet alles in dieser einen Datei statt.

    hier mal die komplette Datei

    PHP-Code:
    <?php if (count($this->data)): ?>
    <?php 
        $factory 
    $this->getContainer()->get('metamodels.factory');
        
    $model  $factory->getMetaModel('mm_vereine');
        
    // Kategorien
        
    $modelKat  $factory->getMetaModel('mm_kategorie');
        
    $filterKat $modelKat->prepareFilter(19, []);
        
    $itemsKat $modelKat->findByFilter($filterKat);
        
    $arrItemsKat $itemsKat->parseAll('text');

        
    // Festlegen von Pflichtfeldern für das Formular
        
    $mandatoryFields = array('title','category');
        
        
    // Handling Form submit

        
    if(\Input::post('FORM_SUBMIT') == 'mm_vereine'){

            foreach(
    $this->data as $arrItem){

                
    // Handling für Eingabefelder
                
    $type "";
                
    $select = array('category');
                
    $textarea = array('beschreibung','oeffnungszeiten''termine');
                
    $filetype = array('singleSRC','multiSRC');
                
    $multifile = ($key == 'multiSRC')? true false;
                
    $checkbox = array('addImage','addGallery','published');

                
    // Edit Item
                
    if (\Input::post('ACTION') == "edit"){
                    
                    foreach(
    $arrItem['raw'] as $key => $value){
                        
                        if(
    in_array($key$checkbox))
                            
    $arrItem['raw'][$key] = (\Input::post($key))? 0;
                        elseif (
    in_array($key$textarea))
                            
    $arrItem['raw'][$key] = html_entity_decode(\Input::post($key));
                        elseif (
    $key == 'datelatestnews')
                            
    $arrItem['raw'][$key] = strtotime(\Input::post($key));
                        elseif (
    in_array($key$filetype)){
                            
    $dst 'files/allianz-thueringer-becken/vereine/'.$arrItem['raw']['alias'];
                            if (!
    file_exists($dst)){
                                
    $objFiles = \Files::getInstance(); 
                                
    $objFiles->mkdir($dst);
                                
    $objFolder = \Dbafs::addResource$dst );
                                echo 
    "Ordner existiert nicht";
                            }
                            
    $storeFolderAbs TL_ROOT.'/'.$dst;
                            
    $storeFolder $dst;
                            
    $targetTmpPath =  $storeFolder '/tmp';
                            
    $targetTmpPathAbs =  $storeFolderAbs '/tmp';
                            
                            if(!
    file_exists($storeFolderAbs)){
                                new \
    Folder($storeFolder);
                                \
    Dbafs::addResource($storeFolder);
                            }
                            
                            if(
    $key != "multiSRC"){
                                echo 
    "Einzelbild";
                                
    $tmp_name $_FILES[$key]['tmp_name'];
                                
    $name basename($_FILES[$key]["name"]);
                                
    move_uploaded_file($tmp_name"$storeFolder/$name");    
                                
                                \
    Image::resize("$storeFolder/$name"800800"proportional");
                                
    $objFile = \Dbafs::addResource("$storeFolder/$name");
                            
                                
    $bild = array();
                                
    $bild['bin'][] = $objFile->uuid;
                                
    $bild['value'][] = \StringUtil::binToUuid($objFile->uuid);
                                
    $bild['path'][] = $objFile->path;
                                
    $bild['meta'][] = array();

                                
    $arrItem['raw'][$key] = $bild;
                                
    dump($arrItem['raw'][$key]);
                            }else{

                                
    $bild = array();

                                if(!
    file_exists($storeFolderAbs."/galerie")){
                                    new \
    Folder($storeFolder."/galerie");
                                    \
    Dbafs::addResource($storeFolder."/galerie");
                                }
                                foreach(
    $_FILES[$key]['name'] as $index=>$value){    
                                    
    $tmp_name $_FILES[$key]['tmp_name'][$index];
                                    
    $name basename($_FILES[$key]["name"][$index]);
                                    
    move_uploaded_file($tmp_name"$storeFolder/galerie/$name");    
            
                                    \
    Image::resize("$storeFolder/galerie/$name"800800"proportional");
                                    
    $objFile = \Dbafs::addResource("$storeFolder/galerie/$name");
                                
                                    
    $bild['bin'][] = $objFile->uuid;
                                    
    $bild['value'][] = \StringUtil::binToUuid($objFile->uuid);
                                    
    $bild['path'][] = $objFile->path;
                                    
    $bild['meta'][] = array();
                                }
                                
    $arrItem['raw'][$key] = $bild;
                                
                            }
                            unset(
    $_FILES[$key]);
                            
                        }
                        elseif (\
    Input::post($key) != $arrItem['raw'][$key])
                            
    $arrItem['raw'][$key] = \Input::post($key);
                            
                        
                        
    // Variable zurücksetzen
                        
    \Input::setPost($keynull);
                    }

                }
            }    

            
    $ObjItem = new \MetaModels\Item($model$arrItem['raw']); 
            
    $ObjItem->save();

            
    $this->reload();
            
    // alle Items
            
    $items $model->findByFilter($filter);
            
            
    // alternativ nur Knoten raw und text
            
    $arrItems $items->parseAll('text');

            
    // Variable zurücksetzen
            
    \Input::setPost('FORM_SUBMIT'null);
        }
    ?>
    <script>document.write('<script src="assets/tinymce4/js/tinymce.min.js">\x3C/script>')</script>
    <script>
    tinymce.init({
      skin: 'contao',
      selector: 'textarea',
      language: 'de',
      element_format: 'html',
      document_base_url: '<?= Environment::get('base'?>',
      entities: '160,nbsp,60,lt,62,gt,173,shy',
      branding: false,
      setup: function(editor) {
        editor.getElement().removeAttribute('required');
      },
      content_css: 'system/themes/<?= Backend::getTheme() ?>/tinymce.min.css',
      plugins: 'autosave charmap code fullscreen image importcss link lists paste searchreplace stripnbsp tabfocus table visualblocks visualchars',
      browser_spellcheck: true,
      tabfocus_elements: ':prev,:next',
      importcss_append: true,
      extended_valid_elements: 'q[cite|class|title],article,section,hgroup,figure,figcaption',
      menubar: 'edit insert view format table',
      toolbar: 'link unlink | image | formatselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | code'
    });
    </script>
    <div class="verein_item verein_full">

        <?php foreach ($this->data as $arrItem): ?>

        <div class="verein_fee last block">
        
            <form method="post" class="edit_form" action="{{env::request}}" id="mm_vereine" enctype="multipart/form-data">
                <div class="formbody_edit">
                    <h2>Verein bearbeiten: <?= $arrItem['text']['title'?></h2>
                    <input type="hidden" name="FORM_SUBMIT" value="mm_vereine">
                    <input type="hidden" name="ACTION" value="edit">
                    <input type="hidden" name="REQUEST_TOKEN" value="{{request_token}}">
                    <input type="hidden" name="MAX_FILE_SIZE" value="4096000">
                    <input type="hidden" name="id" value="<?= $arrItem['raw']['id'?>">

                    <?php foreach($arrItem['attributes'] as $key => $value): ?>
                        <?php $mandatory = (in_array($key,$mandatoryFields))? true false?>
                    
                        <?php if ($key == "author"): ?>
                            <input type="hidden" name="author" value="{{user::id}}">
                        <?php else: ?>
                            <?php 
                                
    // Handling für Eingabefelder
                                
    $type "";
                                
    $select = array('category');
                                
    $textarea = array('beschreibung','oeffnungszeiten''termine');
                                
    $filetype = array('singleSRC','multiSRC');
                                
    $multifile = ($key == 'multiSRC')? true false;
                                
    $checkbox = array('addImage','addGallery','published');
                                
                                if (
    in_array($key$select))
                                    
    $type "select";
                                elseif (
    in_array($key$textarea))
                                    
    $type "textarea";
                                elseif (
    in_array($key$filetype))
                                    
    $type "file";
                                elseif (
    in_array($key$checkbox))
                                    
    $type "checkbox";
                                elseif (
    $key == 'datelatestnews')
                                    
    $type "date";
                                elseif (
    $key == 'email')
                                    
    $type "email";
                                else
                                    
    $type "text";
                            
                            
    ?>
                            <div class="widget widget-<?= $type ?> <?php if($mandatory):?>mandatory<?php endif;?>">            
                                <?php if(!in_array($type, array("checkbox""radio"))): ?>
                                    <label for="ctrl_<?= $key ?><?php if($mandatory):?>class="mandatory"<?php endif;?><?= $value ?> <?php if($mandatory):?> <span class="mandatory">*</span><?php endif;?></label>
                                <?php endif; ?>

                                <?php
                                    $wert 
    $arrItem['text'][$key];
                                    
    $mandatoryTag = ($mandatory)? "required=''""";
                                    switch (
    $type) {
                                        case 
    "text":
                                            echo 
    "<input type='text' name='$key' id='ctrl_$key' class='text' value='$wert$mandatoryTag>";
                                            break;
                                        case 
    "email":
                                            echo 
    "<input type='email' name='$key' id='ctrl_$key' class='text' value='$wert$mandatoryTag>";
                                            break;
                                        case 
    "date":
                                            echo 
    "<input type='date' name='$key' id='ctrl_$key' class='text' value='"$this->parseDate("Y-m-d"$arrItem['raw'][$key]) ."' $mandatoryTag>";
                                            break;
                                        case 
    "textarea":
                                            echo 
    "<textarea type='textarea' name='$key' id='ctrl_$key' class='textarea' rows='12' cols='80' $mandatoryTag>$wert</textarea>";
                                            break;
                                        case 
    "checkbox":
                                            
    $checked = ($wert == 1)? "checked=''" ""
                                            echo 
    "<input type='checkbox' name='$key' id='opt_$key_0' class='checkbox' value='1' $checked><label for='ctrl_$key$mandatoryTag>$value</label>";
                                            break;
                                        case 
    "select":
                                            echo 
    "<select name='$key' id='ctrl_$key' class='select' >";
                                            foreach(
    $arrItemsKat as $kat){
                                                
    $selected = ($kat['text']['title'] == $wert)? "selected=''" ""
                                                echo 
    "<option value='"$kat['raw']['id'] ."' $selected >"$kat['text']['title'] ."</option>";
                                            }
                                            echo 
    "</select>";
                                            break;
                                        case 
    "file":
                                            if (
    $multifile){
                                                
                                                if(
    $wert != ""){
                                                    echo 
    "<div class='vorschaubild' style='display:block;'>";
                                                    foreach(
    $arrItem['raw'][$key]["path"] as $image)
                                                        echo 
    "<figure class='image_container float_left'>{{picture::$image?size=3&template=picture_default}}</figure>";
                                                    echo
    "<div class='clear'></div></div><br />";
                                                }
                                                echo 
    "<input type='file' name='".$key."[]' id='ctrl_$key' class='upload' accept='.jpg,.jpeg,.gif,.png,.pdf' multiple>";
                                            }else{
                                                if(
    $wert != ""){
                                                    echo 
    "<div class='vorschaubild'><figure class='image_container'>{{picture::".$arrItem['text'][$key]."?size=3&template=picture_default}}</figure></div><br />";
                                                }
                                                echo 
    "<input type='file' name='$key' id='ctrl_$key' class='upload' accept='.jpg,.jpeg,.gif,.png,.pdf'>";
                                            }
                                            break;
                                    }
                                    
                                
    ?>
                            </div>
                        <?php endif; ?>
                
                    <?php endforeach; ?>
                    
                </div>
                <div class="formbody_submit widget-submit widget">
                    <div class="submit_container">
                        <input type="submit" name="save" class="submit save" accesskey="s" value="Speichern"> 
                    </div>
                </div>
            </form>
        </div>
        <?php endforeach; ?>
        
    </div>
    <?php else : ?>
    <?php $this
    ->block('noItem'); ?>
    <p class="info"><?= $this->noItemsMsg ?></p>
    <?php $this->endblock(); ?>
    <?php 
    endif; ?>
    Edit:
    Kurz gesagt, einfach eine gefilterte Liste mit selbst gebautem Formular, welches über das Model von MM das Objekt in der DB speichert.

    Edit2:
    Ist schon eine Weile her, keine Ahnung was mich damals geritten hat.

  8. #8
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.719
    User beschenken
    Wunschliste

    Standard

    Holla die Waldfee!

    Sieht so aus, als wäre das alles in ein MM-Listentemplate geknallt worden - seufz...

    Ich würde bei mm_vereine über einen Filter nach der Datensatz-ID suchen - wenn es die nicht gibt, legst Du ein neues Item-Objekt an (wie aktuell mit leerem Array) vs. wenn es das gibt hast Du das Item-Objekt und kannst es bearbeiten

    Setzen der Daten im Item mit

    PHP-Code:
    // Simple Attribute wie Text, Int, Dezimal, Datum...
    $ObjItem->set('key''value');
    // Komplexe Attribute wie Select, Tags, Datei, translated*
    $attrXy $model->getAttribute('key');
    $ObjItem->set('key'$attrXy->widgetToValue('value'0));
    ...
    // Speichern
    $ObjItem->save(); 

    Als Hidden-Field musst du den Autor nicht setzen - da eingeloggt, hast Du immer Zugriff auf die ID oder Username

    zu Beachten: ab MM 2.2 muss beim Select-Attribut der Wert des Alias gespeichert werden - in Deinem Fall muss Alias bei den Attributseinstellungen Author auf id stehen, sofern es überhaupt ein Select ist

  9. #9
    Contao-Nutzer
    Registriert seit
    24.10.2016.
    Beiträge
    22

    Standard

    Bisher hat ja alles funktioniert.
    Es geht hierbei wirklich nur um die ID vom Autor.

    Im konkreten Fall hat der Autor die ID 55. so Steht es beim Datensatz auch in der Datenbank.
    Nach dem Speichern steht da allerdings nur die 5 drin.
    Das ist das, was ich nicht verstehe.

  10. #10
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.719
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von Stephan_84 Beitrag anzeigen
    Nach dem Speichern steht da allerdings nur die 5 drin.
    Das ist das, was ich nicht verstehe.
    dann musst Du das mal debuggen...

    PHP-Code:
    dump($arrItem['raw']); 

  11. #11
    Contao-Nutzer
    Registriert seit
    24.10.2016.
    Beiträge
    22

    Standard

    [QUOTE=zonky;572526]dann musst Du das mal debuggen...

    Vor dem Speichern ist der Datensatz des Autors im Feld 'author' also das Array mit all den Daten des Mitglieds.

    Muss ich dann anstelle der Zuweisung

    PHP-Code:
    $arrItem['raw'][$key] = \Input::post($key); 
    mir das Mitgliedsobjekt holen und in
    PHP-Code:
    $arrItem['raw']['author'
    speichern?

    Die erste Stelle der ID bekommt er ja hin (5 statt 55).

    Edit:
    hab es vorerst so gelöst
    PHP-Code:
    if ($key == 'author'$arrItem['raw'][$key] = $arrItem['raw'][$key]; 
    Der Bearbeiter soll ja eh nicht im FE bearbeitet werden können.
    Geändert von Stephan_84 (10.05.2023 um 14:32 Uhr)

  12. #12
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.719
    User beschenken
    Wunschliste

    Standard

    https://metamodels.readthedocs.io/de...item-interface

    Ein neues Item wird wie folgt erzeugt:

    $item = new \MetaModels\Item($model, []);

    In dem übergebenen Array können „Key-Value-Paare“ übergeben werden - dies ist aber nur bei einfachen Item-Typen wie Text sinnvoll.
    arbeite lieber mit der set-Methode des Items und mit widgetToValue bist du immer auf der sicheren Seite was die Daten angeht

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •