Ergebnis 1 bis 4 von 4

Thema: [GELÖST]Hook postUpload

  1. #1
    Contao-Nutzer
    Registriert seit
    20.08.2017.
    Beiträge
    28

    Standard [GELÖST]Hook postUpload

    Hi Leute,

    ich arbeite an einem Projekt, in dem es um einen geschützten Mitgliederebereich geht. Kunden sollen eine E-Mail-Benachrichtigung bekommen, wenn in ihren Ordner im Backend eine neue Datei hochgeladen wurde. Dafür hat mir ein Programmierer eine Funktion erstellt und in die FileUpload.php eingefügt. Nun möchte ich das ganze aber gern Updatesicher haben und die Funktionen in einen Hook umwandeln. Dafür habe ich den Hook postUpload verwendet. Leider scheint die Funktion nicht 1 zu 1 übernommen werden zu können. Denn der Hook funktioniert nicht. Ich muss dazu sagen, dass ist mein erster Versuch mit Extension-Entwicklung und ich habe mich in der Contao Dokumentation informiert und diverse Forenbeiträge gelesen. Aber es funktioniert nicht. Und so sieht das ganze aus:

    Die Funktion (eingefügt in der FileUpload.php in Zeile 189 funktioniert sie)
    Code:
        //developer 04.04.17//
    						$this->import('BackendUser', 'User');
    						$currUserid = $this->User->id;
    						$currfilemounts = $this->filemounts;
    						$isAdmin = $this->User->admin;						
    						if($isAdmin==1){ // admin					
    							foreach($arrUploaded as $newFiles){
    								$folders = explode("/",$newFiles);
    								$customerfolder = $folders[1];
    							}
    							$arrUsers='';
    
    							//$userHomeDir = $this->Database->execute("SELECT homeDir FROM tl_member WHERE id = ".$currUserid);
    							//$homeDirName = $this->Database->execute("SELECT name FROM tl_files WHERE uuid = ".$userHomeDir);
    							
    							$homeDirName='';
    							//if(strtolower($customerfolder==$homeDirName)){
    							if(strtolower($customerfolder=="customer general")){	
    								$objFEMembers = $this->Database->execute("SELECT * FROM tl_member WHERE login=1");
    								
    								while ($objFEMembers->next()){
    									$arrUsers.=$objFEMembers->email.',';									
    								}
    							}else{
    								foreach($arrUploaded as $newFiles){
    									$folders = explode("/",$newFiles);
    									$groupfolder = $folders[count($folders)-2];
    								}
    
    								$objGroups =  $this->Database->execute("SELECT id FROM tl_member_group WHERE name ='".$groupfolder."'");
    								$objUsers =  $this->Database->execute("SELECT * FROM tl_member WHERE login=1");
    	                        	while ($objUsers->next())
    								{
    									$arrGroups = unserialize($objUsers->groups);									
    									foreach($arrGroups as $group){									
    									if(in_array($objGroups->id,$arrGroups)){
    											$arrUsers.=$objUsers->email.',';
    										}	
    									} 						
    								}
    												
    							}
    						}else{ // is other users
    								$currUser =  $this->Database->execute("SELECT * FROM tl_user WHERE id = ".$currUserid);
    			                    $currUserGroup = unserialize($currUser->groups);
    															
    								$objUsers =  $this->Database->execute("SELECT * FROM tl_user WHERE admin !=1");
    								$arrUsers = '';	
    								$arrGroups  = '';									
    								while ($objUsers->next())
    								{						       
    									$arrGroups = unserialize($objUsers->groups); 
    		                            $arrFilemounts = unserialize($objUsers->filemounts); 
    			                        foreach($arrGroups as $group){
    			                             if(in_array($group,$currUserGroup)){
    													$arrUsers.=$objUsers->email.',';
    										}	
    									}                                
    								 }							
    						 }						
    						$count=1;
                            $fileStr='';    
    
                            foreach($arrUploaded as $newFiles){
    							$fileStr.=$count.' '.$newFiles.'<br/>';
    							$count++;
    						}								
    						$objEmail = new \Email();
    						$objEmail->from = $GLOBALS['TL_ADMIN_EMAIL'];
    						$objEmail->fromName = $GLOBALS['TL_ADMIN_NAME'];
    						$objEmail->subject = sprintf('Notification', \Idna::decode(\Environment::get('host')));
    						$objEmail->html = sprintf('Sehr verehrter Kunde,<p>Folgende Datei wurde in Ihrem Liegenschaftsportal hochgeladen und kann jetzt abgerufen werden.</p> ' . $fileStr . '<br/><br/>Mit freundlichen Grüßen<br/>'.$GLOBALS['TL_ADMIN_NAME'], 'Notification', $strUrl, $strUrl . '?token=' . $objNotify->tokenRemove);
    						$objEmail->sendTo(rtrim($arrUsers,','));                        
    						//developer 04.04.17//
    
    	
    }
    Jetzt das Modul:

    Ordnerstruktur:
    EmailNotificationSystem
    -assets
    -classes
    --EmailNotificationUser.php
    -config
    --autoload.php
    --config.php

    EmailNotificationUser.php
    Code:
    <?php
    
    public function EmailNotificationSystem($arrFiles)
    {
        //developer 04.04.17//
    						$this->import('BackendUser', 'User');
    						$currUserid = $this->User->id;
    						$currfilemounts = $this->filemounts;
    						$isAdmin = $this->User->admin;						
    						if($isAdmin==1){ // admin					
    							foreach($arrUploaded as $newFiles){
    								$folders = explode("/",$newFiles);
    								$customerfolder = $folders[1];
    							}
    							$arrUsers='';
    
    							//$userHomeDir = $this->Database->execute("SELECT homeDir FROM tl_member WHERE id = ".$currUserid);
    							//$homeDirName = $this->Database->execute("SELECT name FROM tl_files WHERE uuid = ".$userHomeDir);
    							
    							$homeDirName='';
    							//if(strtolower($customerfolder==$homeDirName)){
    							if(strtolower($customerfolder=="customer general")){	
    								$objFEMembers = $this->Database->execute("SELECT * FROM tl_member WHERE login=1");
    								
    								while ($objFEMembers->next()){
    									$arrUsers.=$objFEMembers->email.',';									
    								}
    							}else{
    								foreach($arrUploaded as $newFiles){
    									$folders = explode("/",$newFiles);
    									$groupfolder = $folders[count($folders)-2];
    								}
    
    								$objGroups =  $this->Database->execute("SELECT id FROM tl_member_group WHERE name ='".$groupfolder."'");
    								$objUsers =  $this->Database->execute("SELECT * FROM tl_member WHERE login=1");
    	                        	while ($objUsers->next())
    								{
    									$arrGroups = unserialize($objUsers->groups);									
    									foreach($arrGroups as $group){									
    									if(in_array($objGroups->id,$arrGroups)){
    											$arrUsers.=$objUsers->email.',';
    										}	
    									} 						
    								}
    												
    							}
    						}else{ // is other users
    								$currUser =  $this->Database->execute("SELECT * FROM tl_user WHERE id = ".$currUserid);
    			                    $currUserGroup = unserialize($currUser->groups);
    															
    								$objUsers =  $this->Database->execute("SELECT * FROM tl_user WHERE admin !=1");
    								$arrUsers = '';	
    								$arrGroups  = '';									
    								while ($objUsers->next())
    								{						       
    									$arrGroups = unserialize($objUsers->groups); 
    		                            $arrFilemounts = unserialize($objUsers->filemounts); 
    			                        foreach($arrGroups as $group){
    			                             if(in_array($group,$currUserGroup)){
    													$arrUsers.=$objUsers->email.',';
    										}	
    									}                                
    								 }							
    						 }						
    						$count=1;
                            $fileStr='';    
    
                            foreach($arrUploaded as $newFiles){
    							$fileStr.=$count.' '.$newFiles.'<br/>';
    							$count++;
    						}								
    						$objEmail = new \Email();
    						$objEmail->from = $GLOBALS['TL_ADMIN_EMAIL'];
    						$objEmail->fromName = $GLOBALS['TL_ADMIN_NAME'];
    						$objEmail->subject = sprintf('Notification', \Idna::decode(\Environment::get('host')));
    						$objEmail->html = sprintf('Sehr verehrter Kunde,<p>Folgende Datei wurde in Ihrem Liegenschaftsportal hochgeladen und kann jetzt abgerufen werden.</p> ' . $fileStr . '<br/><br/>Mit freundlichen Grüßen<br/>'.$GLOBALS['TL_ADMIN_NAME'], 'Notification', $strUrl, $strUrl . '?token=' . $objNotify->tokenRemove);
    						$objEmail->sendTo(rtrim($arrUsers,','));                        
    						//developer 04.04.17//
    
    	
    }
    autoload.php
    Code:
    <?php
    ClassLoader::addClasses(array
    (
    'Contao\EmailNotificationUser' => 'system/modules/EmailNotificationSystem/classes/EmailNotificationUser.php',
    ));
    config.php
    Code:
    <?php
    $GLOBALS['TL_HOOKS']['postUpload'][] = array('EmailNotificationUser', 'EmailNotificationSystem');
    Die Logik hinter der Funktion ist folgende: Es muss eine Mitgliedergruppe mit dem gleichen Namen existieren wie ein Ordner in der Dateiverwaltung. Das einzelne Mitglied muss den Mitgliedergruppen entsprechend zugeordnet sein, damit es die E-Mail-Benachrichtigung erhält. Funktioniert wie gesagt auch, wenn man die Funktion in der FileUpload.php einfügt.

    Kann mir irgendjemand einen Tipp geben, was an meinen Dateien nicht stimmt?
    Vielen Dank!
    Geändert von Christina17 (12.01.2018 um 10:48 Uhr)

  2. #2
    Contao-Nutzer
    Registriert seit
    20.08.2017.
    Beiträge
    28

    Standard

    Das ganze scheint nicht so trivial zu sein. deswegen würde ich es gern auch anders angehen....kann man Contao sagen, dass es eine FileUploadCustom.php benutzen soll statt der Standard FileUpload.php?
    Außerdem würde ich gern das sendTo in ein sendBcc ändern. Das funktioniert aber nicht so ohne weiteres. Muss für ein sendBcc noch zusätzlich etwas konfiguriert werden?

  3. #3
    Contao-Nutzer
    Registriert seit
    20.08.2017.
    Beiträge
    28

    Standard

    Hat sich erledigt. Mit rumprobieren und recherchieren habe ich es hinbekommen, die FileUploadCustom.php einzubinden und die Mails per Bcc zu versenden.
    Mein Fehler hier war nur, dass ich kein sendTo vernwendet hatte. Erst sendBcc und dann sendTo behebt den Fehler und die Mails werden korrekt versendet.

  4. #4
    Contao-Urgestein Avatar von cliffparnitzky
    Registriert seit
    08.10.2010.
    Ort
    Lüneburg
    Beiträge
    2.452
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Moin,
    also, ich denke schon, dass es mit deinem Code im wesentlichen funktionieren kann.

    Die Datei "EmailNotificationUser.php" ist nciht korrekt qaufgebaut, weshalb der postUpload Hock nicht getriggert wird.

    Nur BCC senden mit der Contao Mail Klasse kann man nicht (verbieten Mail Programme meist auch, oder es wird dann dieses "Undisclosed Recipients" Zeugs angezeugt). Da wäre es im Grunde gut eine allgemeine E-Mail Adresse für das sendTo zu erwenden und vorher die BCCs einzufügen.

    Grüße, Cliff

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
  •