Simpla 2: переключатель пользовательского шаблона

Simpla 2: переключатель пользовательского шаблона

Дата публикации:
Поделиться:

Как обычно начнем с АПИ. Файл api/Design.php - в нем сделаем несколько изменений.

Добавим 3 метода:

    public function set_theme($theme) {
        if(is_dir($this->config->root_dir.'/design/'.$theme.'/html')) {
            setcookie('theme', $theme, time()+60*60*24*30, "/");
            return $theme;
        }
        else
            return false;
    }
    
    public function get_theme() {
        if(!isset($_COOKIE['theme']) || !is_dir($this->config->root_dir.'/design/'.$_COOKIE['theme'].'/html'))
            $theme = $this->set_theme($this->settings->theme);
        else
            $theme = $_COOKIE['theme'];

        return $theme;
    }
    
    public function get_themes()
    {
        if($handle = opendir('design/')) {
            while(false !== ($file = readdir($handle)))
            { 
                if(is_dir('design/'.$file) && $file[0] != '.')
                {
                    unset($theme);
                    $theme->name = $file;
                    $themes[] = $theme; 
                } 
            }
            closedir($handle); 
            sort($themes);
        }
        return $themes;
    }  

Теперь, когда мы создали нужные нам методы, можно ими воспрользоваться. Заменим строку 32

		$theme = $this->settings->theme;

на

		$theme = $this->get_theme();

И далее по коду - строку 63

		$this->design->assign('settings',	$this->settings);

на

		$settings = $this->settings;
		$settings->theme = $this->get_theme();
		$this->design->assign('settings',	$settings);

Создадим список шаблонов для передачи в шаблон. В файле view/IndexView.php заменим передачу переменной content в шаблон (~70 строка)

$this->design->assign('content', $content);	

на (как раз с этим кодом надо поиграться, чтобы было красиво)

		$html = '<div id="styles" style="width: 120px; position: fixed; top: 40px; left: 0; padding: 6px 8px 8px; background: #dedede; z-index: 9999" onclick="jQuery(this).hide(\'right\')">';
		foreach($this->design->get_themes() as $theme)
			$html .= '<li><a href="'.$this->request->url(array('theme'=>$theme->name)).'">'.$theme->name.'</a></li>';   
		$html .= '</ul></div>';	

		// Передаем основной блок в шаблон
		$this->design->assign('content', $content.$html);	

Этот вывод в шаблон можно не делать, если Вы будете публиковать список через фреймы - но у меня не было такой задачи.

Хотелось бы затронуть меньше файлов, но... Теперь обработаем входной параметр theme в файле view/View.php. После обработчика валюты вставим код (~64 строкой)

            if(($theme = strval($this->request->get('theme')))!='') {
                $this->design->set_theme($theme);
                header("Location: ".$this->request->url(array('theme'=>null)));
            }
            
//            $this->design->assign('themes',    $this->design->get_themes());   

Тут специально закомментирована передача в шаблон переменной themes. Мне она там не надо, т.к. я планироваю все сделать без затрагивания шаблонов, но если Вам понадобится - можете раскомментировать.

Посмотреть пример работы можно по ссылке.

Удачи в работе!

Отзывы

Оставьте отзыв
На него будут приходить уведомление при ответе. На сайте не публикуется

Модули из этой тематики