Zum Inhalt springen

FlexForm Konfiguration leer in eigenem Page Type?

Erstellt am 5. August 2008 · 7 Antworten · letzte Antwort am 7. Januar 2019

Tags: Frage

SeveQ ·

Hi Leute,

ich hab für einen Ajax Request einer eigenen Extension folgendermaßen eine Response Page gebaut.

EXT:blubb/pi1/static/setup.txt:

includeLibs.blubbediblubb = EXT:blubb/pi1/class.tx_blubb_pi1.php

blubb_page >
blubb_page = PAGE
blubb_page {
	typeNum = 12345
	config {
		language = de
		locale_all = de_DE
		disableAllHeaderCode = 1
		sendNoCacheHeaders = 1
		metaCharset = utf-8
		no_cache = 1
		admPanel = 0
		xhtml_cleaning = 0
		additionalHeaders = Content-Type:text/plain;charset=utf-8
	}
	
	10 < plugin.tx_blubb_pi1
	10.userFunc = tx_blubb_pi1->getAjaxResponse
}

Das funktioniert soweit auch schon sehr gut. Bis auf eine Sache:

ich hab im Kontext dieser Seite aus irgendeinem Grund keine Werte aus der FlexForm Konfiguration zur Verfügung.

Ich lese die FlexForm Config in einer eigenen Funktion ein.

	function initFF()
	{
		$content = "";

		$this->pi_initPIflexForm();
		$this->lConf = array();
		$piFlexForm = $this->cObj->data['pi_flexform'];

		foreach($piFlexForm['data'] as $sheet => $data)
		{
			foreach( $data as $lang => $value )
			{
				foreach( $value as $key => $val )
				{
					$this->lConf[$key] = $this->pi_getFFvalue($piFlexForm, $key, $sheet);
				}
			}
		}
		
		return $content;
	}

Im Kontext der Hauptseite funktioniert das zu 100%. Im Kontext der Response Seite ist $this->cObj->data['pi_flexform']; nicht existent.

Wie kommt das? Und wie erreiche ich, daß auch im Kontext der Response Page die Konfiguration zur Verfügung steht?

Danke

Grüße,
Hendrik

SeveQ ·

Mir isses gerade wie Schuppen von den Augen gefallen:

weil es gar keine Konfiguration für diese Page gibt. Die vorgenommenen Einstellungen sind nicht für das Plugin global, sondern nur für ein spezifisches Contentitem gültig...

Oh man! #angry# #angry# #angry#

just2b ·

und damit du zugriff auf das TS hast, müsstest du noch den Parameter $conf übergeben, so wie in deinem plugin

georg

michelfontaine ·

Ich habe das gleiche Problem und die Schuppen sind bei mir noch auf den Augen. Was bedeutet denn

Die vorgenommenen Einstellungen sind nicht für das Plugin global, sondern nur für ein spezifisches Contentitem gültig

?

Warum steht $this->cObj->data['pi_flexform'] in meinem Plugin nur bei Pagetype 0 zur Verfügung (während andere Werte aus dem data-Array auch bei anderen Pagetypes zur Verfügung stehen)? Wo wird die Auswahl getroffen? Und wo muss ich $conf übergeben? Im TS oder wo? Bin leider aus Euren Aussagen nicht schlau geworden...

Viele Grüße
Mic

tylfaril ·

hi.

ich hab leider ein ähnliches, um nicht zu sagen identes problem.

ich hab auf meiner hauptseite einen datenbankzugriff der von einem paramter aus einer flexform abhängig ist.

mache ich dann einen ajax call kann die flexform nicht mehr initialisiert werden und meine abfrage geht in der datenbank ins leere.
mein typoscript für meine extension sieht so aus:

#AJAX call
ajaxCall = PAGE
    
ajaxCall {
  typeNum = 5001
  10 < plugin.tx_infproject_pi1
  10.pid_list >
  10.pid_list = 37
  config {
    disableAllHeaderCode = 1
    xhtml_cleaning = 0
    admPanel = 0
    debug = 0
    no_cache = 1
  }
}

jetzt soll die 37 aber aus der aktuellen $conf['pidList'] kommen.

