: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
namespace Nextend\SmartSlider3\Slider;
use Joomla\CMS\Router\Route;
use Nextend\Framework\Cast;
use Nextend\Framework\Data\Data;
use Nextend\Framework\FastImageSize\FastImageSize;
use Nextend\Framework\Image\Image;
use Nextend\Framework\Image\ImageEdit;
use Nextend\Framework\Misc\Str;
use Nextend\Framework\Parser\Common;
use Nextend\Framework\Parser\Link;
use Nextend\Framework\Platform\Platform;
use Nextend\Framework\Plugin;
use Nextend\Framework\Request\Request;
use Nextend\Framework\ResourceTranslator\ResourceTranslator;
use Nextend\Framework\Sanitize;
use Nextend\Framework\Translation\Translation;
use Nextend\Framework\View\Html;
use Nextend\SmartSlider3\Generator\Generator;
use Nextend\SmartSlider3\Renderable\AbstractRenderableOwner;
use Nextend\SmartSlider3\Renderable\Component\AbstractComponent;
use Nextend\SmartSlider3\Renderable\Component\ComponentSlide;
class Slide extends AbstractRenderableOwner {
public $id = 0, $slider = 0, $publish_up = '1970-01-01 00:00:00', $publish_down = '1970-01-01 00:00:00', $published = 1, $first = 0, $slide = '', $ordering = 0, $generator_id = 0;
protected $frontendFirst = false;
protected $title = '', $description = '', $thumbnail = '';
* @var string contains escaped html data
protected $generator = false;
protected $variables = array();
public $attributes = array(), $linkAttributes = array(), $showOnAttributes = array();
public $containerAttributes = array(
'class' => 'n2-ss-layers-container n2-ss-slide-limiter n2-ow'
public $classes = '', $style = '';
public $nextCacheRefresh = 2145916800; // 2038
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');
foreach ($data as $key => $value) {
'layers' => json_decode($this->slide, true),
'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;
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.
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]);
$layers[$i]['zIndex'] = 0;
if (isset($layers[$i]['type']) && $layers[$i]['type'] == 'group') {
$this->fixOldZIndexes($layers[$i]['layers']);
if (isset($layers[0]['zIndex'])) {
private function sortOldZIndex($a, $b) {
if ($a['zIndex'] == $b['zIndex']) {
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();
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() {
public function isCurrentlyEdited() {
return Request::$REQUEST->getInt('slideid') == $this->id;
public function setIndex($index) {
public function setPublicID($publicID) {
$this->publicID = $publicID;
public function getPublicID(): int {
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->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);
protected function addSlideLink() {
$linkV1 = $this->parameters->getIfEmpty('link', '');
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 != '#') {
$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'] = "";
public function getRawLink() {
$linkV1 = $this->parameters->getIfEmpty('link', '');
list($link, $target) = array_pad((array)Common::parse($linkV1), 2, '');
return $this->parameters->getIfEmpty('href', '');
public function getRawLinkHref() {
$linkV1 = $this->parameters->getIfEmpty('link', '');
list($link, $target) = array_pad((array)Common::parse($linkV1), 2, '');
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);
'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();
$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(
'class' => 'n2-ss-slide-thumbnail'
$this->html .= Html::image($this->sliderObject->features->optimize->optimizeThumbnail($thumbnail), esc_attr($this->getThumbnailAltDynamic()), $attributes);
$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() {
public function getAsStatic() {
$mainContainer = new ComponentSlide($this, $this->slide);
'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)) {
private static function splitTokens($input) {
for ($i = 0; $i < strlen($input); $i++) {
$currentChar = $input[$i];
if ($currentChar === "," && $nestingLevel === 0) {
$tokens[] = $currentToken;
$currentToken .= $currentChar;
if ($currentChar === "(") {
} else if ($currentChar === ")") {
if (strlen($currentToken)) {
$tokens[] = $currentToken;