| ... | ... |
@@ -68,57 +68,58 @@ class SendNewsNotificationJob |
| 68 | 68 |
// Load groups and notification models if we have news to share |
| 69 | 69 |
if ($News->rowCount() && ($Notification = Notification::findByPk($Archive->nc_notification)) !== null && ($Groups = MemberGroupModel::findMultipleByIds($arrGroupIds)) !== null) |
| 70 | 70 |
{
|
| 71 |
- while ($Groups->next()) |
|
| 71 |
+ foreach ($News->iterateAssociative() as $item) |
|
| 72 | 72 |
{
|
| 73 |
- // Skip disabled groups |
|
| 74 |
- if ($Groups->disable) |
|
| 75 |
- {
|
|
| 76 |
- continue; |
|
| 77 |
- } |
|
| 73 |
+ $arrNewsIds[] = $item['id']; |
|
| 78 | 74 |
|
| 79 |
- // Get group members |
|
| 80 |
- $Members = MemberModel::findBy(array("`groups` LIKE '%\"".$Groups->id."\"%'","(start='' OR start<='$time') AND (stop='' OR stop>'" . ($time + 60) . "') AND disable=''"),null);
|
|
| 81 |
- |
|
| 82 |
- // Send notification to each member |
|
| 83 | 75 |
$arrNews = array(); |
| 84 | 76 |
$arrNewsPlain = array(); |
| 85 |
- foreach ($News->iterateAssociative() as $item) |
|
| 86 |
- {
|
|
| 87 |
- $arrNewsIds[] = $item['id']; |
|
| 88 | 77 |
|
| 89 |
- if ($Members !== null) |
|
| 78 |
+ $strText = ''; |
|
| 79 |
+ $objContentElement = ContentModel::findPublishedByPidAndTable($item['id'], 'tl_news'); |
|
| 80 |
+ |
|
| 81 |
+ if ($objContentElement !== null) |
|
| 82 |
+ {
|
|
| 83 |
+ while ($objContentElement->next()) |
|
| 90 | 84 |
{
|
| 91 |
- $strText = ''; |
|
| 92 |
- $objContentElement = ContentModel::findPublishedByPidAndTable($item['id'], 'tl_news'); |
|
| 85 |
+ $strText .= Controller::getContentElement($objContentElement->current()); |
|
| 86 |
+ } |
|
| 87 |
+ } |
|
| 88 |
+ $arrRow = array( |
|
| 89 |
+ 'date' => date('d.m.Y',$item['date']),
|
|
| 90 |
+ 'headline' => $item['headline'], |
|
| 91 |
+ 'teaser' => $item['teaser'] ? StringUtil::substr(strip_tags(str_ireplace(array('<br />','<br>','<br/>','</p>','<p>'),' ',$item['teaser'])),128) : '',
|
|
| 92 |
+ 'text_plain' => $strText ? strip_tags(str_ireplace(array('<br />','<br>','<br/>','</p>','<p>'),' ',$strText)) : ($item['teaser'] ? strip_tags(str_ireplace(array('<br />','<br>','<br/>','</p>','<p>'),' ',$item['teaser'])) : ''),
|
|
| 93 |
+ 'text_html' => $strText ?: $item['teaser'] |
|
| 94 |
+ ); |
|
| 95 |
+ |
|
| 96 |
+ if (($objJumpTo = $Archive->getRelated('jumpTo')) !== null)
|
|
| 97 |
+ {
|
|
| 98 |
+ // $arrRow['url'] = $objJumpTo->getAbsoluteUrl(sprintf((Config::get('useAutoItem') ? '/%s' : '/items/%s'),$item['alias'])).'?ltoken=%%_TOKEN_%%';
|
|
| 99 |
+ $arrRow['url'] = $objJumpTo->getAbsoluteUrl(sprintf((Config::get('useAutoItem') ? '/%s' : '/items/%s'),$item['alias']));
|
|
| 100 |
+ } |
|
| 93 | 101 |
|
| 94 |
- if ($objContentElement !== null) |
|
| 95 |
- {
|
|
| 96 |
- while ($objContentElement->next()) |
|
| 97 |
- {
|
|
| 98 |
- $strText .= Controller::getContentElement($objContentElement->current()); |
|
| 99 |
- } |
|
| 100 |
- } |
|
| 101 |
- $arrRow = array( |
|
| 102 |
- 'date' => date('d.m.Y',$item['date']),
|
|
| 103 |
- 'headline' => $item['headline'], |
|
| 104 |
- 'teaser' => $item['teaser'] ? StringUtil::substr(strip_tags(str_ireplace(array('<br />','<br>','<br/>','</p>','<p>'),' ',$item['teaser'])),128) : '',
|
|
| 105 |
- 'text_plain' => $strText ? strip_tags(str_ireplace(array('<br />','<br>','<br/>','</p>','<p>'),' ',$strText)) : ($item['teaser'] ? strip_tags(str_ireplace(array('<br />','<br>','<br/>','</p>','<p>'),' ',$item['teaser'])) : ''),
|
|
| 106 |
- 'text_html' => $strText ?: $item['teaser'] |
|
| 107 |
- ); |
|
| 108 |
- |
|
| 109 |
- if (($objJumpTo = $Archive->getRelated('jumpTo')) !== null)
|
|
| 110 |
- {
|
|
| 111 |
- // $arrRow['url'] = $objJumpTo->getAbsoluteUrl(sprintf((Config::get('useAutoItem') ? '/%s' : '/items/%s'),$item['alias'])).'?ltoken=%%_TOKEN_%%';
|
|
| 112 |
- $arrRow['url'] = $objJumpTo->getAbsoluteUrl(sprintf((Config::get('useAutoItem') ? '/%s' : '/items/%s'),$item['alias']));
|
|
| 113 |
- } |
|
| 102 |
+ $arrNews[] = $arrRow; |
|
| 103 |
+ |
|
| 104 |
+ $arrNewsPlain[] = date('d.m.Y',$item['date']).' - '.$item['headline'];
|
|
| 105 |
+ $arrNewsHtml[] = '<div style="margin-bottom: 15px;"><h3>'.$arrRow['date'].' '.$arrRow['headline'].'</h3><p>'.$arrRow['teaser'].'</p>'. ($arrRow['url'] ? '<p><a href="'.$arrRow['url'].'">» Ganze Nachricht lesen...</a></p>' : '') .'</div>'; |
|
| 106 |
+ $arrNewsFullPlain[] = date('d.m.Y',$item['date']).' - '.$item['headline'] . "\n" . $arrRow['text_plain'];
|
|
| 107 |
+ $arrNewsFullHtml[] = '<div style="margin-bottom: 15px;"><h3>'.$arrRow['date'].' '.$arrRow['headline'].'</h3>' . $arrRow['text_html'] . ($arrRow['url'] ? '<p><a href="'.$arrRow['url'].'">» Ganze Nachricht lesen...</a></p>' : '') .'</div>'; |
|
| 114 | 108 |
|
| 115 |
- $arrNews[] = $arrRow; |
|
| 109 |
+ while ($Groups->next()) |
|
| 110 |
+ {
|
|
| 111 |
+ // Skip disabled groups |
|
| 112 |
+ if ($Groups->disable) |
|
| 113 |
+ {
|
|
| 114 |
+ continue; |
|
| 115 |
+ } |
|
| 116 | 116 |
|
| 117 |
- $arrNewsPlain[] = date('d.m.Y',$item['date']).' - '.$item['headline'];
|
|
| 118 |
- $arrNewsHtml[] = '<div style="margin-bottom: 15px;"><h3>'.$arrRow['date'].' '.$arrRow['headline'].'</h3><p>'.$arrRow['teaser'].'</p>'. ($arrRow['url'] ? '<p><a href="'.$arrRow['url'].'">» Ganze Nachricht lesen...</a></p>' : '') .'</div>'; |
|
| 119 |
- $arrNewsFullPlain[] = date('d.m.Y',$item['date']).' - '.$item['headline'] . "\n" . $arrRow['text_plain'];
|
|
| 120 |
- $arrNewsFullHtml[] = '<div style="margin-bottom: 15px;"><h3>'.$arrRow['date'].' '.$arrRow['headline'].'</h3>' . $arrRow['text_html'] . ($arrRow['url'] ? '<p><a href="'.$arrRow['url'].'">» Ganze Nachricht lesen...</a></p>' : '') .'</div>'; |
|
| 117 |
+ // Get group members |
|
| 118 |
+ $Members = MemberModel::findBy(array("`groups` LIKE '%\"".$Groups->id."\"%'","(start='' OR start<='$time') AND (stop='' OR stop>'" . ($time + 60) . "') AND disable=''"),null);
|
|
| 121 | 119 |
|
| 120 |
+ // Send notification to each member |
|
| 121 |
+ if ($Members !== null) |
|
| 122 |
+ {
|
|
| 122 | 123 |
while ($Members->next()) |
| 123 | 124 |
{
|
| 124 | 125 |
if (!$Members->nc_news_subscribe) |
| ... | ... |
@@ -145,9 +146,9 @@ class SendNewsNotificationJob |
| 145 | 146 |
} |
| 146 | 147 |
} |
| 147 | 148 |
} |
| 148 |
- |
|
| 149 | 149 |
} |
| 150 | 150 |
|
| 151 |
+ |
|
| 151 | 152 |
// Flag news as sent |
| 152 | 153 |
if (count($arrNewsIds)) |
| 153 | 154 |
{
|
| ... | ... |
@@ -80,11 +80,13 @@ class SendNewsNotificationJob |
| 80 | 80 |
$Members = MemberModel::findBy(array("`groups` LIKE '%\"".$Groups->id."\"%'","(start='' OR start<='$time') AND (stop='' OR stop>'" . ($time + 60) . "') AND disable=''"),null);
|
| 81 | 81 |
|
| 82 | 82 |
// Send notification to each member |
| 83 |
- if ($Members !== null) |
|
| 83 |
+ $arrNews = array(); |
|
| 84 |
+ $arrNewsPlain = array(); |
|
| 85 |
+ foreach ($News->iterateAssociative() as $item) |
|
| 84 | 86 |
{
|
| 85 |
- $arrNews = array(); |
|
| 86 |
- $arrNewsPlain = array(); |
|
| 87 |
- foreach ($News->iterateAssociative() as $item) |
|
| 87 |
+ $arrNewsIds[] = $item['id']; |
|
| 88 |
+ |
|
| 89 |
+ if ($Members !== null) |
|
| 88 | 90 |
{
|
| 89 | 91 |
$strText = ''; |
| 90 | 92 |
$objContentElement = ContentModel::findPublishedByPidAndTable($item['id'], 'tl_news'); |
| ... | ... |
@@ -106,7 +108,7 @@ class SendNewsNotificationJob |
| 106 | 108 |
|
| 107 | 109 |
if (($objJumpTo = $Archive->getRelated('jumpTo')) !== null)
|
| 108 | 110 |
{
|
| 109 |
-// $arrRow['url'] = $objJumpTo->getAbsoluteUrl(sprintf((Config::get('useAutoItem') ? '/%s' : '/items/%s'),$item['alias'])).'?ltoken=%%_TOKEN_%%';
|
|
| 111 |
+ // $arrRow['url'] = $objJumpTo->getAbsoluteUrl(sprintf((Config::get('useAutoItem') ? '/%s' : '/items/%s'),$item['alias'])).'?ltoken=%%_TOKEN_%%';
|
|
| 110 | 112 |
$arrRow['url'] = $objJumpTo->getAbsoluteUrl(sprintf((Config::get('useAutoItem') ? '/%s' : '/items/%s'),$item['alias']));
|
| 111 | 113 |
} |
| 112 | 114 |
|
| ... | ... |
@@ -117,33 +119,33 @@ class SendNewsNotificationJob |
| 117 | 119 |
$arrNewsFullPlain[] = date('d.m.Y',$item['date']).' - '.$item['headline'] . "\n" . $arrRow['text_plain'];
|
| 118 | 120 |
$arrNewsFullHtml[] = '<div style="margin-bottom: 15px;"><h3>'.$arrRow['date'].' '.$arrRow['headline'].'</h3>' . $arrRow['text_html'] . ($arrRow['url'] ? '<p><a href="'.$arrRow['url'].'">» Ganze Nachricht lesen...</a></p>' : '') .'</div>'; |
| 119 | 121 |
|
| 120 |
- $arrNewsIds[] = $item['id']; |
|
| 121 |
- } |
|
| 122 |
- while ($Members->next()) |
|
| 123 |
- {
|
|
| 124 |
- if (!$Members->nc_news_subscribe) |
|
| 122 |
+ while ($Members->next()) |
|
| 125 | 123 |
{
|
| 126 |
- continue; |
|
| 127 |
- } |
|
| 124 |
+ if (!$Members->nc_news_subscribe) |
|
| 125 |
+ {
|
|
| 126 |
+ continue; |
|
| 127 |
+ } |
|
| 128 | 128 |
|
| 129 |
- //$strToken = \TokenLogin::getOrRenewUserToken($Members->current()); |
|
| 130 |
- $strToken = ''; |
|
| 131 |
- |
|
| 132 |
- $Notification->send(array |
|
| 133 |
- ( |
|
| 134 |
- 'member_email' => $Members->email.($Members->nc_news_additionalEmail ? ','.$Members->nc_news_additionalEmail : ''), |
|
| 135 |
- 'member_firstname' => $Members->firstname, |
|
| 136 |
- 'member_lastname' => $Members->lastname, |
|
| 137 |
- 'news_topics' => implode("\n",$arrNewsPlain),
|
|
| 138 |
- 'news_topics_html' => "<ul>\n<li>".str_replace('%%_TOKEN_%%',$strToken,implode("</li>\n<li>",$arrNewsHtml))."</li>\n</ul>",
|
|
| 139 |
- 'news_full' => implode("\n",$arrNewsFullPlain),
|
|
| 140 |
- 'news_full_html' => implode("",$arrNewsFullHtml),
|
|
| 141 |
- 'member_login_token' => $strToken, |
|
| 142 |
- 'admin_email' => $admin_email, |
|
| 143 |
- ), |
|
| 144 |
- $GLOBALS['TL_LANGUAGE']); |
|
| 129 |
+ //$strToken = \TokenLogin::getOrRenewUserToken($Members->current()); |
|
| 130 |
+ $strToken = ''; |
|
| 131 |
+ |
|
| 132 |
+ $Notification->send(array |
|
| 133 |
+ ( |
|
| 134 |
+ 'member_email' => $Members->email.($Members->nc_news_additionalEmail ? ','.$Members->nc_news_additionalEmail : ''), |
|
| 135 |
+ 'member_firstname' => $Members->firstname, |
|
| 136 |
+ 'member_lastname' => $Members->lastname, |
|
| 137 |
+ 'news_topics' => implode("\n",$arrNewsPlain),
|
|
| 138 |
+ 'news_topics_html' => "<ul>\n<li>".str_replace('%%_TOKEN_%%',$strToken,implode("</li>\n<li>",$arrNewsHtml))."</li>\n</ul>",
|
|
| 139 |
+ 'news_full' => implode("\n",$arrNewsFullPlain),
|
|
| 140 |
+ 'news_full_html' => implode("",$arrNewsFullHtml),
|
|
| 141 |
+ 'member_login_token' => $strToken, |
|
| 142 |
+ 'admin_email' => $admin_email, |
|
| 143 |
+ ), |
|
| 144 |
+ $GLOBALS['TL_LANGUAGE']); |
|
| 145 |
+ } |
|
| 145 | 146 |
} |
| 146 | 147 |
} |
| 148 |
+ |
|
| 147 | 149 |
} |
| 148 | 150 |
|
| 149 | 151 |
// Flag news as sent |
| ... | ... |
@@ -77,7 +77,7 @@ class SendNewsNotificationJob |
| 77 | 77 |
} |
| 78 | 78 |
|
| 79 | 79 |
// Get group members |
| 80 |
- $Members = MemberModel::findBy(array("`groups` LIKE '%\"".$Groups->id."\"%'","login='1' AND (start='' OR start<='$time') AND (stop='' OR stop>'" . ($time + 60) . "') AND disable=''"),null);
|
|
| 80 |
+ $Members = MemberModel::findBy(array("`groups` LIKE '%\"".$Groups->id."\"%'","(start='' OR start<='$time') AND (stop='' OR stop>'" . ($time + 60) . "') AND disable=''"),null);
|
|
| 81 | 81 |
|
| 82 | 82 |
// Send notification to each member |
| 83 | 83 |
if ($Members !== null) |
| ... | ... |
@@ -64,11 +64,10 @@ class SendNewsNotificationJob |
| 64 | 64 |
// Do we have new news items |
| 65 | 65 |
$News = $this->db->executeQuery("SELECT id, alias, headline, `date`, teaser FROM tl_news WHERE pid = ? AND nc_sent != '1' AND date <='$time' AND (start='' OR start<='$time') AND (stop='' OR stop>'" . ($time + 60) . "') AND published='1' ORDER BY `date` DESC, `time` DESC",[$Archive->id]);
|
| 66 | 66 |
|
| 67 |
+ $arrNewsIds = array(); |
|
| 67 | 68 |
// Load groups and notification models if we have news to share |
| 68 | 69 |
if ($News->rowCount() && ($Notification = Notification::findByPk($Archive->nc_notification)) !== null && ($Groups = MemberGroupModel::findMultipleByIds($arrGroupIds)) !== null) |
| 69 | 70 |
{
|
| 70 |
- $arrNewsIds = array(); |
|
| 71 |
- |
|
| 72 | 71 |
while ($Groups->next()) |
| 73 | 72 |
{
|
| 74 | 73 |
// Skip disabled groups |
| ... | ... |
@@ -67,6 +67,7 @@ class SendNewsNotificationJob |
| 67 | 67 |
// Load groups and notification models if we have news to share |
| 68 | 68 |
if ($News->rowCount() && ($Notification = Notification::findByPk($Archive->nc_notification)) !== null && ($Groups = MemberGroupModel::findMultipleByIds($arrGroupIds)) !== null) |
| 69 | 69 |
{
|
| 70 |
+ $arrNewsIds = array(); |
|
| 70 | 71 |
|
| 71 | 72 |
while ($Groups->next()) |
| 72 | 73 |
{
|
| ... | ... |
@@ -84,7 +85,6 @@ class SendNewsNotificationJob |
| 84 | 85 |
{
|
| 85 | 86 |
$arrNews = array(); |
| 86 | 87 |
$arrNewsPlain = array(); |
| 87 |
- $arrNewsIds = array(); |
|
| 88 | 88 |
foreach ($News->iterateAssociative() as $item) |
| 89 | 89 |
{
|
| 90 | 90 |
$strText = ''; |
| ... | ... |
@@ -101,7 +101,7 @@ class SendNewsNotificationJob |
| 101 | 101 |
'date' => date('d.m.Y',$item['date']),
|
| 102 | 102 |
'headline' => $item['headline'], |
| 103 | 103 |
'teaser' => $item['teaser'] ? StringUtil::substr(strip_tags(str_ireplace(array('<br />','<br>','<br/>','</p>','<p>'),' ',$item['teaser'])),128) : '',
|
| 104 |
- 'text_plain' => $strText ? strip_tags(str_ireplace(array('<br />','<br>','<br/>','</p>','<p>'),' ',$strText)) : strip_tags(str_ireplace(array('<br />','<br>','<br/>','</p>','<p>'),' ',$item['teaser'])),
|
|
| 104 |
+ 'text_plain' => $strText ? strip_tags(str_ireplace(array('<br />','<br>','<br/>','</p>','<p>'),' ',$strText)) : ($item['teaser'] ? strip_tags(str_ireplace(array('<br />','<br>','<br/>','</p>','<p>'),' ',$item['teaser'])) : ''),
|
|
| 105 | 105 |
'text_html' => $strText ?: $item['teaser'] |
| 106 | 106 |
); |
| 107 | 107 |
|
| ... | ... |
@@ -13,6 +13,8 @@ declare(strict_types=1); |
| 13 | 13 |
namespace vonRotenberg\NewsmailerBundle\Cron; |
| 14 | 14 |
|
| 15 | 15 |
use Contao\Config; |
| 16 |
+use Contao\ContentModel; |
|
| 17 |
+use Contao\Controller; |
|
| 16 | 18 |
use Contao\CoreBundle\Monolog\ContaoContext; |
| 17 | 19 |
use Contao\CoreBundle\ServiceAnnotation\CronJob; |
| 18 | 20 |
use Contao\Date; |
| ... | ... |
@@ -51,6 +53,8 @@ class SendNewsNotificationJob |
| 51 | 53 |
|
| 52 | 54 |
if ($Archives !== null) |
| 53 | 55 |
{
|
| 56 |
+ list($admin_name,$admin_email) = StringUtil::splitFriendlyEmail(Config::get('adminEmail'));
|
|
| 57 |
+ |
|
| 54 | 58 |
while ($Archives->next()) |
| 55 | 59 |
{
|
| 56 | 60 |
$Archive = $Archives->current(); |
| ... | ... |
@@ -83,10 +87,22 @@ class SendNewsNotificationJob |
| 83 | 87 |
$arrNewsIds = array(); |
| 84 | 88 |
foreach ($News->iterateAssociative() as $item) |
| 85 | 89 |
{
|
| 90 |
+ $strText = ''; |
|
| 91 |
+ $objContentElement = ContentModel::findPublishedByPidAndTable($item['id'], 'tl_news'); |
|
| 92 |
+ |
|
| 93 |
+ if ($objContentElement !== null) |
|
| 94 |
+ {
|
|
| 95 |
+ while ($objContentElement->next()) |
|
| 96 |
+ {
|
|
| 97 |
+ $strText .= Controller::getContentElement($objContentElement->current()); |
|
| 98 |
+ } |
|
| 99 |
+ } |
|
| 86 | 100 |
$arrRow = array( |
| 87 | 101 |
'date' => date('d.m.Y',$item['date']),
|
| 88 | 102 |
'headline' => $item['headline'], |
| 89 |
- 'teaser' => $item['teaser'] ? StringUtil::substr(strip_tags(str_ireplace(array('<br />','<br>','<br/>','</p>','<p>'),' ',$item['teaser'])),128) : ''
|
|
| 103 |
+ 'teaser' => $item['teaser'] ? StringUtil::substr(strip_tags(str_ireplace(array('<br />','<br>','<br/>','</p>','<p>'),' ',$item['teaser'])),128) : '',
|
|
| 104 |
+ 'text_plain' => $strText ? strip_tags(str_ireplace(array('<br />','<br>','<br/>','</p>','<p>'),' ',$strText)) : strip_tags(str_ireplace(array('<br />','<br>','<br/>','</p>','<p>'),' ',$item['teaser'])),
|
|
| 105 |
+ 'text_html' => $strText ?: $item['teaser'] |
|
| 90 | 106 |
); |
| 91 | 107 |
|
| 92 | 108 |
if (($objJumpTo = $Archive->getRelated('jumpTo')) !== null)
|
| ... | ... |
@@ -99,6 +115,8 @@ class SendNewsNotificationJob |
| 99 | 115 |
|
| 100 | 116 |
$arrNewsPlain[] = date('d.m.Y',$item['date']).' - '.$item['headline'];
|
| 101 | 117 |
$arrNewsHtml[] = '<div style="margin-bottom: 15px;"><h3>'.$arrRow['date'].' '.$arrRow['headline'].'</h3><p>'.$arrRow['teaser'].'</p>'. ($arrRow['url'] ? '<p><a href="'.$arrRow['url'].'">» Ganze Nachricht lesen...</a></p>' : '') .'</div>'; |
| 118 |
+ $arrNewsFullPlain[] = date('d.m.Y',$item['date']).' - '.$item['headline'] . "\n" . $arrRow['text_plain'];
|
|
| 119 |
+ $arrNewsFullHtml[] = '<div style="margin-bottom: 15px;"><h3>'.$arrRow['date'].' '.$arrRow['headline'].'</h3>' . $arrRow['text_html'] . ($arrRow['url'] ? '<p><a href="'.$arrRow['url'].'">» Ganze Nachricht lesen...</a></p>' : '') .'</div>'; |
|
| 102 | 120 |
|
| 103 | 121 |
$arrNewsIds[] = $item['id']; |
| 104 | 122 |
} |
| ... | ... |
@@ -119,7 +137,10 @@ class SendNewsNotificationJob |
| 119 | 137 |
'member_lastname' => $Members->lastname, |
| 120 | 138 |
'news_topics' => implode("\n",$arrNewsPlain),
|
| 121 | 139 |
'news_topics_html' => "<ul>\n<li>".str_replace('%%_TOKEN_%%',$strToken,implode("</li>\n<li>",$arrNewsHtml))."</li>\n</ul>",
|
| 122 |
- 'member_login_token' => $strToken |
|
| 140 |
+ 'news_full' => implode("\n",$arrNewsFullPlain),
|
|
| 141 |
+ 'news_full_html' => implode("",$arrNewsFullHtml),
|
|
| 142 |
+ 'member_login_token' => $strToken, |
|
| 143 |
+ 'admin_email' => $admin_email, |
|
| 123 | 144 |
), |
| 124 | 145 |
$GLOBALS['TL_LANGUAGE']); |
| 125 | 146 |
} |
| ... | ... |
@@ -132,10 +132,10 @@ class SendNewsNotificationJob |
| 132 | 132 |
$strNewsIds = implode(',',$arrNewsIds);
|
| 133 | 133 |
$this->db->executeStatement("UPDATE tl_news SET nc_sent = '1' WHERE id IN ($strNewsIds)");
|
| 134 | 134 |
} |
| 135 |
+ |
|
| 136 |
+ $this->logger->log(LogLevel::INFO, 'News notifications has been sent', array('contao' => new ContaoContext(__METHOD__, 'CRON')));
|
|
| 135 | 137 |
} |
| 136 | 138 |
} |
| 137 | 139 |
} |
| 138 |
- $this->logger->log(LogLevel::INFO, 'News notification has been executed', array('contao' => new ContaoContext(__METHOD__, 'CRON')));
|
|
| 139 |
- |
|
| 140 | 140 |
} |
| 141 | 141 |
} |
| ... | ... |
@@ -86,7 +86,7 @@ class SendNewsNotificationJob |
| 86 | 86 |
$arrRow = array( |
| 87 | 87 |
'date' => date('d.m.Y',$item['date']),
|
| 88 | 88 |
'headline' => $item['headline'], |
| 89 |
- 'teaser' => StringUtil::substr(strip_tags(str_ireplace(array('<br />','<br>','<br/>','</p>','<p>'),' ',$item['teaser'])),128)
|
|
| 89 |
+ 'teaser' => $item['teaser'] ? StringUtil::substr(strip_tags(str_ireplace(array('<br />','<br>','<br/>','</p>','<p>'),' ',$item['teaser'])),128) : ''
|
|
| 90 | 90 |
); |
| 91 | 91 |
|
| 92 | 92 |
if (($objJumpTo = $Archive->getRelated('jumpTo')) !== null)
|
| ... | ... |
@@ -91,7 +91,8 @@ class SendNewsNotificationJob |
| 91 | 91 |
|
| 92 | 92 |
if (($objJumpTo = $Archive->getRelated('jumpTo')) !== null)
|
| 93 | 93 |
{
|
| 94 |
- $arrRow['url'] = $objJumpTo->getAbsoluteUrl(sprintf((Config::get('useAutoItem') ? '/%s' : '/items/%s'),$item['alias'])).'?ltoken=%%_TOKEN_%%';
|
|
| 94 |
+// $arrRow['url'] = $objJumpTo->getAbsoluteUrl(sprintf((Config::get('useAutoItem') ? '/%s' : '/items/%s'),$item['alias'])).'?ltoken=%%_TOKEN_%%';
|
|
| 95 |
+ $arrRow['url'] = $objJumpTo->getAbsoluteUrl(sprintf((Config::get('useAutoItem') ? '/%s' : '/items/%s'),$item['alias']));
|
|
| 95 | 96 |
} |
| 96 | 97 |
|
| 97 | 98 |
$arrNews[] = $arrRow; |
| ... | ... |
@@ -80,6 +80,7 @@ class SendNewsNotificationJob |
| 80 | 80 |
{
|
| 81 | 81 |
$arrNews = array(); |
| 82 | 82 |
$arrNewsPlain = array(); |
| 83 |
+ $arrNewsIds = array(); |
|
| 83 | 84 |
foreach ($News->iterateAssociative() as $item) |
| 84 | 85 |
{
|
| 85 | 86 |
$arrRow = array( |
| ... | ... |
@@ -90,13 +91,15 @@ class SendNewsNotificationJob |
| 90 | 91 |
|
| 91 | 92 |
if (($objJumpTo = $Archive->getRelated('jumpTo')) !== null)
|
| 92 | 93 |
{
|
| 93 |
- $arrRow['url'] = $objJumpTo->getAbsoluteUrl(sprintf((Config::get('useAutoItem') ? '/%s' : '/items/%s'),$News->alias)).'?ltoken=%%_TOKEN_%%';
|
|
| 94 |
+ $arrRow['url'] = $objJumpTo->getAbsoluteUrl(sprintf((Config::get('useAutoItem') ? '/%s' : '/items/%s'),$item['alias'])).'?ltoken=%%_TOKEN_%%';
|
|
| 94 | 95 |
} |
| 95 | 96 |
|
| 96 | 97 |
$arrNews[] = $arrRow; |
| 97 | 98 |
|
| 98 | 99 |
$arrNewsPlain[] = date('d.m.Y',$item['date']).' - '.$item['headline'];
|
| 99 | 100 |
$arrNewsHtml[] = '<div style="margin-bottom: 15px;"><h3>'.$arrRow['date'].' '.$arrRow['headline'].'</h3><p>'.$arrRow['teaser'].'</p>'. ($arrRow['url'] ? '<p><a href="'.$arrRow['url'].'">» Ganze Nachricht lesen...</a></p>' : '') .'</div>'; |
| 101 |
+ |
|
| 102 |
+ $arrNewsIds[] = $item['id']; |
|
| 100 | 103 |
} |
| 101 | 104 |
while ($Members->next()) |
| 102 | 105 |
{
|
| ... | ... |
@@ -123,12 +126,11 @@ class SendNewsNotificationJob |
| 123 | 126 |
} |
| 124 | 127 |
|
| 125 | 128 |
// Flag news as sent |
| 126 |
- $arrNewsIds = array(); |
|
| 127 |
- foreach ($News->iterateAssociative() as $newsRow) |
|
| 129 |
+ if (count($arrNewsIds)) |
|
| 128 | 130 |
{
|
| 129 |
- $arrNewsIds[] = $newsRow['id']; |
|
| 131 |
+ $strNewsIds = implode(',',$arrNewsIds);
|
|
| 132 |
+ $this->db->executeStatement("UPDATE tl_news SET nc_sent = '1' WHERE id IN ($strNewsIds)");
|
|
| 130 | 133 |
} |
| 131 |
- $this->db->executeStatement("UPDATE tl_news SET nc_sent = '1' WHERE id IN (".implode(',',$arrNewsIds).")");
|
|
| 132 | 134 |
} |
| 133 | 135 |
} |
| 134 | 136 |
} |
| ... | ... |
@@ -73,7 +73,7 @@ class SendNewsNotificationJob |
| 73 | 73 |
} |
| 74 | 74 |
|
| 75 | 75 |
// Get group members |
| 76 |
- $Members = MemberModel::findBy(array("groups LIKE '%\"".$Groups->id."\"%'","login='1' AND (start='' OR start<='$time') AND (stop='' OR stop>'" . ($time + 60) . "') AND disable=''"),null);
|
|
| 76 |
+ $Members = MemberModel::findBy(array("`groups` LIKE '%\"".$Groups->id."\"%'","login='1' AND (start='' OR start<='$time') AND (stop='' OR stop>'" . ($time + 60) . "') AND disable=''"),null);
|
|
| 77 | 77 |
|
| 78 | 78 |
// Send notification to each member |
| 79 | 79 |
if ($Members !== null) |
| 1 | 1 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,138 @@ |
| 1 |
+<?php |
|
| 2 |
+ |
|
| 3 |
+declare(strict_types=1); |
|
| 4 |
+ |
|
| 5 |
+/* |
|
| 6 |
+* This file is part of newsmailer bundle for Contao. |
|
| 7 |
+* |
|
| 8 |
+* (c) Benjamin Roth |
|
| 9 |
+* |
|
| 10 |
+* @license LGPL-3.0-or-later |
|
| 11 |
+*/ |
|
| 12 |
+ |
|
| 13 |
+namespace vonRotenberg\NewsmailerBundle\Cron; |
|
| 14 |
+ |
|
| 15 |
+use Contao\Config; |
|
| 16 |
+use Contao\CoreBundle\Monolog\ContaoContext; |
|
| 17 |
+use Contao\CoreBundle\ServiceAnnotation\CronJob; |
|
| 18 |
+use Contao\Date; |
|
| 19 |
+use Contao\MemberGroupModel; |
|
| 20 |
+use Contao\MemberModel; |
|
| 21 |
+use Contao\NewsArchiveModel; |
|
| 22 |
+use Contao\StringUtil; |
|
| 23 |
+use Doctrine\DBAL\Connection; |
|
| 24 |
+use NotificationCenter\Model\Notification; |
|
| 25 |
+use Psr\Log\LoggerInterface; |
|
| 26 |
+use Psr\Log\LogLevel; |
|
| 27 |
+ |
|
| 28 |
+/** |
|
| 29 |
+ * @CronJob("minutely")
|
|
| 30 |
+ */ |
|
| 31 |
+class SendNewsNotificationJob |
|
| 32 |
+{
|
|
| 33 |
+ /** @var LoggerInterface */ |
|
| 34 |
+ private $logger; |
|
| 35 |
+ |
|
| 36 |
+ /** @var Connection */ |
|
| 37 |
+ private $db; |
|
| 38 |
+ |
|
| 39 |
+ public function __construct(Connection $db, LoggerInterface $logger) |
|
| 40 |
+ {
|
|
| 41 |
+ $this->logger = $logger; |
|
| 42 |
+ $this->db = $db; |
|
| 43 |
+ } |
|
| 44 |
+ |
|
| 45 |
+ public function __invoke(string $scope) |
|
| 46 |
+ {
|
|
| 47 |
+ list($admin_name,$admin_email) = StringUtil::splitFriendlyEmail(Config::get('adminEmail'));
|
|
| 48 |
+ |
|
| 49 |
+ // Get archives with notifications enabled |
|
| 50 |
+ $Archives = NewsArchiveModel::findBy('nc_enable','1');
|
|
| 51 |
+ |
|
| 52 |
+ if ($Archives !== null) |
|
| 53 |
+ {
|
|
| 54 |
+ while ($Archives->next()) |
|
| 55 |
+ {
|
|
| 56 |
+ $Archive = $Archives->current(); |
|
| 57 |
+ $arrGroupIds = StringUtil::deserialize($Archive->nc_notification_groups,true); |
|
| 58 |
+ $time = Date::floorToMinute(); |
|
| 59 |
+ |
|
| 60 |
+ // Do we have new news items |
|
| 61 |
+ $News = $this->db->executeQuery("SELECT id, alias, headline, `date`, teaser FROM tl_news WHERE pid = ? AND nc_sent != '1' AND date <='$time' AND (start='' OR start<='$time') AND (stop='' OR stop>'" . ($time + 60) . "') AND published='1' ORDER BY `date` DESC, `time` DESC",[$Archive->id]);
|
|
| 62 |
+ |
|
| 63 |
+ // Load groups and notification models if we have news to share |
|
| 64 |
+ if ($News->rowCount() && ($Notification = Notification::findByPk($Archive->nc_notification)) !== null && ($Groups = MemberGroupModel::findMultipleByIds($arrGroupIds)) !== null) |
|
| 65 |
+ {
|
|
| 66 |
+ |
|
| 67 |
+ while ($Groups->next()) |
|
| 68 |
+ {
|
|
| 69 |
+ // Skip disabled groups |
|
| 70 |
+ if ($Groups->disable) |
|
| 71 |
+ {
|
|
| 72 |
+ continue; |
|
| 73 |
+ } |
|
| 74 |
+ |
|
| 75 |
+ // Get group members |
|
| 76 |
+ $Members = MemberModel::findBy(array("groups LIKE '%\"".$Groups->id."\"%'","login='1' AND (start='' OR start<='$time') AND (stop='' OR stop>'" . ($time + 60) . "') AND disable=''"),null);
|
|
| 77 |
+ |
|
| 78 |
+ // Send notification to each member |
|
| 79 |
+ if ($Members !== null) |
|
| 80 |
+ {
|
|
| 81 |
+ $arrNews = array(); |
|
| 82 |
+ $arrNewsPlain = array(); |
|
| 83 |
+ foreach ($News->iterateAssociative() as $item) |
|
| 84 |
+ {
|
|
| 85 |
+ $arrRow = array( |
|
| 86 |
+ 'date' => date('d.m.Y',$item['date']),
|
|
| 87 |
+ 'headline' => $item['headline'], |
|
| 88 |
+ 'teaser' => StringUtil::substr(strip_tags(str_ireplace(array('<br />','<br>','<br/>','</p>','<p>'),' ',$item['teaser'])),128)
|
|
| 89 |
+ ); |
|
| 90 |
+ |
|
| 91 |
+ if (($objJumpTo = $Archive->getRelated('jumpTo')) !== null)
|
|
| 92 |
+ {
|
|
| 93 |
+ $arrRow['url'] = $objJumpTo->getAbsoluteUrl(sprintf((Config::get('useAutoItem') ? '/%s' : '/items/%s'),$News->alias)).'?ltoken=%%_TOKEN_%%';
|
|
| 94 |
+ } |
|
| 95 |
+ |
|
| 96 |
+ $arrNews[] = $arrRow; |
|
| 97 |
+ |
|
| 98 |
+ $arrNewsPlain[] = date('d.m.Y',$item['date']).' - '.$item['headline'];
|
|
| 99 |
+ $arrNewsHtml[] = '<div style="margin-bottom: 15px;"><h3>'.$arrRow['date'].' '.$arrRow['headline'].'</h3><p>'.$arrRow['teaser'].'</p>'. ($arrRow['url'] ? '<p><a href="'.$arrRow['url'].'">» Ganze Nachricht lesen...</a></p>' : '') .'</div>'; |
|
| 100 |
+ } |
|
| 101 |
+ while ($Members->next()) |
|
| 102 |
+ {
|
|
| 103 |
+ if (!$Members->nc_news_subscribe) |
|
| 104 |
+ {
|
|
| 105 |
+ continue; |
|
| 106 |
+ } |
|
| 107 |
+ |
|
| 108 |
+ //$strToken = \TokenLogin::getOrRenewUserToken($Members->current()); |
|
| 109 |
+ $strToken = ''; |
|
| 110 |
+ |
|
| 111 |
+ $Notification->send(array |
|
| 112 |
+ ( |
|
| 113 |
+ 'member_email' => $Members->email.($Members->nc_news_additionalEmail ? ','.$Members->nc_news_additionalEmail : ''), |
|
| 114 |
+ 'member_firstname' => $Members->firstname, |
|
| 115 |
+ 'member_lastname' => $Members->lastname, |
|
| 116 |
+ 'news_topics' => implode("\n",$arrNewsPlain),
|
|
| 117 |
+ 'news_topics_html' => "<ul>\n<li>".str_replace('%%_TOKEN_%%',$strToken,implode("</li>\n<li>",$arrNewsHtml))."</li>\n</ul>",
|
|
| 118 |
+ 'member_login_token' => $strToken |
|
| 119 |
+ ), |
|
| 120 |
+ $GLOBALS['TL_LANGUAGE']); |
|
| 121 |
+ } |
|
| 122 |
+ } |
|
| 123 |
+ } |
|
| 124 |
+ |
|
| 125 |
+ // Flag news as sent |
|
| 126 |
+ $arrNewsIds = array(); |
|
| 127 |
+ foreach ($News->iterateAssociative() as $newsRow) |
|
| 128 |
+ {
|
|
| 129 |
+ $arrNewsIds[] = $newsRow['id']; |
|
| 130 |
+ } |
|
| 131 |
+ $this->db->executeStatement("UPDATE tl_news SET nc_sent = '1' WHERE id IN (".implode(',',$arrNewsIds).")");
|
|
| 132 |
+ } |
|
| 133 |
+ } |
|
| 134 |
+ } |
|
| 135 |
+ $this->logger->log(LogLevel::INFO, 'News notification has been executed', array('contao' => new ContaoContext(__METHOD__, 'CRON')));
|
|
| 136 |
+ |
|
| 137 |
+ } |
|
| 138 |
+} |