Zum Inhalt springen

Inhaltselemente von anderer Seite ausgeben

Erstellt am 21. Juni 2010 · 7 Antworten · letzte Antwort am 5. August 2010

Tags: Inhaltselemente, Frage

Unbekannter Benutzer ·

Hallo zusammen

Ich entwickle im Moment eine Extension und stehe vor folgendem Problem.
Ich habe Seite A. In dieser Seite ist ein Text-mit-Bild Element enthalten.
Zusätzlich habe ich Seite B in der meine Extension eingebunden ist.
Ist es nun möglich in meiner Extension-Klasse den Inhalt von Seite A auszulesen und in diesen auf Seite B auszugeben?

Normalerweise würde ich das mit file_get_contents machen und anschliessend das rausfiltern was ich benötige.

Besten Dank und Gruss
Reeko

sunixzs ·

Du kannst in deiner Extension die UID vom Content holen der anderen Seite holen und dann rendern lassen:

$where = "pid = '".$pid."'" . $this->cObj->enabledFields( "tt_content" );
$order = "sorting";

$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', 'tt_content', $where, "", $sorting);
		
while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)){
 $contentConf = Array(
  'tables' => 'tt_content',
  'source' => $row['uid'],
  'dontCheckPid' => 1
 );
 $content .= $this->cObj->RECORDS($contentConf);
}

(Bei der Reihenfolge der Parameter bei exec_SELECTquery() bin ich mir gerade nicht sicher - steht aber in der Doku.)

sunixzs ·

Kleiner Tipp noch...

Das Plugin könnte auf der selben Seite sein wie der Inhalt, der geholt werden soll.

Dann würde es eine Endlosschleife geben, weil das Plugin sich immer wieder selbst ausgibt!

Da müsste noch so etwas rein:

if ($GLOBALS['TSFE']->id == $pid) return "ERROR: Selbstaufruf."
Unbekannter Benutzer ·

Hallo sunixzs
Funktioniert einwandfrei:

$foreignPid = 6;
if ($GLOBALS['TSFE']->id == $foreignPid) {
	return "ERROR: Selbstaufruf.";
}
$res_foreignContent = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', 'tt_content', 'pid='.$foreignPid);
$foreignContent = '';
while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res_foreignContent)){
	$fc = array(
		'tables' => 'tt_content',
		'source' => $row['uid'],
		'dontCheckPid' => 1
	);
	$foreignContent .= $this->cObj->RECORDS($fc);
}
return $foreignContent;
$GLOBALS['TYPO3_DB']->sql_free_result($res_foreignContent);

Besten Dank und Gruss
Reeko

adi770 ·

Hallo Miteinander,

Ich habe genau den gleichen Code in meiner Extension verwendet. Komischerweise wir immer nur der Header des Inhaltselements (aus tt_content) das ich auslesen möchte angezeigt.
Hab nun schon Stunden verbracht mit diesem Problem und bin völlig ratlos.
Mit der extension lese ich per ajax-Call Inhaltselemente aus tt_content aus und will sie im FE ausgeben.

<?php
if (!defined ('PATH_typo3conf')) die ('Could not access this script directly!');

require_once(PATH_tslib.'class.tslib_pibase.php');

