File manager - Edit - /home/verseaumee/ptitsanes/plugins/solidres/experience/experience.php
Back
<?php /** ------------------------------------------------------------------------ SOLIDRES - Accommodation booking extension for Joomla ------------------------------------------------------------------------ * @author Solidres Team <contact@solidres.com> * @website https://www.solidres.com * @copyright Copyright (C) 2013 - 2020 Solidres. All Rights Reserved. * @license GNU General Public License version 3, or later ------------------------------------------------------------------------ */ defined('_JEXEC') or die; use Joomla\Utilities\ArrayHelper; use Joomla\CMS\Component\ComponentHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Table\Table; use Joomla\CMS\Uri\Uri; use Joomla\CMS\Filesystem\File; use Joomla\CMS\Filesystem\Folder; use Joomla\CMS\Router\Route; use Joomla\CMS\Factory as CMSFactory; class PlgSolidresExperience extends SRPlugin { /** * @var $db JDatabaseDriver * @since 0.1.0 */ protected $db; protected static $plgVersion = '1.4.0'; public function onSolidresSideNavPrepare(&$menuStructure, &$iconMap) { $mainActivity = ComponentHelper::getParams('com_solidres')->get('main_activity', ''); if ($mainActivity !== '' && $mainActivity === '0') { return; } $menuStructure['SR_SUBMENU_EXPERIENCES'] = array( '0.0' => array('SR_CATEGORIES_LABEL', 'index.php?option=com_solidres&view=expcategories'), '1.0' => array('SR_EXPERIENCES_LABEL', 'index.php?option=com_solidres&view=experiences'), '2.0' => array('SR_TRANSPORTATIONS_LABEL', 'index.php?option=com_solidres&view=transportations'), '3.0' => array('SR_EXP_EXTRAS', 'index.php?option=com_solidres&view=expextras'), '4.0' => array('SR_SUBMENU_COUPONS_LIST', 'index.php?option=com_solidres&view=expcoupons'), '4.5' => array('SR_SUBMENU_DISCOUNTS', 'index.php?option=com_solidres&view=expdiscounts'), '5.0' => array('SR_EXP_GUIDES_LABEL', 'index.php?option=com_solidres&view=expguides'), '6.0' => array('SR_CUSTOM_FIELDS_LABEL', 'index.php?option=com_solidres&view=customfields&context=com_solidres.experience.customer'), '7.0' => array('SR_RESERVATIONS_LABEL', 'index.php?option=com_solidres&view=expreservations'), '8.0' => array('SR_EXPERIENCE_INVOICES', 'index.php?option=com_solidres&view=expinvoices'), '9.0' => array('SR_STATUSES', 'index.php?option=com_solidres&view=statuses&scope=1'), '9.1' => array('SR_ORIGINS', 'index.php?option=com_solidres&view=origins&scope=1'), //'9.2' => array('SR_EXP_CALENDARS', 'index.php?option=com_solidres&view=expcalendars'), '10.0' => array('SR_EXP_REPORT_N_STATISTICS', 'index.php?option=com_solidres&view=expdashboard'), ); if (SRPlugin::isEnabled('experienceinvoice')) { $menuStructure['SR_SUBMENU_EXPERIENCES']['8.0'] = array('SR_EXPERIENCE_INVOICES', 'index.php?option=com_solidres&view=expinvoices'); } $iconMap['experiences'] = 'fa fa-camera'; } protected function getMenuTypeOptions() { $viewPath = $this->_getSitePath() . '/views'; return array( 'experience' => $viewPath . '/experience/tmpl/default.xml', 'experiences' => $viewPath . '/experiences/tmpl/default.xml', 'exptracking' => $viewPath . '/exptracking/tmpl/default.xml', 'expcategories' => $viewPath . '/expcategories/tmpl/default.xml', ); } private function getCountry($countryId) { static $countries = []; if (!array_key_exists($countryId, $countries)) { $query = $this->db->getQuery(true) ->select('a.id, a.name, a.code_2, a.code_3') ->from($this->db->quoteName('#__sr_countries', 'a')) ->where('a.state = 1 AND a.id = ' . (int) $countryId); $this->db->setQuery($query); $countries[$countryId] = $this->db->loadObject() ?: false; } return $countries[$countryId]; } public function onSolidresExperiencePrepare(&$item) { static $prepareItems = []; if (isset($prepareItems[$item->id])) { return; } $prepareItems[$item->id] = true; ArrayHelper::toInteger($item->cid); ArrayHelper::toInteger($item->tid); $query = $this->db->getQuery(true); // Load categories if (count($item->cid)) { static $categories = null; if (null === $categories) { $query->select('a.id, a.name, a.alias') ->from($this->db->quoteName('#__sr_experience_categories', 'a')) ->where('a.state = 1'); $this->db->setQuery($query); $categories = $this->db->loadObjectList(); } $item->categories = []; if ($categories) { foreach ($categories as $category) { if (in_array($category->id, $item->cid)) { if (!isset($category->link)) { $category->link = Route::_(SRExperienceHelper::getItemsRoute(array('cat' => $category->id)), false); } $item->categories[] = $category; } } } } // Load transportation if (count($item->tid)) { static $transportations = null; if (null === $transportations) { $query->clear() ->select('a.id, a.name') ->from($this->db->quoteName('#__sr_experience_transportations', 'a')) ->where('a.state = 1'); $this->db->setQuery($query); $transportations = $this->db->loadObjectList(); } $item->transportations = []; if ($transportations) { foreach ($transportations as $transportation) { if (in_array($transportation->id, $item->tid)) { if (!isset($transportation->link)) { $transportation->link = Route::_(SRExperienceHelper::getItemsRoute(array('tran' => $transportation->id)), false); } $item->transportations[] = $transportation; } } } } if ($item->country_id || $item->contact_country_id) { if ($item->country_id) { $item->country = $this->getCountry($item->country_id); } if ($item->contact_country_id) { $item->contact_country = $this->getCountry($item->contact_country_id); } } if ($item->contact_geo_state_id) { static $geoStates = []; if (!isset($geoStates[$item->contact_geo_state_id])) { $query->clear() ->select('a.id, a.country_id, a.name, a.code_2, a.code_3') ->from($this->db->quoteName('#__sr_geo_states', 'a')) ->where('a.state = 1 AND a.id = ' . (int) $item->contact_geo_state_id); $this->db->setQuery($query); $geoStates[$item->contact_geo_state_id] = $this->db->loadObject(); } $item->contact_geo_state = $geoStates[$item->contact_geo_state_id]; unset($item->contact_geo_state_id); } $solidresConfig = JComponentHelper::getParams('com_solidres'); // Available sizes $item->available_sizes = SRExperienceHelper::getAvailableSizes($item); $route = SRExperienceHelper::getItemRoute($item->id, (array) $item->cid); if ($solidresConfig->get('enable_auto_scroll', '1')) { $route .= '#sr-experience'; } $item->link = Route::_($route, false); // Tax $item->tax_rate = null; $item->taxAmount = 0.00; $item->priceDisplay = $item->pricing_base; $taxId = (int) $item->tax_id; if ($taxId) { $query->clear() ->select('a.rate') ->from($this->db->quoteName('#__sr_taxes', 'a')) ->where('a.id = ' . $taxId . ' AND a.state = 1 AND a.country_id = ' . (int) $item->country_id); $this->db->setQuery($query); if ($rate = $this->db->loadResult()) { $item->tax_rate = (float) $rate; $item->taxAmount = $item->tax_rate * $item->pricing_base; if ($solidresConfig->get('show_price_with_tax')) { $item->priceDisplay += $item->taxAmount; } } } // Pricing $pricing = $item->pricing; if (!empty($pricing['children'])) { $base = isset($pricing['children']['base']) ? (float) $pricing['children']['base'] : 0.00; $pricing['children']['base'] = $base; $temp = array(); if (!empty($pricing['children']['extra'])) { foreach ($pricing['children']['extra'] as $price) { list($from, $to, $quantity, $value) = $price; $temp[$from . '_' . $to][$quantity] = (float) $value; } } $pricing['children']['extra'] = $temp; } $item->pricing = $pricing; SRLayoutHelper::addIncludePath(__DIR__ . '/layouts'); // Galleries if (!empty($item->params['media_folder'])) { JLoader::import('joomla.filesystem.folder'); JLoader::import('joomla.filesystem.file'); $images = []; if (is_string($item->params['media_folder'])) { $path = JPATH_ROOT . '/' . $item->params['media_folder']; if (is_dir($path)) { $folder = $item->params['media_folder']; $images = array_map(function ($image) use ($folder) { return $folder . '/' . $image; }, Folder::files($path, 'gif|png|jpe?g|svg|GIF|PNG|JPE?G|SVG')); } } elseif (is_array($item->params['media_folder'])) { $images = $item->params['media_folder']; } if ($images) { $thumbSize = !empty($item->params['thumb_size']) ? $item->params['thumb_size'] : ''; $rootUri = Uri::root(true); $useCaption = !empty($item->params['filename_as_caption']); $galleries = []; foreach ($images as $image) { $baseDir = dirname($image); $ext = File::getExt($image); $image = $rootUri . '/' . $image; $name = basename($image, '.' . $ext); $thumb = $name . '_' . $thumbSize . '.' . $ext; if (is_file(JPATH_ROOT . '/' . $baseDir . '/thumbs/' . $thumb)) { $thumb = $rootUri . '/' . $baseDir . '/thumbs/' . $thumb; } else { $thumb = $image; } $galleries[] = array( 'thumb' => $thumb, 'image' => $image, 'caption' => preg_replace('/[_\-]+/', ' ', $name), ); } $item->galleries = SRLayoutHelper::render('experience.gallery.gallery', array( 'galleries' => $galleries, 'useCaption' => $useCaption, )); if (strpos($item->description_long, '{show_gallery}') !== false) { $item->description_long = str_replace('{show_gallery}', $item->galleries, $item->description_long); unset($item->galleries); } } } $item->availableDates = array(); if (!empty($item->available_dates) && ($availableDates = @json_decode($item->available_dates, true)) && json_last_error() === JSON_ERROR_NONE) { $nowDate = CMSFactory::getDate(CMSFactory::getDate()->format('Y-m-d')); $minBookDays = isset($item->params['min_book_days']) ? (int) $item->params['min_book_days'] : 0; $maxBookDays = isset($item->params['max_book_days']) ? (int) $item->params['max_book_days'] : 0; foreach ($availableDates as $availableDate) { try { $diff = (int) $nowDate->diff(CMSFactory::getDate($availableDate))->format('%R%a'); if ($diff >= 0) { if (($minBookDays > 0 && $diff < $minBookDays) || ($maxBookDays > 0 && $diff > $maxBookDays) ) { continue; } $item->availableDates[] = $availableDate; } } catch (Exception $e) { // Ignore error } } $cmp = function ($a, $b) { $a = strtotime($a); $b = strtotime($b); if ($a == $b) { return 0; } return ($a < $b) ? -1 : 1; }; usort($item->availableDates, $cmp); $item->available_dates = json_encode($item->availableDates); } $item->distances = []; if (!empty($item->params['associated_assets'])) { $assetIds = ArrayHelper::toInteger($item->params['associated_assets']); $query->clear() ->select('a.name, a.city, a.distance_from_city_centre') ->from($this->db->quoteName('#__sr_reservation_assets', 'a')) ->where('a.state = 1 AND a.id IN (' . join(',', $assetIds) . ')'); $this->db->setQuery($query); if ($rows = $this->db->loadObjectList()) { foreach ($rows as $row) { if (!empty($row->distance_from_city_centre)) { $item->distances[] = [ 'asset' => $row->name, 'city' => $row->city, 'distance' => $row->distance_from_city_centre, 'display' => Text::sprintf('SR_EXP_N_KM_FROM_CENTRE', $row->distance_from_city_centre, $row->city . ' (' . $row->name . ')'), ]; } } } } } public function onSolidresPluginRegister() { if ($this->app->isSite() && $this->app->input->getCmd('option') == 'com_solidres' && !SRPlugin::isEnabled('customfield') ) { throw new RuntimeException(Text::_('SR_ERROR_CUSTOMFIELD_REQUIRE')); } $this->defines(); JLoader::import('helpers.experience', $this->_getAdminPath()); JLoader::register('SRExpPayment', SRPlugin::getAdminPath('experience') . '/helpers/payment.php'); JLoader::register('SRWishList', JPATH_ADMINISTRATOR . '/components/com_solidres/helpers/wishlist.php'); if (strcasecmp($this->app->input->getCmd('option'), 'com_solidres') !== 0) { return; } $command = $this->getCommand(); $partnerId = SRUtilities::getPartnerId(); $user = CMSFactory::getUser(); $adminPath = false; $commands = array( 'expextras', 'expextra', 'expcoupons', 'expcoupon', 'myexperiences', 'expreservations', 'expreservation', 'expdashboard', 'expguides', 'expguide', ); if (in_array($command, $commands)) { if ($user->id) { if (SRPlugin::isEnabled('user')) { Table::addIncludePath(SRPlugin::getAdminPath('user') . '/tables'); $customerTable = Table::getInstance('Customer', 'SolidresTable'); if ($customerTable->load(array('user_id' => $user->id))) { if ($command == 'myexperiences') { $this->app->input->set('_viewAlias', 'myexperiences'); $this->app->input->set('view', 'expreservations'); } $adminPath = true; } } } elseif ($this->app->isClient('site')) { $return = base64_encode(Uri::getInstance()->toString()); $this->app->redirect(Route::_('index.php?option=com_users&view=login&return=' . $return, false)); } if (version_compare(JVERSION, '4.0', 'ge')) { JLoader::register('Joomla\\CMS\\Toolbar\\ToolbarHelper', JPATH_LIBRARIES . '/src/Toolbar/ToolbarHelper.php'); } else { JLoader::register('JToolBarHelper', JPATH_ADMINISTRATOR . '/includes/toolbar.php'); } } if (($this->app->isSite() && $partnerId !== false && in_array($command, array('expreservations', 'expreservation'))) || $adminPath ) { if (SRPlugin::isEnabled('hub')) { $options = ['relative' => true, 'version' => PlgSolidresHub::getHashVersion()]; JHtml::_('stylesheet', 'plg_solidres_hub/assets/hub.min.css', $options); JHtml::_('script', 'plg_solidres_hub/assets/hub.min.js', $options); } SRControllerLegacy::addIncludePath($this->_getAdminPath()); } else { SRControllerLegacy::addIncludePath($this->_getBasePath()); } $menu = $this->app->getMenu()->getActive(); if ( $menu && isset($menu->query['option']) && $menu->query['option'] == 'com_solidres' && isset($menu->query['view']) && $menu->query['view'] == 'experiences' ) { $uri = clone Uri::getInstance(); $router = $this->app->getRouter(); $vars = $router->parse($uri); if (!empty($vars['category_id'])) { $menu->params->set('categories', array()); $menu->params->set('country_id', null); $menu->params->set('city', null); } } } private function getCommand() { $task = strtolower($this->app->input->getCmd('task')); $view = strtolower($this->app->input->getCmd('view')); if (strpos($task, '.') !== false) { $command = explode('.', $task, 2); return $command[0]; } return $view; } public function onExperienceSendConfirmEmail($table) { static $sent = false; if ($sent) { return; } $sent = true; $layout = SRLayoutHelper::getInstance(); $layout->addIncludePath(__DIR__ . '/layouts'); JModelLegacy::addIncludePath($this->_getAdminPath() . '/models', 'SolidresModel'); $reservationModel = JModelLegacy::getInstance('ExpReservation', 'SolidresModel', array('ignore_request' => true)); $item = $reservationModel->getItem($table->get('id')); $experience = unserialize($item->experience_history); $imageLogo = !empty($experience->contact_company_logo) ? Uri::root() . $experience->contact_company_logo : null; $fieldValues = SRCustomFieldHelper::setFieldDataValues($item->customer); $displayData = array( 'layout' => $layout, 'item' => $item, 'imageLogo' => $imageLogo, 'experience' => $experience, 'customer_firstname' => $fieldValues->get('customer_firstname'), 'customer_lastname' => $fieldValues->get('customer_lastname'), ); $fromMail = $this->app->get('mailfrom'); $fromName = $this->app->get('fromname'); $mailer = CMSFactory::getMailer(); $filter = JFilterInput::getInstance(); if (!empty($experience->contact_email)) { $displayData['admin'] = 1; $body = $layout->render('experience.emails.reservation_completed_customer_notify_inliner', $displayData); $subject = Text::sprintf('SR_EXPERIENCE_EMAIL_ADMIN_SUBJECT', $item->code, $displayData['customer_firstname'], $displayData['customer_lastname']); $mailer->sendMail($fromMail, $fromName, $experience->contact_email, $subject, $filter->clean($body, 'TRIM'), true); $mailer->clearAllRecipients(); } if ($clientEmail = $fieldValues->get('customer_email')) { $displayData['admin'] = 0; $body = $layout->render('experience.emails.reservation_completed_customer_notify_inliner', $displayData); $subject = Text::sprintf('SR_EXPERIENCE_EMAIL_GUEST_SUBJECT'); $mailer->sendMail($fromMail, $fromName, $clientEmail, $subject, $filter->clean($body, 'TRIM'), true); $this->app->enqueueMessage(Text::sprintf('SR_EXPERIENCE_BOOK_SEND_EMAIL_SUCCESS_FORMAT', $clientEmail)); } } public function onSolidresBeforeDisplay($viewName, &$cachable, &$urlParams) { if (in_array(strtolower($viewName), array('experiences', 'experience'))) { $urlParams = array_merge(array( 'minRange' => 'FLOAT', 'maxRange' => 'FLOAT', 'base_location' => 'STRING', 'end_location' => 'STRING', 'city' => 'STRING', 'country_id' => 'UINT', 'categories' => 'ARRAY', 'cat' => 'STRING', 'range' => 'STRING', 'owner' => 'STRING', 'review' => 'STRING', 'day' => 'STRING', 'hour' => 'STRING', 'Itemid' => 'UINT', ), $urlParams); } if (in_array($viewName, array('bookform', 'exptracking'))) { $cachable = false; } } public function onSolidresWidgetsRegister(&$widgets = []) { $widgets['experience.widgets.total.experiences'] = Text::_('SR_EXP_WIDGET_TOTAL_EXPERIENCES'); $widgets['experience.widgets.total.customers'] = Text::_('SR_EXP_WIDGET_TOTAL_CUSTOMERS'); $widgets['experience.widgets.total.reservations'] = Text::_('SR_EXP_WIDGET_TOTAL_RESERVATIONS'); $widgets['experience.widgets.total.revenues'] = Text::_('SR_EXP_WIDGET_TOTAL_REVENUES'); } public function onSolidresWidgetPrepare(stdClass $widget, JViewLegacy $statisticsView) { $this->onSolidresWidgetsRegister($widgets); if (!isset($widgets[$widget->id])) { return; } switch ($widget->id) { case 'experience.widgets.total.experiences': $this->loadWidgetTotalExperiences($widget); break; case 'experience.widgets.total.customers': $this->loadWidgetTotalCustomers($widget); break; case 'experience.widgets.total.reservations': $this->loadWidgetTotalReservations($widget); break; case 'experience.widgets.total.revenues': $this->loadWidgetTotalRevenues($widget); break; } $widget->layoutId = 'widgets.card'; } protected function getPartnerId() { static $partnerId = null; if (null === $partnerId) { if ($this->app->isClient('site')) { $partnerId = (int) (SRUtilities::getPartnerId() ?: 0); } else { $partnerId = 0; } } return $partnerId; } protected function loadWidgetTotalExperiences($widget) { $db = CMSFactory::getDbo(); $query = $db->getQuery(true) ->select('COUNT(*)') ->from($db->quoteName('#__sr_experiences')) ->where($db->quoteName('state') . ' = 1'); if ($partnerId = $this->getPartnerId()) { $query->where($db->quoteName('partner_id') . ' = ' . $partnerId); } $db->setQuery($query); $widget->title = Text::_('SR_EXP_WIDGET_TOTAL_EXPERIENCES'); $widget->content = $db->loadResult() ?: Text::_('SR_STATISTICS_NO_DATA_FOUND'); $widget->icon = 'fa fa-plane'; } protected function loadWidgetTotalReservations($widget) { $db = CMSFactory::getDbo(); $query = $db->getQuery(true) ->select('COUNT(*)') ->from($db->quoteName('#__sr_experience_reservations', 'a')) ->where('a.state <> -2'); if ($partnerId = $this->getPartnerId()) { $query->join('INNER', $db->quoteName('#__sr_experiences', 'a2') . ' ON a2.id = a.experience_id') ->where('a2.partner_id = ' . $partnerId); } $db->setQuery($query); $widget->title = Text::_('SR_EXP_WIDGET_TOTAL_RESERVATIONS'); $widget->content = $db->loadResult() ?: Text::_('SR_STATISTICS_NO_DATA_FOUND'); $widget->icon = 'fa fa-key'; } protected function loadWidgetTotalCustomers($widget) { $db = CMSFactory::getDbo(); $query = $db->getQuery(true) ->select('COUNT(DISTINCT a.customer_id)') ->from($db->quoteName('#__sr_experience_reservations', 'a')) ->join('INNER', $db->quoteName('#__sr_customers', 'a2') . ' ON a2.id = a.customer_id') ->join('INNER', $db->quoteName('#__users', 'a3') . ' ON a3.id = a2.user_id') ->where('a3.block = 0 AND a.state <> -2'); if ($partnerId = $this->getPartnerId()) { $query->join('INNER', $db->quoteName('#__sr_experiences', 'a4') . ' ON a4.id = a.experience_id') ->where('a4.partner_id = ' . $partnerId); } $db->setQuery($query); $widget->title = Text::_('SR_EXP_WIDGET_TOTAL_CUSTOMERS'); $widget->content = $db->loadResult() ?: Text::_('SR_STATISTICS_NO_DATA_FOUND'); $widget->icon = 'fa fa-users'; } protected function loadWidgetTotalRevenues($widget) { $revenues = 0.00; $solidresConfig = JComponentHelper::getParams('com_solidres'); $defaultCurrencyId = $solidresConfig->get('default_currency_id'); $confirmPaymentState = $solidresConfig->get('exp_payment_confirm_state', 1); $db = CMSFactory::getDbo(); $query = $db->getQuery(true) ->select('a.currency_id, a.total_paid') ->from($db->quoteName('#__sr_experience_reservations', 'a')) ->where('a.state <> -2 AND a.payment_status = ' . (int) $confirmPaymentState); if ($partnerId = $this->getPartnerId()) { $query->join('INNER', $db->quoteName('#__sr_experiences', 'a2') . ' ON a2.id = a.experience_id') ->where('a2.partner_id = ' . $partnerId); } $db->setQuery($query); if ($rows = $db->loadObjectList()) { $query->clear() ->select('a.id, a.exchange_rate') ->from($db->quoteName('#__sr_currencies', 'a')) ->where('a.state = 1'); $db->setQuery($query); $currencies = $db->loadObjectList('id'); foreach ($rows as $row) { $currencyId = $row->currency_id ?: $defaultCurrencyId; $totalPaid = (float) $row->total_paid; if (isset($currencies[$currencyId])) { if ($currencyId == $defaultCurrencyId) { $revenues += $totalPaid; } else { $fromExchangeRate = (float) $currencies[$currencyId]->exchange_rate; $toExchangeRate = (float) $currencies[$defaultCurrencyId]->exchange_rate; $revenues += $totalPaid * ($toExchangeRate / $fromExchangeRate); } } } } $currency = new SRCurrency($revenues, $defaultCurrencyId); $widget->title = Text::_('SR_EXP_WIDGET_TOTAL_REVENUES'); $widget->content = $currency->format(); $widget->icon = 'fa fa-dollar'; } }
| ver. 1.4 |
Github
|
.
| PHP 8.5.7 | Generation time: 0 |
proxy
|
phpinfo
|
Settings