cms = 'WordPress'; $this->installed = acym_isExtensionActive('the-events-calendar/the-events-calendar.php'); $this->rtecInstalled = acym_isExtensionActive('registrations-for-the-events-calendar/registrations-for-the-events-calendar.php'); $this->eventTicketsInstalled = acym_isExtensionActive('event-tickets/event-tickets.php'); $this->rootCategoryId = 0; $this->pluginDescription->name = 'The Events Calendar'; $this->pluginDescription->icon = ACYM_PLUGINS_URL.'/'.basename(__DIR__).'/icon.png'; $this->pluginDescription->category = 'Events management'; $this->pluginDescription->features = '["content","automation"]'; $this->pluginDescription->description = '- Insert events in your emails
- Filter users by event subscription'; if ($this->installed) { $this->displayOptions = [ 'title' => ['ACYM_TITLE', true], 'price' => ['ACYM_PRICE', true], 'image' => ['ACYM_IMAGE', true], 'intro' => ['ACYM_INTRO_ONLY', true], 'full' => ['ACYM_FULL_TEXT', false], 'date' => ['ACYM_DATE', true], 'location' => ['ACYM_LOCATION', true], 'website' => [__('Event Website', 'the-events-calendar'), false], 'tags' => ['ACYM_TAGS', false], 'cats' => ['ACYM_CATEGORIES', false], ]; $this->initCustomView(); $this->settings = [ 'custom_view' => [ 'type' => 'custom_view', 'tags' => array_merge($this->displayOptions, $this->replaceOptions, $this->elementOptions), ], 'hidepast' => [ 'type' => 'switch', 'label' => 'ACYM_HIDE_PAST_EVENTS', 'value' => 1, ], ]; } else { $this->settings = [ 'not_installed' => '1', ]; } } public function getStandardStructure(&$customView) { $tag = new stdClass(); $tag->id = 0; $format = new stdClass(); $format->tag = $tag; $format->title = '{title}'; $format->afterTitle = acym_translation('ACYM_PRICE').': {price}'; $format->afterArticle = acym_translation('ACYM_DATE').': {date}
'.acym_translation('ACYM_LOCATION').': {location}'; $format->imagePath = '{image}'; $format->description = '{intro}'; $format->link = '{link}'; $format->customFields = []; $customView = '
'.$this->pluginHelper->getStandardDisplay($format).'
'; } public function initReplaceOptionsCustomView() { $this->replaceOptions = [ 'link' => ['ACYM_LINK'], 'picthtml' => ['ACYM_IMAGE'], 'startdate' => ['ACYM_START_DATE'], 'enddate' => ['ACYM_END_DATE'], 'simplestartdate' => ['ACYM_START_DATE_SIMPLE'], 'simpleenddate' => ['ACYM_END_DATE_SIMPLE'], ]; } public function initElementOptionsCustomView() { $query = 'SELECT post.* FROM #__posts AS post WHERE post.post_type = "tribe_events" AND post.post_status = "publish"'; $element = acym_loadObject($query); if (empty($element)) return; foreach ($element as $key => $value) { $this->elementOptions[$key] = [$key]; } } public function getPossibleIntegrations() { return $this->pluginDescription; } public function insertionOptions($defaultValues = null) { $this->defaultValues = $defaultValues; $this->prepareWPCategories('tribe_events_cat'); $tabHelper = new TabHelper(); $identifier = $this->name; $tabHelper->startTab(acym_translation('ACYM_ONE_BY_ONE'), !empty($this->defaultValues->defaultPluginTab) && $identifier === $this->defaultValues->defaultPluginTab); $displayOptions = [ [ 'title' => 'ACYM_DISPLAY', 'type' => 'checkbox', 'name' => 'display', 'options' => $this->displayOptions, ], [ 'title' => 'ACYM_CLICKABLE_TITLE', 'type' => 'boolean', 'name' => 'clickable', 'default' => true, ], [ 'title' => 'ACYM_TRUNCATE', 'type' => 'intextfield', 'isNumber' => 1, 'name' => 'wrap', 'text' => 'ACYM_TRUNCATE_AFTER', 'default' => 0, ], [ 'title' => 'ACYM_READ_MORE', 'type' => 'boolean', 'name' => 'readmore', 'default' => true, ], [ 'title' => 'ACYM_DISPLAY_PICTURES', 'type' => 'pictures', 'name' => 'pictures', ], ]; $zoneContent = $this->getFilteringZone().$this->prepareListing(); echo $this->displaySelectionZone($zoneContent); echo $this->pluginHelper->displayOptions($displayOptions, $identifier, 'individual', $this->defaultValues); $tabHelper->endTab(); $identifier = 'auto'.$this->name; $tabHelper->startTab(acym_translation('ACYM_BY_CATEGORY'), !empty($this->defaultValues->defaultPluginTab) && $identifier === $this->defaultValues->defaultPluginTab); $catOptions = [ [ 'title' => 'ACYM_ORDER_BY', 'type' => 'select', 'name' => 'order', 'options' => [ 'ID' => 'ACYM_DATE_CREATED', 'post_date' => 'ACYM_DATE', 'post_title' => 'ACYM_TITLE', 'menu_order' => 'ACYM_MENU_ORDER', 'rand' => 'ACYM_RANDOM', ], 'default' => 'post_date', 'defaultdir' => 'asc', ], ]; $this->autoContentOptions($catOptions, 'event'); $this->autoCampaignOptions($catOptions); $displayOptions = array_merge($displayOptions, $catOptions); echo $this->displaySelectionZone($this->getCategoryListing()); echo $this->pluginHelper->displayOptions($displayOptions, $identifier, 'grouped', $this->defaultValues); $tabHelper->endTab(); $tabHelper->display('plugin'); } public function prepareListing() { $this->querySelect = 'SELECT post.ID, post.post_title, post.post_date, post.post_content '; $this->query = 'FROM #__posts AS post '; $this->filters = []; $this->filters[] = 'post.post_type = "tribe_events"'; $this->filters[] = 'post.post_status = "publish"'; $this->searchFields = ['post.ID', 'post.post_title']; $this->pageInfo->order = 'post.ID'; $this->elementIdTable = 'post'; $this->elementIdColumn = 'ID'; if ($this->getParam('hidepast', '1') === '1') { $this->query .= 'JOIN #__postmeta AS startdate ON post.ID = startdate.post_id AND startdate.meta_key = "_EventStartDateUTC" '; $this->filters[] = 'startdate.`meta_value` >= '.acym_escapeDB(date('Y-m-d H:i:s')); } parent::prepareListing(); //if a category is selected if (!empty($this->pageInfo->filter_cat)) { $this->query .= 'JOIN #__term_relationships AS cat ON post.ID = cat.object_id'; $this->filters[] = 'cat.term_taxonomy_id = '.intval($this->pageInfo->filter_cat); } $listingOptions = [ 'header' => [ 'post_title' => [ 'label' => 'ACYM_TITLE', 'size' => '7', ], 'post_date' => [ 'label' => 'ACYM_PUBLISHING_DATE', 'size' => '4', 'type' => 'date', ], 'ID' => [ 'label' => 'ACYM_ID', 'size' => '1', 'class' => 'text-center', ], ], 'id' => 'ID', 'rows' => $this->getElements(), ]; return $this->getElementsListing($listingOptions); } public function replaceContent(&$email) { $this->replaceMultiple($email); $this->replaceOne($email); } public function generateByCategory(&$email) { $tags = $this->pluginHelper->extractTags($email, 'auto'.$this->name); $this->tags = []; if (empty($tags)) return $this->generateCampaignResult; $time = time(); foreach ($tags as $oneTag => $parameter) { if (isset($this->tags[$oneTag])) continue; if (empty($parameter->from)) { $parameter->from = date('Y-m-d H:i:s', $time); } else { $parameter->from = acym_date(acym_replaceDate($parameter->from), 'Y-m-d H:i:s'); } if (!empty($parameter->to)) $parameter->to = acym_date(acym_replaceDate($parameter->to), 'Y-m-d H:i:s'); $query = 'SELECT DISTINCT post.`ID` FROM #__posts AS post JOIN #__postmeta AS startdate ON post.ID = startdate.post_id AND startdate.meta_key = "_EventStartDateUTC" '; $where = []; $selectedArea = $this->getSelectedArea($parameter); if (!empty($selectedArea)) { $query .= 'JOIN #__term_relationships AS cat ON post.ID = cat.object_id '; $where[] = 'cat.term_taxonomy_id IN ('.implode(',', $selectedArea).')'; } $where[] = 'post.post_type = "tribe_events"'; $where[] = 'post.post_status = "publish"'; $where[] = 'startdate.`meta_value` >= '.acym_escapeDB($parameter->from); if (!empty($parameter->to)) $where[] = 'startdate.meta_value <= '.acym_escapeDB($parameter->to).' AND startdate.meta_value != "0000-00-00 00:00:00"'; if (!empty($parameter->onlynew)) { $lastGenerated = $this->getLastGenerated($email->id); if (!empty($lastGenerated)) { $where[] = 'startdate.meta_value > '.acym_escapeDB(acym_date($lastGenerated, 'Y-m-d H:i:s', false)); } } $query .= ' WHERE ('.implode(') AND (', $where).')'; $this->tags[$oneTag] = $this->finalizeCategoryFormat($query, $parameter, 'post'); } return $this->generateCampaignResult; } public function replaceIndividualContent($tag) { $query = 'SELECT post.* FROM #__posts AS post WHERE post.post_type = "tribe_events" AND post.post_status = "publish" AND post.ID = '.intval($tag->id); $element = $this->initIndividualContent($tag, $query); if (empty($element)) return ''; $varFields = $this->getCustomLayoutVars($element); $properties = acym_loadObjectList('SELECT meta_key, meta_value AS `value` FROM #__postmeta WHERE post_id = '.intval($tag->id), 'meta_key'); foreach ($properties as $name => $property) { $varFields['{'.$name.'}'] = $property->value; } $link = get_permalink($element->ID); $varFields['{link}'] = $link; $title = ''; $afterTitle = ''; $afterArticle = ''; $imagePath = ''; $contentText = ''; $customFields = []; $varFields['{title}'] = $element->post_title; if (in_array('title', $tag->display)) $title = $varFields['{title}']; $imageId = get_post_thumbnail_id($tag->id); if (!empty($imageId)) { $imagePath = get_the_post_thumbnail_url($tag->id); } $varFields['{image}'] = $imagePath; $varFields['{picthtml}'] = ''; if (!in_array('image', $tag->display)) $imagePath = ''; $varFields['{full}'] = $this->cleanExtensionContent($element->post_content); $varFields['{intro}'] = $this->cleanExtensionContent($this->getIntro($element->post_content)); if (in_array('full', $tag->display)) { $contentText .= $varFields['{full}']; } elseif (in_array('intro', $tag->display)) { $contentText .= $varFields['{intro}']; } $varFields['{startdate}'] = ''; $varFields['{enddate}'] = ''; $varFields['{simpleenddate}'] = ''; $varFields['{simplestartdate}'] = ''; $varFields['{date}'] = ''; if (!empty($properties['_EventStartDateUTC']->value)) { $allday = !empty($properties['_EventAllDay']->value) && $properties['_EventAllDay']->value === 'yes'; $startDate = $properties['_EventStartDateUTC']->value; $endDate = empty($properties['_EventEndDateUTC']->value) ? '' : $properties['_EventEndDateUTC']->value; $varFields['{startdate}'] = acym_date($startDate, acym_translation('ACYM_DATE_FORMAT_LC2')); $varFields['{enddate}'] = acym_date($endDate, acym_translation('ACYM_DATE_FORMAT_LC2')); $varFields['{simplestartdate}'] = acym_date($startDate, acym_translation('ACYM_DATE_FORMAT_LC1')); $varFields['{simpleenddate}'] = acym_date($endDate, acym_translation('ACYM_DATE_FORMAT_LC1')); $varFields['{date}'] = $allday ? $varFields['{simplestartdate}'] : $varFields['{startdate}']; if (!empty($endDate) && $startDate !== $endDate) { if ($allday) { $endDateDisplay = $varFields['{simpleenddate}']; } else { if ($varFields['{simplestartdate}'] === $varFields['{simpleenddate}']) { $endDateDisplay = acym_date($endDate, 'H:i'); } else { $endDateDisplay = $varFields['{enddate}']; } } $varFields['{date}'] .= ' - '.$endDateDisplay; } } if (in_array('date', $tag->display) && !empty($properties['_EventStartDateUTC']->value)) { $customFields[] = [ $varFields['{date}'], acym_translation('ACYM_DATE'), ]; } $varFields['{location}'] = ''; if (!empty($properties['_EventVenueID']->value)) { $locationData = acym_loadObjectList('SELECT meta_key, meta_value AS `value` FROM #__postmeta WHERE post_id = '.intval($properties['_EventVenueID']->value), 'meta_key'); if (!empty($locationData)) { $locationName = acym_loadResult('SELECT post_title FROM #__posts WHERE ID = '.intval($properties['_EventVenueID']->value)); $googleMapsSearch = []; if (!empty($locationData['_VenueAddress']->value)) $googleMapsSearch[] = $locationData['_VenueAddress']->value; if (!empty($locationData['_VenueZip']->value)) $googleMapsSearch[] = $locationData['_VenueZip']->value; if (!empty($locationData['_VenueCity']->value)) $googleMapsSearch[] = $locationData['_VenueCity']->value; if (!empty($locationData['_VenueCountry']->value)) $googleMapsSearch[] = $locationData['_VenueCountry']->value; $gmapQuery = implode(' ', $googleMapsSearch); $varFields['{location}'] = ''.$locationName.''; } if (in_array('location', $tag->display) && !empty($properties['_EventVenueID']->value)) { $customFields[] = [ $varFields['{location}'], acym_translation('ACYM_LOCATION'), ]; } } $price = empty($properties['_EventCost']->value) ? 0 : $properties['_EventCost']->value; $symbol = empty($properties['_EventCurrencySymbol']->value) ? '' : $properties['_EventCurrencySymbol']->value; if (empty($properties['_EventCurrencyPosition']->value) || $properties['_EventCurrencyPosition']->value === 'suffix') { $price .= $symbol; } else { $price = $symbol.$price; } $varFields['{price}'] = $price; if (in_array('price', $tag->display)) { $customFields[] = [ $varFields['{price}'], acym_translation('ACYM_PRICE'), ]; } $varFields['{website}'] = empty($properties['_EventURL']->value) ? '' : ''.$properties['_EventURL']->value.''; if (in_array('website', $tag->display) && !empty($properties['_EventURL']->value)) { $customFields[] = [ $varFields['{website}'], __('Event Website', 'the-events-calendar'), ]; } $varFields['{cats}'] = get_the_term_list($tag->id, 'tribe_events_cat', '', ', '); if (in_array('cats', $tag->display) && !empty($varFields['{cats}'])) { $customFields[] = [ $varFields['{cats}'], acym_translation('ACYM_CATEGORIES'), ]; } $varFields['{tags}'] = get_the_term_list($tag->id, 'post_tag', '', ', '); if (in_array('tags', $tag->display) && !empty($varFields['{tags}'])) { $customFields[] = [ $varFields['{tags}'], acym_translation('ACYM_TAGS'), ]; } $varFields['{readmore}'] = ''.acym_escape( acym_translation('ACYM_READ_MORE') ).''; if ($tag->readmore === '1') $afterArticle .= $varFields['{readmore}']; $format = new stdClass(); $format->tag = $tag; $format->title = $title; $format->afterTitle = $afterTitle; $format->afterArticle = $afterArticle; $format->imagePath = $imagePath; $format->description = $contentText; $format->link = empty($tag->clickable) ? '' : $link; $format->customFields = $customFields; $result = '
'.$this->pluginHelper->getStandardDisplay($format).'
'; return $this->finalizeElementFormat($result, $tag, $varFields); } /** * Function called with ajax to search in events */ public function searchEvent() { $id = acym_getVar('int', 'id'); if (!empty($id)) { $subject = acym_loadResult( 'SELECT post_title FROM #__posts WHERE ID = '.intval($id) ); if (empty($subject)) $subject = ''; echo json_encode( [ [ 'value' => $id, 'text' => $id.' - '.$subject, ], ] ); exit; } $return = []; $search = acym_getVar('string', 'search', ''); $elements = acym_loadObjectList( 'SELECT ID, post_title FROM #__posts WHERE post_title LIKE '.acym_escapeDB('%'.$search.'%').' AND post_type = "tribe_events" ORDER BY post_title ASC' ); foreach ($elements as $oneElement) { $return[] = [$oneElement->ID, $oneElement->ID.' - '.$oneElement->post_title]; } echo json_encode($return); exit; } public function getTicketsSelection() { $id = acym_getVar('int', 'event', 0); if (empty($id)) exit; $elements = acym_loadObjectList( 'SELECT ticket.`ID`, ticket.`post_title` FROM `#__posts` AS ticket JOIN #__postmeta AS meta ON meta.post_id = ticket.ID WHERE meta.meta_key LIKE "_tribe_%_for_event" AND meta.`meta_value` = '.intval($id).' ORDER BY ticket.`post_title` ASC' ); $options = []; $options[0] = acym_translation('ACYM_ANY'); foreach ($elements as $oneElement) { $options[$oneElement->ID] = $oneElement->post_title; } echo acym_select( $options, acym_getVar('string', 'name', ''), acym_getVar('int', 'value', 0), [ 'class' => 'acym__select', ] ); exit; } public function onAcymDeclareFilters(&$filters) { $this->filtersFromConditions($filters); } public function onAcymDeclareConditions(&$conditions) { if (!$this->rtecInstalled && !$this->eventTicketsInstalled) return; $conditions['user']['eventscalendar'] = new stdClass(); $conditions['user']['eventscalendar']->name = 'The Events Calendar - Registration'; $conditions['user']['eventscalendar']->option = '
'; $conditions['user']['eventscalendar']->option .= '
'; $selectOptions = [ 'class' => 'acym__select acym_select2_ajax', 'data-placeholder' => acym_translation('ACYM_ANY_EVENT'), 'data-params' => [ 'plugin' => __CLASS__, 'trigger' => 'searchEvent', ], ]; // If Events tickets installed, add the ticket option if ($this->eventTicketsInstalled) { $selectOptions['acym-automation-reload'] = [ 'plugin' => __CLASS__, 'trigger' => 'getTicketsSelection', 'change' => '#ettec_tochange___numor_____numand__', 'name' => 'acym_condition[conditions][__numor__][__numand__][eventscalendar][ticket]', 'paramFields' => [ 'event' => 'acym_condition[conditions][__numor__][__numand__][eventscalendar][event]', ], ]; } $conditions['user']['eventscalendar']->option .= acym_select( [], 'acym_condition[conditions][__numor__][__numand__][eventscalendar][event]', null, $selectOptions ); $conditions['user']['eventscalendar']->option .= '
'; $conditions['user']['eventscalendar']->option .= '
'; $conditions['user']['eventscalendar']->option .= ''; $conditions['user']['eventscalendar']->option .= '
'; $conditions['user']['eventscalendar']->option .= '
'; $conditions['user']['eventscalendar']->option .= '
'; $conditions['user']['eventscalendar']->option .= acym_dateField('acym_condition[conditions][__numor__][__numand__][eventscalendar][datemin]', '', 'cell shrink'); $conditions['user']['eventscalendar']->option .= '<'; $conditions['user']['eventscalendar']->option .= ''.acym_translation('ACYM_REGISTRATION_DATE').''; $conditions['user']['eventscalendar']->option .= '<'; $conditions['user']['eventscalendar']->option .= acym_dateField('acym_condition[conditions][__numor__][__numand__][eventscalendar][datemax]', '', 'cell shrink'); $conditions['user']['eventscalendar']->option .= '
'; } public function onAcymProcessCondition_eventscalendar(&$query, $options, $num, &$conditionNotValid) { $this->processConditionFilter_eventscalendar($query, $options, $num); $affectedRows = $query->count(); if (empty($affectedRows)) $conditionNotValid++; } public function onAcymProcessFilterCount_eventscalendar(&$query, $options, $num) { $this->onAcymProcessFilter_eventscalendar($query, $options, $num); return acym_translationSprintf('ACYM_SELECTED_USERS', $query->count()); } public function onAcymProcessFilter_eventscalendar(&$query, $options, $num) { $this->processConditionFilter_eventscalendar($query, $options, $num); } private function processConditionFilter_eventscalendar(&$query, $options, $num) { if ($this->eventTicketsInstalled) { // Event tickets integration, since the ticket field exists $userT = 'eventTicketsUser'.$num; $entryT = 'eventTickets'.$num; $elemT = 'eventTicketsElement'.$num; $dateField = $entryT.'.post_date_gmt'; $query->join[$userT] = '#__postmeta AS '.$userT.' ON '.$userT.'.meta_value = user.email AND '.$userT.'.meta_key = "_tribe_tickets_email"'; $query->join[$entryT] = '#__posts AS '.$entryT.' ON '.$entryT.'.ID = '.$userT.'.post_id'; if (!empty($options['ticket'])) { $type = '_tribe_%_product'; $value = 'ticket'; } elseif (!empty($options['event'])) { $type = '_tribe_%_event'; $value = 'event'; } if (!empty($type) && !empty($value)) { $query->join[$elemT] = '#__postmeta AS '.$elemT.' ON '.$entryT.'.ID = '.$elemT.'.post_id AND '.$elemT.'.meta_key LIKE '.acym_escapeDB($type).' AND '.$elemT.'.meta_value = '.intval($options[$value]); } } elseif ($this->rtecInstalled) { // Registration the events calendar, since the ticket field doesn't exist $dateField = 'rtec'.$num.'.registration_date'; $query->join['eventscalendar'.$num] = '#__rtec_registrations AS rtec'.$num.' ON rtec'.$num.'.email = user.email OR (user.cms_id != 0 AND rtec'.$num.'.user_id = user.cms_id)'; if (!empty($options['event'])) $query->where[] = 'rtec'.$num.'.event_id = '.intval($options['event']); } else { return; } if (!empty($options['datemin'])) { $options['datemin'] = acym_replaceDate($options['datemin']); if (!is_numeric($options['datemin'])) $options['datemin'] = strtotime($options['datemin']); if (!empty($options['datemin'])) { $query->where[] = $dateField.' > '.acym_escapeDB(date('Y-m-d H:i:s', $options['datemin'])); } } if (!empty($options['datemax'])) { $options['datemax'] = acym_replaceDate($options['datemax']); if (!is_numeric($options['datemax'])) $options['datemax'] = strtotime($options['datemax']); if (!empty($options['datemax'])) { $query->where[] = $dateField.' < '.acym_escapeDB(date('Y-m-d H:i:s', $options['datemax'])); } } } public function onAcymDeclareSummary_conditions(&$automationCondition) { $this->summaryConditionFilters($automationCondition); } public function onAcymDeclareSummary_filters(&$automationFilter) { $this->summaryConditionFilters($automationFilter); } private function summaryConditionFilters(&$automation) { if (empty($automation['eventscalendar'])) return; if (empty($automation['eventscalendar']['ticket'])) { if (empty($automation['eventscalendar']['event'])) { $event = acym_translation('ACYM_ANY_EVENT'); } else { $event = acym_loadResult( 'SELECT post_title FROM #__posts WHERE ID = '.intval($automation['eventscalendar']['event']) ); } } else { $ticket = acym_loadResult( 'SELECT post_title FROM #__posts WHERE ID = '.intval($automation['eventscalendar']['ticket']) ); $event = acym_loadResult( 'SELECT event.post_title FROM #__postmeta AS meta JOIN #__posts AS event ON event.ID = meta.meta_value WHERE meta.meta_key = "_tribe_rsvp_for_event" AND meta.post_id = '.intval($automation['eventscalendar']['ticket']) ); $event .= ' - '.$ticket; } $finalText = acym_translationSprintf('ACYM_REGISTERED_TO', $event); $dates = []; if (!empty($automation['eventscalendar']['datemin'])) { $dates[] = acym_translation('ACYM_AFTER').' '.acym_replaceDate($automation['eventscalendar']['datemin'], true); } if (!empty($automation['eventscalendar']['datemax'])) { $dates[] = acym_translation('ACYM_BEFORE').' '.acym_replaceDate($automation['eventscalendar']['datemax'], true); } if (!empty($dates)) { $finalText .= ' '.implode(' '.acym_translation('ACYM_AND').' ', $dates); } $automation = $finalText; } }