Contao-Camp 2024
Ergebnis 1 bis 4 von 4

Thema: Hook überschreiben

  1. #1
    Contao-Nutzer Avatar von dako314
    Registriert seit
    04.05.2013.
    Ort
    Mannheim
    Beiträge
    120

    Standard Hook überschreiben

    Hi zusammen,

    ich möchte einen bestimmten Hook eines Packages überschreiben. Im genauen geht es um diesen Hook hier, aber das spielt glaube ich keine Rolle:

    https://github.com/richardhj/contao-...tion/Hooks.php (checkBeforeAddToCollection)

    Dieser ist so konfiguriert:

    PHP-Code:
    $GLOBALS['ISO_HOOKS']['addProductToCollection'][] = [
        \
    Richardhj\Isotope\SimpleStockManagement\FrontendIntegration\Hooks::class,
        
    'checkBeforeAddToCollection',
    ]; 
    Kann ich einfach in der lokalen Anwendung diesen Hook überschreiben und meine eigene Klasse dazu schreiben? Gibt es dazu best practices oder ist das schon der richtige Ansatz?

    Danke,

    LG
    Daniel

  2. #2
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.061
    Partner-ID
    10107

    Standard

    PHP-Code:
    // contao/config.php
    $GLOBALS['ISO_HOOKS']['addProductToCollection'] = array_filter($GLOBALS['ISO_HOOKS']['addProductToCollection'], function($hook) {
        return \
    Richardhj\Isotope\SimpleStockManagement\FrontendIntegration\Hooks::class !== $hook[0] ?? '';
    });

    $GLOBALS['ISO_HOOKS']['addProductToCollection'][] = [/* your hook */]; 
    ungetestet

    Falls der andere Hook ein Service ist, könntest du ihn vielleicht auch decoraten.
    Geändert von Spooky (30.09.2021 um 08:05 Uhr)
    » sponsor me via GitHub or PayPal or Revolut

  3. #3
    Contao-Nutzer Avatar von dako314
    Registriert seit
    04.05.2013.
    Ort
    Mannheim
    Beiträge
    120

    Standard

    @Spooky: Danke, das hat funktioniert - hat nur ein Semikolon nach dem return gefehlt, jetzt sieht der erste Teil so aus:

    PHP-Code:
    $GLOBALS['ISO_HOOKS']['addProductToCollection'] = array_filter(
      
    $GLOBALS['ISO_HOOKS']['addProductToCollection'],
      function(
    $hook) {
        return \
    Richardhj\Isotope\SimpleStockManagement\FrontendIntegration\Hooks::class !== $hook[0] ?? '';
      }
    ); 

  4. #4
    Contao-Fan Avatar von markocupic
    Registriert seit
    06.12.2010.
    Ort
    Oberkirch (Schweiz)
    Beiträge
    660

    Standard

    Stand auch schon vor dem Problem. Eine Idee wäre es für die Zukunft, dass man Hooks von Anfang an so baut, dass sie deaktivierbar sind und dass es wie zum Standard wird.

    In der Export Table Erweiterung bin ich diesen Weg gegangen.

    https://github.com/markocupic/export...e-hook-steuern

    PHP-Code:
    // App/EventListener/ExportTable/FormatDateListener.php

    declare(strict_types=1);

    namespace 
    App\EventListener\ExportTable;

    use 
    Contao\CoreBundle\Framework\ContaoFramework;
    use 
    Contao\CoreBundle\ServiceAnnotation\Hook;
    use 
    Contao\Date;
    use 
    Markocupic\ExportTable\Config\Config;
    use 
    Markocupic\ExportTable\Listener\ContaoHooks\ExportTableFormatDateListener;

    /**
     * @Hook(MyCustomFormatDateListener::HOOK, priority=MyCustomFormatDateListener::PRIORITY)
     */
    class MyCustomFormatDateListener
    {
        public const 
    HOOK 'exportTable';
        public const 
    PRIORITY 100;
        
        public static 
    $disableHook false;
        private 
    $framework;

        public function 
    __construct(ContaoFramework $framework)
        {
            
    $this->framework $framework;
        }

        
    /**
         * @param $varValue
         *
         * @return mixed
         */
        
    public function __invoke(string $strFieldname$varValuestring $strTablename, array $arrDataRecord, array $arrDcaConfig $objConfig)
        {
            if (static::
    $disableHook) {
                return 
    false;
            }
            
            
    // Disable original Hook that is shipped with the export table extension.
            
    ExportTableFormatDateListener::$disableHook true;
            
            
    $dateAdapter $this->framework->getAdapter(Date::class);

            
    $dca $arrDca['fields'][$strFieldname] ?? null;

            if (
    $dca) {
                
    $strRgxp $dca['eval']['rgxp'];

                if (
    '' !== $varValue && $strRgxp && \in_array($strRgxp, ['date''datim''time'], true)) {
                    
    $dateFormat $dateAdapter->getFormatFromRgxp($strRgxp);
                    
    $varValue $dateAdapter->parse($dateFormat$varValue);
                }
            }

            return 
    $varValue;
        }

    Geändert von markocupic (09.10.2021 um 08:54 Uhr)
    Anfragen für bezahlten Support oder Extension-Programmierung via PN.

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •