-
[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!
-
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?
-
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.
-
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