auctions-1.0.x-dev/modules/auctions_mail/auctions_mail.module
modules/auctions_mail/auctions_mail.module
<?php /** * @file * Contains auctions_core.module. */ use Drupal\auctions_core\Entity\AuctionBid; use Drupal\auctions_core\Entity\AuctionItem; use Drupal\Core\Link; use Drupal\Core\Routing\RouteMatchInterface; use Drupal\Core\Url; use Drupal\node\Entity\NodeType; use Drupal\user\Entity\User; /** * Implements of hook_help(). */ function auctions_mail_help($route_name, RouteMatchInterface $route_match) { switch ($route_name) { case 'help.page.auctions_mail': $modPath = Drupal::service('extension.path.resolver')->getPath('module', 'auctions_mail'); $readmePath = $modPath . '/README.md'; if (is_file($readmePath)) { $text = \file_get_contents($readmePath, false); if (!\Drupal::moduleHandler()->moduleExists('markdown')) { return '<pre>' . $text . '</pre>'; } else { // Use the Markdown filter to render the README. $filter_manager = \Drupal::service('plugin.manager.filter'); $settings = \Drupal::configFactory()->get('markdown.settings')->getRawData(); $config = ['settings' => $settings]; $filter = $filter_manager->createInstance('markdown', $config); return $filter->process($text, 'en'); } } else { return t('Please see README in Auctions base module'); } break; } } /** * Implements hook_auctions_core_workflow_action(). * * AUCTION CORE HOOK. * * allow other modules to interact upon auction_item workflow changes. */ function auctions_mail_auctions_core_workflow_action(AuctionItem $auctionItem, $workflow) { // Reminder: this hook will be triggered at ALL auciton_item workflow changes. // auctionItem maybe new and not have an id yet. if ($auctionItem && $auctionItem->id()) { $auctionTools = auctions_core_tools(); $mailconfig = $auctionTools->configFactory->get('auctions_mail.content'); $auctionLink = ''; // Sort out link to item or node. todo: make this better. $auctionItemUrl = Url::fromRoute('entity.auction_item.canonical', ['auction_item' => $auctionItem->id()], ['absolute' => TRUE] ); $auctionLink = Link::fromTextAndUrl($auctionItem->getName(), $auctionItemUrl)->toString(); // Then, check to see if any Auction Node type has attached item. $nodeTypes = NodeType::loadMultiple(); if (isset($nodeTypes['auction'])) { $query = $auctionTools->entityTypeManager->getStorage('node')->getQuery(); $query->condition('type', 'auction'); $query->condition('status', 1); $query->condition('field_auction_item', $auctionItem->id()); $query->accessCheck(); $nids = $query->execute(); if ($nids) { $key = \array_keys($nids); $node = $auctionTools->entityTypeManager->getStorage('node')->load($nids[$key[0]]); $nodeUrl = $node->toUrl()->setOption('absolute', TRUE); $auctionLink = Link::fromTextAndUrl($node->getTitle(), $nodeUrl)->toString(); } } switch ($workflow) { case 1: // Bidding open. // noop. break; case 2: // Auction relisted. regardless of relist group. $owner = $auctionItem->getOwner(); $build = [ '#type' => 'processed_text', '#text' => $mailconfig->get('body-relisted-owner')['value'], '#format' => $mailconfig->get('body-relisted-owner')['format'], '#filter_types_to_skip' => [], '#langcode' => $auctionTools->languageManager->getCurrentLanguage()->getId(), ]; $formattedBody = $auctionTools->renderer->renderPlain($build); $tokenBody = \str_replace('@auction', $auctionLink, $formattedBody); $body = ['#markup' => $tokenBody]; $mail = $auctionTools->sendMail($owner->getEmail(), $mailconfig->get('email-from'), $mailconfig->get('email-replyto'), $mailconfig->get('subject-relisted-owner'), $body); /* FALSE: has bid in any previous relisting.*/ $relistBids = $auctionTools->bidsGroupedByUser($auctionItem->id(), FALSE); if ($relistBids) { // Mail each bidder. foreach ($relistBids as $uid => $rawBid) { $user = $auctionTools->entityTypeManager->getStorage('user')->load($uid); $to = $user->getEmail(); $build = [ '#type' => 'processed_text', '#text' => $mailconfig->get('body-relisted-bidder')['value'], '#format' => $mailconfig->get('body-relisted-bidder')['format'], '#filter_types_to_skip' => [], '#langcode' => $auctionTools->languageManager->getCurrentLanguage()->getId(), ]; $formattedBody = $auctionTools->renderer->renderPlain($build); $tokenBody = \str_replace('@auction', $auctionLink, $formattedBody); $body = ['#markup' => $tokenBody]; $auctionTools->sendMail($user->getEmail(), $mailconfig->get('email-from'), $mailconfig->get('email-replyto'), $mailconfig->get('subject-relisted-bidder'), $body); } } break; case 3: // Auction closed. // Mail auction owner. close may be instant.. $owner = $auctionItem->getOwner(); $build = [ '#type' => 'processed_text', '#text' => $mailconfig->get('body-closed-owner')['value'], '#format' => $mailconfig->get('body-closed-owner')['format'], '#filter_types_to_skip' => [], '#langcode' => $auctionTools->languageManager->getCurrentLanguage()->getId(), ]; $formattedBody = $auctionTools->renderer->renderPlain($build); $tokenBody = \str_replace('@auction', $auctionLink, $formattedBody); $tokenBody = \str_replace('@auction', $auctionLink, $formattedBody); $body = ['#markup' => $tokenBody]; $mail = $auctionTools->sendMail( $owner->getEmail(), $mailconfig->get('email-from'), $mailconfig->get('email-replyto'), $mailconfig->get('subject-closed-owner'), $body ); $userBids = $auctionItem->hasBids() ? $auctionTools->bidsGroupedByUser($auctionItem->id(), $auctionItem->getRelistCount()) : FALSE; if ($userBids) { // Mail each bidder. foreach ($userBids as $uid => $rawBid) { $user = $auctionTools->entityTypeManager->getStorage('user')->load($uid); $build = [ '#type' => 'processed_text', '#text' => $mailconfig->get('body-closed-bidder')['value'], '#format' => $mailconfig->get('body-closed-bidder')['format'], '#filter_types_to_skip' => [], '#langcode' => $auctionTools->languageManager->getCurrentLanguage()->getId(), ]; $formattedBody = $auctionTools->renderer->renderPlain($build); $tokenBody = \str_replace('@auction', $auctionLink, $formattedBody); $body = ['#markup' => $tokenBody]; $auctionTools->sendMail( $user->getEmail(), $mailconfig->get('email-from'), $mailconfig->get('email-replyto'), $mailconfig->get('subject-closed-bidder'), $body ); } } $winner = $auctionItem->hasBids() ? $auctionTools->getAuctionItemWinner($auctionItem->id(), $auctionItem->getRelistCount()) : FALSE; if ($winner instanceof User) { $build = [ '#type' => 'processed_text', '#text' => $mailconfig->get('body-closed-winner')['value'], '#format' => $mailconfig->get('body-closed-winner')['format'], '#filter_types_to_skip' => [], '#langcode' => $auctionTools->languageManager->getCurrentLanguage()->getId(), ]; $formattedBody = $auctionTools->renderer->renderPlain($build); $tokenBody = \str_replace('@auction', $auctionLink, $formattedBody); $body = ['#markup' => $tokenBody]; $winnerEmail = $auctionTools->sendMail( $winner->getEmail(), $mailconfig->get('email-from'), $mailconfig->get('email-replyto'), $mailconfig->get('subject-closed-winner'), $body ); $build = [ '#type' => 'processed_text', '#text' => $mailconfig->get('body-closed-owner-winner')['value'], '#format' => $mailconfig->get('body-closed-owner-winner')['format'], '#filter_types_to_skip' => [], '#langcode' => $auctionTools->languageManager->getCurrentLanguage()->getId(), ]; $userLink = $winner->toLink()->toString()->__toString(); $formattedBody = $auctionTools->renderer->renderPlain($build); $tokenBody = \str_replace('@auction', $auctionLink, $formattedBody); $tokenBody = \str_replace('@user', $userLink, $tokenBody); $body = ['#markup' => $tokenBody]; $ownerEmail = $auctionTools->sendMail( $owner->getEmail(), $mailconfig->get('email-from'), $mailconfig->get('email-replyto'), $mailconfig->get('subject-closed-owner-winner'), $body ); } break; } } } /** * Implements hook_auctions_core_new_bid(). * * AUCTION CORE HOOK. * * Alow other modules to interact upon auction_item workflow changes. * Standard and instant types only. Autobid type is not to trigger. */ function auctions_mail_auctions_core_new_bid(AuctionBid $auctionBid) { // @todo ! Notify any other bidder that 'they have compitition'. // @todo ! Notify author of new bid. $auctionItem = $auctionBid->getItemEntity(); $auctionTools = auctions_core_tools(); $mailconfig = $auctionTools->configFactory->get('auctions_mail.content'); $userBids = FALSE; $auctionLink = ''; if ($auctionItem->hasBids()) { // Assume auction_item will be only path. $userBids = $auctionTools->bidsGroupedByUser($auctionItem->id(), $auctionItem->getRelistCount()); // Sort out link to item or node. todo: make this better. $auctionItemUrl = Url::fromRoute('entity.auction_item.canonical', ['auction_item' => $auctionItem->id()], ['absolute' => TRUE] ); $auctionLink = Link::fromTextAndUrl($auctionItem->getName(), $auctionItemUrl)->toString(); // Check to see if any Auction Node type has attached item. $nodeTypes = NodeType::loadMultiple(); if (isset($nodeTypes['auction'])) { $query = $auctionTools->entityTypeManager->getStorage('node')->getQuery(); $query->condition('type', 'auction'); $query->condition('status', 1); $query->condition('field_auction_item', $auctionItem->id()); $query->accessCheck(); $nids = $query->execute(); if ($nids) { $key = \array_keys($nids); $node = $auctionTools->entityTypeManager->getStorage('node')->load($nids[$key[0]]); $nodeUrl = $node->toUrl()->setOption('absolute', TRUE); $auctionLink = Link::fromTextAndUrl($node->getTitle(), $nodeUrl)->toString(); } } } $owner = $auctionItem->getOwner(); $build = [ '#type' => 'processed_text', '#text' => $mailconfig->get('body-author')['value'], '#format' => $mailconfig->get('body-author')['format'], '#filter_types_to_skip' => [], '#langcode' => $auctionTools->languageManager->getCurrentLanguage()->getId(), ]; $formattedBody = $auctionTools->renderer->renderPlain($build); $tokenBody = \str_replace('@auction', $auctionLink, $formattedBody); $body = ['#markup' => $tokenBody]; $mail = $auctionTools->sendMail($owner->getEmail(), $mailconfig->get('email-from'), $mailconfig->get('email-replyto'), $mailconfig->get('subject-author'), $body); if ($userBids) { // Mail each bidder. foreach ($userBids as $uid => $rawBid) { $user = $auctionTools->entityTypeManager->getStorage('user')->load($uid); $to = $user->getEmail(); $build = [ '#type' => 'processed_text', '#text' => $mailconfig->get('body-bidder')['value'], '#format' => $mailconfig->get('body-bidder')['format'], '#filter_types_to_skip' => [], '#langcode' => $auctionTools->languageManager->getCurrentLanguage()->getId(), ]; $formattedBody = $auctionTools->renderer->renderPlain($build); $tokenBody = \str_replace('@auction', $auctionLink, $formattedBody); $body = ['#markup' => $tokenBody]; $auctionTools->sendMail($user->getEmail(), $mailconfig->get('email-from'), $mailconfig->get('email-replyto'), $mailconfig->get('subject-bidder'), $body); } } }