/** * Execute the action */ public function execute() { parent::execute(); // get parameters $charset = $this->getContainer()->getParameter('kernel.charset'); $searchTerm = \SpoonFilter::getPostValue('term', null, ''); $term = $charset == 'utf-8' ? \SpoonFilter::htmlspecialchars($searchTerm) : \SpoonFilter::htmlentities($searchTerm); // validate search term if ($term == '') { $this->output(self::BAD_REQUEST, null, 'term-parameter is missing.'); } else { // previous search result $previousTerm = \SpoonSession::exists('searchTerm') ? \SpoonSession::get('searchTerm') : ''; \SpoonSession::set('searchTerm', ''); // save this term? if ($previousTerm != $term) { // format data $this->statistics = array(); $this->statistics['term'] = $term; $this->statistics['language'] = LANGUAGE; $this->statistics['time'] = FrontendModel::getUTCDate(); $this->statistics['data'] = serialize(array('server' => $_SERVER)); $this->statistics['num_results'] = FrontendSearchModel::getTotal($term); // save data FrontendSearchModel::save($this->statistics); } // save current search term in cookie \SpoonSession::set('searchTerm', $term); // output $this->output(self::OK); } }
private function saveData() { $booking['id'] = 0; $booking['room_id'] = \SpoonFilter::getPostValue('room_id', null, null); $booking['start'] = \SpoonFilter::getPostValue('arrival', null, null); $booking['end'] = \SpoonFilter::getPostValue('departure', null, null); $booking['client_name'] = \SpoonFilter::getPostValue('client_name', null, null); $booking['client_email'] = \SpoonFilter::getPostValue('client_email', null, null); $booking['date'] = FrontendModel::getUTCDate(); if ($booking['room_id'] && $booking['start'] && $booking['end'] && $booking['client_name']) { $booking['id'] = $this->addReservation($booking); } echo json_encode($booking['id']); die; }
/** * Fetch a list of subpages of a page. * * @param int $id The id of the item to grab the subpages for. * @return array */ public static function getSubpages($id) { // fetch items $items = (array) FrontendModel::getContainer()->get('database')->getRecords('SELECT i.id, i.title, m.description, i.parent_id FROM pages AS i INNER JOIN meta AS m ON m.id = i.meta_id WHERE i.parent_id = ? AND i.status = ? AND i.hidden = ? AND i.language = ? AND i.publish_on <= ? ORDER BY i.sequence ASC', array((int) $id, 'active', 'N', FRONTEND_LANGUAGE, FrontendModel::getUTCDate('Y-m-d H:i') . ':00')); // has items if (!empty($items)) { // reset url foreach ($items as &$row) { $row['full_url'] = FrontendNavigation::getURL($row['id'], FRONTEND_LANGUAGE); } } // return return $items; }
/** * Saves the feedback * * @param array $feedback */ public static function saveFeedback(array $feedback) { $feedback['created_on'] = FrontendModel::getUTCDate(); unset($feedback['sentOn']); FrontendModel::getContainer()->get('database')->insert('faq_feedback', $feedback); }
/** * Unsubscribes an e-mail address from CampaignMonitor and our database * * @param string $email The e-mail address to unsubscribe. * @param string $groupId The id of the group to unsubscribe from. * @return bool */ public static function unsubscribe($email, $groupId = null) { // get objects $db = FrontendModel::getContainer()->get('database'); $cm = self::getCM(); // set group ID $groupId = !empty($groupId) ? $groupId : FrontendMailmotorModel::getDefaultGroupID(); // get group CM ID $groupCMId = self::getCampaignMonitorID('list', $groupId); // group exists if (FrontendMailmotorModel::existsGroup($groupId)) { try { // unsubscribe the email from this group $cm->unsubscribe($email, $groupCMId); } catch (\Exception $e) { // for the unsubscribe function we ignore any errors // stop here if something went wrong with CM return false; } // set variables $subscriber['status'] = 'unsubscribed'; $subscriber['unsubscribed_on'] = FrontendModel::getUTCDate('Y-m-d H:i:s'); // unsubscribe the user $db->update('mailmotor_addresses_groups', $subscriber, 'email = ? AND group_id = ?', array($email, $groupId)); // user unsubscribed return true; } // user not unsubscribed return false; }
/** * * Unsubscribe the email * * @param $email * * @return bool */ public static function unsubscribe($email) { $record = FrontendModel::getContainer()->get('database')->getRecord(' SELECT id FROM mailengine_users WHERE email= ?', array($email)); //--Check if record exists if (is_array($record)) { $data = array(); $data['active'] = 'N'; $data['unsubscribe_on'] = FrontendModel::getUTCDate(); //--Update record FrontendModel::getContainer()->get('database')->update('mailengine_users', $data, 'id=' . $record["id"]); //--Delete the groups for the user self::deleteGroupFromUser($record['id']); return true; } else { return false; } }
/** * Save statistics */ private function saveStatistics() { // no search term = no search if (!$this->term) { return; } // previous search result $previousTerm = \SpoonSession::exists('searchTerm') ? \SpoonSession::get('searchTerm') : ''; \SpoonSession::set('searchTerm', ''); // save this term? if ($previousTerm != $this->term) { // format data $this->statistics = array(); $this->statistics['term'] = $this->term; $this->statistics['language'] = LANGUAGE; $this->statistics['time'] = FrontendModel::getUTCDate(); $this->statistics['data'] = serialize(array('server' => $_SERVER)); $this->statistics['num_results'] = $this->pagination['num_items']; // save data FrontendSearchModel::save($this->statistics); } // save current search term in cookie \SpoonSession::set('searchTerm', $this->term); }
/** * Validate the form */ private function validateForm() { // get settings $commentsAllowed = isset($this->settings['allow_comments']) && $this->settings['allow_comments']; // comments aren't allowed so we don't have to validate if (!$commentsAllowed) { return false; } // is the form submitted if ($this->frm->isSubmitted()) { // cleanup the submitted fields, ignore fields that were added by hackers $this->frm->cleanupFields(); // does the key exists? if (\SpoonSession::exists('blog_comment_' . $this->record['id'])) { // calculate difference $diff = time() - (int) \SpoonSession::get('blog_comment_' . $this->record['id']); // calculate difference, it it isn't 10 seconds the we tell the user to slow down if ($diff < 10 && $diff != 0) { $this->frm->getField('message')->addError(FL::err('CommentTimeout')); } } // validate required fields $this->frm->getField('author')->isFilled(FL::err('AuthorIsRequired')); $this->frm->getField('email')->isEmail(FL::err('EmailIsRequired')); $this->frm->getField('message')->isFilled(FL::err('MessageIsRequired')); // validate optional fields if ($this->frm->getField('website')->isFilled() && $this->frm->getField('website')->getValue() != 'http://') { $this->frm->getField('website')->isURL(FL::err('InvalidURL')); } // no errors? if ($this->frm->isCorrect()) { // get module setting $spamFilterEnabled = isset($this->settings['spamfilter']) && $this->settings['spamfilter']; $moderationEnabled = isset($this->settings['moderation']) && $this->settings['moderation']; // reformat data $author = $this->frm->getField('author')->getValue(); $email = $this->frm->getField('email')->getValue(); $website = $this->frm->getField('website')->getValue(); if (trim($website) == '' || $website == 'http://') { $website = null; } $text = $this->frm->getField('message')->getValue(); // build array $comment['post_id'] = $this->record['id']; $comment['language'] = FRONTEND_LANGUAGE; $comment['created_on'] = FrontendModel::getUTCDate(); $comment['author'] = $author; $comment['email'] = $email; $comment['website'] = $website; $comment['text'] = $text; $comment['status'] = 'published'; $comment['data'] = serialize(array('server' => $_SERVER)); // get URL for article $permaLink = $this->record['full_url']; $redirectLink = $permaLink; // is moderation enabled if ($moderationEnabled) { // if the commenter isn't moderated before alter the // comment status so it will appear in the moderation queue if (!FrontendBlogModel::isModerated($author, $email)) { $comment['status'] = 'moderation'; } } // should we check if the item is spam if ($spamFilterEnabled) { // check for spam $result = FrontendModel::isSpam($text, SITE_URL . $permaLink, $author, $email, $website); // if the comment is spam alter the comment status so it will appear in the spam queue if ($result) { $comment['status'] = 'spam'; } elseif ($result == 'unknown') { // if the status is unknown then we should moderate it manually $comment['status'] = 'moderation'; } } // insert comment $comment['id'] = FrontendBlogModel::insertComment($comment); // trigger event FrontendModel::triggerEvent('Blog', 'after_add_comment', array('comment' => $comment)); // append a parameter to the URL so we can show moderation if (strpos($redirectLink, '?') === false) { if ($comment['status'] == 'moderation') { $redirectLink .= '?comment=moderation#' . FL::act('Comment'); } if ($comment['status'] == 'spam') { $redirectLink .= '?comment=spam#' . FL::act('Comment'); } if ($comment['status'] == 'published') { $redirectLink .= '?comment=true#comment-' . $comment['id']; } } else { if ($comment['status'] == 'moderation') { $redirectLink .= '&comment=moderation#' . FL::act('Comment'); } if ($comment['status'] == 'spam') { $redirectLink .= '&comment=spam#' . FL::act('Comment'); } if ($comment['status'] == 'published') { $redirectLink .= '&comment=true#comment-' . $comment['id']; } } // set title $comment['post_title'] = $this->record['title']; $comment['post_url'] = $this->record['url']; // notify the admin FrontendBlogModel::notifyAdmin($comment); // store timestamp in session so we can block excessive usage \SpoonSession::set('blog_comment_' . $this->record['id'], time()); // store author-data in cookies try { CommonCookie::set('comment_author', $author); CommonCookie::set('comment_email', $email); CommonCookie::set('comment_website', $website); } catch (\Exception $e) { // settings cookies isn't allowed, but because this isn't a real problem we ignore the exception } // redirect $this->redirect($redirectLink); } } }
/** * Validate the form */ private function validateForm() { // is the form submitted if ($this->frm->isSubmitted()) { // get fields $txtDisplayName = $this->frm->getField('display_name'); $txtEmail = $this->frm->getField('email'); $txtPassword = $this->frm->getField('password'); // check email if ($txtEmail->isFilled(FL::getError('EmailIsRequired'))) { // valid email? if ($txtEmail->isEmail(FL::getError('EmailIsInvalid'))) { // email already exists? if (FrontendProfilesModel::existsByEmail($txtEmail->getValue())) { // set error $txtEmail->setError(FL::getError('EmailExists')); } } } // check password $txtPassword->isFilled(FL::getError('PasswordIsRequired')); // no errors if ($this->frm->isCorrect()) { // init values $settings = array(); $values = array(); // generate salt $settings['salt'] = FrontendProfilesModel::getRandomString(); $settings['language'] = FRONTEND_LANGUAGE; // values $values['email'] = $txtEmail->getValue(); $values['password'] = FrontendProfilesModel::getEncryptedString($txtPassword->getValue(), $settings['salt']); $values['status'] = 'inactive'; $values['display_name'] = $txtDisplayName->getValue(); $values['registered_on'] = FrontendModel::getUTCDate(); $values['last_login'] = FrontendModel::getUTCDate(null, 0); /* * Add a profile. * We use a try-catch statement to catch errors when more users sign up simultaneously. */ try { // insert profile $profileId = FrontendProfilesModel::insert($values); // use the profile id as url until we have an actual url FrontendProfilesModel::update($profileId, array('url' => FrontendProfilesModel::getUrl($values['display_name']))); // trigger event FrontendModel::triggerEvent('Profiles', 'after_register', array('id' => $profileId)); // generate activation key $settings['activation_key'] = FrontendProfilesModel::getEncryptedString($profileId . microtime(), $settings['salt']); // set settings FrontendProfilesModel::setSettings($profileId, $settings); // login FrontendProfilesAuthentication::login($profileId); // activation URL $mailValues['activationUrl'] = SITE_URL . FrontendNavigation::getURLForBlock('Profiles', 'Activate') . '/' . $settings['activation_key']; // send email $from = $this->get('fork.settings')->get('Core', 'mailer_from'); $replyTo = $this->get('fork.settings')->get('Core', 'mailer_reply_to'); $message = \Common\Mailer\Message::newInstance(FL::getMessage('RegisterSubject'))->setFrom(array($from['email'] => $from['name']))->setTo(array($txtEmail->getValue() => ''))->setReplyTo(array($replyTo['email'] => $replyTo['name']))->parseHtml(FRONTEND_MODULES_PATH . '/Profiles/Layout/Templates/Mails/Register.tpl', $mailValues, true); $this->get('mailer')->send($message); // redirect $this->redirect(SITE_URL . '/' . $this->URL->getQueryString() . '?sent=true'); } catch (\Exception $e) { // when debugging we need to see the exceptions if ($this->getContainer()->getParameter('kernel.debug')) { throw $e; } // show error $this->tpl->assign('registerHasFormError', true); } } else { $this->tpl->assign('registerHasFormError', true); } } }
/** * Login a profile. * * @param int $profileId Login the profile with this id in. * @param bool $remember Should we set a cookie for later? * @return bool */ public static function login($profileId, $remember = false) { // redefine vars $profileId = (int) $profileId; $remember = (bool) $remember; $secretKey = null; // cleanup old sessions self::cleanupOldSessions(); // set profile_logged_in to true \SpoonSession::set('frontend_profile_logged_in', true); // should we remember the user? if ($remember) { // generate secret key $secretKey = FrontendProfilesModel::getEncryptedString(\SpoonSession::getSessionId(), FrontendProfilesModel::getRandomString()); // set cookie CommonCookie::set('frontend_profile_secret_key', $secretKey); } // delete all records for this session to prevent duplicate keys (this should never happen) FrontendModel::getContainer()->get('database')->delete('profiles_sessions', 'session_id = ?', \SpoonSession::getSessionId()); // insert new session record FrontendModel::getContainer()->get('database')->insert('profiles_sessions', array('profile_id' => $profileId, 'session_id' => \SpoonSession::getSessionId(), 'secret_key' => $secretKey, 'date' => FrontendModel::getUTCDate())); // update last login FrontendProfilesModel::update($profileId, array('last_login' => FrontendModel::getUTCDate())); // trigger event FrontendModel::triggerEvent('Profiles', 'after_logged_in', array('profile_id' => $profileId)); // load the profile object self::$profile = new FrontendProfilesProfile($profileId); }
/** * Get related items based on tags * * @param int $id The id of the item to get related items for. * @param int $limit The maximum number of items to retrieve. * @return array */ public static function getRelated($id, $limit = 5) { $id = (int) $id; $limit = (int) $limit; // get the related IDs $relatedIDs = (array) FrontendTagsModel::getRelatedItemsByTags($id, 'Blog', 'Blog', $limit); // no items if (empty($relatedIDs)) { return array(); } // get link $link = FrontendNavigation::getURLForBlock('Blog', 'Detail'); // get items $items = (array) FrontendModel::getContainer()->get('database')->getRecords('SELECT i.id, i.title, m.url FROM blog_posts AS i INNER JOIN meta AS m ON i.meta_id = m.id WHERE i.status = ? AND i.language = ? AND i.hidden = ? AND i.publish_on <= ? AND i.id IN(' . implode(',', $relatedIDs) . ') ORDER BY i.publish_on DESC, i.id DESC LIMIT ?', array('active', FRONTEND_LANGUAGE, 'N', FrontendModel::getUTCDate('Y-m-d H:i') . ':00', $limit), 'id'); // loop items foreach ($items as &$row) { $row['full_url'] = $link . '/' . $row['url']; } return $items; }
private static function uploadFile() { //--Check if the file is an image or file if (self::isImage()) { // the image path $path = FRONTEND_FILES_PATH . '/media/images'; } else { // the file path $path = FRONTEND_FILES_PATH . '/media/files'; } // create folders if needed if (!SpoonDirectory::exists($path . '/source')) { SpoonDirectory::create($path . '/source'); } if (!SpoonDirectory::exists($path . '/128x128')) { SpoonDirectory::create($path . '/128x128'); } // build the filename $filename = self::checkFilename(); $item = array(); $item["filename"] = $filename; $item["extension"] = self::$field->getExtension(); $item["created_on"] = FrontendModel::getUTCDate('Y-m-d H:i:s'); $item["filesize"] = self::$field->getFileSize("b"); $data = array(); //--Check if file is an image to specify data if (self::isImage()) { $item["filetype"] = self::$fieldTypeImage; $data["width"] = self::$field->getWidth(); $data["height"] = self::$field->getHeight(); // upload the image & generate thumbnails self::$field->generateThumbnails($path, $filename); } else { $item["filetype"] = self::$fieldTypeFile; // move the source file self::$field->moveFile($path . "/" . $filename); } //--Serialize data $item["data"] = serialize($data); // get db $db = FrontendModel::getDB(true); //--Insert into media return $db->insert("media", $item); }
/** * Update value within a order * * @param array $item * @param int $orderId * @param int $productId * @return int */ public static function updateOrderValue($item, $orderId, $productId) { // set date $item['date'] = FrontendModel::getUTCDate(); // get db $db = FrontendModel::getContainer()->get('database'); // update $db->update('catalog_orders_values', $item, 'order_id = ? AND product_id = ?', array((int) $orderId, (int) $productId)); }
/** * Get all items by date * * @param int $startTimestamp * @param int $endTimestamp * @return array * */ public static function getAllByDate($startTimestamp, $endTimestamp) { // build cache info $cacheDirectory = FRONTEND_CACHE_PATH . '/Agenda/'; $cacheKey = $startTimestamp . '-' . $endTimestamp . '-' . FRONTEND_LANGUAGE; $cacheFile = FRONTEND_CACHE_PATH . '/Agenda/' . $cacheKey . '.cache'; $currentTime = time(); $cacheTimeout = FrontendModel::get('fork.settings')->get('Agenda', 'cache_timeout'); // cache file exists if (file_exists($cacheFile)) { $cacheFileLastModifiedTime = filemtime($cacheFile); $differenceBetweenCurrentAndModifiedTime = $currentTime - $cacheFileLastModifiedTime; // use cache within cache timeout if ($differenceBetweenCurrentAndModifiedTime < $cacheTimeout) { $cacheData = @unserialize(file_get_contents($cacheFile)); // return cache data if exists if ($cacheData) { return $cacheData; } } } $startTimestamp = FrontendModel::getUTCDate(null, $startTimestamp); $endTimestamp = FrontendModel::getUTCDate(null, $endTimestamp); $items = (array) FrontendModel::getContainer()->get('database')->getRecords('SELECT i.*, UNIX_TIMESTAMP(i.begin_date) AS begin_date, UNIX_TIMESTAMP(i.end_date) AS end_date, m.url, c.title AS category_title, m2.url AS category_url, t.agenda_id, t.frequency, t.interval, t.type, t.days, t.ends_on, UNIX_TIMESTAMP(t.end_date) AS ends_on_date FROM agenda AS i INNER JOIN meta AS m ON i.meta_id = m.id INNER JOIN agenda_categories AS c ON i.category_id = c.id INNER JOIN meta AS m2 ON c.meta_id = m2.id LEFT OUTER JOIN agenda_recurring_options AS t ON i.id = t.agenda_id WHERE i.language = ? AND DATE(i.begin_date) BETWEEN ? AND ? OR i.recurring = ? AND i.language = ? ORDER BY i.begin_date ASC', array(FRONTEND_LANGUAGE, $startTimestamp, $endTimestamp, 'Y', FRONTEND_LANGUAGE)); // no results? if (empty($items)) { return array(); } // get item action url $agendaUrl = FrontendNavigation::getURLForBlock('Agenda', 'Detail'); // get category action url $categoryUrl = FrontendNavigation::getURLForBlock('Agenda', 'Category'); // get all recurring items foreach ($items as $key => $item) { $items[$key]['full_url'] = $agendaUrl . '/' . $items[$key]['url']; $items[$key]['category_full_url'] = $categoryUrl . '/' . $items[$key]['category_url']; // get image $img = FrontendModel::getContainer()->get('database')->getRecord('SELECT * FROM agenda_images WHERE agenda_id = ? ORDER BY sequence', array((int) $item['id'])); if ($img) { $items[$key]['image'] = FRONTEND_FILES_URL . '/Agenda/' . $item['id'] . '/400x300/' . $img['filename']; } // get recurring items if ($item['recurring'] == 'Y') { $recurringItems = FrontendAgendaRecurringAgendaItems::getItemRecurrance($item, $startTimestamp, $endTimestamp); // found recurring items if (!empty($recurringItems)) { $items = array_merge($items, $recurringItems); } } // set dates $items[$key]['begin_date'] = date('Y-m-d H:i', $items[$key]['begin_date']); $items[$key]['end_date'] = date('Y-m-d H:i', $items[$key]['end_date']); } // unset items which are outside the view foreach ($items as $key => $value) { $beginDate = strtotime($items[$key]['begin_date']); $begints = strtotime($startTimestamp); $endts = strtotime($endTimestamp); // check if begin date of element fits the given timespan if ($beginDate < $begints || $beginDate > $endts) { unset($items[$key]); } else { // set timestamps for navigation detail pages $items[$key]['ts_begin_date'] = strtotime($value['begin_date']); $items[$key]['ts_end_date'] = strtotime($value['end_date']); // set boolean for whole day agenda if ($value['whole_day'] == 'Y') { $items[$key]['whole_day'] = true; } if ($value['whole_day'] == 'N') { $items[$key]['whole_day'] = false; } $beginAsDay = strftime('%Y%m%d', strtotime($value['begin_date'])); $endAsDay = strftime('%Y%m%d', strtotime($value['end_date'])); // set dif if begin and end date is different if ($beginAsDay != $endAsDay) { $items[$key]['different_end_date'] = true; } } } // write the cache file $fs = new Filesystem(); if (!empty($items)) { $fs->dumpFile(FRONTEND_CACHE_PATH . '/Agenda/' . $cacheKey . '.cache', serialize($items)); } return $items; }
/** * Validate the form */ private function validateForm() { // get settings $subscriptionsAllowed = isset($this->settings['allow_subscriptions']) && $this->settings['allow_subscriptions']; // subscriptions aren't allowed so we don't have to validate if (!$subscriptionsAllowed) { return false; } // is the form submitted if ($this->frm->isSubmitted()) { // cleanup the submitted fields, ignore fields that were added by hackers $this->frm->cleanupFields(); // does the key exists? if (\SpoonSession::exists('agenda_subscription_' . $this->record['id'])) { // calculate difference $diff = time() - (int) \SpoonSession::get('agenda_subscription_' . $this->record['id']); // calculate difference, it it isn't 10 seconds the we tell the user to slow down if ($diff < 10 && $diff != 0) { $this->frm->getField('message')->addError(FL::err('CommentTimeout')); } } // validate required fields $this->frm->getField('name')->isFilled(FL::err('NameIsRequired')); $this->frm->getField('email')->isEmail(FL::err('EmailIsRequired')); // no errors? if ($this->frm->isCorrect()) { // get module setting $moderationEnabled = isset($this->settings['moderation']) && $this->settings['moderation']; // reformat data $name = $this->frm->getField('name')->getValue(); $email = $this->frm->getField('email')->getValue(); // build array $subscription['agenda_id'] = $this->record['id']; $subscription['language'] = FRONTEND_LANGUAGE; $subscription['created_on'] = FrontendModel::getUTCDate(); $subscription['name'] = $name; $subscription['email'] = $email; $subscription['status'] = 'subscribed'; // get URL for article $permaLink = $this->record['full_url']; $redirectLink = $permaLink; // is moderation enabled if ($moderationEnabled) { // if the commenter isn't moderated before alter the subscription status so it will appear in the moderation queue if (!FrontendAgendaModel::isModerated($name, $email)) { $subscription['status'] = 'moderation'; } } // insert comment $subscription['id'] = FrontendAgendaModel::insertSubscription($subscription); // trigger event FrontendModel::triggerEvent('agenda', 'after_add_subscription', array('subscription' => $subscription)); // append a parameter to the URL so we can show moderation if (strpos($redirectLink, '?') === false) { if ($subscription['status'] == 'moderation') { $redirectLink .= '?subscription=moderation#' . FL::act('Subscribe'); } if ($subscription['status'] == 'subscribed') { $redirectLink .= '?subscription=true#subscription-' . $subscription['id']; } } else { if ($subscription['status'] == 'moderation') { $redirectLink .= '&subscription=moderation#' . FL::act('Subscribe'); } if ($subscription['status'] == 'subscribed') { $redirectLink .= '&subscription=true#comment-' . $subscription['id']; } } // set title $subscription['agenda_title'] = $this->record['title']; $subscription['agenda_url'] = $this->record['url']; // notify the admin FrontendAgendaModel::notifyAdmin($subscription); // store timestamp in session so we can block excessive usage \SpoonSession::set('agenda_subscription_' . $this->record['id'], time()); // store author-data in cookies try { Cookie::set('subscription_author', $name); Cookie::set('subscription_email', $email); } catch (Exception $e) { // settings cookies isn't allowed, but because this isn't a real problem we ignore the exception } // redirect $this->redirect($redirectLink); } } }
/** * Validate the form. */ private function validateForm() { // submitted if ($this->frm->isSubmitted()) { // does the key exists? if (\SpoonSession::exists('formbuilder_' . $this->item['id'])) { // calculate difference $diff = time() - (int) \SpoonSession::get('formbuilder_' . $this->item['id']); // calculate difference, it it isn't 10 seconds the we tell the user to slow down if ($diff < 10 && $diff != 0) { $this->frm->addError(FL::err('FormTimeout')); } } // validate fields foreach ($this->item['fields'] as $field) { // field name $fieldName = 'field' . $field['id']; // skip if ($field['type'] == 'submit' || $field['type'] == 'paragraph' || $field['type'] == 'heading') { continue; } // loop other validations foreach ($field['validations'] as $rule => $settings) { // already has an error so skip if ($this->frm->getField($fieldName)->getErrors() !== null) { continue; } // required if ($rule == 'required') { $this->frm->getField($fieldName)->isFilled($settings['error_message']); } elseif ($rule == 'email') { // only check this if the field is filled, if the field is required it will be validated before if ($this->frm->getField($fieldName)->isFilled()) { $this->frm->getField($fieldName)->isEmail($settings['error_message']); } } elseif ($rule == 'numeric') { // only check this if the field is filled, if the field is required it will be validated before if ($this->frm->getField($fieldName)->isFilled()) { $this->frm->getField($fieldName)->isNumeric($settings['error_message']); } } elseif ($rule == 'time') { $regexTime = '/^(([0-1][0-9]|2[0-3]|[0-9])|([0-1][0-9]|2[0-3]|[0-9])(:|h)[0-5]?[0-9]?)$/'; if (!\SpoonFilter::isValidAgainstRegexp($regexTime, $this->frm->getField($fieldName)->getValue())) { $this->frm->getField($fieldName)->setError($settings['error_message']); } } } } // valid form if ($this->frm->isCorrect()) { // item $data['form_id'] = $this->item['id']; $data['session_id'] = \SpoonSession::getSessionId(); $data['sent_on'] = FrontendModel::getUTCDate(); $data['data'] = serialize(array('server' => $_SERVER)); // insert data $dataId = FrontendFormBuilderModel::insertData($data); // init fields array $fields = array(); // loop all fields foreach ($this->item['fields'] as $field) { // skip if ($field['type'] == 'submit' || $field['type'] == 'paragraph' || $field['type'] == 'heading') { continue; } // field data $fieldData['data_id'] = $dataId; $fieldData['label'] = $field['settings']['label']; $fieldData['value'] = $this->frm->getField('field' . $field['id'])->getValue(); if ($field['type'] == 'radiobutton') { $values = array(); foreach ($field['settings']['values'] as $value) { $values[$value['value']] = $value['label']; } $fieldData['value'] = $values[$fieldData['value']]; } // clean up if (is_array($fieldData['value']) && empty($fieldData['value'])) { $fieldData['value'] = null; } // serialize if ($fieldData['value'] !== null) { $fieldData['value'] = serialize($fieldData['value']); } // save fields data $fields[$field['id']] = $fieldData; // insert FrontendFormBuilderModel::insertDataField($fieldData); } $this->get('event_dispatcher')->dispatch(FormBuilderEvents::FORM_SUBMITTED, new FormBuilderSubmittedEvent($this->item, $fields, $dataId)); // trigger event FrontendModel::triggerEvent('FormBuilder', 'after_submission', array('form_id' => $this->item['id'], 'data_id' => $dataId, 'data' => $data, 'fields' => $fields, 'visitorId' => FrontendModel::getVisitorId())); // store timestamp in session so we can block excessive usage \SpoonSession::set('formbuilder_' . $this->item['id'], time()); // redirect $redirect = SITE_URL . $this->URL->getQueryString(); $redirect .= stripos($redirect, '?') === false ? '?' : '&'; $redirect .= 'identifier=' . $this->item['identifier']; $redirect .= '#' . $this->formName; throw new RedirectException('Redirect', new RedirectResponse($redirect)); } else { // not correct, show errors // global form errors set if ($this->frm->getErrors() != '') { $this->tpl->assign('formBuilderError', $this->frm->getErrors()); } else { // general error $this->tpl->assign('formBuilderError', FL::err('FormError')); } } } }
/** * Unsubscribes an e-mail address * * @param string $email The mail address to unsubscribe. * @param string $groupId The id of the group to unsubscribe from. * @return bool */ public static function unsubscribe($email, $groupId = null) { // get objects $db = FrontendModel::getContainer()->get('database'); // set groupID $groupId = !empty($groupId) ? $groupId : self::getDefaultGroupID(); // unsubscribe the user in CM if (self::existsGroup($groupId)) { // set variables $subscriber['status'] = 'unsubscribed'; $subscriber['unsubscribed_on'] = FrontendModel::getUTCDate('Y-m-d H:i:s'); // unsubscribe the user $db->update('mailmotor_addresses_groups', $subscriber, 'email = ? AND group_id = ?', array($email, $groupId)); // user unsubscribed return true; } // user not unsubscribed return false; }
/** * Get a gallery by id * * @return array * @param int $galleryId The id of the gallery. */ public static function getGallery($id) { return (array) FrontendModel::getContainer()->get('database')->getRecord('SELECT i.*, UNIX_TIMESTAMP(i.publish_on) AS publish_on FROM slideshow_galleries AS i INNER JOIN slideshow_images as p ON i.id = p.gallery_id WHERE i.id = ? AND i.language = ? AND i.hidden = ? AND i.publish_on <= ? AND p.hidden = ? ORDER BY i.sequence', array((int) $id, FRONTEND_LANGUAGE, 'N', FrontendModel::getUTCDate('Y-m-d H:i') . ':00', 'N')); }