He creado una extensión Typo3 v9.5.26 personalizada utilizando la extensión Extension Builder.

Mi extensión reside en typo3conf / ext / xyz_sortitems y ordena los elementos.

Un artículo tiene los atributos itemid, nombre, fecha y monto.

Mi ext_localconf.php se ve así:

<?php  
if (!defined('TYPO3_MODE')) {  
    die ('Access denied.');  
}  
  
call_user_func(  
    function() {  
  
        \TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin(  
            'XYZ.XyzSortitems',  
            'Sortitems',  
  
            // cacheable actions  
            ['Sortitems' => 'sortbyname,sortbydate,sortbyamount,showsingleitem'],  
  
            // non-cacheable actions  
            ['Sortitems' => 'sortbyname,sortbydate,sortbyamount,showsingleitem']  
        );  
  
    }  
);

Mi controlador de vista reside en typo3conf / ext / xyz_sortitems / classes / Controller / SortitemsController.php y se ve así:

<?php  
  
namespace XYZ\XyzSortitems\Controller;  
  
class SortitemsController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController {  
  
    protected $sortitemsRepository = null;  
  
    public function injectSortitemsRepository(\XYZ\XyzSortitems\Domain\Repository\SortimtesRepository $sortitemsRepository) {  
        $this->sortitemsRepository = $sortitemsRepository;  
    }  
  
    public function sortbynameAction() {  
        // sorts items by name here...  
    }  
  
    public function sortbydateAction() {  
        // sorts items by date here...  
    }  
  
    public function sortbyamountAction() {  
        // sorts items by amount here...  
    }  
  
    public function showsingleitemAction() {  
        // displays a single item here...  
    }  
  
}

... y mi plantilla de vista (por ejemplo, para sortbydateAction) reside en ext / xyz_sortitems / Resources / Private / Templates / Sortbydate.html y genera enlaces a los elementos respectivos como este:

<html xmlns:f="http://typo3.org/ns/fluid/ViewHelpers">  
    <f:layout name="defaultLayout" />  
    <f:section name="sectionname">  
        <f:for each="{items}" as="item">  
  
            <!-- here the link to the single item page is generated -->  
            <f:link.action action="showsingleitem" pageUid="4321" arguments="{itemid: item.itemid}">  
  
        </f:for>  
    </f:section>  
</html>

Mi extensión funciona como se esperaba.

Ahora, cuando miro el front-end en una página que muestra una lista ordenada de elementos (por ejemplo, ordenados por fecha), el motor de plantilla Fluid genera los enlaces de los elementos en esta lista a las respectivas páginas de destino (cada una muestra un solo elemento) sobre esto:

http://example.com/item  
?tx_xzysortitems_sortitems%5Baction%5D=showsingleitem 
&tx_xzysortitems_sortitems%5Bcontroller%5D=Sortitems  
&tx_xzysortitems_sortitems%5Bitemid%5D=12345  
&cHash=38a2dd43d7b0c4997c3b0ff6d4430e55

En su lugar, necesito tener los enlaces a las páginas respectivas que muestren un solo elemento con este aspecto:

