Hi zusammen,
ich hab ne FE-Extension geschrieben, mit der ich einen Seitenbaum kopieren möchte. Also die Seite soll aufgerufen werden und das Script ausgeführt werden, das funktioniert auch alles (FE-User hat auch BE-Rechte).
Problem ist nur, ich krieg immer folgenden Fehler, für jede kopierte Seite einmal:
Warning: Invalid argument supplied for foreach() in C:\Programme\TYPO3_4.1.2\htdocs\Testsite\t3lib\class.t3lib_refindex.php on line 240
(Also ich arbeite mom auf einer lokalen Testsite mit Winstaller, bevor ich das in unser Projekt einfüge)
Problem ist außerdem, dass die kopierten Seiten alle keinen Titel mehr haben.
Vielleicht kann mir jemand helfen?
Das ist der Code in der Extension:
<?php
require_once(PATH_tslib.'class.tslib_pibase.php');
/**
* Plugin 'Make ' for the 'make' extension.
*
* @author <>
* @package TYPO3
* @subpackage tx_make
*/
class tx_make_pi1 extends tslib_pibase {
var $prefixId = 'tx_make_pi1'; // Same as class name
var $scriptRelPath = 'pi1/class.tx_make_pi1.php'; // Path to this script relative to the extension dir.
var $extKey = 'make'; // The extension key.
var $pi_checkCHash = true;
/**
* The main method of the PlugIn
*
* @param string $content: The PlugIn content
* @param array $conf: The PlugIn configuration
* @return The content that is displayed on the website
*/
function main($content,$conf) {
$this->conf=$conf;
$this->pi_setPiVarDefaults();
$this->pi_loadLL();
require_once (PATH_t3lib."class.t3lib_tcemain.php");
$cmd = array();
$cmd['pages'][390]['copy'] = -390; //Copies page id=390 to the position after page 390
$tce = t3lib_div::makeInstance('t3lib_TCEmain');
$tce->stripslashes_values = 0;
$tce->copyTree = 3;
$tce->start(array(),$cmd);
$tce->process_cmdmap();
t3lib_BEfunc::getSetUpdateSignal('updatePageTree');
$tce->clear_cacheCmd('pages');
$content='<div class="content_make_university">YOOO is drin</div>';
// Now only set the page title of the root page
return $this->pi_wrapInBaseClass($content);
}
}
if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/make/pi1/class.tx_make_pi1.php']) {
include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/make/pi1/class.tx_makeuniversity_pi1.php']);
}
?>
Viele Grüße, Benni
Du weißt aber, dass schon mit Typo3 direkt funktioniert?
Ja, das weiß ich!
Wir brauchen das in Kombination mit einem Frontend Formular.
Vielleicht hat da ja jemand ne Idee oder Code wo ich mal drüber schauen dürfte?
Kannst du den Datensatz nicht erstmal per SQL dublizieren?
Hallo Cezar,
konntest du das Problem mittlerweile lösen?
Ich hänge genau an der selben Stelle und habe wie du auf Code aus der Extension freesite zurückgegriffen.
Ich finde die Stelle nicht, wo die Funktion generateRefIndexData() aufgerufen wird. Evtl fehlt ja da noch ein Variablen-Wert.
Grüße
Jehu
Also ich komme nicht weiter.
Wie hier zu lesen ist, wäre es nicht nötig, einen BE_USER beim $tce->start() mit anzugeben. Wenn ich den BE_USER jedoch weg lasse, bekomme ich eine Fehlermeldung:
Warning: Variable passed to each() is not an array or object in /home/marco/www/typo3_src-4.1.2/t3lib/class.t3lib_tcemain.php on line 4734
Fatal error: Call to a member function writelog() on a non-object in /home/marco/www/typo3_src-4.1.2/t3lib/class.t3lib_tcemain.php on line 6243
Hier die quasi unverändtere Funktion der freesite-Extension (ich greife lediglich auf die Variablen aus dem TS meiner Extension zurück).
Allerdings soll diese Funktion in meinem Fall im Frontend ausgeführt werden:
function copyDummyPages($src_uid,$new_BE_USER) {
if (!$this->conf["testingOnly"]) {
$tce = t3lib_div::makeInstance("t3lib_TCEmain");
$new_BE_USER->user["admin"]=1;
// Set to number of page-levels to copy
$tce->copyTree=2;
$tce->neverHideAtCopy=1;
// Making copy-command
$cmd = array();
$cmd["pages"][$src_uid]["copy"] = $this->conf["pid_newsite"];
$tce->stripslashes_values=0;
$tce->start(array(),$cmd,$new_BE_USER);
$tce->process_cmdmap();
debug($tce,'tce nach dem kopieren');
// Unsetting the user.
unset($new_BE_USER);
// Getting the new root page id.
$root_page_pid = $tce->copyMappingArray["pages"][$src_uid];
return $root_page_pid;
} else {
debug("COPY page structure: pid=".$src_uid,1);
return 99999;
}
}
Die Seiten werden samt Content kopiert. Allerdings ohne Seitentitel.
Fehlermeldung im FE:
Warning: Invalid argument supplied for foreach() in /home/marco/www/typo3_src-4.1.2/t3lib/class.t3lib_refindex.php on line 240
Warning: Invalid argument supplied for foreach() in /home/marco/www/typo3_src-4.1.2/t3lib/class.t3lib_refindex.php on line 240
Warning: Invalid argument supplied for foreach() in /home/marco/www/typo3_src-4.1.2/t3lib/class.t3lib_refindex.php on line 240
Warning: Invalid argument supplied for foreach() in /home/marco/www/typo3_src-4.1.2/t3lib/class.t3lib_refindex.php on line 240
Im BE-Log steht:
Record 'TEST' (tt_content:377) was inserted on page '' (567) (msg#1.1.10)
Record '' (pages:567) was inserted on page '' (564) (msg#1.1.10)
Record '' (pages:566) was inserted on page '' (564) (msg#1.1.10)
Record '' (pages:565) was inserted on page '' (564) (msg#1.1.10)
Record '' (pages:564) was inserted on page 'blubber-Sites' (86) (msg#1.1.10)
Hat jemand eine Idee, warum der keine Seitentitel kopiert?
Freesite im Backend hat damit keine Probleme.
Grüße
Jehu #angry#
Übrigends: Wenn ich als Admin im BE eingeloggt bin, funktioniert es problemlos (wie in dem oben verlinkten Beitrag erwähnt).
Das bedeutet, $new_BE_USER ist wohl kein korrekt angelegter Admin, trotz "$new_BE_USER->user["admin"]=1;"
Hilfe. 😢
So, ich habe die Ursache des Problems noch immer nicht gefunden. Daher hier ein Würg-Around um die fehlenden Seitentitel nachträglich zu setzen:
// FIX: Seitentitel werden aus irgend einem Grund nicht kopiert
// Deshalb Titel abfragen und in neuen Seiten updaten...
$z = 0;
foreach ($tce->copyMappingArray["pages"] as $k => $v) {
// Erstes Element überspringen (das ist die neue root-Page)
if($z!=0) {
// Seitentitel auslesen
$titleRes = $GLOBALS['TYPO3_DB']->exec_SELECTquery('title','pages','uid='.$k);
$title = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($titleRes);
// Seitentitel der neuen Unterseiten updaten
$GLOBALS['TYPO3_DB']->exec_UPDATEquery('pages','uid='.$v,array('title'=>$title['title']));
}
$z++;
}
Dummer weise habe ich offenbar jetzt noch ein ganz anderes Problem.
Das kopieren funktioniert nur, wenn ich den kompletten Cache vorher im Backend lösche und auch dann nicht immer. 🙁
Gruß
Jehu
@Cezar:
Was mich wundert: Warum bekommst du bei $tce->start(array(),$cmd); keinen Fehler, da fehlt doch das 3. Argument (BE-User).
Im Log steht beim fehlgeschlagenen Kopier-Versuch:
"Versuch einen Datensatz auf Seite 'Blubber-Sites' (86) einzufügen, wo diese Tabelle, pages, nicht erlaubt ist (msg#1.1.11)".
MIST
Das Problem wurde gelöst, aber allerdings nur als Backend User...
Na gut. habe nun zu einer Notlösung gegriffen: simulatebe
Ich initialisieren dann in meiner Extension manuell eine simulatebe-Session und beende sie nach dem kopieren des Seitenbaums wieder. Fertig. Klappt wunderbar.