/**
  * Send lead data using given notification
  *
  * @param int                                    $leadId
  * @param FormModel                              $form
  * @param \NotificationCenter\Model\Notification $notification
  *
  * @return bool
  */
 public static function send($leadId, \FormModel $form, \NotificationCenter\Model\Notification $notification)
 {
     $data = array();
     $labels = array();
     $leadDataCollection = \Database::getInstance()->prepare("\n            SELECT\n                name,\n                value,\n                (SELECT label FROM tl_form_field WHERE tl_form_field.id=tl_lead_data.field_id) AS fieldLabel\n            FROM tl_lead_data\n            WHERE pid=?\n        ")->execute($leadId);
     // Generate the form data and labels
     while ($leadDataCollection->next()) {
         $data[$leadDataCollection->name] = $leadDataCollection->value;
         $labels[$leadDataCollection->name] = $leadDataCollection->fieldLabel ?: $leadDataCollection->name;
     }
     $formHelper = new \NotificationCenter\tl_form();
     // Send the notification
     $result = $notification->send($formHelper->generateTokens($data, $form->row(), array(), $labels));
     return !in_array(false, $result);
 }
 /**
  * Send a lost password e-mail
  * @param object
  */
 protected function sendPasswordLink($objMember)
 {
     $objNotification = \NotificationCenter\Model\Notification::findByPk($this->nc_notification);
     if ($objNotification === null) {
         $this->log('The notification was not found ID ' . $this->nc_notification, __METHOD__, TL_ERROR);
         return;
     }
     $confirmationId = md5(uniqid(mt_rand(), true));
     // Store the confirmation ID
     $objMember = \MemberModel::findByPk($objMember->id);
     $objMember->activation = $confirmationId;
     $objMember->save();
     $arrTokens = array();
     // Add member tokens
     foreach ($objMember->row() as $k => $v) {
         $arrTokens['member_' . $k] = $v;
     }
     $arrTokens['recipient_email'] = $objMember->email;
     $arrTokens['domain'] = \Idna::decode(\Environment::get('host'));
     $arrTokens['link'] = \Idna::decode(\Environment::get('base')) . \Environment::get('request') . ($GLOBALS['TL_CONFIG']['disableAlias'] || strpos(\Environment::get('request'), '?') !== false ? '&' : '?') . 'token=' . $confirmationId;
     $objNotification->send($arrTokens);
     $this->log('A new password has been requested for user ID ' . $objMember->id . ' (' . $objMember->email . ')', __METHOD__, TL_ACCESS);
     // Check whether there is a jumpTo page
     if (($objJumpTo = $this->objModel->getRelated('jumpTo')) !== null) {
         $this->jumpToOrReload($objJumpTo->row());
     }
     $this->reload();
 }
 public static function sendNotification($intSubmission, $intNotification, $arrTokens = array())
 {
     $arrTokens += static::generateTokens($intSubmission);
     if (($objNotification = Notification::findByPk($intNotification)) !== null) {
         $objNotification->submission = $intSubmission;
         $objNotification->send($arrTokens, $GLOBALS['TL_LANGUAGE']);
     }
 }
 public static function addSubscriptions(Order $objOrder, $arrTokens)
 {
     $strEmail = $objOrder->getBillingAddress()->email;
     $objAddress = $objOrder->getShippingAddress() ?: $objOrder->getBillingAddress();
     $arrItems = $objOrder->getItems();
     $objSession = \Session::getInstance();
     if (!($intModule = $objSession->get('isotopeCheckoutModuleIdSubscriptions'))) {
         return true;
     }
     $objSession->remove('isotopeCheckoutModuleIdSubscriptions');
     $objModule = \ModuleModel::findByPk($intModule);
     foreach ($arrItems as $item) {
         switch ($objModule->iso_direct_checkout_product_mode) {
             case 'product_type':
                 $objFieldpalette = FieldPaletteModel::findBy('iso_direct_checkout_product_type', Standard::findAvailableByIdOrAlias($item->product_id)->type);
                 break;
             default:
                 $objFieldpalette = FieldPaletteModel::findBy('iso_direct_checkout_product', $item->product_id);
                 break;
         }
         if ($objFieldpalette !== null && $objFieldpalette->iso_addSubscription) {
             if ($objFieldpalette->iso_subscriptionArchive && (!$objFieldpalette->iso_addSubscriptionCheckbox || \Input::post('subscribeToProduct_' . $item->product_id))) {
                 $objSubscription = Subscription::findOneBy(array('email=?', 'pid=?', 'activation!=?', 'disable=?'), array($strEmail, $objFieldpalette->iso_subscriptionArchive, '', 1));
                 if (!$objSubscription) {
                     $objSubscription = new Subscription();
                 }
                 if ($objFieldpalette->iso_addActivation) {
                     $strToken = md5(uniqid(mt_rand(), true));
                     $objSubscription->disable = true;
                     $objSubscription->activation = $strToken;
                     if (($objNotification = Notification::findByPk($objFieldpalette->iso_activationNotification)) !== null) {
                         if ($objFieldpalette->iso_activationJumpTo && ($objPageRedirect = \PageModel::findByPk($objFieldpalette->iso_activationJumpTo)) !== null) {
                             $arrTokens['link'] = \Environment::get('url') . '/' . \Controller::generateFrontendUrl($objPageRedirect->row()) . '?token=' . $strToken;
                         }
                         $objNotification->send($arrTokens, $GLOBALS['TL_LANGUAGE']);
                     }
                 }
                 $arrAddressFields = \Config::get('iso_addressFields');
                 if ($arrAddressFields === null) {
                     $arrAddressFields = serialize(array_keys(static::getIsotopeAddressFields()));
                 }
                 foreach (deserialize($arrAddressFields, true) as $strName) {
                     $objSubscription->{$strName} = $objAddress->{$strName};
                 }
                 $objSubscription->email = $strEmail;
                 $objSubscription->pid = $objFieldpalette->iso_subscriptionArchive;
                 $objSubscription->tstamp = $objSubscription->dateAdded = time();
                 $objSubscription->quantity = \Input::post('quantity');
                 $objSubscription->order_id = $objOrder->id;
                 $objSubscription->save();
             }
         }
     }
     return true;
 }
 /**
  * Check if the message can be member customizable
  * @category save_callback
  *
  * @param mixed          $varValue
  * @param \DataContainer $dc
  *
  * @return mixed
  * @throws \Exception
  */
 public function checkMessageMemberCustomizable($varValue, $dc)
 {
     /** @noinspection PhpUndefinedMethodInspection */
     $objNotification = Notification::findByPk($dc->activeRecord->pid);
     $strNotificationType = Notification::findGroupForType($objNotification->type);
     // Check the allowed tokens corresponding for this notification type
     foreach ($GLOBALS['NOTIFICATION_CENTER']['NOTIFICATION_TYPE'][$strNotificationType][$objNotification->type] as $field => $tokens) {
         // We have to check whether the member id will be passed to the message as token
         if (in_array('member_id', $tokens) || in_array('member_*', $tokens)) {
             return $varValue;
         }
     }
     throw new \Exception($GLOBALS['TL_LANG']['ERR']['messageNotMemberCustomizable']);
 }
 /**
  * Send notifications.
  *
  * @param bool $clear Clear notifications after sending them.
  *
  * @return void
  */
 public function send($clear = true)
 {
     $notificationIds = array_keys($this->notifications);
     $collection = Notification::findMultipleByIds($notificationIds);
     if ($collection) {
         foreach ($collection as $notification) {
             $message = $this->notifications[$collection->id];
             $notification->current()->send($message['data'], $message['language']);
         }
     }
     if ($clear) {
         $this->clear();
     }
 }
 /**
  * Send the news message
  * @param integer
  * @return boolean
  */
 public function sendNewsMessage($intId)
 {
     $objNews = \NewsModel::findByPk($intId);
     if ($objNews === null) {
         return false;
     }
     $objArchive = $objNews->getRelated('pid');
     if ($objArchive === null || !$objArchive->newsletter || !$objArchive->newsletter_channel || !$objArchive->nc_notification) {
         return false;
     }
     $objNotification = \NotificationCenter\Model\Notification::findByPk($objArchive->nc_notification);
     if ($objNotification === null) {
         return false;
     }
     $objRecipients = \NewsletterRecipientsModel::findBy(array("pid=? AND active=1"), $objArchive->newsletter_channel);
     if ($objRecipients === null) {
         return false;
     }
     $arrTokens = array();
     // Generate news archive tokens
     foreach ($objArchive->row() as $k => $v) {
         $arrTokens['news_archive_' . $k] = \Haste\Util\Format::dcaValue('tl_news_archive', $k, $v);
     }
     // Generate news tokens
     foreach ($objNews->row() as $k => $v) {
         $arrTokens['news_' . $k] = \Haste\Util\Format::dcaValue('tl_news', $k, $v);
     }
     $arrTokens['news_text'] = '';
     $objElement = \ContentModel::findPublishedByPidAndTable($objNews->id, 'tl_news');
     // Generate news text
     if ($objElement !== null) {
         while ($objElement->next()) {
             $arrTokens['news_text'] .= $this->getContentElement($objElement->id);
         }
     }
     // Generate news URL
     $objPage = \PageModel::findWithDetails($objNews->getRelated('pid')->jumpTo);
     $arrTokens['news_url'] = ($objPage->rootUseSSL ? 'https://' : 'http://') . ($objPage->domain ?: \Environment::get('host')) . TL_PATH . '/' . $objPage->getFrontendUrl(($GLOBALS['TL_CONFIG']['useAutoItem'] && !$GLOBALS['TL_CONFIG']['disableAlias'] ? '/' : '/items/') . (!$GLOBALS['TL_CONFIG']['disableAlias'] && $objNews->alias != '' ? $objNews->alias : $objNews->id), $objPage->language);
     // Administrator e-mail
     $arrTokens['admin_email'] = $GLOBALS['TL_ADMIN_EMAIL'];
     while ($objRecipients->next()) {
         $arrTokens['recipient_email'] = $objRecipients->email;
         $objNotification->send($arrTokens);
     }
     // Set the newsletter flag
     $objNews->newsletter = 1;
     $objNews->save();
     return true;
 }
 /**
  * Verify tokens
  * @param   string Text
  * @param   \DataContainer
  */
 public function verifyTokens($rgxp, $strText, $objWidget)
 {
     if ($rgxp != 'nc_tokens') {
         return false;
     }
     $strGroup = NotificationModel::findGroupForType(static::$strType);
     $arrValidTokens = (array) $GLOBALS['NOTIFICATION_CENTER']['NOTIFICATION_TYPE'][$strGroup][static::$strType][$objWidget->name];
     // Build regex pattern
     $strPattern = '/##(' . implode('|', $arrValidTokens) . ')##/i';
     $strPattern = str_replace('*', '[^##]*', $strPattern);
     preg_match_all($strPattern, $strText, $arrValidMatches);
     preg_match_all('/##([A-Za-z0-9_]+)##/i', $strText, $arrAllMatches);
     $arrInvalidTokens = array_diff($arrAllMatches[1], $arrValidMatches[1]);
     if (count($arrInvalidTokens)) {
         $strInvalidTokens = '##' . implode('##, ##', $arrInvalidTokens) . '##';
         $objWidget->addError(sprintf($GLOBALS['TL_LANG']['tl_nc_language']['token_error'], $strInvalidTokens));
     }
     return true;
 }
 /**
  * Send a lost password e-mail
  *
  * @param \MemberModel $objMember
  */
 protected function sendPasswordLink($objMember)
 {
     $objNotification = \NotificationCenter\Model\Notification::findByPk($this->nc_notification);
     if ($objNotification === null) {
         $this->log('The notification was not found ID ' . $this->nc_notification, __METHOD__, TL_ERROR);
         return;
     }
     $confirmationId = md5(uniqid(mt_rand(), true));
     // Store the confirmation ID
     $objMember = \MemberModel::findByPk($objMember->id);
     $objMember->activation = $confirmationId;
     $objMember->save();
     $arrTokens = array();
     // Add member tokens
     foreach ($objMember->row() as $k => $v) {
         if (\Validator::isBinaryUuid($v)) {
             $v = \StringUtil::binToUuid($v);
         }
         $arrTokens['member_' . $k] = specialchars($v);
     }
     // FIX: Add salutation token
     $arrTokens['salutation_user'] = NotificationCenterPlus::createSalutation($GLOBALS['TL_LANGUAGE'], $objMember);
     // ENDFIX
     $arrTokens['recipient_email'] = $objMember->email;
     $arrTokens['domain'] = \Idna::decode(\Environment::get('host'));
     $arrTokens['link'] = \Idna::decode(\Environment::get('base')) . \Environment::get('request') . ($GLOBALS['TL_CONFIG']['disableAlias'] || strpos(\Environment::get('request'), '?') !== false ? '&' : '?') . 'token=' . $confirmationId;
     // FIX: Add custom change password jump to
     if (($objJumpTo = $this->objModel->getRelated('changePasswordJumpTo')) !== null) {
         $arrTokens['link'] = \Idna::decode(\Environment::get('base')) . \Controller::generateFrontendUrl($objJumpTo->row(), '?token=' . $confirmationId);
     }
     // ENDFIX
     $objNotification->send($arrTokens, $GLOBALS['TL_LANGUAGE']);
     $this->log('A new password has been requested for user ID ' . $objMember->id . ' (' . $objMember->email . ')', __METHOD__, TL_ACCESS);
     // Check whether there is a jumpTo page
     if (($objJumpTo = $this->objModel->getRelated('jumpTo')) !== null) {
         $this->jumpToOrReload($objJumpTo->row());
     }
     StatusMessage::addSuccess(sprintf($GLOBALS['TL_LANG']['notification_center_plus']['sendPasswordLink']['messageSuccess'], $arrTokens['recipient_email']), $this->objModel->id);
     $this->reload();
 }
 public static function sendNotification($intId, $arrTokens)
 {
     if (($objNotification = Notification::findByPk($intId)) !== null) {
         $objNotification->send($arrTokens, $GLOBALS['TL_LANGUAGE']);
     }
 }
 /**
  * Send the personal data change e-mail
  * @param object
  * @param array
  * @param object
  */
 public function sendPersonalDataEmail($objUser, $arrData, $objModule)
 {
     if (!$objModule->nc_notification) {
         return;
     }
     $arrTokens = array();
     $arrTokens['admin_email'] = $GLOBALS['TL_ADMIN_EMAIL'];
     $arrTokens['domain'] = \Environment::get('host');
     // Support newsletters
     if (in_array('newsletter', $this->Config->getActiveModules())) {
         if (!is_array($arrData['newsletter'])) {
             if ($arrData['newsletter'] != '') {
                 $objChannels = \Database::getInstance()->execute("SELECT title FROM tl_newsletter_channel WHERE id IN(" . implode(',', array_map('intval', (array) $arrData['newsletter'])) . ")");
                 $arrTokens['member_newsletter'] = implode("\n", $objChannels->fetchEach('title'));
             } else {
                 $arrTokens['member_newsletter'] = '';
             }
         }
     }
     // Translate/format old values
     foreach ($_SESSION['PERSONAL_DATA'] as $strFieldName => $strFieldValue) {
         $arrTokens['member_old_' . $strFieldName] = \Haste\Util\Format::dcaValue('tl_member', $strFieldName, $strFieldValue);
     }
     // Translate/format new values
     foreach ($arrData as $strFieldName => $strFieldValue) {
         $arrTokens['member_' . $strFieldName] = \Haste\Util\Format::dcaValue('tl_member', $strFieldName, $strFieldValue);
     }
     $objNotification = \NotificationCenter\Model\Notification::findByPk($objModule->nc_notification);
     if ($objNotification !== null) {
         $objNotification->send($arrTokens);
     }
 }
 public static function sendOrderNotification($objOrder, $arrTokens)
 {
     $arrItems = $objOrder->getItems();
     // only send one one notification per product type and order
     $arrProductTypes = array();
     foreach ($arrItems as $objItem) {
         $arrProductTypes[] = $objItem->getProduct()->type;
     }
     foreach (array_unique($arrProductTypes) as $intProductType) {
         if (($objProductType = ProductType::findByPk($intProductType)) !== null) {
             if ($objProductType->sendOrderNotification && ($objNotification = Notification::findByPk($objProductType->orderNotification)) !== null) {
                 if ($objProductType->removeOtherProducts) {
                     $objNotification->send(static::getCleanTokens($intProductType, $objOrder, $objNotification, $arrTokens), $GLOBALS['TL_LANGUAGE']);
                 } else {
                     $objNotification->send($arrTokens, $GLOBALS['TL_LANGUAGE']);
                 }
             }
         }
     }
 }
