/** * Generate the checkout step * @return string */ public function generate() { $this->objForm = new Form($this->objModule->getFormId(), 'POST', function ($haste) { return \Input::post('FORM_SUBMIT') === $haste->getFormId(); }); if ($this->objModule->iso_order_conditions) { $objFormConfig = \FormModel::findByPk($this->objModule->iso_order_conditions); if (null === $objFormConfig) { throw new \InvalidArgumentException('Order condition form "' . $this->objModule->iso_order_conditions . '" not found.'); } $this->objForm->setTableless($objFormConfig->tableless); $this->objForm->addFieldsFromFormGenerator($this->objModule->iso_order_conditions, function ($strName, &$arrDca) { $arrDca['value'] = $_SESSION['FORM_DATA'][$strName] ?: $arrDca['value']; return true; }); } if (!empty($GLOBALS['ISO_HOOKS']['orderConditions']) && is_array($GLOBALS['ISO_HOOKS']['orderConditions'])) { foreach ($GLOBALS['ISO_HOOKS']['orderConditions'] as $callback) { \System::importStatic($callback[0])->{$callback[1]}($this->objForm, $this->objModule); } } if (!$this->objForm->hasFields()) { $this->blnError = false; return ''; } // Change enctype if there are uploads if ($this->objForm->hasUploads()) { $this->objModule->Template->enctype = 'multipart/form-data'; } if ($this->objForm->isSubmitted()) { $this->blnError = !$this->objForm->validate(); $_SESSION['FORM_DATA'] = is_array($_SESSION['FORM_DATA']) ? $_SESSION['FORM_DATA'] : array(); foreach (array_keys($this->objForm->getFormFields()) as $strField) { if ($this->objForm->getWidget($strField) instanceof \uploadable) { $arrFile = $_SESSION['FILES'][$strField]; $varValue = str_replace(TL_ROOT . '/', '', dirname($arrFile['tmp_name'])) . '/' . rawurlencode($arrFile['name']); } else { $varValue = $this->objForm->fetch($strField); } $_SESSION['FORM_DATA'][$strField] = $varValue; } } else { $blnError = false; foreach (array_keys($this->objForm->getFormFields()) as $strField) { // Clone widget because otherwise we add errors to the original widget instance $objClone = clone $this->objForm->getWidget($strField); $objClone->validate(); if ($objClone->hasErrors()) { $blnError = true; break; } } $this->blnError = $blnError; } $objTemplate = new \Isotope\Template('iso_checkout_order_conditions'); $this->objForm->addToTemplate($objTemplate); return $objTemplate->parse(); }
/** * @param Form $form */ protected function validateFormAndSendMail(Form $form) { if (!$form->validate()) { return; } global $container; /** @var EventDispatcher $eventDispatcher */ $eventDispatcher = $container['event-dispatcher']; /** @var TransportInterface $transport */ $transport = $container['avisota.transport.default']; $values = $form->fetchAll(); $email = $values['email']; $repository = EntityHelper::getRepository('Avisota\\Contao:Recipient'); $recipient = $repository->findOneBy(array('email' => $email)); if ($recipient) { /** @var \Avisota\Contao\Entity\Recipient $recipient */ if ($this->avisota_unsubscribe_show_mailing_lists) { $mailingListIds = $values['mailingLists']; } if (!$this->avisota_unsubscribe_show_mailing_lists) { $mailingListIds = deserialize($this->avisota_mailing_lists); } $subscriptions = $recipient->getSubscriptions(); $subscriptions = array_filter($subscriptions->toArray(), function (\Avisota\Contao\Entity\Subscription $subscription) use($mailingListIds) { return $subscription->getMailingList() && in_array($subscription->getMailingList()->getId(), $mailingListIds); }); /** @var SubscriptionManager $subscriptionManager */ $subscriptionManager = $container['avisota.subscription']; /** @var Subscription[] $subscriptions */ $subscriptionManager->unsubscribe($subscriptions); \Session::getInstance()->set('AVISOTA_LAST_SUBSCRIPTIONS', $subscriptions); if (count($subscriptions)) { if ($this->avisota_unsubscribe_confirmation_message) { $messageRepository = EntityHelper::getRepository('Avisota\\Contao:Message'); $message = $messageRepository->find($this->avisota_unsubscribe_confirmation_message); if ($message) { /** @var MessageRendererInterface $renderer */ $renderer = $container['avisota.message.renderer']; $data = array('subscriptions' => $subscriptions); $template = $renderer->renderMessage($message); $mail = $template->render($recipient, $data); $transport->send($mail); } } if ($this->avisota_unsubscribe_confirmation_page) { $event = new GetPageDetailsEvent($this->avisota_unsubscribe_confirmation_page); $eventDispatcher->dispatch(ContaoEvents::CONTROLLER_GET_PAGE_DETAILS, $event); $event = new GenerateFrontendUrlEvent($event->getPageDetails()); $eventDispatcher->dispatch(ContaoEvents::CONTROLLER_GENERATE_FRONTEND_URL, $event); $event = new RedirectEvent($event->getUrl()); $eventDispatcher->dispatch(ContaoEvents::CONTROLLER_REDIRECT, $event); } } $this->Template->subscriptions = $subscriptions; } else { $this->Template->subscriptions = array(); } }
/** * 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(); }
/** * Edit an address record. Based on the PersonalData core module * @param integer * @return void */ protected function edit($intAddressId = 0) { $table = Address::getTable(); \System::loadLanguageFile(\MemberModel::getTable()); $this->Template = new \Isotope\Template($this->memberTpl); $this->Template->hasError = false; $this->Template->slabel = specialchars($GLOBALS['TL_LANG']['MSC']['saveData']); if ($intAddressId === 0) { $objAddress = Address::createForMember(\FrontendUser::getInstance()->id); } else { $objAddress = Address::findOneForMember($intAddressId, \FrontendUser::getInstance()->id); } if (null === $objAddress) { global $objPage; \Controller::redirect(\Controller::generateFrontendUrl($objPage->row())); } $objForm = new Form($table . '_' . $this->id, 'POST', function ($objForm) { return \Input::post('FORM_SUBMIT') === $objForm->getFormId(); }, (bool) $this->tableless); $objForm->bindModel($objAddress); // Add form fields and modify for the address book $arrFields = $this->arrFields; $objForm->addFieldsFromDca($table, function ($strName, &$arrDca) use($arrFields) { if (!in_array($strName, $arrFields) || !$arrDca['eval']['feEditable']) { return false; } // Map checkboxWizard to regular checkbox widget if ($arrDca['inputType'] == 'checkboxWizard') { $arrDca['inputType'] = 'checkbox'; } // Special field "country" if ($strName == 'country') { $arrCountries = array_merge(Isotope::getConfig()->getBillingCountries(), Isotope::getConfig()->getShippingCountries()); $arrDca['reference'] = $arrDca['options']; $arrDca['options'] = array_values(array_intersect(array_keys($arrDca['options']), $arrCountries)); $arrDca['default'] = Isotope::getConfig()->billing_country; } return true; }); if ($objForm->isSubmitted()) { if ($objForm->validate()) { $objAddress->save(); // Call onsubmit_callback if (is_array($GLOBALS['TL_DCA'][$table]['config']['onsubmit_callback'])) { foreach ($GLOBALS['TL_DCA'][$table]['config']['onsubmit_callback'] as $callback) { $objCallback = \System::importStatic($callback[0]); $objCallback->{$callback}[1]($objAddress); } } global $objPage; \Controller::redirect(\Controller::generateFrontendUrl($objPage->row())); } else { $this->Template->hasError = true; } } $objForm->addToTemplate($this->Template); // Add groups $arrGroups = array(); foreach ($objForm->getFormFields() as $strName => $arrConfig) { if ($arrConfig['feGroup'] != '') { $arrGroups[$arrConfig['feGroup']][$strName] = $objForm->getWidget($strName)->parse(); } } foreach ($arrGroups as $k => $v) { $this->Template->{$k} = $v; } $this->Template->addressDetails = $GLOBALS['TL_LANG'][$table]['addressDetails']; $this->Template->contactDetails = $GLOBALS['TL_LANG'][$table]['contactDetails']; $this->Template->personalData = $GLOBALS['TL_LANG'][$table]['personalData']; $this->Template->loginDetails = $GLOBALS['TL_LANG'][$table]['loginDetails']; }
/** * Generate the module */ protected function compile() { $this->Template->hasError = false; $this->Template->slabel = specialchars($GLOBALS['TL_LANG']['MSC']['saveAddressButton']); $table = Address::getTable(); \System::loadLanguageFile($table); \Controller::loadDataContainer($table); // Call onload_callback (e.g. to check permissions) if (is_array($GLOBALS['TL_DCA'][$table]['config']['onload_callback'])) { foreach ($GLOBALS['TL_DCA'][$table]['config']['onload_callback'] as $callback) { $objCallback = \System::importStatic($callback[0]); $objCallback->{$callback}[1](); } } $arrFields = $this->iso_addressFields; $useBilling = in_array('billing', $this->iso_address); $objAddress = $this->getDefaultAddress($useBilling); $objForm = new Form('iso_cart_address_' . $this->id, 'POST', function ($objHaste) { /** @type Form $objHaste */ return \Input::post('FORM_SUBMIT') === $objHaste->getFormId(); }, (bool) $this->tableless); $objForm->bindModel($objAddress); // Add form fields $objForm->addFieldsFromDca($table, function ($strName, &$arrDca) use($arrFields, $useBilling) { if (!in_array($strName, $arrFields) || !$arrDca['eval']['feEditable'] || $arrDca['eval']['membersOnly'] && FE_USER_LOGGED_IN !== true) { return false; } // Special field "country" if ($strName == 'country') { if ($useBilling) { $arrCountries = Isotope::getConfig()->getBillingCountries(); $arrDca['default'] = Isotope::getConfig()->billing_country; } else { $arrCountries = Isotope::getConfig()->getShippingCountries(); $arrDca['default'] = Isotope::getConfig()->shipping_country; } $arrDca['reference'] = $arrDca['options']; $arrDca['options'] = array_values(array_intersect(array_keys($arrDca['options']), $arrCountries)); } return true; }); $objCart = Isotope::getCart(); // Save the data if ($objForm->validate()) { if (!$objCart->id) { $objCart->save(); } $objAddress->tstamp = time(); $objAddress->pid = $objCart->id; $objAddress->save(); // Call onsubmit_callback if (is_array($GLOBALS['TL_DCA'][$table]['config']['onsubmit_callback'])) { foreach ($GLOBALS['TL_DCA'][$table]['config']['onsubmit_callback'] as $callback) { $objCallback = \System::importStatic($callback[0]); $objCallback->{$callback}[1]($objAddress); } } // Set the billing address if ($useBilling) { $objCart->setBillingAddress($objAddress); } // Set the shipping address if (in_array('shipping', $this->iso_address)) { $objCart->setShippingAddress($objAddress); } $this->jumpToOrReload($this->jumpTo); } $objForm->addToTemplate($this->Template); // Predefine the group order (other groups will be appended automatically) $arrGroups = array(); $categories = array('personal' => array(), 'address' => array(), 'contact' => array(), 'login' => array(), 'profile' => array()); foreach ($objForm->getFormFields() as $strName => $arrConfig) { if ($arrConfig['feGroup'] != '') { $arrGroups[$arrConfig['feGroup']][$strName] = $objForm->getWidget($strName)->parse(); } } foreach ($arrGroups as $k => $v) { $this->Template->{$k} = $v; // backwards compatibility $key = $k . ($k == 'personal' ? 'Data' : 'Details'); $categories[$GLOBALS['TL_LANG']['tl_member'][$key]] = $v; } $this->Template->categories = $categories; $this->Template->addressDetails = $GLOBALS['TL_LANG'][$table]['addressDetails']; $this->Template->contactDetails = $GLOBALS['TL_LANG'][$table]['contactDetails']; $this->Template->personalData = $GLOBALS['TL_LANG'][$table]['personalData']; $this->Template->loginDetails = $GLOBALS['TL_LANG'][$table]['loginDetails']; }