core
core copied to clipboard
Seiten kopieren: Seitenalias ist leer
In einer MULTILEVEL Contao Installation habe ich einer bestehenden Seite mit allen Unterseiten dupliziert. Mir ist aufgefallen, dass abgesehen vom Rootknoten des Duplikats alle Unterseiten keinen Alias mehr haben. Ich muss jede Seite manuell bearbeiten und speichen, damit der Alias wieder (automatisch) gesetzt wird. Bei MULTILEVEL kann der Alias ja gleich sein, sofern von einer anderen Seite mit anderer Domain kopiert wird. Reproduzier in der aktuellen Contao Demo!
Edit all -> Select each page you need -> generate Page Alias. Done.
Reproduceable with the online Demo ;)
Das sollte nicht die Lösung sein, für ein Problem dem man auch so entgegenwirken könnte.
Das Verhalten finde ich auch extrem nervig.
@contao/developers Eventuell könnte man anstatt des "noNotCopy"-Flags ein neues Flag einführen, das beim Kopieren den "save_callback" oder einen allgemeinen Callback aufruft?
Könnte man nicht generell den save_callback aufrufen? Und bei doNotCopy halt mit leerem Wert?
Ja, könnte man. Allerdings hängt der save_callback in diesem Fall von $dc->activeRecord
ab.
Du meinst dieser ist bei act=create
nicht vorhanden?
Ich hab das mal entsprechend umgesetzt:
diff --git a/system/modules/core/drivers/DC_Table.php b/system/modules/core/drivers/DC_Table.php
index 96da5a3..dd29134 100644
--- a/system/modules/core/drivers/DC_Table.php
+++ b/system/modules/core/drivers/DC_Table.php
@@ -856,7 +856,9 @@ class DC_Table extends \DataContainer implements \listable, \editable
// Copy the values if the record contains data
if ($objRow->numRows)
{
- foreach ($objRow->fetchAssoc() as $k=>$v)
+ $this->objActiveRecord = (object) $objRow->row();
+
+ foreach ($objRow->row() as $k=>$v)
{
if (in_array($k, array_keys($GLOBALS['TL_DCA'][$this->strTable]['fields'])))
{
@@ -884,8 +886,28 @@ class DC_Table extends \DataContainer implements \listable, \editable
}
}
+ // Trigger the save_callback
+ if (is_array($GLOBALS['TL_DCA'][$this->strTable]['fields'][$k]['save_callback']))
+ {
+ foreach ($GLOBALS['TL_DCA'][$this->strTable]['fields'][$k]['save_callback'] as $callback)
+ {
+ if (is_array($callback))
+ {
+ $this->import($callback[0]);
+ $v = $this->$callback[0]->$callback[1]($v, $this);
+ }
+ elseif (is_callable($callback))
+ {
+ $v = $callback($v, $this);
+ }
+ }
+ }
+
// Set fields (except password fields)
$this->set[$k] = ($GLOBALS['TL_DCA'][$this->strTable]['fields'][$k]['inputType'] == 'password' ? '' : $v);
+
+ // Adjust the active record (required in the save_callback)
+ $this->objActiveRecord->$k = $this->set[$k];
}
}
@@ -1057,15 +1079,17 @@ class DC_Table extends \DataContainer implements \listable, \editable
->execute($id);
}
- foreach ($objCTable->fetchAllAssoc() as $row)
+ while ($objCTable->next())
{
// Exclude the duplicated record itself
- if ($v == $table && $row['id'] == $parentId)
+ if ($v == $table && $objCTable->id == $parentId)
{
continue;
}
- foreach ($row as $kk=>$vv)
+ // Overwrite the ID
+ $this->objActiveRecord = (object) $objCTable->row();
+ $this->objActiveRecord->id = $insertID;
+
+ foreach ($objCTable->row() as $kk=>$vv)
{
if ($kk == 'id')
{
@@ -1090,11 +1114,31 @@ class DC_Table extends \DataContainer implements \listable, \editable
}
}
- $copy[$v][$row['id']][$kk] = $vv;
+ // Trigger the save_callback
+ if (is_array($GLOBALS['TL_DCA'][$v]['fields'][$kk]['save_callback']))
+ {
+ foreach ($GLOBALS['TL_DCA'][$v]['fields'][$kk]['save_callback'] as $callback)
+ {
+ if (is_array($callback))
+ {
+ $this->import($callback[0]);
+ $vv = $this->$callback[0]->$callback[1]($vv, $this);
+ }
+ elseif (is_callable($callback))
+ {
+ $vv = $callback($vv, $this);
+ }
+ }
+ }
+
+ $copy[$v][$objCTable->id][$kk] = $vv;
+
+ // Adjust the active record (required in the save_callback)
+ $this->objActiveRecord->$kk = $vv;
}
- $copy[$v][$row['id']]['pid'] = $insertID;
- $copy[$v][$row['id']]['tstamp'] = $time;
+ $copy[$v][$objCTable->id]['pid'] = $insertID;
+ $copy[$v][$objCTable->id]['tstamp'] = $time;
}
}
}
Es löst das Problem aber nicht wirklich, weil z.B. die Aliase der kopierten Unterseiten nicht korrekt generiert werden. Das liegt unter anderem daran, dass $dc->id
nach wie vor auf den eigentlich kopierten Datensatz zeigt, und selbst wenn man das anpasst wird das Folder-URL-Prefix immer noch nicht richtig generiert.
@contao/developers Ne Idee wie man das Problem lösen könnte?
Welches Problem konkret?
Es löst das Problem aber nicht wirklich, weil z.B. die Aliase der kopierten Unterseiten nicht korrekt generiert werden. Das liegt unter anderem daran, dass $dc->id nach wie vor auf den eigentlich kopierten Datensatz zeigt, und selbst wenn man das anpasst wird das Folder-URL-Prefix immer noch nicht richtig generiert.
Wir müssten natürlich den kompletten activeRecord jeweils korrekt setzen. Dann muss es funktionieren, denn es funktioniert ja auch im normalen Kontext. Es scheint mir nur ziemlich aufwändig.
$dc->id
!== $dc->activeRecord->id
Das weiss ich. Aber man kann ja immer beide setzen. Bei Edit-Multiple scheint es ja auch zu funktionieren dass für jedes Feld das Alias korrekt generiert wird.