| ... | ... |
@@ -7,3 +7,10 @@ services: |
| 7 | 7 |
vonRotenberg\MemberfilesBundle\: |
| 8 | 8 |
resource: ../src |
| 9 | 9 |
exclude: ../src/{VonrotenbergMemberfilesBundle.php,ContaoManager,Entity,Migrations,Model,Resources,Tests,Widget}
|
| 10 |
+ |
|
| 11 |
+ vonrotenberg.cron.secure_downloads_service: |
|
| 12 |
+ class: vonRotenberg\MemberfilesBundle\Cron\SecureDownloadsJob |
|
| 13 |
+ public: true |
|
| 14 |
+ arguments: |
|
| 15 |
+ - "@database_connection" |
|
| 16 |
+ - "@logger" |
| ... | ... |
@@ -10,4 +10,37 @@ |
| 10 | 10 |
|
| 11 | 11 |
use vonRotenberg\MemberfilesBundle\Model\SecureDownloadsModel; |
| 12 | 12 |
|
| 13 |
+/** |
|
| 14 |
+ * Notification types |
|
| 15 |
+ */ |
|
| 16 |
+$GLOBALS['NOTIFICATION_CENTER']['NOTIFICATION_TYPE']['contao']['secDownloads_submitted'] = array |
|
| 17 |
+( |
|
| 18 |
+ 'recipients' => array |
|
| 19 |
+ ( |
|
| 20 |
+ 'member_email' // The email address of the recipient |
|
| 21 |
+ ), |
|
| 22 |
+ 'email_text' => array |
|
| 23 |
+ ( |
|
| 24 |
+ 'member_firstname', // The firstname of the recipient |
|
| 25 |
+ 'member_lastname', // The lastname of the recipient |
|
| 26 |
+ 'downloads' // The names of all new files |
|
| 27 |
+ ), |
|
| 28 |
+ 'email_html' => array |
|
| 29 |
+ ( |
|
| 30 |
+ 'member_firstname', // The firstname of the recipient |
|
| 31 |
+ 'member_lastname', // The lastname of the recipient |
|
| 32 |
+ 'downloads_html', // The names of all new files |
|
| 33 |
+ ) |
|
| 34 |
+); |
|
| 35 |
+ |
|
| 36 |
+/** |
|
| 37 |
+ * Permissions |
|
| 38 |
+ */ |
|
| 39 |
+ |
|
| 40 |
+$GLOBALS['TL_PERMISSIONS'][] = 'sec_dl_access'; |
|
| 41 |
+ |
|
| 42 |
+/** |
|
| 43 |
+ * Models |
|
| 44 |
+ */ |
|
| 45 |
+ |
|
| 13 | 46 |
$GLOBALS['TL_MODELS']['tl_member_secureDownloads'] = SecureDownloadsModel::class; |
| ... | ... |
@@ -15,13 +15,15 @@ use Contao\CoreBundle\DataContainer\PaletteManipulator; |
| 15 | 15 |
*/ |
| 16 | 16 |
|
| 17 | 17 |
PaletteManipulator::create() |
| 18 |
- ->addLegend('sec_dl_legend','publish_legend',PaletteManipulator::POSITION_BEFORE)
|
|
| 19 |
- ->addField('secureDownloadsEnabled','sec_dl_legend',PaletteManipulator::POSITION_APPEND)
|
|
| 20 |
- ->applyToPalette('root','tl_page')
|
|
| 21 |
- ->applyToPalette('rootfallback','tl_page');
|
|
| 18 |
+ ->addLegend('sec_dl_legend', 'publish_legend', PaletteManipulator::POSITION_BEFORE)
|
|
| 19 |
+ ->addField('secureDownloadsEnabled', 'sec_dl_legend', PaletteManipulator::POSITION_APPEND)
|
|
| 20 |
+ ->applyToPalette('root', 'tl_page')
|
|
| 21 |
+ ->applyToPalette('rootfallback', 'tl_page');
|
|
| 22 | 22 |
|
| 23 | 23 |
$GLOBALS['TL_DCA']['tl_page']['palettes']['__selector__'][] = 'secureDownloadsEnabled'; |
| 24 |
-$GLOBALS['TL_DCA']['tl_page']['subpalettes']['secureDownloadsEnabled'] = 'secureDownloadsSRC,secureDownloadsTarget,secureDownloadsRegExp,secureDownloadsFields,sd_nc_enable,sd_nc_notification'; |
|
| 24 |
+$GLOBALS['TL_DCA']['tl_page']['palettes']['__selector__'][] = 'sd_nc_enable'; |
|
| 25 |
+$GLOBALS['TL_DCA']['tl_page']['subpalettes']['secureDownloadsEnabled'] = 'secureDownloadsSRC,secureDownloadsTarget,secureDownloadsRegExp,secureDownloadsFields,sd_nc_enable'; |
|
| 26 |
+$GLOBALS['TL_DCA']['tl_page']['subpalettes']['sd_nc_enable'] = 'sd_nc_notification'; |
|
| 25 | 27 |
|
| 26 | 28 |
|
| 27 | 29 |
/** |
| ... | ... |
@@ -29,64 +31,55 @@ $GLOBALS['TL_DCA']['tl_page']['subpalettes']['secureDownloadsEnabled'] = 'secure |
| 29 | 31 |
*/ |
| 30 | 32 |
$GLOBALS['TL_DCA']['tl_page']['fields']['secureDownloadsEnabled'] = array |
| 31 | 33 |
( |
| 32 |
- 'label' => &$GLOBALS['TL_LANG']['tl_page']['secureDownloadsEnabled'], |
|
| 33 |
- 'exclude' => true, |
|
| 34 |
- 'inputType' => 'checkbox', |
|
| 35 |
- 'eval' => array('submitOnChange'=>true),
|
|
| 36 |
- 'sql' => "char(1) NOT NULL default ''" |
|
| 34 |
+ 'exclude' => true, |
|
| 35 |
+ 'inputType' => 'checkbox', |
|
| 36 |
+ 'eval' => array('submitOnChange' => true),
|
|
| 37 |
+ 'sql' => "char(1) NOT NULL default ''" |
|
| 37 | 38 |
); |
| 38 | 39 |
$GLOBALS['TL_DCA']['tl_page']['fields']['secureDownloadsSRC'] = array |
| 39 | 40 |
( |
| 40 |
- 'label' => &$GLOBALS['TL_LANG']['tl_page']['secureDownloadsSRC'], |
|
| 41 |
- 'exclude' => true, |
|
| 42 |
- 'inputType' => 'fileTree', |
|
| 43 |
- 'eval' => array('mandatory'=>true,'fieldType'=>'radio', 'tl_class'=>'clr'),
|
|
| 44 |
- 'sql' => 'binary(16) NULL' |
|
| 41 |
+ 'exclude' => true, |
|
| 42 |
+ 'inputType' => 'fileTree', |
|
| 43 |
+ 'eval' => array('mandatory' => true, 'fieldType' => 'radio', 'tl_class' => 'clr'),
|
|
| 44 |
+ 'sql' => 'binary(16) NULL' |
|
| 45 | 45 |
); |
| 46 | 46 |
|
| 47 | 47 |
$GLOBALS['TL_DCA']['tl_page']['fields']['secureDownloadsTarget'] = array |
| 48 | 48 |
( |
| 49 |
- 'label' => &$GLOBALS['TL_LANG']['tl_page']['secureDownloadsTarget'], |
|
| 50 |
- 'exclude' => true, |
|
| 51 |
- 'inputType' => 'fileTree', |
|
| 52 |
- 'eval' => array('mandatory'=>true,'fieldType'=>'radio', 'tl_class'=>'clr'),
|
|
| 53 |
- 'sql' => 'binary(16) NULL' |
|
| 49 |
+ 'exclude' => true, |
|
| 50 |
+ 'inputType' => 'fileTree', |
|
| 51 |
+ 'eval' => array('mandatory' => true, 'fieldType' => 'radio', 'tl_class' => 'clr'),
|
|
| 52 |
+ 'sql' => 'binary(16) NULL' |
|
| 54 | 53 |
); |
| 55 | 54 |
|
| 56 | 55 |
$GLOBALS['TL_DCA']['tl_page']['fields']['secureDownloadsRegExp'] = array |
| 57 | 56 |
( |
| 58 |
- 'label' => &$GLOBALS['TL_LANG']['tl_page']['secureDownloadsRegExp'], |
|
| 59 |
- 'exclude' => true, |
|
| 60 |
- 'inputType' => 'text', |
|
| 61 |
- 'eval' => array('mandatory'=>true,'maxlength'=>64,'preserveTags'=>true,'decodeEntities'=>true),
|
|
| 62 |
- 'sql' => 'varchar(64) NULL' |
|
| 57 |
+ 'exclude' => true, |
|
| 58 |
+ 'inputType' => 'text', |
|
| 59 |
+ 'eval' => array('mandatory' => true, 'maxlength' => 64, 'preserveTags' => true, 'decodeEntities' => true),
|
|
| 60 |
+ 'sql' => 'varchar(64) NULL' |
|
| 63 | 61 |
); |
| 64 | 62 |
|
| 65 | 63 |
$GLOBALS['TL_DCA']['tl_page']['fields']['secureDownloadsFields'] = array |
| 66 | 64 |
( |
| 67 |
- 'label' => &$GLOBALS['TL_LANG']['tl_page']['secureDownloadsFields'], |
|
| 68 |
- 'exclude' => true, |
|
| 69 |
- 'inputType' => 'checkboxWizard', |
|
| 70 |
- 'options_callback' => array('tl_page_eSM_secureDownloads','getMemberProperties'),
|
|
| 71 |
- 'eval' => array('mandatory'=>true,'multiple'=>true),
|
|
| 72 |
- 'sql' => 'varchar(255) NULL' |
|
| 65 |
+ 'exclude' => true, |
|
| 66 |
+ 'inputType' => 'checkboxWizard', |
|
| 67 |
+ 'eval' => array('mandatory' => true, 'multiple' => true),
|
|
| 68 |
+ 'sql' => 'varchar(255) NULL' |
|
| 73 | 69 |
); |
| 74 | 70 |
|
| 75 | 71 |
$GLOBALS['TL_DCA']['tl_page']['fields']['sd_nc_enable'] = array |
| 76 | 72 |
( |
| 77 |
- 'label' => &$GLOBALS['TL_LANG']['tl_page']['sd_nc_enable'], |
|
| 78 |
- 'exclude' => true, |
|
| 79 |
- 'inputType' => 'checkbox', |
|
| 80 |
- 'eval' => array('tl_class'=>'w50 m12','submitOnChange'=>true),
|
|
| 81 |
- 'sql' => "char(1) NOT NULL default ''" |
|
| 73 |
+ 'exclude' => true, |
|
| 74 |
+ 'inputType' => 'checkbox', |
|
| 75 |
+ 'eval' => array('tl_class' => 'w50 m12', 'submitOnChange' => true),
|
|
| 76 |
+ 'sql' => "char(1) NOT NULL default ''" |
|
| 82 | 77 |
); |
| 83 | 78 |
|
| 84 | 79 |
$GLOBALS['TL_DCA']['tl_page']['fields']['sd_nc_notification'] = array |
| 85 | 80 |
( |
| 86 |
- 'label' => &$GLOBALS['TL_LANG']['tl_page']['sd_nc_enable'], |
|
| 87 |
- 'exclude' => true, |
|
| 88 |
- 'inputType' => 'select', |
|
| 89 |
- 'options_callback' => array('tl_page_eSM_secureDownloads', 'getNotificationChoices'),
|
|
| 90 |
- 'eval' => array('mandatory'=>true,'includeBlankOption'=>true, 'chosen'=>true, 'tl_class'=>'w50'),
|
|
| 91 |
- 'sql' => "int(10) unsigned NOT NULL default '0'" |
|
| 81 |
+ 'exclude' => true, |
|
| 82 |
+ 'inputType' => 'select', |
|
| 83 |
+ 'eval' => array('mandatory' => true, 'includeBlankOption' => true, 'chosen' => true, 'tl_class' => 'w50'),
|
|
| 84 |
+ 'sql' => "int(10) unsigned NOT NULL default '0'" |
|
| 92 | 85 |
); |
| ... | ... |
@@ -16,8 +16,8 @@ use Contao\CoreBundle\DataContainer\PaletteManipulator; |
| 16 | 16 |
PaletteManipulator::create() |
| 17 | 17 |
->addLegend('sec_dl_legend','account_legend',PaletteManipulator::POSITION_BEFORE)
|
| 18 | 18 |
->addField('sec_dl_access','sec_dl_legend',PaletteManipulator::POSITION_APPEND)
|
| 19 |
- ->applyToPalette('extend')
|
|
| 20 |
- ->applyToPalette('custom');
|
|
| 19 |
+ ->applyToPalette('extend','tl_user')
|
|
| 20 |
+ ->applyToPalette('custom','tl_user');
|
|
| 21 | 21 |
|
| 22 | 22 |
|
| 23 | 23 |
/** |
| ... | ... |
@@ -16,7 +16,7 @@ use Contao\CoreBundle\DataContainer\PaletteManipulator; |
| 16 | 16 |
PaletteManipulator::create() |
| 17 | 17 |
->addLegend('sec_dl_legend','alexf_legend',PaletteManipulator::POSITION_BEFORE)
|
| 18 | 18 |
->addField('sec_dl_access','sec_dl_legend',PaletteManipulator::POSITION_APPEND)
|
| 19 |
- ->applyToPalette('default');
|
|
| 19 |
+ ->applyToPalette('default', 'tl_user');
|
|
| 20 | 20 |
|
| 21 | 21 |
/** |
| 22 | 22 |
* Add fields to tl_user_group |
| ... | ... |
@@ -21,6 +21,10 @@ $GLOBALS['TL_LANG']['tl_page']['secureDownloadsRegExp'][0] = 'Automatisierungs-F |
| 21 | 21 |
$GLOBALS['TL_LANG']['tl_page']['secureDownloadsRegExp'][1] = 'Regulärer Ausdruck um ein oder mehrere Zuordnungsfragmente aus dem Dateinamen zu extrahieren.'; |
| 22 | 22 |
$GLOBALS['TL_LANG']['tl_page']['secureDownloadsFields'][0] = 'Fragment-Felder'; |
| 23 | 23 |
$GLOBALS['TL_LANG']['tl_page']['secureDownloadsFields'][1] = 'Felder welche den Fragmenten zugeordnet werden.'; |
| 24 |
+$GLOBALS['TL_LANG']['tl_page']['sd_nc_enable'][0] = 'Benachrichtigung senden'; |
|
| 25 |
+$GLOBALS['TL_LANG']['tl_page']['sd_nc_enable'][1] = 'Sendet eine Benachrichtigung bei neuen Dateien.'; |
|
| 26 |
+$GLOBALS['TL_LANG']['tl_page']['sd_nc_notification*'][0] = 'Benachrichtigung'; |
|
| 27 |
+$GLOBALS['TL_LANG']['tl_page']['sd_nc_notification*'][1] = 'Die Benachrichtigung, welche gesendet werden soll.'; |
|
| 24 | 28 |
|
| 25 | 29 |
/** |
| 26 | 30 |
* Legends |
| 27 | 31 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,48 @@ |
| 1 |
+<?php |
|
| 2 |
+ |
|
| 3 |
+declare(strict_types=1); |
|
| 4 |
+ |
|
| 5 |
+/* |
|
| 6 |
+ * This file is part of eSales Media SinglereisenBundle |
|
| 7 |
+ * |
|
| 8 |
+ * (c) Benjamin Roth |
|
| 9 |
+ * |
|
| 10 |
+ * @license proprietary |
|
| 11 |
+ */ |
|
| 12 |
+ |
|
| 13 |
+namespace vonRotenberg\MemberfilesBundle\Command; |
|
| 14 |
+ |
|
| 15 |
+use Contao\CoreBundle\Framework\ContaoFramework; |
|
| 16 |
+use Contao\System; |
|
| 17 |
+use Symfony\Component\Console\Command\Command; |
|
| 18 |
+use Symfony\Component\Console\Input\InputInterface; |
|
| 19 |
+use Symfony\Component\Console\Output\OutputInterface; |
|
| 20 |
+ |
|
| 21 |
+class SecureDownloadsCommand extends Command |
|
| 22 |
+{
|
|
| 23 |
+ public function __construct(ContaoFramework $framework) |
|
| 24 |
+ {
|
|
| 25 |
+ $this->framework = $framework; |
|
| 26 |
+ |
|
| 27 |
+ parent::__construct(); |
|
| 28 |
+ } |
|
| 29 |
+ |
|
| 30 |
+ protected function configure(): void |
|
| 31 |
+ {
|
|
| 32 |
+ $this |
|
| 33 |
+ ->setName('secureDownloads:sendNotifications')
|
|
| 34 |
+ ->setDescription('Sends notifications about newly added files.')
|
|
| 35 |
+ ; |
|
| 36 |
+ } |
|
| 37 |
+ |
|
| 38 |
+ protected function execute(InputInterface $input, OutputInterface $output): int |
|
| 39 |
+ {
|
|
| 40 |
+ $this->framework->initialize(); |
|
| 41 |
+ |
|
| 42 |
+ $secdl_service = System::getContainer()->get("vonrotenberg.cron.secure_downloads_service");
|
|
| 43 |
+ |
|
| 44 |
+ $secdl_service->sendFileNotifications('cli');
|
|
| 45 |
+ |
|
| 46 |
+ return 0; |
|
| 47 |
+ } |
|
| 48 |
+} |
| 0 | 49 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,45 @@ |
| 1 |
+<?php |
|
| 2 |
+ |
|
| 3 |
+declare(strict_types=1); |
|
| 4 |
+ |
|
| 5 |
+/* |
|
| 6 |
+ * This file is part of memberfiles bundle. |
|
| 7 |
+ * |
|
| 8 |
+ * (c) vonRotenberg |
|
| 9 |
+ * |
|
| 10 |
+ * @license commercial |
|
| 11 |
+ */ |
|
| 12 |
+ |
|
| 13 |
+namespace vonRotenberg\MemberfilesBundle\Cron; |
|
| 14 |
+ |
|
| 15 |
+use Contao\BackendUser; |
|
| 16 |
+use Contao\Controller; |
|
| 17 |
+use Contao\CoreBundle\ServiceAnnotation\Callback; |
|
| 18 |
+use Contao\DataContainer; |
|
| 19 |
+use Contao\System; |
|
| 20 |
+use Doctrine\DBAL\Connection; |
|
| 21 |
+use Psr\Log\LoggerInterface; |
|
| 22 |
+ |
|
| 23 |
+class SecureDownloadsJob |
|
| 24 |
+{
|
|
| 25 |
+ |
|
| 26 |
+ /** @var LoggerInterface */ |
|
| 27 |
+ private $logger; |
|
| 28 |
+ |
|
| 29 |
+ /** @var Connection */ |
|
| 30 |
+ protected $db; |
|
| 31 |
+ |
|
| 32 |
+ public function __construct(Connection $db, LoggerInterface $logger) |
|
| 33 |
+ {
|
|
| 34 |
+ $this->logger = $logger; |
|
| 35 |
+ $this->db = $db; |
|
| 36 |
+ } |
|
| 37 |
+ |
|
| 38 |
+ /** |
|
| 39 |
+ * @CronJob("* * * * *")
|
|
| 40 |
+ */ |
|
| 41 |
+ public function sendFileNotifications(string $scope) |
|
| 42 |
+ {
|
|
| 43 |
+ |
|
| 44 |
+ } |
|
| 45 |
+} |
| ... | ... |
@@ -38,7 +38,7 @@ class MemberListener {
|
| 38 | 38 |
} |
| 39 | 39 |
|
| 40 | 40 |
/** |
| 41 |
- * @Callback(table="tl_member", target="list.operations.secureDownloads.button" |
|
| 41 |
+ * @Callback(table="tl_member", target="list.operations.secureDownloads.button") |
|
| 42 | 42 |
*/ |
| 43 | 43 |
public function onListSecureDownloadsOperationCallback(array $row, ?string $href, string $label, string $title, ?string $icon, string $attributes, string $table, array $rootRecordIds, ?array $childRecordIds, bool $circularReference, ?string $previous, ?string $next, DataContainer $dc) |
| 44 | 44 |
{
|
| ... | ... |
@@ -49,7 +49,7 @@ class MemberSecureDownloadsListener {
|
| 49 | 49 |
} |
| 50 | 50 |
|
| 51 | 51 |
/** |
| 52 |
- * @Callback(table="tl_member_secureDownloads", target="list.operations.edit.button" |
|
| 52 |
+ * @Callback(table="tl_member_secureDownloads", target="list.operations.edit.button") |
|
| 53 | 53 |
*/ |
| 54 | 54 |
public function onListEditOperationCallback(array $row, ?string $href, string $label, string $title, ?string $icon, string $attributes, string $table, array $rootRecordIds, ?array $childRecordIds, bool $circularReference, ?string $previous, ?string $next, DataContainer $dc) |
| 55 | 55 |
{
|
| ... | ... |
@@ -68,7 +68,7 @@ class MemberSecureDownloadsListener {
|
| 68 | 68 |
} |
| 69 | 69 |
|
| 70 | 70 |
/** |
| 71 |
- * @Callback(table="tl_member_secureDownloads", target="list.operations.delete.button" |
|
| 71 |
+ * @Callback(table="tl_member_secureDownloads", target="list.operations.delete.button") |
|
| 72 | 72 |
*/ |
| 73 | 73 |
public function onListDeleteOperationCallback(array $row, ?string $href, string $label, string $title, ?string $icon, string $attributes, string $table, array $rootRecordIds, ?array $childRecordIds, bool $circularReference, ?string $previous, ?string $next, DataContainer $dc) |
| 74 | 74 |
{
|
| ... | ... |
@@ -88,7 +88,7 @@ class MemberSecureDownloadsListener {
|
| 88 | 88 |
} |
| 89 | 89 |
|
| 90 | 90 |
/** |
| 91 |
- * @Callback(table="tl_member_secureDownloads", target="list.operations.show.button" |
|
| 91 |
+ * @Callback(table="tl_member_secureDownloads", target="list.operations.show.button") |
|
| 92 | 92 |
*/ |
| 93 | 93 |
public function onListShowOperationCallback(array $row, ?string $href, string $label, string $title, ?string $icon, string $attributes, string $table, array $rootRecordIds, ?array $childRecordIds, bool $circularReference, ?string $previous, ?string $next, DataContainer $dc) |
| 94 | 94 |
{
|
| ... | ... |
@@ -31,7 +31,7 @@ class PageListener {
|
| 31 | 31 |
} |
| 32 | 32 |
|
| 33 | 33 |
/** |
| 34 |
- * @Callback(table="tl_page", target="fields.secureDownloadsFields.options" |
|
| 34 |
+ * @Callback(table="tl_page", target="fields.secureDownloadsFields.options") |
|
| 35 | 35 |
*/ |
| 36 | 36 |
public function onSecureDownloadsFieldsOptionsCallback(?DataContainer $dc) |
| 37 | 37 |
{
|
| ... | ... |
@@ -52,7 +52,7 @@ class PageListener {
|
| 52 | 52 |
} |
| 53 | 53 |
|
| 54 | 54 |
/** |
| 55 |
- * @Callback(table="tl_page", target="fields.sd_nc_notification.options" |
|
| 55 |
+ * @Callback(table="tl_page", target="fields.sd_nc_notification.options") |
|
| 56 | 56 |
*/ |
| 57 | 57 |
public function onSdNcNotificationOptionsCallback(?DataContainer $dc) |
| 58 | 58 |
{
|