http://example.com/item/{itemid}/{name}  
(e.g. http://example.com/item/12345/ice-cream-on-toast)

Dado que RealURL se ha ido en Typo2 v9, obviamente necesito un Route Enhancer en typo3conf / ext / xyz_sortitems / config.yaml, leyendo el itemid y el nombre de la tabla de la extensión en la base de datos de Typo3 y colocando estos valores en las URL que apuntan a las páginas de un solo elemento .

Desafortunadamente, alrededor del 90% de todos los ejemplos de código que pude encontrar hacen referencia a la extensión "Noticias" basada en pi de Georg Ringer como ejemplo. Esta extensión es bastante especial (porque está basada en pi y por muchas otras razones) y la mera repetición de ejemplos sobre esta extensión no hace que el tema sea más comprensible para mí. El 10% restante de las instrucciones que pude encontrar, incluida la documentación oficial de Typo3 (actualmente here) proporcionan excelentes ejemplos, pero no mencionen qué valor proviene de dónde.

Estoy principalmente interesado en la parte superior de config.yaml:

  routeEnhancers:  
    {SecondLine}:  
      type: {typedefinition}  
      extension: {extensionname}  
      plugin: {pluginname}  
      namespace: {namespace}  
      limitToPages:  
        - {a_page_id}  
        - {another_page_id}  
      routes:  
      # routes here...

¿Cuáles de estos valores necesito y de dónde los obtengo exactamente?

Las instrucciones que he encontrado hasta ahora generalmente no explican estos valores en absoluto o se refieren a ellos con "tome estos valores de su ext_localconf.php". Esto no me ayuda mucho, ya que no explica qué valor en config.yaml corresponde con qué valor en ext_localconf.php y si la sintaxis del valor respectivo debe ser minúscula, la primera letra en mayúscula y el resto en minúscula o camel, si necesita estar entre comillas simples o dobles, escapado, puede contener espacios, necesita guiones bajos o cualquier otra cosa que la sintaxis requiera para ser válida. Términos como "nombre de extensión" pueden ser engañosos, ya que en mi ejemplo podrían ser "sortitems", "xyz_sortitems", "XYZ.Sortitems", "XyzSortitems" o "Sortitems", solo por nombrar algunos.

Agradecería una respuesta con un ejemplo de código config.yaml que explique estos valores en detalle, de forma genérica , para que todos los que lean esta pregunta y tengan el mismo problema entendiendo los manuales como yo puedan aplicar esto conocimientos valiosos a su propia extensión personalizada Typo3 fácilmente.

0
Tobse 7 may. 2021 a las 11:24

1 respuesta

La mejor respuesta

Según su pregunta, estas son las explicaciones de los valores.

routeEnhancers:  
    {SecondLine}:  
      type: {typedefinition}  
      extension: {extensionname}  
      plugin: {pluginname}  
      namespace: {namespace}  
      limitToPages:  
        - {a_page_id}  
        - {another_page_id}  
      routes:  
      # routes here...

Valor de {Second Line}

Ejemplo: XzySortitemsShow

Nombre único para los potenciadores, utilizado internamente para referenciar. Encontrado en documento principal.

Valor de {typedefinition}

Ejemplo: Extbase

TYPO3 viene con los siguientes mejoradores de ruta listos para usar:

  • Potenciador simple (tipo potenciador "Simple")
  • Mejorador de complementos (tipo de mejorador "Complemento")
  • Extbase Plugin Enhancer (tipo de potenciador "Extbase")

Más tipos se describen en documentos principales.

Valor de {extensionname}

Ejemplo: XyzSortitems

UpperCamelCase del nombre de la extensión (el nombre de la carpeta de su extensión)

Fuente: typo3_src-10.4.14 / sysext / extbase / Classes / Utility / ExtensionUtility.php

Los parámetros de función de configurePlugin () son

public static function configurePlugin(
    $extensionName, 
    $pluginName, 
    array $controllerActions, 
    array $nonCacheableControllerActions = [], 
    $pluginType = self::PLUGIN_TYPE_PLUGIN)

Comentario del código de configurePlugin () * @param string $ extensionName El nombre de la extensión (en UpperCamelCase) o la clave de la extensión (en lower_underscore)

Valor de {pluginname}

Ejemplo: Sortitems

Fuente: typo3_src-10.4.14 / sysext / extbase / Classes / Utility / ExtensionUtility.php

Los parámetros de función de configurePlugin () son

public static function configurePlugin(
    $extensionName, 
    $pluginName, 
    array $controllerActions, 
    array $nonCacheableControllerActions = [], 
    $pluginType = self::PLUGIN_TYPE_PLUGIN)

Comentario del código de configurePlugin ()

* @param string $pluginName must be a unique id 
      for your plugin in UpperCamelCase 
      (the string length of the extension key 
      added to the length of the plugin name 
      should be less than 32!)

{espacio de nombres}

Es una alternativa para escribir extbase.

Se puede encontrar un ejemplo aquí en el documento principal y el potenciador del complemento se describe aquí en el documento principal.

Para Extbase Plugin Enhancer, también es posible configurar el espacio de nombres directamente omitiendo la extensión y las propiedades del complemento y simplemente usando la propiedad del espacio de nombres como en el Plugin Enhancer normal.

Fuera de tema : EXT de Georg Ringer: ¡las noticias no se basan en pi!

1
Heinz Schilling 9 may. 2021 a las 12:21