Exemple #13
0
 /**
  * Send the notification
  */
 public function sendNotification()
 {
     if (!\Input::get('master') || !\Leads\NotificationCenterIntegration::available(true)) {
         \Controller::redirect('contao/main.php?act=error');
     }
     // No need to check for null as NotificationCenterIntegration::available(true) already does
     $notificationsCollection = \NotificationCenter\Model\Notification::findBy('type', 'core_form');
     $notifications = [];
     // Generate the notifications
     foreach ($notificationsCollection as $notification) {
         $notifications[$notification->id] = $notification->title;
     }
     // Process the form
     if ('tl_leads_notification' === \Input::post('FORM_SUBMIT')) {
         /**
          * @var \FormModel                             $form
          * @var \NotificationCenter\Model\Notification $notification
          */
         if (!isset($notifications[\Input::post('notification')]) || !is_array(\Input::post('IDS')) || ($form = \FormModel::findByPk(\Input::get('master'))) === null || null === ($notification = \NotificationCenter\Model\Notification::findByPk(\Input::post('notification')))) {
             \Controller::reload();
         }
         if (\Input::get('id')) {
             $ids = [(int) \Input::get('id')];
         } else {
             $session = \Session::getInstance()->getData();
             $ids = array_map('intval', $session['CURRENT']['IDS']);
         }
         foreach ($ids as $id) {
             if (\Leads\NotificationCenterIntegration::send($id, $form, $notification)) {
                 \Message::addConfirmation(sprintf($GLOBALS['TL_LANG']['tl_lead']['notification_confirm'], $id));
             }
         }
         \Controller::redirect($this->getReferer());
     }
     return \Leads\NotificationCenterIntegration::generateForm($notifications, [\Input::get('id')]);
 }
 /**
  * Get notification ids.
  *
  * @return array
  */
 public function getNotificationIds()
 {
     $collection = Notification::findBy(array('type LIKE ?'), 'workflow_%');
     return OptionsBuilder::fromCollection($collection, 'id', 'title')->groupBy('type')->getOptions();
 }
 /**
  * Send a notification when address has been changed
  *
  * @param Address $objAddress
  * @param array   $arrOldAddress
  * @param \User   $objMember
  * @param Config  $objConfig
  */
 protected function triggerNotificationCenter(Address $objAddress, array $arrOldAddress, \User $objMember, Config $objConfig)
 {
     if (!$this->nc_notification) {
         return;
     }
     /** @type Notification $objNotification */
     $objNotification = Notification::findByPk($this->nc_notification);
     if (null === $objNotification) {
         return;
     }
     $arrTokens = array();
     $arrTokens['admin_email'] = $GLOBALS['TL_ADMIN_EMAIL'];
     $arrTokens['domain'] = \Environment::get('host');
     $arrTokens['link'] = \Environment::get('base') . \Environment::get('request');
     foreach ($objAddress->row() as $k => $v) {
         $arrTokens['address_' . $k] = $v;
     }
     foreach ($arrOldAddress as $k => $v) {
         $arrTokens['address_old_' . $k] = $v;
     }
     foreach ($objMember->getData() as $k => $v) {
         $arrTokens['member_' . $k] = $v;
     }
     foreach ($objConfig->row() as $k => $v) {
         $arrTokens['config_' . $k] = $v;
     }
     $objNotification->send($arrTokens);
 }
 /**
  * @category ISO_HOOKS: postCheckout
  *
  * @param ProductCollection\Order $order
  * @param array                   $tokens
  *
  */
 public function updateStockPostCheckout(ProductCollection\Order $order, array $tokens)
 {
     foreach ($order->getItems() as $item) {
         /** @var Product|\Model $product */
         $product = $item->getProduct();
         $productType = $product->getRelated('type');
         if ($productType->stockmanagement_active) {
             // Book stock change
             /** @var Stock|\Model $stockChange */
             $stockChange = new Stock();
             $stockChange->tstamp = time();
             $stockChange->pid = $product->id;
             $stockChange->product_collection_id = $order->id;
             $stockChange->quantity = -1 * (int) $item->quantity;
             $stockChange->source = Stock::STOCKMANAGEMENT_SOURCE_ORDER;
             $stockChange->save();
             // Fetch current stock
             $stock = Stock::getStockForProduct($product->id);
             // Disable product if necessary
             if ($productType->stockmanagement_disableProduct && false !== $stock && $stock < 1) {
                 $product->published = '';
                 $product->save();
             }
             // Send stock change notifications
             if ($productType->stockmanagement_notification) {
                 $notifications = deserialize($productType->stockmanagement_notifications);
                 foreach ($notifications as $notification) {
                     if ($stock <= $notification['threshold']) {
                         /** @noinspection PhpUndefinedMethodInspection */
                         /** @var Notification $notificationCenter */
                         $notificationCenter = Notification::findByPk($notification['nc_id']);
                         if (null !== $notificationCenter) {
                             $notificationCenter->send(self::createStockChangeNotifictionTokens($product, $order));
                         }
                         // Do not send multiple notifications
                         break;
                     }
                 }
             }
         }
     }
 }
