Ergebnis 1 bis 2 von 2

Thema: Neue IDs in Checkbox nach Duplizierung von Child-Records automatisch übernehmen

  1. #1
    Contao-Nutzer Avatar von chatjack
    Registriert seit
    02.09.2012.
    Ort
    Essen
    Beiträge
    160

    Standard Neue IDs in Checkbox nach Duplizierung von Child-Records automatisch übernehmen

    Hallo zusammen,

    ich stehe gerade vor dem Problem, dass das Checkbox-Widget in einem DCA nach dem Kopieren des Eltern-Elements die alten IDs enthält und überlege zurzeit, wie ich es am besten hin bekomme, die neuen IDs zu hinterlegen. Zurzeit gibt es die Tabelle tl_lom_election, die folgende Child-Tables umfasst.

    Code:
    - tl_lom_election
    --- tl_lom_candidate
    --- tl_lom_topic
    ----- tl_lom_question
    ------- tl_lom_answer (enthält ein CheckBox-Widget mit Einträgen aus tl_lom_candidate)
    Im DCA für den Table tl_lom_answer steckt momentan ein CheckboxWidget, um Einträge aus tl_lom_candidate anzuzeigen, die sich den gemeinsamen Parent tl_lom_election teilen. Dieser wird über folgenden Callback befeuert.

    PHP-Code:
        /**
         * @Callback(table="tl_lom_answer", target="fields.candidate.options")
         */
        
    public function answerCandidateOptions(DataContainer $dc)
        {

            
    $options = [];

            
    $objQuestion LomQuestionModel::findByPk($dc->activeRecord->pid);
            
    $objTopic LomTopicModel::findByPk($objQuestion->pid);
            
    $objCandidate LomCandidateModel::findByPid($objTopic->pid, ['order' => 'sorting']);

            while(
    $objCandidate->next())
            {
                
    $name $objCandidate->name;
                if (
    $objCandidate->party)
                {
                    
    $name .= ' [' LomPartyModel::findByPk($objCandidate->party)->name ']';
                }
                
    $options[$objCandidate->id] = $name;
            }

            return 
    $options;

        } 
    Dupliziere ich nun tl_lom_election, bekomme alle Child-Records die ebenfalls dupliziert wurden neue IDs, was ja technisch auch unumgänglich ist. Aber wie komme ich in meinem Feld candidate beim Duplizieren an die neuen IDs?

    PHP-Code:
    ...
            
    'candidate' => [
                
    'inputType' => 'checkbox',
                
    'eval'      => ['multiple'=>true],
                
    'sql'       => 'blob NULL'
            
    ],
    ... 
    Bisher sind mir zwei Optionen in den Sinn gekommen.

    • Die Tabelle tl_lom_candidate bekommt ein zusätzliches Feld mit einer dynamischen ID, die in das Feld "candidate" geschrieben wird, nicht unique ist und somit dupliziert werden kann.
    • Nach dem Kopieren ermittle ich die neuen IDs, indem ich alle Felder bis auf die ID selbst miteinander abgleiche. Doppelte Inhalte führen dann natürlich ggf. zu falschen Verknüpfungen.


    Bevor ich mir hier etwas zusammen bastle wäre meine Frage, ob hier vielleicht jemand schon vor einem ähnlichen Problem stand und eine Lösung für das Problem gefunden hat.

    Dank und Gruß
    Dennis
    Geändert von chatjack (04.08.2020 um 14:34 Uhr)

  2. #2
    Contao-Nutzer Avatar von chatjack
    Registriert seit
    02.09.2012.
    Ort
    Essen
    Beiträge
    160

    Standard

    Ich habe jetzt eine einigermaßen zufriedenstellende Lösung gefunden. Die Einträge in tl_lom_candidate sind sortiertbar. Dadurch ergibt sich aus der Kombination aus "pid" und "sorting" quasi schon ein eindeutiger Identifier, da "sorting" nach dem Kopieren erhalten bleibt. Auf der Basis konnte ich eine Funktion schreiben, die die neuen IDs übernimmt.

    PHP-Code:
        /**
        * @Callback(table="tl_lom_election", target="config.oncopy")
        */
        
    public function electionOnCopy(string $idDataContainer $dc)
        {

                
    // Candidate map
                
    $mapping = [];

                
    // Old candidates
                
    $objCandidatesOld LomCandidateModel::findByPid($dc->id);

                
    // Map new IDs by sorting
                
    while($objCandidatesOld->next())
                {
                    
    $mapping[$objCandidatesOld->id] = LomCandidateModel::findOneBy(['pid=?''sorting=?'], [$id$objCandidatesOld->sorting])->id;
                }

                
    // Find topics
                
    $objTopics LomTopicModel::findByPid($id);
                while (
    $objTopics && $objTopics->next())
                {
                    
    // Find questions
                    
    $objQuestions LomQuestionModel::findByPid($objTopics->id);
                    while (
    $objQuestions && $objQuestions->next())
                    {
                        
    // Find answers
                        
    $objAnswers LomAnswerModel::findByPid($objQuestions->id);
                        while (
    $objAnswers && $objAnswers->next())
                        {
                            
    // Get candidates
                            
    $candidate StringUtil::deserialize($objAnswers->candidate);
                            if (
    $candidate)
                            {
                                
    // Replace ids
                                
    for ($i=0$i<count($candidate); $i++)
                                {
                                    if (isset(
    $mapping[$candidate[$i]]))
                                    {
                                        
    $candidate[$i] = $mapping[$candidate[$i]];
                                    }
                                }
                                
    $objAnswers->candidate $candidate;
                                
    $objAnswers->save();
                            }
                        }
                    }
                }

        } 

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
  •