class scalerprocess extends tslib_pibase {
    function main() {
        # Instanz Zugriff auf typo3 Funktionen
        $this->cObj = t3lib_div::makeInstance('tslib_cObj');
        # Datenbank Verbindung
        tslib_eidtools::connectDB();

        # Zugriff auf Bildfunktionen etc. ermöglichen (cobj existiert nicht bei ajax abfragen.)
        # Siehe: http://www.typo3.net/forum/list/list_post//97311/?tx_mmforum_pi1[page]=#pid354391
        $TSFEclassName = t3lib_div::makeInstanceClassName('tslib_fe');
        $id = isset($HTTP_GET_VARS['id']) ? $HTTP_GET_VARS['id'] : 0;
        $GLOBALS['TSFE'] = new $TSFEclassName($TYPO3_CONF_VARS, $id, '0', 1, '', '', '', '');
        $GLOBALS['TSFE']->connectToMySQL();
        $GLOBALS['TSFE']->fe_user = tslib_eidtools::initFeUser();
        $GLOBALS['TSFE']->fetch_the_id();
        $GLOBALS['TSFE']->getPageAndRootline();
        $GLOBALS['TSFE']->initTemplate();
        $GLOBALS['TSFE']->tmpl->getFileName_backPath = PATH_site;
        $GLOBALS['TSFE']->forceTemplateParsing = 1;
        $GLOBALS['TSFE']->getConfigArray();
        $GLOBALS['TSFE']->set_no_cache();

        
        #Debug###
        $GLOBALS['TYPO3_DB']->debugOutput = true;
        $GLOBALS['TYPO3_DB']->store_lastBuiltQuery = true;



        if ($GLOBALS['TSFE']->id == $GLOBALS["_GET"]["id"]) {
            echo "ERROR: Selbstaufruf.";
        }

        $res_content = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', 'tt_content', 'pid='.$GLOBALS["_GET"]["id"]);
        $content = '';

        while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res_content)) {
            $fc = array(
                    'tables' => 'tt_content',
                    'source' => $row['uid'],
                    'dontCheckPid' => 1,
            );
            $content .= $this->cObj->RECORDS($fc);
        }
        $GLOBALS['TYPO3_DB']->sql_free_result($res_content);

        echo $content;

        //echo t3lib_div::debug($content);
        //echo $GLOBALS['TYPO3_DB']->debug_lastBuiltQuery;
        //return "<pre>test:". print_r($GLOBALS["_GET"]). "</pre>";
    }
}
$output = t3lib_div::makeInstance('scalerprocess');
$output->main();

?>

Wär super wenn mir jemand einen Tipp geben könnte.
Gruss adi

sunixzs ·

Hallo Adi,

für ajax benutze ich meistens Stanislas Rolland's Weg aus der sr_freecap-Extension:

<?php
/***************************************************************
*  Copyright notice
*
*  (c) 2005-2009 Stanislas Rolland <typo3(arobas)sjbr.ca>
*  All rights reserved
*
*  This script is part of the Typo3 project. The Typo3 project is
*  free software; you can redistribute it and/or modify
*  it under the terms of the GNU General Public License as published by
*  the Free Software Foundation; either version 2 of the License, or
*  (at your option) any later version.
*
*  The GNU General Public License can be found at
*  http://www.gnu.org/copyleft/gpl.html.
*
*  This script is distributed in the hope that it will be useful,
*  but WITHOUT ANY WARRANTY; without even the implied warranty of
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*  GNU General Public License for more details.
*
*  This copyright notice MUST APPEAR in all copies of the script!
***************************************************************/
/**
* This script invokes the freecap CAPTCHA image generation
*
*/
require_once(t3lib_extMgm::extPath('sr_freecap').'pi1/class.tx_srfreecap_pi1.php');
if (t3lib_div::int_from_ver($GLOBALS['TYPO_VERSION']) < 4003000) {
	require_once(PATH_tslib.'class.tslib_fe.php');
	require_once(PATH_t3lib.'class.t3lib_userauth.php');
	require_once(PATH_tslib.'class.tslib_feuserauth.php');
	require_once(PATH_t3lib.'class.t3lib_tstemplate.php');
	require_once(PATH_t3lib.'class.t3lib_page.php');
	require_once(PATH_tslib.'class.tslib_content.php');
}

// ***********************************
// Creating a $TSFE object
// ***********************************
$TSFEclassName = t3lib_div::makeInstanceClassName('tslib_fe');
$id = t3lib_div::_GET('id');
if (!isset($id)) $id = 0;
$id = htmlspecialchars($id);
$GLOBALS['TSFE'] = new $TSFEclassName($TYPO3_CONF_VARS, $id, '0', 1, '', '','','');
$GLOBALS['TSFE']->connectToDB();
$GLOBALS['TSFE']->initFEuser();
$GLOBALS['TSFE']->determineId();
// *******************************************
// Get compressed $TCA-Array();
// After this, we should now have a valid $TCA, though minimized
// *******************************************
$GLOBALS['TSFE']->getCompressedTCarray();
$GLOBALS['TSFE']->initTemplate();
$GLOBALS['TSFE']->tmpl->getFileName_backPath = PATH_site;