Exemple #17
0
 /**
  * Retrieve the array of notification data for parsing simple tokens
  *
  * @param int $intNotification
  *
  * @return array
  */
 public function getNotificationTokens($intNotification)
 {
     /** @type \Isotope\Model\Config $objConfig */
     $objConfig = $this->getRelated('config_id');
     $arrTokens = deserialize($this->email_data, true);
     $arrTokens['uniqid'] = $this->uniqid;
     $arrTokens['order_status_id'] = $this->order_status;
     $arrTokens['order_status'] = $this->getStatusLabel();
     $arrTokens['recipient_email'] = $this->getEmailRecipient();
     $arrTokens['order_id'] = $this->id;
     $arrTokens['order_items'] = $this->sumItemsQuantity();
     $arrTokens['order_products'] = $this->countItems();
     $arrTokens['order_subtotal'] = Isotope::formatPriceWithCurrency($this->getSubtotal(), false);
     $arrTokens['order_total'] = Isotope::formatPriceWithCurrency($this->getTotal(), false);
     $arrTokens['document_number'] = $this->document_number;
     $arrTokens['cart_html'] = '';
     $arrTokens['cart_text'] = '';
     $arrTokens['document'] = '';
     // Add all the collection fields
     foreach ($this->row() as $k => $v) {
         $arrTokens['collection_' . $k] = $v;
     }
     // Add billing/customer address fields
     if (($objAddress = $this->getBillingAddress()) !== null) {
         foreach ($objAddress->row() as $k => $v) {
             $arrTokens['billing_address_' . $k] = Format::dcaValue($objAddress->getTable(), $k, $v);
             // @deprecated (use ##billing_address_*##)
             $arrTokens['billing_' . $k] = $arrTokens['billing_address_' . $k];
         }
         $arrTokens['billing_address'] = $objAddress->generate($objConfig->getBillingFieldsConfig());
         // @deprecated (use ##billing_address##)
         $arrTokens['billing_address_text'] = $arrTokens['billing_address'];
     }
     // Add shipping address fields
     if (($objAddress = $this->getShippingAddress()) !== null) {
         foreach ($objAddress->row() as $k => $v) {
             $arrTokens['shipping_address_' . $k] = Format::dcaValue($objAddress->getTable(), $k, $v);
             // @deprecated (use ##billing_address_*##)
             $arrTokens['shipping_' . $k] = $arrTokens['shipping_address_' . $k];
         }
         $arrTokens['shipping_address'] = $objAddress->generate($objConfig->getShippingFieldsConfig());
         // Shipping address equals billing address
         // @deprecated (use ##shipping_address##)
         if ($objAddress->id == $this->getBillingAddress()->id) {
             $arrTokens['shipping_address_text'] = $this->requiresPayment() ? $GLOBALS['TL_LANG']['MSC']['useBillingAddress'] : $GLOBALS['TL_LANG']['MSC']['useCustomerAddress'];
         } else {
             $arrTokens['shipping_address_text'] = $arrTokens['shipping_address'];
         }
     }
     // Add payment method info
     if ($this->hasPayment() && ($objPayment = $this->getPaymentMethod()) !== null) {
         $arrTokens['payment_id'] = $objPayment->id;
         $arrTokens['payment_label'] = $objPayment->getLabel();
         $arrTokens['payment_note'] = $objPayment->note;
     }
     // Add shipping method info
     if ($this->hasShipping() && ($objShipping = $this->getShippingMethod()) !== null) {
         $arrTokens['shipping_id'] = $objShipping->id;
         $arrTokens['shipping_label'] = $objShipping->getLabel();
         $arrTokens['shipping_note'] = $objShipping->note;
     }
     // Add config fields
     if ($this->getRelated('config_id') !== null) {
         foreach ($this->getRelated('config_id')->row() as $k => $v) {
             $arrTokens['config_' . $k] = Format::dcaValue($this->getRelated('config_id')->getTable(), $k, $v);
         }
     }
     // Add member fields
     if ($this->member > 0 && $this->getRelated('member') !== null) {
         foreach ($this->getRelated('member')->row() as $k => $v) {
             $arrTokens['member_' . $k] = Format::dcaValue($this->getRelated('member')->getTable(), $k, $v);
         }
     }
     if ($intNotification > 0 && ($objNotification = Notification::findByPk($intNotification)) !== null) {
         $objTemplate = new \Isotope\Template($objNotification->iso_collectionTpl);
         $objTemplate->isNotification = true;
         $this->addToTemplate($objTemplate, array('gallery' => $objNotification->iso_gallery, 'sorting' => $this->getItemsSortingCallable($objNotification->iso_orderCollectionBy)));
         $arrTokens['cart_html'] = Haste::getInstance()->call('replaceInsertTags', array($objTemplate->parse(), false));
         $objTemplate->textOnly = true;
         $arrTokens['cart_text'] = strip_tags(Haste::getInstance()->call('replaceInsertTags', array($objTemplate->parse(), true)));
         // Generate and "attach" document
         /** @var \Isotope\Interfaces\IsotopeDocument $objDocument */
         if ($objNotification->iso_document > 0 && ($objDocument = Document::findByPk($objNotification->iso_document)) !== null) {
             $strFilePath = $objDocument->outputToFile($this, TL_ROOT . '/system/tmp');
             $arrTokens['document'] = str_replace(TL_ROOT . '/', '', $strFilePath);
         }
     }
     // !HOOK: add custom email tokens
     if (isset($GLOBALS['ISO_HOOKS']['getOrderNotificationTokens']) && is_array($GLOBALS['ISO_HOOKS']['getOrderNotificationTokens'])) {
         foreach ($GLOBALS['ISO_HOOKS']['getOrderNotificationTokens'] as $callback) {
             $objCallback = \System::importStatic($callback[0]);
             $arrTokens = $objCallback->{$callback}[1]($this, $arrTokens);
         }
     }
     return $arrTokens;
 }
 */
