'n2-ss-layers-container n2-ss-slide-limiter n2-ow' ); public $classes = '', $style = ''; public $nextCacheRefresh = 2145916800; // 2038 /** * Slide constructor. * * @param $slider Slider * @param $data array */ public function __construct($slider, $data) { $this->parameters = new Data($data['params'], true); $version = $this->parameters->getIfEmpty('version', '0.0.0'); if (version_compare($version, '3.3.9999', '<')) { $this->parameters->set('desktopportraitpadding', '0|*|0|*|0|*|0'); } unset($data['params']); foreach ($data as $key => $value) { $this->$key = $value; } $this->slide = array( 'type' => 'slide', 'layers' => json_decode($this->slide, true), 'title' => $this->title, 'publish_up' => $this->publish_up, 'publish_down' => $this->publish_down, 'published' => $this->published, 'description' => $this->description, 'thumbnail' => $this->thumbnail, ) + $this->parameters->toArray(); if ($version == '0.0.0') { /** * Required for sample slider city!!! */ $this->fixOldZIndexes($this->slide['layers']); } $this->sliderObject = $slider; $this->renderable = $slider; $this->onCreate(); } private function fixOldZIndexes(&$layers) { /** * If we do not have version info for the slide, we should do the check for the old zIndexed storage and sort the layers to the new structure. */ if (is_array($layers)) { for ($i = 0; $i < count($layers); $i++) { if (!isset($layers[$i]['zIndex'])) { if (isset($layers[$i]['style']) && preg_match('/z\-index:[ ]*([0-9]+);/', $layers[$i]['style'], $matches)) { $layers[$i]['zIndex'] = intval($matches[1]); } else { $layers[$i]['zIndex'] = 0; } } if (isset($layers[$i]['type']) && $layers[$i]['type'] == 'group') { $this->fixOldZIndexes($layers[$i]['layers']); } } if (isset($layers[0]['zIndex'])) { usort($layers, array( $this, "sortOldZIndex" )); } } } private function sortOldZIndex($a, $b) { if ($a['zIndex'] == $b['zIndex']) { return 0; } return ($a['zIndex'] < $b['zIndex']) ? 1 : -1; } public function __clone() { $this->parameters = clone $this->parameters; } protected function onCreate() { Plugin::doAction('ssSlide', array($this)); } public function initGenerator($extend = array()) { if ($this->generator_id > 0) { $this->generator = new Generator($this, $this->sliderObject, $extend); } } public function hasGenerator() { return !!$this->generator; } public function isComponentVisible($generatorVisibleVariable) { return !empty($generatorVisibleVariable) && $this->hasGenerator(); } /** * @return Slide[] */ public function expandSlide() { return $this->generator->getSlides(); } public function expandSlideAdmin() { return $this->generator->getSlidesAdmin(); } public function fillSample() { if ($this->hasGenerator()) { $this->generator->fillSample(); } } public function setVariables($variables) { $this->variables = array_merge($this->variables, (array)$variables); } public function isFirst() { return !!$this->first; } public function isCurrentlyEdited() { return Request::$REQUEST->getInt('slideid') == $this->id; } public function setIndex($index) { $this->index = $index; } public function setPublicID($publicID) { $this->publicID = $publicID; } /** * @return int */ public function getPublicID(): int { return $this->publicID; } public function setFirst() { $this->frontendFirst = true; $this->attributes['data-first'] = '1'; } public function getFrontendFirst() { return $this->frontendFirst; } public function prepare() { $this->variables['slide'] = array( 'name' => $this->getTitle(), 'description' => $this->getDescription() ); } public function setSlidesParams() { $this->background = $this->sliderObject->features->makeBackground($this); $this->addSlideLink(); $this->attributes['data-slide-duration'] = Cast::floatToString(max(0, $this->parameters->get('slide-duration', 0)) / 1000); $this->attributes['data-id'] = $this->id; $this->attributes['data-slide-public-id'] = $this->publicID; $this->classes .= ' n2-ss-slide-' . $this->id; $this->sliderObject->features->makeSlide($this); $this->renderHtml(); } protected function addSlideLink() { $linkV1 = $this->parameters->getIfEmpty('link', ''); if (!empty($linkV1)) { list($link, $target) = array_pad((array)Common::parse($linkV1), 2, ''); $this->parameters->un_set('link'); $this->parameters->set('href', $link); $this->parameters->set('href-target', $target); } $url = $this->parameters->get('href'); $target = $this->parameters->get('href-target'); if (!empty($url) && $url != '#') { $url = $this->fill($url); } if (!empty($url) && $url != '#') { if (empty($target)) { $target = '_self'; } $url = ResourceTranslator::toUrl($url); $url = Link::parse($url, $this->linkAttributes); $this->linkAttributes['data-href'] = $url; $this->linkAttributes['tabindex'] = 0; $this->linkAttributes['role'] = 'button'; $ariaLabel = $this->parameters->get('aria-label'); if (!empty($ariaLabel)) { $this->linkAttributes['aria-label'] = $this->fill($ariaLabel); } if (!isset($this->linkAttributes['onclick']) && !isset($this->linkAttributes['data-n2-lightbox'])) { if (!empty($target) && $target != '_self') { $this->linkAttributes['data-target'] = $target; } $this->linkAttributes['data-n2click'] = "url"; } if (!isset($this->linkAttributes['style'])) { $this->linkAttributes['style'] = ''; } $this->linkAttributes['data-force-pointer'] = ""; $this->hasLink = true; } } public function getRawLink() { $linkV1 = $this->parameters->getIfEmpty('link', ''); if (!empty($linkV1)) { list($link, $target) = array_pad((array)Common::parse($linkV1), 2, ''); return $link; } return $this->parameters->getIfEmpty('href', ''); } public function getRawLinkHref() { $linkV1 = $this->parameters->getIfEmpty('link', ''); if (!empty($linkV1)) { list($link, $target) = array_pad((array)Common::parse($linkV1), 2, ''); return $target; } return $this->parameters->getIfEmpty('href-target', '_self'); } public function getSlider() { return $this->sliderObject; } public function getAvailableDevices() { return array_diff(array_keys($this->sliderObject->features->responsive->mediaQueries), array('all')); } protected function renderHtml() { if (empty($this->html)) { AbstractComponent::$isAdmin = $this->sliderObject->isAdmin; $mainContainer = new ComponentSlide($this, $this->slide); $attributes = array( 'role' => 'note', 'class' => 'n2-ss-slide--focus' ); if (!isset($this->linkAttributes['role']) || $this->linkAttributes['role'] != 'button') { $attributes['tabindex'] = '-1'; } $this->html = Html::tag('div', $attributes, Sanitize::remove_all_html($this->getTitle())); $this->html .= Html::tag('div', $this->containerAttributes, $mainContainer->render($this->sliderObject->isAdmin)); } } public function finalize() { if ($this->sliderObject->exposeSlideData['title']) { $title = $this->getTitle(); if (!empty($title)) { $this->attributes['data-title'] = Translation::_($title); } } if ($this->sliderObject->exposeSlideData['description']) { $description = $this->getDescription(); if (!empty($description)) { $this->attributes['data-description'] = Translation::_($description); } } if ($this->sliderObject->exposeSlideData['thumbnail']) { $thumbnail = $this->getThumbnailDynamic(); if (!empty($thumbnail)) { $attributes = Html::addExcludeLazyLoadAttributes(array( 'loading' => 'lazy', 'style' => '', 'class' => 'n2-ss-slide-thumbnail' )); $this->html .= Html::image($this->sliderObject->features->optimize->optimizeThumbnail($thumbnail), esc_attr($this->getThumbnailAltDynamic()), $attributes); } } if ($this->hasLink) { $this->attributes['data-haslink'] = 1; } if (!$this->sliderObject->isAdmin || !$this->underEdit) { if (!$this->isVisibleDesktopPortrait()) { $this->showOnAttributes['data-hide-desktopportrait'] = 1; } if (!$this->isVisibleTabletPortrait()) { $this->showOnAttributes['data-hide-tabletportrait'] = 1; } if (!$this->isVisibleMobilePortrait()) { $this->showOnAttributes['data-hide-mobileportrait'] = 1; } } $this->attributes += $this->showOnAttributes; } public function isVisibleDesktopPortrait() { return $this->parameters->get('desktopportrait', 1); } public function isVisibleDesktopLandscape() { return $this->parameters->get('desktoplandscape', 1); } public function isVisibleTabletPortrait() { return $this->parameters->get('tabletportrait', 1); } public function isVisibleTabletLandscape() { return $this->parameters->get('tabletlandscape', 1); } public function isVisibleMobilePortrait() { return $this->parameters->get('mobileportrait', 1); } public function isVisibleMobileLandscape() { return $this->parameters->get('mobilelandscape', 1); } /** * @return string contains escaped html data */ public function getHTML() { return $this->html; } public function getAsStatic() { $mainContainer = new ComponentSlide($this, $this->slide); $attributes = array( 'class' => 'n2-ss-static-slide n2-ow' . $this->classes ); if (!$this->sliderObject->isAdmin || !$this->underEdit) { if (!$this->isVisibleDesktopPortrait()) { $attributes['data-hide-desktopportrait'] = 1; } if (!$this->isVisibleDesktopLandscape()) { $attributes['data-hide-desktoplandscape'] = 1; } if (!$this->isVisibleTabletPortrait()) { $attributes['data-hide-tabletportrait'] = 1; } if (!$this->isVisibleTabletLandscape()) { $attributes['data-hide-tabletlandscape'] = 1; } if (!$this->isVisibleMobilePortrait()) { $attributes['data-hide-mobileportrait'] = 1; } if (!$this->isVisibleMobileLandscape()) { $attributes['data-hide-mobilelandscape'] = 1; } } return Html::tag('div', $attributes, $mainContainer->render($this->sliderObject->isAdmin)); } public function forceNonStatic() { $this->parameters->set('static-slide', 0); } public function isStatic() { if ($this->parameters->get('static-slide', 0)) { return true; } return false; } private static function splitTokens($input) { $tokens = array(); $currentToken = ""; $nestingLevel = 0; for ($i = 0; $i < strlen($input); $i++) { $currentChar = $input[$i]; if ($currentChar === "," && $nestingLevel === 0) { $tokens[] = $currentToken; $currentToken = ""; } else { $currentToken .= $currentChar; if ($currentChar === "(") { $nestingLevel++; } else if ($currentChar === ")") { $nestingLevel--; } } } if (strlen($currentToken)) { $tokens[] = $currentToken; } return $tokens; } public function fill($value) { if (!empty($this->variables) && !empty($value)) { return preg_replace_callback('/{((([a-z]+)\(([^}]+)\))|([a-zA-Z0-9][a-zA-Z0-9_\/]*))}/', array( $this, 'parseFunction' ), $value); } return $value; } private function parseFunction($match) { if (!isset($match[5])) { $args = self::splitTokens($match[4]); for ($i = 0; $i < count($args); $i++) { $args[$i] = $this->parseVariable($args[$i]); } if (method_exists($this, '_' . $match[3])) { return call_user_func_array(array( $this, '_' . $match[3] ), $args); } return $match[0]; } else { return $this->parseVariable($match[5]); } } private function parseVariable($variable) { preg_match('/^("|\')(.*)("|\')$/', $variable, $match); if (!empty($match)) { return $match[2]; } preg_match('/((([a-z]+)\(([^}]+)\)))/', $variable, $match); if (!empty($match)) { return call_user_func(array( $this, 'parseFunction' ), $match); } else { preg_match('/([a-zA-Z][0-9a-zA-Z_]*)(\/([0-9a-z]+))?/', $variable, $match); if ($match) { $index = empty($match[3]) ? 0 : $match[3]; if (is_numeric($index)) { $index = max(1, intval($index)) - 1; } if (isset($this->variables[$index]) && isset($this->variables[$index][$match[1]])) { return $this->variables[$index][$match[1]]; } else { return ''; } } return $variable; } } private function _fallback($s, $def) { if (empty($s)) { return $def; } return $s; } private function _cleanhtml($s) { return strip_tags($s, '
');
}
private function _removehtml($s) {
return strip_tags($s);
}
private function _splitbychars($s, $start = 0, $length = null) {
return Str::substr($s, $start, $length);
}
private function _splitbywords($s, $start, $length) {
$len = intval(Str::strlen($s));
if ($len > $start) {
$posStart = max(0, $start == 0 ? 0 : Str::strpos($s, ' ', $start));
$posEnd = max(0, $length > $len ? $len : Str::strpos($s, ' ', $length));
if ($posEnd == 0 && $length <= $len) $posEnd = $len;
return Str::substr($s, $posStart, $posEnd);
} else {
return '';
}
}
private function _findimage($s, $index) {
$index = isset($index) ? intval($index) - 1 : 0;
preg_match_all('/(