Contao-Camp 2024
Ergebnis 1 bis 14 von 14

Thema: Funktion eines Cronjobs Manuell ausführen

  1. #1
    Contao-Fan
    Registriert seit
    16.01.2012.
    Beiträge
    418

    Standard Funktion eines Cronjobs Manuell ausführen

    Guten Tag,

    gibt es eine Möglichkeit die Function eines Cronjobs Manuell zB beim Aufruf einer Seite auzuführen? In manchen wenigen Fällen müsste die Funktion sofort ausgeführt werden (vorzeitige Abreise eines Gastes usw)


    config.php =>
    PHP-Code:
    $GLOBALS['TL_CRON']['hourly'][]  = array('bbOrderCronHourly''bborderhourly'); 

    bbOrderCronHourly.php =>
    PHP-Code:
    class bbOrderCronHourly extends Frontend 
     
    {

        public function 
    bborderhourly()
        {

    // Do Something 

             
    }

    Vielen Dank.
    Geändert von Nacht69 (26.03.2024 um 16:33 Uhr)

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

    Standard

    Die Funktion sollte dann in einen separaten Service ausgelagert werden und dann injected sich der Cronjob diesen Service zur Ausführung - und anderswo nutzt du dann diesen Service auch dementsprechend.
    » sponsor me via GitHub or PayPal or Revolut

  3. #3
    Contao-Fan
    Registriert seit
    16.01.2012.
    Beiträge
    418

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Die Funktion sollte dann in einen separaten Service ausgelagert werden und dann injected sich der Cronjob diesen Service zur Ausführung - und anderswo nutzt du dann diesen Service auch dementsprechend.
    Guten Tag,

    bin nun endlich dazu gekommen mir das Thema anzusehen

    ich scheitere jedoch das ganze in ein Content Element oder Frontend Modul zu "injecten"

    Bei Cronjobs klappt es bereits. Beim Content Element überhaupt nicht... hab einiges getestet, genau wissen was ich tu, tu ich aber noch nicht....


    PHP-Code:
    # src/MeinBundle/Resources/config/services.yaml
    services:
      
    _defaults:
        
    autowiretrue
        autoconfigure
    true


      
    # Definition von test.service.database_update_service
      
    test.service.database_update_service:
        class: 
    test\bbPWBxml\Service\DatabaseUpdateService
        arguments
    :
          - 
    '@contao.framework'
          
    '@database_connection'
        
    public: false
      test
    \bbPWBxml\Cron\CronMinutely:
        
    arguments:
          - 
    '@test.service.database_update_service'
        
    tags:
          - { 
    namecontao.cronjobmethod'__invoke'intervalminutely }

      
    test\bbPWBxml\Cron\CronHourly:
        
    arguments:
          - 
    '@test.service.database_update_service'
        
    tags:
          - { 
    namecontao.cronjobmethod'__invoke'intervalhourly }

      
    test\bbPWBxml\Cron\CronDaily:
        
    arguments:
          - 
    '@test.service.database_update_service'
        
    tags:
          - { 
    namecontao.cronjobmethod'__invoke'intervaldaily }


      
    test\bbPWBxml\Module\PWBXmlUpdate:
       
    arguments: ['@contao.framework''main'# Falls notwendig
        
    tags:
          - { 
    name'contao.content_element'category'includes'template'mod_pwbxmlloader' }
        
    calls:
          - [
    setDatabaseUpdateService, ['@test.service.database_update_service']] 

    das ContentElement:




    PHP-Code:
    <?php 

    namespace test\bbPWBxml\Module;

    use 
    test\bbPWBxml\Service\DatabaseUpdateService;
    use 
    Contao\Module;
    use 
    Contao\Model;

    class 
    PWBXmlUpdate extends Module
    {
        
    /**
         * @var DatabaseUpdateService
         */
        
    private $databaseUpdateService;

        public function 
    __construct(Model $model$column 'main')
        {
            
    parent::__construct($model$column);
        }

        
    /**
         * Setter-Methode für DatabaseUpdateService
         */
        
    public function setDatabaseUpdateService(DatabaseUpdateService $databaseUpdateService)
        {
            
    $this->databaseUpdateService $databaseUpdateService;
        }

        protected function 
    compile()
        {
            
            
            echo 
    'test';
            
    // Verwendung des DatabaseUpdateService

                 
    $this->databaseUpdateService->updateMediaTimestamp();
     

           
        }
    }
    PS: Mittlerweile 4.13

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

    Standard

    Das ist kein Content Element sondern ein Frontend Module. Außerdem extendest von Contao\Module - du solltest aber lieber moderne Controller verwenden, wie in der Dokumentation beschrieben: https://docs.contao.org/dev/framewor...t-end-modules/
    » sponsor me via GitHub or PayPal or Revolut

  5. #5
    Contao-Fan
    Registriert seit
    16.01.2012.
    Beiträge
    418

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Das ist kein Content Element sondern ein Frontend Module. Außerdem extendest von Contao\Module - du solltest aber lieber moderne Controller verwenden, wie in der Dokumentation beschrieben: https://docs.contao.org/dev/framewor...t-end-modules/
    In diesem Fall wäre es mir egal ob es ein Content Element (tl_content) oder ein Frontend Module (tl_module) ist. Jedoch haben wir einige "Module" die über beide wege zur verfügung stehen sollten. Deswegen muss ich gleich vorher fragen

    Beispiel alter config:
    Code:
     $GLOBALS['TL_CTE']['test'] = array
    (
    	'Test'				=> 'ModuleTest'
    );
    
    
    	$GLOBALS['FE_MOD']['test'] = array
    (
    	'Test'				=> 'ModuleTest'
    );
    Geht sowas heute noch und wenn ja was verwende ich dann statt "extends Module" - "AbstractFrontendModuleController" ?

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

    Standard

    Einfach so wie's in der verlinkten Dokumentation steht
    » sponsor me via GitHub or PayPal or Revolut

  7. #7
    Contao-Fan
    Registriert seit
    16.01.2012.
    Beiträge
    418

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Einfach so wie's in der verlinkten Dokumentation steht
    Die lese ich natürlich gerade bzw baue das so nach - ich meinte eher ob der Ansatz auch der richtige ist, wenn ich einen Code bzw eine Classe für beides verwenden will?

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

    Standard

    u.U. ist das möglich, wenn du nur vom AbstractFragmentController erbst und dich dann um einiges selbst kümmerst.
    » sponsor me via GitHub or PayPal or Revolut

  9. #9
    Contao-Fan
    Registriert seit
    16.01.2012.
    Beiträge
    418

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    u.U. ist das möglich, wenn du nur vom AbstractFragmentController erbst und dich dann um einiges selbst kümmerst.
    ok danke - habs nun so wie in der Doku zusammengebaut, und konnte nun auch template und module anlegen. Leider funktioniert der ansatz den Service zu injecten gar nicht - es kommt nicht mal eine Fehlermeldung.

    Gibts dazu auch eine Doku?

    Sachen die ich verstanden habe, sind logisch aber die ganze herangehensweise erst mal zu durchblicken ist schwer bzw viel arbeit. Kann ich den Service auch im Template aufrufen?

    PHP-Code:
    <?php 

    namespace test\bbPWBxml\Module;


    use 
    Contao\CoreBundle\Controller\FrontendModule\AbstractFrontendModuleController;
    use 
    Contao\ModuleModel;
    use 
    Contao\Template;
    use 
    Symfony\Component\HttpFoundation\Request;
    use 
    Symfony\Component\HttpFoundation\Response;
    use 
    test\bbPWBxml\Service\DatabaseUpdateService;


    class 
    PWBXmlUpdate extends AbstractFrontendModuleController
    {
       private 
    $databaseUpdateService;
             public function 
    setDatabaseUpdateService(DatabaseUpdateService $databaseUpdateService)
        {
            
    $this->databaseUpdateService $databaseUpdateService;
        }


        protected function 
    getResponse(Template $templateModuleModel $modelRequest $request): Response
        
    {
      
            return 
    $template->getResponse();
            
            echo 
    'test';
        
         
    $this->databaseUpdateService->updateMediaTimestamp();
        
        }
        
        
        
    // ???? // 
        
    protected function compile()
        {
            
            
            echo 
    'test';
            
    // Verwendung des DatabaseUpdateService

                
     
     
    $this->databaseUpdateService->updateMediaTimestamp();
           
        }
        

    }


    PHP-Code:
    # src/MeinBundle/Resources/config/services.yaml
    services:
      
    _defaults:
        
    autowiretrue
        autoconfigure
    true

    # Alias für DatabaseUpdateService
      
    test\bbPWBxml\Service\DatabaseUpdateService'@test.service.database_update_service'

      
    # Definition von test.service.database_update_service
      
    test.service.database_update_service:
        class: 
    test\bbPWBxml\Service\DatabaseUpdateService
        arguments
    :
          - 
    '@contao.framework'
          
    '@database_connection'
        
    public: false
      test
    \bbPWBxml\Cron\CronMinutely:
        
    arguments:
          - 
    '@test.service.database_update_service'
        
    tags:
          - { 
    namecontao.cronjobmethod'__invoke'intervalminutely }

      
    test\bbPWBxml\Cron\CronHourly:
        
    arguments:
          - 
    '@test.service.database_update_service'
        
    tags:
          - { 
    namecontao.cronjobmethod'__invoke'intervalhourly }

      
    test\bbPWBxml\Cron\CronDaily:
        
    arguments:
          - 
    '@test.service.database_update_service'
        
    tags:
          - { 
    namecontao.cronjobmethod'__invoke'intervaldaily }


      
    test\bbPWBxml\Module\PWBXmlUpdate:
            
    tags:
                -
                    
    namecontao.frontend_module
                    category
    miscellaneous
            calls
    :
                - [
    setDatabaseUpdateService, ['@test.service.database_update_service']] 

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

    Standard

    Du hast eine "setDatabaseUpdateService" Methode implementiert - hat es einen bestimmten Grund, dass du diesen Weg gewählt hast? Der "normale" Weg wäre DI über den Constructor.
    » sponsor me via GitHub or PayPal or Revolut

  11. #11
    Contao-Fan
    Registriert seit
    16.01.2012.
    Beiträge
    418

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Du hast eine "setDatabaseUpdateService" Methode implementiert - die lässt du aber nirgendwo aufrufen. Hat es einen bestimmten Grund, dass du diesen Weg gewählt hast? Der "normale" Weg wäre DI über den Constructor.
    Nein, keinen Grund.

    so:?

    Code:
      private $databaseUpdateService;
        public function __construct(DatabaseUpdateService $databaseUpdateService, $column = 'main')
        {
            $this->databaseUpdateService = $databaseUpdateService;
      
        }
    
     protected function getResponse(Template $template, ModuleModel $model, Request $request): Response
        {
      
            return $template->getResponse();
    		
    		echo 'test';
    	
    	 $this->databaseUpdateService->updateMediaTimestamp();
        
        }
    
        protected function compile()
        {
            
            
            echo 'test';
            // Verwendung des DatabaseUpdateService
    
                
     
     $this->databaseUpdateService->updateMediaTimestamp();
           
        }
    
    
    ####
    
    
      test\bbPWBxml\Module\PWBXmlUpdate:
            tags:
                -
                    name: contao.frontend_module
                    category: miscellaneous
            arguments:
                - '@test.service.database_update_service'
    passiert auch nichts .... das test wird aber auch nicht ausgeben.....

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

    Standard

    Hast du denn deinen Controller überhaupt korrekt als Frontend Modul registriert? Der Namespace entspricht außerdem auch nicht wirklich der Konvention (ist aber grundsätzlich dir überlassen).

    Generell scheinst du hier sehr viel anders zu machen, als in der Dokumentation vorgeschlagen.

    Darüberhinaus hast du es als Bundle umgesetzt. Handelt es sich hier um eine wiederverwendbare Extension?
    » sponsor me via GitHub or PayPal or Revolut

  13. #13
    Contao-Fan
    Registriert seit
    16.01.2012.
    Beiträge
    418

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Hast du denn deinen Controller überhaupt korrekt als Frontend Modul registriert?
    PHP-Code:

    dca

    use 
    test\bbPWBxml\Module\PWBXmlUpdate;


    $GLOBALS['TL_DCA']['tl_module']['palettes']['PWBXmlUpdate::TYPE'] = '{type_legend},type,name';

    service
     
    test\bbPWBxml\Module\PWBXmlUpdate:
            
    tags:
                -
                    
    namecontao.frontend_module
                    category
    miscellaneous
                    method
    __invoke
            arguments
    :
                - 
    '@test.service.database_update_service' 
    ich denke?

    Zitat Zitat von Spooky Beitrag anzeigen
    Der Namespace entspricht außerdem auch nicht wirklich der Konvention (ist aber grundsätzlich dir überlassen).
    ich weiss - das liegt dran, dass unsere ganzen Bundles unter contao/ ohne namespace angelegt wurden und das umschreiben unendlich viel arbeit wäre.

    "test" ist aber unser firmenname. (habe ich ersetzt)

    Zitat Zitat von Spooky Beitrag anzeigen
    Generell scheinst du hier sehr viel anders zu machen, als in der Dokumentation vorgeschlagen.
    Das hab ich aber erst nachträglich (wieder) hinzugefügt, nachdem ichs so gemacht hab wie in der doku vorgeschlagen

    Zitat Zitat von Spooky Beitrag anzeigen
    Darüberhinaus hast du es als Bundle umgesetzt. Handelt es sich hier um eine wiederverwendbare Extension?
    Was meinst du damit? Also wird verwenden unsere Bundles immer bei mehreren Kunden - Downloadbar über den Manager für andere sind diese jedoch nicht.

    PHP-Code:
     private $databaseUpdateService;
       public function 
    __construct(DatabaseUpdateService $databaseUpdateService)
        {
            
    $this->databaseUpdateService $databaseUpdateService;
        
                
    $this->databaseUpdateService->updateMediaTimestamp();
        } 
    so habe ich es jetzt ausführen können.

    was mir in der doku nicht ersichtlich ist - wo kommt nun der code hin wie die datenbank abfragen usw die man dann ins Template übergibt etc?
    Geändert von Nacht69 (26.03.2024 um 17:58 Uhr)

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

    Standard

    Zitat Zitat von Nacht69 Beitrag anzeigen
    ich denke?
    Das prüfst du mit debug:container - nicht mit Gedanken
    » sponsor me via GitHub or PayPal or Revolut

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
  •