$tokens) { $replacements = _mkbh_article_page_token_replace($type, $tokens, $data); $text = str_ireplace(array_keys($replacements), array_values($replacements), $text); } return $text; } function _mkbh_article_page_tokens_clear($text, $data) { foreach (_mkbh_article_page_parse_tokens($text) as $type => $tokens) { $replacements = _mkbh_article_page_token_replace($type, $tokens, $data); foreach ($replacements as $token => $value) { $replacements[$token] = NULL; } $text = str_ireplace(array_keys($replacements), array_values($replacements), $text); } return str_ireplace(['
', PHP_EOL], '', $text); } /** * Helper: find all tokens in source text and group by type. * * @param $text * * @return array */ function _mkbh_article_page_parse_tokens($text) { $patterns = [ '/\[mkbh_article:mkbh_inline_images:[\d,]*\]/', '/\[mkbh_article:mkbh_inline_quote:[\d,]*\]/', '/\[mkbh_article:mkbh_inline_fact:[\d,]*\]/', '/\[mkbh_article:mkbh_inline_article:[\d,]*\]/', '/\[mkbh_article:mkbh_inline_map:.*\|\|.*\]/', '/\[mkbh_article:mkbh_inline_ad:.*\]/', '/\[mkbh_article:mkbh_inline_du_skriver_modal\]/', '/\[mkbh_article:mkbh_inline_mobile_pay\]/', '/\[mkbh_article:mkbh_inline_visioner_modal\]/', '/\[mkbh_article:mkbh_inline_top_reviews\]/', '/\[mkbh_article:mkbh_inline_rate_widget\]/', '/\[mkbh_article:mkbh_city_change_analytics\]/', '/\[mkbh_article:mkbh_city_change_suggestions\]/', '/\[mkbh_article:mkbh_beforeafter_slider:[\d,]*\]/', ]; $tokens = []; foreach ($patterns as $pattern) { $matches = []; preg_match_all($pattern, $text, $matches, PREG_PATTERN_ORDER, 0); $matches = reset($matches); foreach ($matches as $match) { @list($type, $name, $arguments) = explode(':', $match); $type = str_replace(['[', ']', ':'], '', $type); $name = str_replace(['[', ']', ':'], '', $name); $arguments = str_replace(['[', ']', ':'], '', $arguments); if ($arguments === '') { $arguments = []; } elseif (strpos($arguments, '||') === FALSE) { $arguments = explode(',', preg_replace('/\s+/', '', $arguments)); } else { $arguments = explode('||', $arguments); } $tokens[$type][] = [ 'name' => $name, 'arguments' => $arguments, 'original' => $match, ]; } } return $tokens; } /** * Process tokens of type and return replacements. * * @param $type * @param $tokens * @param $data * * @return array */ function _mkbh_article_page_token_replace($type, $tokens, $data) { $replacements = []; if ($type == 'mkbh_article' && !empty($data['node'])) { foreach ($tokens as $delta => $token) { $widgets = data_get($data, "node.inline_widgets.{$token['name']}"); $widgets[] = $token; data_set($data, "node.inline_widgets.{$token['name']}", array_values($widgets)); switch ($token['name']) { case 'mkbh_inline_images'; // If no data was supplied, replace with empty string if (empty($token['arguments'])) { $replacements[$token['original']] = ''; } else { $build = [ '#theme' => 'mkbh_token_mkbh_inline_images', '#node' => $data['node'], '#field_collection_items' => $token['arguments'], ]; $replacements[$token['original']] = render($build); } break; case 'mkbh_inline_quote'; // If no data was supplied, replace with empty string if (empty($token['arguments'])) { $replacements[$token['original']] = ''; } else { $build = [ '#theme' => 'mkbh_token_mkbh_inline_quote', '#node' => $data['node'], '#quote' => reset($token['arguments']), ]; $replacements[$token['original']] = render($build); } break; case 'mkbh_inline_fact'; // If no data was supplied, replace with empty string if (empty($token['arguments'])) { $replacements[$token['original']] = ''; } else { $build = [ '#theme' => 'mkbh_token_mkbh_inline_fact', '#node' => $data['node'], '#field_collection_items' => reset($token['arguments']), ]; $replacements[$token['original']] = render($build); } break; case 'mkbh_inline_article'; // If no data was supplied, replace with empty string if (empty($token['arguments'])) { $replacements[$token['original']] = ''; } else { $build = [ '#theme' => 'mkbh_token_mkbh_inline_article', '#node' => $data['node'], '#article' => reset($token['arguments']), ]; $replacements[$token['original']] = render($build); } break; case 'mkbh_inline_map'; // If no data was supplied, replace with empty string if (empty($token['arguments'])) { $replacements[$token['original']] = ''; } else { @list($title, $preface, $source) = $token['arguments']; if (empty($source) || !is_numeric($source)) { $source = 'auto'; } if (empty($title) && empty($preface)) { $replacements[$token['original']] = ''; } else { $build = [ '#theme' => 'mkbh_token_mkbh_inline_map', '#node' => $data['node'], '#title' => $title, '#preface' => $preface, '#source' => $source, ]; $replacements[$token['original']] = render($build); } } break; case 'mkbh_inline_ad'; // If no data was supplied, replace with empty string if (empty($token['arguments'])) { $replacements[$token['original']] = ''; } else { $build = [ '#theme' => 'mkbh_token_mkbh_inline_ad', '#node' => $data['node'], '#ad_unit' => reset($token['arguments']), ]; $replacements[$token['original']] = render($build); } break; case 'mkbh_inline_du_skriver_modal'; $build = [ '#theme' => 'mkbh_token_mkbh_inline_du_skriver_modal', '#node' => $data['node'], ]; $replacements[$token['original']] = render($build); break; case 'mkbh_inline_visioner_modal'; $build = [ '#theme' => 'mkbh_token_mkbh_inline_visioner_modal', '#node' => $data['node'], ]; $replacements[$token['original']] = render($build); break; case 'mkbh_inline_mobile_pay' : $build = [ '#theme' => 'mkbh_token_mkbh_inline_mobile_pay', '#node' => $data['node'], ]; $replacements[$token['original']] = render($build); break; case 'mkbh_inline_top_reviews'; /** @var \Drupal\mkbh_blocks\Adapter\NodeAdapterInterface $adapter */ $adapter = new Drupal\mkbh_blocks\Adapter\NodeAdapterProxy($data['node']); $build = [ '#theme' => 'mkbh_token_mkbh_inline_top_reviews', '#node' => $data['node'], '#reviewType' => taxonomy_term_load($adapter->getArticleType()), ]; $replacements[$token['original']] = render($build); break; case 'mkbh_inline_rate_widget'; $build = [ '#theme' => 'mkbh_block_inline_vision_rate_widget', '#node' => $data['node'], ]; $replacements[$token['original']] = render($build); break; case 'mkbh_beforeafter_slider': $build = [ '#theme' => 'mkbh_beforeafter_slider', '#node' => $data['node'], '#field_collection_items' => $token['arguments'], ]; $replacements[$token['original']] = render($build); break; case 'mkbh_city_change_analytics': $build = [ '#theme' => 'mkbh_token_mkbh_inline_city_change_analytics', '#node' => $data['node'], ]; $replacements[$token['original']] = render($build); break; case 'mkbh_city_change_suggestions': $build = [ '#theme' => 'mkbh_token_mkbh_inline_city_change_suggestions', '#node' => $data['node'], ]; $replacements[$token['original']] = render($build); break; } } } return $replacements; } /** * Get argument-formatted list of tags for review. * * @param $node * @param string $operator * * @return null|string */ function _mkbh_article_page_get_article_tags_argument($node, $operator = '+') { /** @var \Drupal\mkbh_blocks\Adapter\NodeAdapterInterface $adapter */ $adapter = new Drupal\mkbh_blocks\Adapter\NodeAdapterProxy($node); $tags = $adapter->getTags(TRUE); if ($tags) { return implode($operator, $tags); } return NULL; } function _mkbh_article_page_include_leaflet() { $modulePath = drupal_get_path('module', 'mkbh_article_page'); drupal_add_js($modulePath . '/assets/javascripts/mkbh-token-mkbh-inline-map.js'); drupal_add_js(libraries_get_path('leaflet') . '/leaflet.js'); drupal_add_js(libraries_get_path('leaflet') . '/Leaflet.fullscreen.js'); drupal_add_css(libraries_get_path('leaflet') . '/leaflet.css'); drupal_add_css(libraries_get_path('leaflet') . '/leaflet.fullscreen.css'); drupal_add_js(libraries_get_path('isMobile') . '/isMobile.js'); } function _mkbh_article_page_init_flickr_api_client() { Flickr::setApikey(FLICKR_API_KEY); Flickr::setFormat(Flickr::JSON); } /** * Get list of projects entity relates. * Used to send notification emails to users who subscribed to project updates. * * @param $entity * @param $entityType * * @return array */ function _mkbh_article_page_get_entity_added_projects($entity, $entityType) { module_load_include('php', 'mkbh_composer', 'vendor/autoload'); /** @var EntityDrupalWrapper $entityWrapper */ $entityWrapper = entity_metadata_wrapper($entityType, $entity); if (isset($entityWrapper->field_related_projects)) { /** @var EntityDrupalWrapper $originalEntityWrapper */ $originalEntityWrapper = entity_metadata_wrapper($entityType, $entity->original); $relatedProjectIds = collect($entityWrapper->field_related_projects->value())->map(function ($entity) { return $entity->nid; }); /** @noinspection PhpUndefinedFieldInspection */ $originalRelatedProjectIds = collect($originalEntityWrapper->field_related_projects->value())->map(function ($entity) { return $entity->nid; }); $addedRelatedProjectIds = $relatedProjectIds->diff($originalRelatedProjectIds); if ((bool)$entity->status === true && (bool)$entity->original->status === false) { $addedRelatedProjectIds = $addedRelatedProjectIds->merge($relatedProjectIds)->unique(); } return $addedRelatedProjectIds->toArray(); } return []; } /** * Check if token exits. * * @param string $token * @param string $text * * @return bool * */ function _mkbh_article_page_check_if_token_exists(string $token, string $text): bool { return strpos($text, $token) !== FALSE; }