: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
namespace Nextend\SmartSlider3\Slider;
use Nextend\Framework\Asset\AssetManager;
use Nextend\Framework\Asset\Css\Css;
use Nextend\Framework\Asset\Js\Js;
use Nextend\Framework\Data\Data;
use Nextend\Framework\Pattern\MVCHelperTrait;
use Nextend\Framework\Settings;
use Nextend\Framework\View\Html;
use Nextend\SmartSlider3\Application\Model\ModelSliders;
use Nextend\SmartSlider3\Renderable\AbstractRenderable;
use Nextend\SmartSlider3\Slider\Base\PlatformSliderTrait;
use Nextend\SmartSlider3\Slider\SliderType\AbstractSliderTypeCss;
use Nextend\SmartSlider3\Slider\SliderType\AbstractSliderTypeFrontend;
use Nextend\SmartSlider3\Slider\SliderType\SliderTypeFactory;
class Slider extends AbstractRenderable {
use PlatformSliderTrait, MVCHelperTrait;
const LOAD_STATE_NONE = 0;
const LOAD_STATE_SLIDER = 1;
const LOAD_STATE_SLIDES = 2;
const LOAD_STATE_ALL = 3;
protected $isAdminArea = false;
public $manifestData = array(
protected $isGroup = false;
public $hasError = false;
public $disableResponsive = false;
protected $parameters = array(
'disableResponsive' => false,
'generatorData' => array()
protected $slidesBuilder;
protected $cache = false;
public static $_identifier = 'n2-ss';
public $staticSlides = array();
/** @var AbstractSliderTypeFrontend */
* @var AbstractSliderTypeCss
* @var string contains already escaped data
public $exposeSlideData = array(
* @param MVCHelperTrait $MVCHelper
public function __construct($MVCHelper, $sliderId, $parameters, $isAdminArea = false) {
$this->loadState = self::LOAD_STATE_NONE;
$this->isAdminArea = $isAdminArea;
$this->setMVCHelper($MVCHelper);
$this->initPlatformSlider();
$this->sliderId = $sliderId;
$this->cacheId = static::getCacheId($this->sliderId);
$this->parameters = array_merge($this->parameters, $parameters);
$this->disableResponsive = $this->parameters['disableResponsive'];
public function setElementId() {
$this->elementId = self::$_identifier . '-' . $this->sliderId;
public static function getCacheId($sliderId) {
return self::$_identifier . '-' . $sliderId;
public function getAlias() {
return $this->data->get('alias', '');
public function initSlider() {
if ($this->loadState < self::LOAD_STATE_SLIDER) {
$slidersModel = new ModelSliders($this->MVCHelper);
$sliderRow = $slidersModel->get($this->sliderId);
throw new Exception('Slider does not exists!');
if (!$this->isAdminArea && $sliderRow['slider_status'] != 'published') {
throw new Exception('Slider is not published!');
if (!empty($this->parameters['sliderData'])) {
$sliderData = $this->parameters['sliderData'];
$sliderRow['title'] = $sliderData['title'];
unset($sliderData['title']);
$sliderRow['type'] = $sliderData['type'];
unset($sliderData['type']);
$this->data = new Data($sliderRow);
$this->params = new SliderParams($this->sliderId, $sliderRow['type'], $sliderData);
$this->data = new Data($sliderRow);
$this->params = new SliderParams($this->sliderId, $sliderRow['type'], $sliderRow['params'], true);
switch ($sliderRow['type']) {
throw new Exception(n2_('Groups are only available in the Pro version.'));
$this->loadState = self::LOAD_STATE_SLIDER;
public function initSlides() {
if ($this->loadState < self::LOAD_STATE_SLIDES) {
$this->slidesBuilder = new Slides($this);
$this->slidesBuilder->initSlides($this->parameters['slidesData'], $this->parameters['generatorData']);
$this->loadState = self::LOAD_STATE_SLIDES;
public function initAll() {
if ($this->loadState < self::LOAD_STATE_ALL) {
$this->loadState = self::LOAD_STATE_ALL;
private function setSliderIDFromAlias($slider) {
if (is_numeric($slider)) {
$slidersModel = new ModelSliders($this->MVCHelper);
$slider = $slidersModel->getByAlias($slider);
private function loadSlider() {
$this->sliderType = SliderTypeFactory::createFrontend($this->data->get('type', 'simple'), $this);
$defaults = $this->sliderType->getDefaults();
$this->params->fillDefault($defaults);
$this->sliderType->limitParams($this->params);
$this->features = new FeatureManager($this);
public function getNextCacheRefresh() {
return $this->sliderType->getNextCacheRefresh();
return $this->slidesBuilder->getNextCacheRefresh();
public function render() {
if ($this->loadState < self::LOAD_STATE_ALL) {
throw new Exception('Load state not reached all!');
if (!$this->loadSlider()) {
if (!$this->hasSlides()) {
$this->slidesBuilder->addDummySlides();
if (!$this->getActiveSlide()) {
$slides = $this->getSlides();
$this->setActiveSlide($slides[0]);
$this->assets = SliderTypeFactory::createCss($this->data->get('type', 'simple'), $this);
$this->slidesBuilder->prepareRender();
$this->renderStaticSlide();
$slider = $this->sliderType->render($this->assets);
$slider = str_replace('n2-ss-0', $this->elementId, $slider);
$loadingType = $this->params->get('loading-type');
if ($loadingType == 'afterOnLoad') {
$rocketAttributes .= ' data-loading-type="' . $loadingType . '"';
} else if ($loadingType == 'afterDelay') {
$delay = max(0, intval($this->params->get('delay'), 0));
$rocketAttributes .= ' data-loading-type="' . $loadingType . '"';
$rocketAttributes .= ' data-loading-delay="' . $delay . '"';
if (!empty($rocketAttributes)) {
$slider = '<template id="' . $this->elementId . '_t"' . $rocketAttributes . '>' . $slider . '</template>';
$slider = $this->features->translateUrl->replaceUrl($slider) . HTML::tag('ss3-loader', array(), '');
$slider = $this->features->align->renderSlider($slider, $this->assets->sizes['width']);
$slider = $this->features->margin->renderSlider($slider);
Css::addInline($this->features->translateUrl->replaceUrl($this->sliderType->getStyle()), $this->elementId);
* On WordPress, we need to add the slider's Inline JavaScript into the Head.
Js::addInline($this->sliderType->getScript());
'n2-section-smartslider',
$this->params->get('classes', '')
if (intval($this->params->get('clear-both', 1))) {
$sliderAttributes = array(
'class' => implode(' ', $classes),
'data-ssid' => $this->sliderId
$sliderAttributes['data-fallback-for'] = $this->fallbackId;
$ariaLabel = $this->params->get('aria-label', 'Slider');
if (!empty($ariaLabel)) {
$sliderAttributes['tabindex'] = '0';
$sliderAttributes['role'] = 'region';
$sliderAttributes['aria-label'] = $ariaLabel;
$alias = $this->getAlias();
$sliderAttributes['data-alias'] = $alias;
if (intval($this->params->get('alias-id', 0))) {
$sliderAttributes['id'] = $alias;
if (intval($this->params->get('alias-slideswitch-scroll', 1))) {
$slideCount = $this->getSlidesCount();
for ($i = 1; $i <= $slideCount; $i++) {
$slideAnchorHTML .= Html::tag('div', array(
'id' => $alias . '-' . $i
$slider = $slideAnchorHTML . $slider;
$sizes = $this->assets->sizes;
if ($rockedLoader && !empty($sizes['width']) && !empty($sizes['height'])) {
$sliderAttributes['style'] = 'height:' . $sizes['height'] . 'px;';
$html .= Html::tag("div", $sliderAttributes, $slider);
AssetManager::$image->add($this->images);
if (!$this->isGroup && !$this->isAdmin && $this->features->responsive->forceFull) {
$html = Html::tag("ss3-force-full-width", array(
'data-overflow-x' => $this->features->responsive->forceFullOverflowX,
'data-horizontal-selector' => $this->features->responsive->forceFullHorizontalSelector
if ($this->params->get('clear-both', 1)) {
$attr['class'] = 'n2_clear';
return Html::tag("div", $attr, $html);
public function addStaticSlide($slide) {
$this->staticSlides[] = $slide;
public function renderStaticSlide() {
if (count($this->staticSlides)) {
for ($i = 0; $i < count($this->staticSlides); $i++) {
$this->staticHtml .= $this->staticSlides[$i]->getAsStatic();
public static function removeShortcode($content) {
$content = preg_replace('/smartslider3\[([0-9]+)\]/', '', $content);
$content = preg_replace('/\[smartslider3 slider="([0-9]+)"\]/', '', $content);
$content = preg_replace('/\[smartslider3 slider=([0-9]+)\]/', '', $content);
public function getActiveSlide() {
return $this->activeSlide;
* @param Slide $activeSlide
public function setActiveSlide($activeSlide) {
$this->activeSlide = $activeSlide;
public function getSlides() {
return $this->slidesBuilder->getSlides();
public function hasSlides() {
return $this->slidesBuilder->hasSlides();
public function getSlidesCount() {
return $this->slidesBuilder->getSlidesCount();
public function isGroup() {
public function isLegacyFontScale() {
return !!$this->params->get('legacy-font-scale', 0);