Hauptmenü

Werkzeuge

Kategorien

Archiv

AbstractConditionViewHelper in TYPO3 11

Erstellt in Extension Entwicklung, TYPO3 am 3. September 2023 vom Daschmi

Ich habe mit TYPO3 einen „inArray“ ViewHelper verwendet, dieser sah in TYPO3 10 wie folgt aus:

class InArrayViewHelper extends \TYPO3Fluid\Fluid\Core\ViewHelper\AbstractConditionViewHelper {  
  
	public function initializeArguments() {  
  
		parent::initializeArguments();  
  
		$this->registerArgument('haystack', 'mixed', 'View helper haystack ', TRUE);  
		$this->registerArgument('needle', 'string', 'View helper needle', TRUE);  
  
	}  

	public function render() {  

		$needle = $this->arguments['needle'];  
		$haystack = $this->arguments['haystack'];  

		if (!is_array($haystack)) {  

			return $this->renderElseChild();  

		}  
	
		if (in_array($needle, $haystack)) {  
	
			return $this->renderThenChild();  
	
		} else {  
	
			return $this->renderElseChild();  
	
		}  

	}

}

Genutzt habe ich ihn zum Beispiel in einem EXT:news Template wie folgt:

<w:inArray haystack="{1:'4',2:'5',3:'6'}" needle="{settings.templateLayout}">  
	<f:then>
		<!-- Template Layout = 4 oder 5 oder 6 -->
	</f:then>	
	<f:else>
		<!-- Sonstiges Template Layout -->
	</f:else>
</w:inArray>

das funktioniert auch noch in TYPO3 11, allerdings nur bis man den Cache aktiviert und die Seite aus dem Cache geladen wird. Wenn man aber statt der render Methode die evaluateCondition Methode überschreibt funktioniert es.

class InArrayViewHelper extends \TYPO3Fluid\Fluid\Core\ViewHelper\AbstractConditionViewHelper {  
  
	public function initializeArguments() {  
  
		parent::initializeArguments();  
  
		$this->registerArgument('haystack', 'mixed', 'View helper haystack ', TRUE);  
		$this->registerArgument('needle', 'string', 'View helper needle', TRUE);  
  
	}  
  
	protected static function evaluateCondition($arguments = null): bool {  
  
		$needle = $arguments['needle'];  
		$haystack = $arguments['haystack'];  
		  
		if (!is_array($haystack)) {  
		  
			return false;  
		  
		}  
		  
		if (in_array($needle, $haystack)) {  
		  
			return true;  
		  
		} else {  
		  
			return false;  
		  
		}  
  
	}  
  
}

TYPO3 9 (9.5) page slug für manuell erstellte Seiten ermitteln und setzen

Erstellt in Extension Entwicklung, TYPO3 am 6. November 2018 vom Daschmi

Mit folgender Funktion kann für Seiten der zugehörige Page slug mittels TYPO3 Funktionen ermittelt und gesetzt werden.

public static function setPageSlug($uid) {

$fieldConfig = $GLOBALS['TCA']['pages']['columns']['slug']['config'];
$slugHelper = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Core\DataHandling\SlugHelper::class, 'pages', 'slug', $fieldConfig);

$connection = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Core\Database\ConnectionPool::class)->getConnectionForTable('pages');
$queryBuilder = $connection->createQueryBuilder();

$queryBuilder->getRestrictions()->removeAll()->add(\TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction::class));
$statement = $queryBuilder->select('*')->from('pages')->where(
$queryBuilder->expr()->eq('uid', $uid)
)->execute();

$record = $statement->fetch();

$slug = $slugHelper->generate($record, $record['pid']);

// Update
$queryBuilder = $connection->createQueryBuilder();
$queryBuilder->update('pages')->where(
$queryBuilder->expr()->eq('uid', $uid)
)->set('slug', $slug)->execute();

return $slug;

}

Media Dateien aus Seite mit Extbase auslesen

Erstellt in Extension Entwicklung, TYPO3 am 15. Februar 2015 vom Daschmi

Um die Elemente die unter „Media“ bei den Seiteneigenschaften gespeichert sind auszulesen kann folgende Methode in einem Repository verwendet werden:

public function getMediaFromPid($pid)
{

  $query = $this->createQuery();
  $query->getQuerySettings()->setReturnRawQueryResult(true);
  $query->statement("
    SELECT
      *
    FROM
      `sys_file_reference` AS REF, `sys_file` AS FILE
    WHERE
      REF.`tablenames` = ‚pages‘ AND
      REF.`fieldname` = ‚media‘ AND
      REF.pid = ? AND
      FILE.`uid` = REF.`uid_local`", array($pid));

  return $query->execute();

}

oder besser:

$fileRepository = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(‚TYPO3\\CMS\\Core\\Resource\\FileRepository‘);
$fileObjects = $fileRepository->findByRelation(‚pages‘, ‚media‘, $p[‚uid‘]);

Links in TYPO3 in einer Action im Controller generieren

Erstellt in Extension Entwicklung, TYPO3 am 12. Januar 2014 vom Daschmi

Um mit extbase Links in einem Controller zu generieren kann folgender Code verwendet werden:

$data[$k][‚detail_url‘] = $this
->controllerContext
->getUriBuilder()
->reset()
->setArguments(array(‚test‘ => ‚1‘))
->setTargetPageUid($this->settings[‚list_detail_pid‘])
->setCreateAbsoluteUri(true)
->buildFrontendUri(); 

Flexform mit Extbase und Fluid

Erstellt in Extension Entwicklung, TYPO3 am 2. Januar 2014 vom Daschmi

Möchte man sein TYPO3 Extbase Frontend Plugin mit Flexform konfigurieren, so muss in der ext_tables.php folgender Code verwendet werden:

$extensionName = t3lib_div::underscoredToUpperCamelCase($_EXTKEY);
$pluginSignature = strtolower($extensionName).’_frontend‘;
$TCA[‚tt_content‘][‚types‘][‚list‘][’subtypes_addlist‘][$pluginSignature] = ‚pi_flexform‘;
t3lib_extMgm::addPiFlexFormValue($pluginSignature, ‚FILE:EXT:‘.$_EXTKEY.’/Configuration/FlexForms/flexform_frontend.xml‘);

Die Flexformdatei muss dann unter /typo3conf/ext/{extensionkey}/Configuration/FlexForms/flexform_frontend.xml abgelegt werden und kann z.B. so aussehen:

<T3DataStructure>
<sheets>
<sDEF>
<ROOT>
<TCEforms>
<sheetTitle>List Ansicht</sheetTitle>
</TCEforms>
<type>array</type>
<el>
<settings.display_cols>
<TCEforms>
<exclude>1</exclude>
<label>Sichtbare Spalten</label>
<config>
<type>select</type>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0">Preis</numIndex>
<numIndex index="1">1</numIndex>
</numIndex>
<numIndex index="1" type="array">
<numIndex index="0">Marke</numIndex>
<numIndex index="1">2</numIndex>
</numIndex>
</items>
<maxitems>100</maxitems>
<size>5</size>
</config>
</TCEforms>
</settings.display_cols>
</el>
</ROOT>
</sDEF>
</sheets>
</T3DataStructure>

Wenn man die Felder im XML mit dem Prefix settings. versieht kann man im Controller einfach wie folgt zugreifen:

…
$this->cols = explode(‚,‘, $this->settings[‚display_cols‘]);
…