// ******************************************************
// Get config if not already gotten
// After this, we should have a valid config-array ready
// ******************************************************
$GLOBALS['TSFE']->getConfigArray();

// *******************************************
// Setting language and locale
// *******************************************
$GLOBALS['TT']->push('Setting language and locale','');
	$GLOBALS['TSFE']->settingLanguage();
	$GLOBALS['TSFE']->settingLocale();
$GLOBALS['TT']->pull();

// *******************************************
// Invoke the freecap plugin
// *******************************************
$freecap = t3lib_div::makeInstance('tx_srfreecap_pi1');
$freecap->cObj = t3lib_div::makeInstance('tslib_cObj');
$conf = $GLOBALS['TSFE']->tmpl->setup['plugin.'][$freecap->prefixId.'.'];
$freecap->main($conf);
?>

Hier ist z. B. eine Abweichung bei ...

$GLOBALS['TSFE']->fe_user = tslib_eidtools::initFeUser();

Er schreibt ...

$GLOBALS['TSFE']->initFEuser();

Ich habe keine Ahnung, ob das was mit deinem Problem zu tun hat - mit dieser Implementierung kann ich typo3 mit ajax so verwenden, als ob es gar kein ajax wäre - ähm - weißt bestimmt was ich meine - es funktioniert so, als wenn es ein normaler Aufruf der Extension wäre.

"Die Header werden ausgegeben", hm, dann sollten die Daten doch da sein - $this->cObj->RECORDS() sollte demnach laufen.

Wie testest du den Return vom ajax? Vllt. wird clientseitig ja fälschlicherweise nur der Header ausgegeben? Bringt ein Aufruf ohne ajax das gleiche Ergebnis (denke mal mit index.php?eID=tx_ext_)?

$GLOBALS['TSFE'] wird mit $HTTP_GET_VARS['id'] erzeugt - ist das nicht das Gleiche wie $GLOBALS["_GET"]["id"] ? Bzw. bei mir existiert $HTTP_GET_VARS garnicht. (vllt. t3lib_div::_GET('id') verwenden?)

Sorry, antworten habe ich keine - vllt. aber Anregungen, wo man weiter schauen könnte.

Wünsche einen erfolgreichen Tag

sunixzs

adi770 ·

Hallo sunixzs,

Vielen Dank für deine Inputs.
Ich habe nun auch die Implementierung von sr_freecap übernommen. Leider wieder mit dem gleichen Resultat. Es wird nur der Header einer Seite angezeigt.

<!--  CONTENT ELEMENT, uid:5/textpic [begin] -->
		<div id="c5" class="csc-default" >
		<!--  Header: [begin] -->
			<div class="csc-header csc-header-n1"><h3 class="csc-firstHeader"><span class="firstHeaderBg">Referenzen</span></h3></div>
		<!--  Header: [end] -->
			</div>
	<!--  CONTENT ELEMENT, uid:5/textpic [end] -->

Wenn einen direkten Aufruf mache (index.php?eID=ajaxContents&id=4) wird auch nur der Header angezeigt. Ich habe langsam das Gefühl, dass die Ausgabe der ganzen Seite durch typo3 aus Sicherheitsgründen verhindert oder blockiert wird. #angry#

Irgendwo habe ich gelesen, dass der Aufruf mit $this->cObj->RECORDS nur funktioniert wenn die aufzurufende Seite nicht gecached ist. Auch das hab ich getestet und keine Veränderung festgestellt.

Ich werde als nächstes mal diese xajax Extension anschauen.

Vielen Dank nochmals für deine Tipps.

Gruss Adi