Contao\DC_Table::copyChilds PHP Метод

copyChilds() защищенный Метод

Duplicate all child records of a duplicated record
protected copyChilds ( string $table, integer $insertID, integer $id, integer $parentId )
$table string
$insertID integer
$id integer
$parentId integer
    protected function copyChilds($table, $insertID, $id, $parentId)
    {
        $time = time();
        $copy = array();
        $cctable = array();
        $ctable = $GLOBALS['TL_DCA'][$table]['config']['ctable'];
        if (!$GLOBALS['TL_DCA'][$table]['config']['ptable'] && strlen(\Input::get('childs')) && $this->Database->fieldExists('pid', $table) && $this->Database->fieldExists('sorting', $table)) {
            $ctable[] = $table;
        }
        if (!is_array($ctable)) {
            return;
        }
        // Walk through each child table
        foreach ($ctable as $v) {
            $this->loadDataContainer($v);
            $cctable[$v] = $GLOBALS['TL_DCA'][$v]['config']['ctable'];
            if (!$GLOBALS['TL_DCA'][$v]['config']['doNotCopyRecords'] && strlen($v)) {
                // Consider the dynamic parent table (see #4867)
                if ($GLOBALS['TL_DCA'][$v]['config']['dynamicPtable']) {
                    $ptable = $GLOBALS['TL_DCA'][$v]['config']['ptable'];
                    $cond = $ptable == 'tl_article' ? "(ptable=? OR ptable='')" : "ptable=?";
                    $objCTable = $this->Database->prepare("SELECT * FROM {$v} WHERE pid=? AND {$cond}" . ($this->Database->fieldExists('sorting', $v) ? " ORDER BY sorting" : ""))->execute($id, $ptable);
                } else {
                    $objCTable = $this->Database->prepare("SELECT * FROM {$v} WHERE pid=?" . ($this->Database->fieldExists('sorting', $v) ? " ORDER BY sorting" : ""))->execute($id);
                }
                while ($objCTable->next()) {
                    // Exclude the duplicated record itself
                    if ($v == $table && $objCTable->id == $parentId) {
                        continue;
                    }
                    foreach ($objCTable->row() as $kk => $vv) {
                        if ($kk == 'id') {
                            continue;
                        }
                        // Never copy passwords
                        if ($GLOBALS['TL_DCA'][$v]['fields'][$kk]['inputType'] == 'password') {
                            $vv = \Widget::getEmptyValueByFieldType($GLOBALS['TL_DCA'][$v]['fields'][$kk]['sql']);
                        } elseif ($GLOBALS['TL_DCA'][$v]['fields'][$kk]['eval']['unique']) {
                            $vv = \Input::get('act') == 'copyAll' ? $vv . '-' . substr(md5(uniqid(mt_rand(), true)), 0, 8) : \Widget::getEmptyValueByFieldType($GLOBALS['TL_DCA'][$v]['fields'][$kk]['sql']);
                        } elseif ($GLOBALS['TL_DCA'][$v]['fields'][$kk]['eval']['doNotCopy'] || $GLOBALS['TL_DCA'][$v]['fields'][$kk]['eval']['fallback']) {
                            $vv = \Widget::getEmptyValueByFieldType($GLOBALS['TL_DCA'][$v]['fields'][$kk]['sql']);
                            // Use array_key_exists to allow NULL (see #5252)
                            if (array_key_exists('default', $GLOBALS['TL_DCA'][$v]['fields'][$kk])) {
                                $vv = is_array($GLOBALS['TL_DCA'][$v]['fields'][$kk]['default']) ? serialize($GLOBALS['TL_DCA'][$v]['fields'][$kk]['default']) : $GLOBALS['TL_DCA'][$v]['fields'][$kk]['default'];
                            }
                            // Encrypt the default value (see #3740)
                            if ($GLOBALS['TL_DCA'][$v]['fields'][$kk]['eval']['encrypt']) {
                                $vv = \Encryption::encrypt($vv);
                            }
                        }
                        $copy[$v][$objCTable->id][$kk] = $vv;
                    }
                    $copy[$v][$objCTable->id]['pid'] = $insertID;
                    $copy[$v][$objCTable->id]['tstamp'] = $time;
                }
            }
        }
        // Duplicate the child records
        foreach ($copy as $k => $v) {
            if (!empty($v)) {
                foreach ($v as $kk => $vv) {
                    $objInsertStmt = $this->Database->prepare("INSERT INTO " . $k . " %s")->set($vv)->execute();
                    if ($objInsertStmt->affectedRows) {
                        $insertID = $objInsertStmt->insertId;
                        if ((!empty($cctable[$k]) || $GLOBALS['TL_DCA'][$k]['list']['sorting']['mode'] == 5) && $kk != $parentId) {
                            $this->copyChilds($k, $insertID, $kk, $parentId);
                        }
                    }
                }
            }
        }
    }