bei meinem AjaxCall füge ich dann der URL "&type=5001" hinzu.

$.ajax({
		type: "POST",
		url: document.URL + '&type=5001',

mir ist leider nicht klar wie ich den Parameter $conf übergeben soll, so wie just2b meinte bzw wie ich die Konfiguration für mein Objekt mit der typeNum 5001 von meiner hauptseite übernehmen kann.

einen weiteren Lösungsansatz habe ich mit eID unternommen.
obwohl ich den noch nicht zum Laufen gebracht habe und daher nicht weiß ob mir auf diesem weg die $this->piVars bzw $conf erhalten bleibt.

bei meiner JS behandlung füge ich dann ein "&eID=ajaxCall" hinzu.

$.ajax({
		type: "POST",
		url: document.URL + '&eID=ajaxCall',

in meiner ext_localconf.php hab ich ebenfalls die Zeile

$GLOBALS ['TYPO3_CONF_VARS']['FE']['eID_include']['ajaxCall'] = 'EXT:inf_project/ajaxCall.php';

hinzugefügt.

jedoch gibt mein php script ajaxCall.php
(

<?php
echo "ajaxCall.php"; ?>

)
nichts zurück.

Hat jemand Erfahrungen gemacht?
Oder sogar eine Lösung?

Ich bräuchte nach dem Ajax Aufruf einen Zugriff auf die Daten in der FlexForm.

lg
Matthias

Shark1982 ·

Gibts es denn dafür jetzt eine Möglichkeit ? Stehe vor dem gleichen Problem.

Zitat:
und damit du zugriff auf das TS hast, müsstest du noch den Parameter $conf übergeben, so wie in deinem plugin

Wo genau muss ich den Parameter $conf übergeben in PHP oder TS steh auf dem Schlauch ?

tylfaril ·

also bei mir rufe ich einfach

$this->initPIflexForm();

auf
ich schätze das habe ich aus der tt_news:

$this->pi_initPIflexform();
		// Copy the flexform data to a new object
		$piFlexForm = $this->cObj->data['pi_flexform'];
		
		// Combine FlexForm and TS values
		if ($piFlexForm['data']) {
			foreach ($piFlexForm['data'] as $sheet => $data) {
				foreach ($data as $lang => $value) {
					foreach ($value as $key => $val) {
						$val = $this->pi_getFFvalue($piFlexForm, $key, $sheet);
						/* If value exists in Flexform, overwrite existing Typoscript value or create new array entry */
						if ($val != null) {
							$this->conf[$key] = $val;
						}
					}
				}
			}
		}

die flexform daten sind dann richtig gefüllt
wenn der ajaxCall richtig eingerichtet ist sollten die variablen normal befüllt sein und zur verfügung stehen.
oder war das nicht genau das problem?

bithostgmbh ·

Wir haben das so gelöst, dass wir bei der URL für den Ajax Request die ID des Content Elements mitgeben und dann in der Ajax Action die Flexform Konfiguration mit dem FlexformService laden.

URL erstellen im Controller:

$url = $this->uriBuilder->setTargetPageType(1234)->uriFor(
    'ajaxAction',
    [
        'contentUid' => (int) $this->configurationManager->getContentObject()->data['uid']
    ]
);

Controller Action:

class SomeController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController
{
    protected $flexFormService;
    protected $flexformSettings = [];

    public function injectFlexFormService(\TYPO3\CMS\Extbase\Service\FlexFormService $flexFormService): void
    {
        $this->flexFormService = $flexFormService;
    }

    public function initializeAction(): void
    {
        parent::initializeAction();

        if ($this->request->hasArgument('contentUid')) {
            $recordUid = (int) $this->request->getArgument('contentUid');
            $record = TYPO3\CMS\Backend\Utility\BackendUtility::getRecord('tt_content', $recordUid, 'pi_flexform');

            if (!empty($record['pi_flexform'])) {
                $this->flexformSettings = $this->flexFormService->convertFlexFormContentToArray($record['pi_flexform']);
            }
        }
    }

    public function ajaxAction(): void
    {
        //access $this->flexformSettings;
    }
}