Сообщение об ошибке

  • Deprecated function: Function create_function() is deprecated в функции _geshifilter_prepare() (строка 126 в файле /var/www/lsoft/sites/all/modules/geshifilter/geshifilter.pages.inc).
  • Deprecated function: Function create_function() is deprecated в функции _geshifilter_prepare() (строка 131 в файле /var/www/lsoft/sites/all/modules/geshifilter/geshifilter.pages.inc).
  • Deprecated function: Function create_function() is deprecated в функции _geshifilter_process() (строка 231 в файле /var/www/lsoft/sites/all/modules/geshifilter/geshifilter.pages.inc).

PHP и Kohana 3(MVC): Создаем добавляемые через админку виджеты

test

Предисловие

Стало интересно реализовать такую задачу как добавляемые через админку виджеты, которые будут у нас отображаться на страницах сайта. Используем PHP для кода виджетов и CSS для отображения их, за счет чего мы можем придать возможность отображаться виджетам так как нам нужно чтобы они отображались.

Что такое виджет?

Элеме́нт интерфе́йса — примитив графического интерфейса пользователя, имеющий стандартный внешний вид и выполняющий стандартные действия.
Другие названия: контро́л (control), элемент управления и ви́джет (англ. widget).
(с)Википедия

В нашем понимании виджет, это...

Виджет - это часть кода выполняющая определенную функцию и выводящая результат в определенный блок шаблона.

Пометка.

Все тоже самое может использоваться на любой другой MVC архитектуре, тут только для примера взята Kohana 3.

Данная статья предполагает:

1) Вы знаете PHP и CSS в достаточной степени.
2) Вы знаете Kohana 3 в достаточной степени.
3) У вас уже установлен и настроен фреймворк Kohana 3, сделан дефолтный шаблон страницы.
4) У вас готова и подключена база данных к Kohana 3.

Итак, как же все это будет работать?
1) Добавляем в bootstrap.php код отображения формы добавления виджета:

Route::set('widgets','widgets/<action>',array('action' => 'show|add' ))
->defaults(array('controller'=>'widgets', 'action'=>'show'));

2) Теперь создаем сам контроллер /classes/controllers/widgets.php:

<?php defined('SYSPATH') or die('No direct script access.');
class Controller_Widgets extends Controller_DefaultTemplate{
    public $template = 'templates/ajax';//для того чтобы если пускать через ajax не грузить лишних элементов, я использую пустой шаблон
    public function action_add()
    {
        if (isset($_POST['save']))
        {
//здесь мы сохраняем файл с кодом и css стиль к нему, так как считаю стиль неотьемлемой частью виджета
            $file = $_SERVER['DOCUMENT_ROOT'].'/application/views/widgets/'.$_POST['name'].'.php';
            $cssfile = $_SERVER['DOCUMENT_ROOT'].'/assets/widgets/css/'.$_POST['name'].'.css';
            $fp = fopen($file,'w');
            $code = "<div id='widget' class='".$_POST['name']."'>".$_POST['code']."</div>";
            if ($result = fwrite($fp,$code))
            {
                DB::insert('widgets',array('name','i18name'))->values(array($_POST['name'],$_POST['i18name']))->execute();
                fclose($fp);
                $fp = fopen($cssfile,'w');
                {
                    fwrite($fp,$_POST['css']);
                    fclose($fp);
                }
            }
        }
        $this->template->content = View::factory('widgets/admin/add');
    }
}
?>

3) Добавляем саму форму добавления виджета /views/widgets/admin/add.php:

<div id='widget_add'>
<form method='POST'>
Машинное название виджета(латинские,маленькие, без псевдографики):<br><input type='text' name='name' class='name'><br>
Название виджета(для отображения):<br><input type='text' name='i18name' class='i18name'><br>
Код виджета:<br><textarea name='code' class='code' cols='70' rows='10'></textarea><br>
CSS виджета:<br><textarea name='css' class='css' cols='70' rows='10'>#widget .class{}</textarea>
<br><div class='help_message'>".class" меняете на ".ваше_машинное_название_виджета"</div>
<input type='submit' name='save' value='Сохранить'>
</form>
</div>

4) В базе данные создаем таблицу widgets:

CREATE TABLE `widgets` (
  `wid` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  `i18name` varchar(100) NOT NULL,
  `showed` int(1) DEFAULT '1',
  PRIMARY KEY (`wid`,`name`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

5) В контроллер шаблона добавляем код который собственно читает у нас доступные виджеты и отправляет их и файлы стилей в наш основной шаблон:

$widgets = DB::select()->from('widgets')->where('showed','=',1)->cached(20)->execute();
            $cntr=-1;
            foreach ($widgets as $wdgt)
            {
                $this->template->widgets[$cntr++] = View::factory('widgets/'.$wdgt['name']);
                $this->template->widgets_styles[$cntr++] = 'assets/widgets/css/'.$wdgt['name'].'.css';
            }

6) Выводим наши виджеты в отображаемом шаблоне:

<?
    foreach($widgets_styles as $ws)
    {
        echo HTML::style($ws,array('media'=>'screen'));
    }
echo "<div id='widget'>";
    foreach ($widgets as $wdgt)
    {
        echo $wdgt;
    }
?>
</div>

Все, таким образом через localhost/widgets/add мы сможем добавлять код наших виджетов и стили, а сами виджеты уже отображаются на всех страницах, на которых у нас используется наш основной шаблон.

Итог

Это только базовый пример как можно создать структуру виджетов на сайте и далеко не полная. Но как основа для опыта может весьма пригодиться. Сейчас архитектура виджетов в общем-то позволяет только выводить информацию. В дальнейшем, если будет надобность и желающие, мы создадим архитектуру виджетов которые могут не только выводить информацию, но и выполнять определенные действия. Например виджеты типа "Подписка".

Категория: 
Share/Save

Делитесь с друзьями в социальных сетях! Оставляйте комментарии!

Share/Save

Это Вам так же может быть интересно!