core icon indicating copy to clipboard operation
core copied to clipboard

Seiten kopieren: Seitenalias ist leer

Open mimamuxx opened this issue 11 years ago • 14 comments

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!

mimamuxx avatar Sep 30 '13 09:09 mimamuxx

Edit all -> Select each page you need -> generate Page Alias. Done.

Reproduceable with the online Demo ;)

Zeromax avatar Sep 30 '13 11:09 Zeromax

Das sollte nicht die Lösung sein, für ein Problem dem man auch so entgegenwirken könnte.

Thielo avatar Oct 03 '13 21:10 Thielo

Das Verhalten finde ich auch extrem nervig.

HellPat avatar Oct 04 '13 05:10 HellPat

@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?

leofeyer avatar Oct 14 '13 15:10 leofeyer

Könnte man nicht generell den save_callback aufrufen? Und bei doNotCopy halt mit leerem Wert?

aschempp avatar Oct 14 '13 19:10 aschempp

Ja, könnte man. Allerdings hängt der save_callback in diesem Fall von $dc->activeRecord ab.

leofeyer avatar Oct 15 '13 07:10 leofeyer

Du meinst dieser ist bei act=create nicht vorhanden?

aschempp avatar Oct 15 '13 17:10 aschempp

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.

leofeyer avatar Sep 17 '14 15:09 leofeyer

@contao/developers Ne Idee wie man das Problem lösen könnte?

leofeyer avatar Mar 20 '18 14:03 leofeyer

Welches Problem konkret?

aschempp avatar Mar 21 '18 13:03 aschempp

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.

leofeyer avatar Mar 21 '18 14:03 leofeyer

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.

aschempp avatar Mar 22 '18 03:03 aschempp

$dc->id !== $dc->activeRecord->id

leofeyer avatar Mar 22 '18 06:03 leofeyer

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.

aschempp avatar Mar 22 '18 08:03 aschempp