$GLOBALS['TL_DCA'][$table]['palettes']['__selector__'][] = 'stockmanagement_active';
$GLOBALS['TL_DCA'][$table]['palettes']['__selector__'][] = 'stockmanagement_notification';
$GLOBALS['TL_DCA'][$table]['palettes']['standard'] .= ';{stockmanagement_legend},stockmanagement_active';
/**
 * SubPalettes
 */
$GLOBALS['TL_DCA'][$table]['subpalettes']['stockmanagement_active'] = 'stockmanagement_disableProduct,stockmanagement_notification';
$GLOBALS['TL_DCA'][$table]['subpalettes']['stockmanagement_notification'] = 'stockmanagement_notifications';
/**
 * Fields
 */
$GLOBALS['TL_DCA'][$table]['fields']['stockmanagement_active'] = ['label' => &$GLOBALS['TL_LANG'][$table]['stockmanagement_active'], 'inputType' => 'checkbox', 'eval' => ['tl_class' => 'w50', 'submitOnChange' => true], 'sql' => "char(1) NOT NULL default ''"];
$GLOBALS['TL_DCA'][$table]['fields']['stockmanagement_notification'] = ['label' => &$GLOBALS['TL_LANG'][$table]['stockmanagement_notification'], 'inputType' => 'checkbox', 'eval' => ['tl_class' => 'w50', 'submitOnChange' => true], 'sql' => "char(1) NOT NULL default ''"];
$GLOBALS['TL_DCA'][$table]['fields']['stockmanagement_notifications'] = ['label' => &$GLOBALS['TL_LANG'][$table]['stockmanagement_notifications'], 'inputType' => 'multiColumnWizard', 'eval' => ['tl_class' => 'clr', 'columnFields' => ['threshold' => ['inputType' => 'text', 'label' => &$GLOBALS['TL_LANG'][$table]['stockmanagement_notifications_threshold'], 'eval' => ['rgxp' => 'digit', 'mandatory' => true, 'style' => 'width:60px;text-align:right']], 'nc_id' => ['inputType' => 'select', 'label' => &$GLOBALS['TL_LANG'][$table]['stockmanagement_notifications_nc_id'], 'eval' => ['mandatory' => true], 'options_callback' => function () {
    /** @var Notification|\Model\Collection $notifications */
    /** @noinspection PhpUndefinedMethodInspection */
    $notifications = Notification::findBy('type', 'iso_stockmanagement_change');
    if (null === $notifications) {
        return [];
    }
    return $notifications->fetchEach('title');
}]], 'buttons' => ['up' => false, 'down' => false]], 'save_callback' => [function ($value) {
    $value = deserialize($value);
    $thresholds = array_reduce($value, function ($carry, $item) {
        return array_merge($carry, [$item['threshold']]);
    }, []);
    array_multisort($thresholds, SORT_NUMERIC, $value);
    return serialize($value);
}], 'sql' => "text NULL"];
$GLOBALS['TL_DCA'][$table]['fields']['stockmanagement_disableProduct'] = ['label' => &$GLOBALS['TL_LANG'][$table]['stockmanagement_disableProduct'], 'inputType' => 'checkbox', 'eval' => ['tl_class' => 'w50'], 'sql' => "char(1) NOT NULL default ''"];
 /**
  * Generate the module
  */
 protected function compile()
 {
     /** @var Message|\Model\Collection $objMessages */
     /** @noinspection PhpUndefinedMethodInspection */
     $objMessages = Message::findBy(array('pid IN (' . implode(',', $this->nc_member_customizable_notifications) . ') AND member_customizable<>\'\''), array());
     $arrOptions = array();
     $arrSelected = array();
     while ($objMessages->next()) {
         if (MemberMessages::memberHasSelected(\FrontendUser::getInstance()->id, $objMessages->id)) {
             $arrSelected[$objMessages->pid][] = $objMessages->id;
         }
         // Fetch tokens for parsing the option labels
         $objNotification = $objMessages->getRelated('pid');
         $objGateway = $objMessages->getRelated('gateway');
         $arrTokens = array_merge(array_combine(array_map(function ($key) {
             return 'message_' . $key;
         }, array_keys($objMessages->row())), $objMessages->row()), array_combine(array_map(function ($key) {
             return 'notification_' . $key;
         }, array_keys($objNotification->row())), $objNotification->row()), array_combine(array_map(function ($key) {
             return 'gateway_' . $key;
         }, array_keys($objGateway->row())), $objGateway->row()));
         $arrOptions[$objMessages->pid][$objMessages->id] = \StringUtil::parseSimpleTokens($this->nc_member_customizable_label ?: '##message_title## (##gateway_title##)', $arrTokens);
     }
     $objForm = new Form('tl_select_notifications', 'POST', function ($objHaste) {
         /** @noinspection PhpUndefinedMethodInspection */
         return \Input::post('FORM_SUBMIT') === $objHaste->getFormId();
     });
     foreach ($arrOptions as $k => $options) {
         /** @noinspection PhpUndefinedMethodInspection */
         $objForm->addFormField('notification_' . $k, array('label' => Notification::findByPk($objMessages->pid)->title, 'inputType' => $this->nc_member_customizable_inputType, 'options' => $options, 'eval' => array('mandatory' => $this->nc_member_customizable_mandatory), 'value' => !empty($arrSelected[$k]) ? $arrSelected[$k] : array()));
         // Add a validator
         // We check whether it is possible to send the message to the recipient by means of the gateway
         // E.g. a sms message requires a phone number set by the member which is not default
         $objForm->addValidator('notification_' . $k, function ($varValue, $objWidget, $objForm) use($k, $arrOptions) {
             if (empty($varValue)) {
                 return $varValue;
             }
             foreach ($varValue as $msg) {
                 /** @noinspection PhpUndefinedMethodInspection */
                 /** @var Message|\Model $objMessage */
                 $objMessage = Message::findByPk($msg);
                 /** @noinspection PhpUndefinedMethodInspection */
                 /** @var GatewayInterface|MessageDraftCheckSendInterface $objGateway */
                 $objGateway = $objMessage->getRelated('gateway')->getGateway();
                 if (!$objGateway instanceof MessageDraftCheckSendInterface) {
                     continue;
                 }
                 // Throw the error message as exception if the method has not yet
                 if (!$objGateway->canSendDraft($objMessage)) {
                     throw new \Exception(sprintf($GLOBALS['TL_LANG']['ERR']['messageNotSelectable'], $arrOptions[$k][$msg]));
                 }
             }
             return $varValue;
         });
     }
     $objForm->addSubmitFormField('submit', $GLOBALS['TL_LANG']['MSC']['saveSettings']);
     // Process form submit
     if ($objForm->validate()) {
         $arrData = $objForm->fetchAll();
         foreach ($arrData as $field => $notification) {
             if (strpos($field, 'notification_') !== 0) {
                 continue;
             }
             list(, $notificationId) = trimsplit('_', $field);
             // Delete
             foreach (array_diff((array) $arrSelected[$notificationId], (array) $notification) as $msg) {
                 /** @noinspection PhpUndefinedMethodInspection */
                 MemberMessages::findByMemberAndMessage(\FrontendUser::getInstance()->id, $msg)->delete();
             }
             // Create
             foreach (array_diff((array) $notification, (array) $arrSelected[$notificationId]) as $msg) {
                 /** @var MemberMessages|\Model $objMemberMessage */
                 $objMemberMessage = new MemberMessages();
                 $objMemberMessage->member_id = \FrontendUser::getInstance()->id;
                 $objMemberMessage->message_id = $msg;
                 $objMemberMessage->save();
             }
         }
     }
     $this->Template->form = $objForm->generate();
 }
 /**
  * @param string       $type
  * @param Subscription $subscription
  *
  * @internal param \ArrayObject $tokens
  * @SuppressWarnings(PHPMD.LongVariable)
  */
 protected function sendNotification($type, Subscription $subscription)
 {
     $tokens = $this->buildTokens($subscription);
     $notificationCollection = Notification::findBy('type', $type);
     if (null !== $notificationCollection) {
         while ($notificationCollection->next()) {
             $notification = $notificationCollection->current();
             if ($notification->avisotaFilterByMailingList) {
                 $mailingListId = $subscription->getMailingList() ? $subscription->getMailingList()->getId() : null;
                 $selectedMailingLists = deserialize($notification->avisotaFilteredMailingLists, true);
                 if (!in_array($mailingListId, $selectedMailingLists)) {
                     continue;
                 }
             }
             /** @var Notification $notification */
             $notification->send($tokens->getArrayCopy());
         }
     }
 }