Лучшая CMS

mendel
На сайте с 06.03.2008
Offline
183
#121
obius:
А как же типы полей? Например переменая "footerBoxed" с типом значения булево. Или при редактировании в "формочке" все типы полей выводятся как input[type=text] или textarea?

Храниться оно в текстовом файлике в json, откуда я и скопировал.

Структура (где типы и т.п.) выглядит вот так:


'skinReg' => {
'box' =>{
'#class' => 'RegBox',
},
'rules' => {
'default' => {
'id' => {'hidden', {'defaultSave','value'=>'skinReg'}},
'folder'=>{'hidden','randId'},
'siteName' => {'string'},
'skin'=>{{'selectArray','options'=>{
'cerulean'=>'Cerulean - A calm blue sky',
'cosmo'=>'Cosmo - An ode to Metro',
'cyborg'=>'Cyborg - Jet black and electric blue',
'darkly'=>'Darkly - Flatly in night mode',
'flatly'=>'Flatly - Flat and modern',
'journal'=>'Journal - Crisp like a new sheet of paper',
'lumen'=>'Lumen - Light and shadow',
'paper'=>'Paper - Material is the metaphor',
'readable'=>'Readable - Optimized for legibility',
'sandstone'=>'Sandstone - A touch of warmth',
'simplex'=>'Simplex - Mini and minimalist',
'slate'=>'Slate - Shades of gunmetal gray',
'spacelab'=>'Spacelab - Silvery and sleek',
'superhero'=>'Superhero - The brave and the blue',
'united'=>'United - Ubuntu orange and unique font',
'yeti'=>'Yeti - A friendly foundation',
}}},
'favicon' => {{'string', 'maxlen'=>120},'img'},
'bgImg' => {{'string', 'maxlen'=>120},'img'},
'bgSize'=>{{'selectArray','options'=>{
'cover'=>'По ширине',
'contain'=>'Поместить целиком',
}},
},

'footerBoxed'=>{'boolean'},
'copyright' => {'string'},
'footerColor'=>{'string'},
'footerBgColor'=>{'string'},
'footerType'=>{{'selectArray','options'=>{
'layout/block/footerSmall'=>'Small - no contact, no menu',
'layout/block/footerMenu'=>'Menu - contact, menu',
'layout/block/footerWell'=>'Well - contact line',
}},
{'default','value'=>'layout/block/footerSmall'}
},

'infoBlock' =>{'article'},
'infoBlock2' =>{'article'},
'defaultThumb' => {{'string', 'maxlen'=>120},'img'},
},
},
'formTabs' => {
'default' => {
'default'=>{
'siteName',
'skin',
'bgImg','bgSize',
'favicon',
},
'footer'=>{
'footerBoxed',
'footerType',
'copyright',
'footerColor','footerBgColor',
},
'other'=>{
'defaultThumb',
'infoBlock',
'infoBlock2',
},
},
},
},

(квадратные скобки заменил на фигурные ибо форум портит)

Немного сыровато, например правило img не требует string ибо наследуется от него, и т.п., но пока цель быстро делать сайты и тестировать, а не чистота кода.

К этому еще файлик языков:


'model/skinReg' =>{
'#parent' =>'model/abstractFormModel',
'footer_Tab' => 'Подвал (footer)',
'other_Tab' => 'Прочие настройки',
//
'siteName'=>'Название сайта',
'siteName_help'=>'Название сайта',
'skin'=>'Шаблон',
'skin_help'=>'Шаблон - основная цветовая схема, и некоторые стандартные элементы оформления',
'favicon'=>'Favicon',
'favicon_help'=>'favicon',
'bgImg'=>'Фон',
'bgImg_help'=>'Фоновая картинка всего сайта',
'bgSize'=>'Размер фона',
'bgSize_help'=>'Размер фоновой картинки - по умолчанию замостить копиями картинки, или растянуть по ширине, или поместить всю картинку целиком',

'footerBoxed'=>'Фиксированная ширина',
'footerBoxed_help'=>'Фиксированная ширина шаблона, т.е. не на всю ширину',
'copyright'=>'Копирайт',
'copyright_help'=>'Пишется внизу сайта и других местах',
'footerColor'=>'Цвет шрифта футера',
'footerColor_help'=>'Цвет шрифта в "подвале", там где копирайты',
'footerBgColor'=>'Цвет фона футера',
'footerBgColor_help'=>'Цвет фона "подвала"',
'footerType'=>'Вариант подвала',
'footerType_help'=>'Выбираем вариант компоновки подвала (нижней части страницы)',

'infoBlock' =>'Инфо блок сайдбара',
'infoBlock_help' =>'ИнФормация выводимая в первом блоке в сайдбаре - наиболее полезная',
'infoBlock2' =>'Инфо блок2',
'infoBlock2_help' =>'Блок сайдбара который внизу',
'defaultThumb'=>'Заглушка для статей',
'defaultThumb_help'=>'Заглушка для статей подставляемая если у статьи нет картинки',
},

Ну и собственно "код" самого контроллера для админки:


'adminSkin' => {
'#parent' =>'adminRegAbstract',
'modelName' => 'skinReg@skinReg',
},

Ну и результат соответственно выглядит вот так:

Оно вроде и много букафф как для простой формочки на 15 полей, но пишется это быстрее чем куча копипасты шаблонов, думать не надо,

да и чего греха таить - не так уж и мало оно делает - и валидация, и приведение типов, и автозаполнение и разные виды полей, типа картинки, текстового редактора и т.п.

Ну и да, шаблоны тут уже готовые, и контроллер типовой, но они тоже не сложные:

Шаблон который мы тут видим:


<div class="row">
<div class="col-lg-12">
<?=view('crud/crudTab',{'model'=>$model,'actions'=> controller()->updateActions});?>
</div>
<?php if($article): ?>
<div class="col-lg-12">
<div class="box">
<div class="box-body">
<?=$article;?>
</div>
</div>
</div>
<?php endif;?>
</div>
<?php if(controller()->needUploader) : ?>
<?=view('uploader/uploader',{'folder'=>$model->folder,'addEditor'=>TRUE});?>
<?php endif; ?>

Ну и контроллер тоже хоть и универсальный, но не сложный:


class AdminRegController extends AbstractPageController
{
public $formTabs;
public $needUploader = TRUE;
protected $modelName;
public $updateActions={{'crud/save'}};

public function __construct($config = NULL) {
if(s()->currentUser()->isGuest()) throw new RouteForbiddenException();
s()->http()->ttl = FALSE; // Запретим кешировать наш вывод ибо он динамичный
parent::__construct($config);
}

public function indexAction() {
$page = $this->preparePage();
// **********************************************************************
$model = model($this->modelName);
// Пробуем обновить данные из POST, если обновили и данные валидны, то сохраним
if(s()->post()->update($model) AND $model->isValid()) {
$model->save();
}
$page->model = $model;
s()->layout()->show($page);
}
}

Ну и "абстрактный" конфиг контроллера от которого мы "наследовались" выше:


'adminRegAbstract' => {
'#parent' =>'adminAbstract',
'#class'=>'AdminRegController',
'viewName' => 'crud/update',
'needUploader' => TRUE,
},

(напомню что квадратные скобки заменяны на фигурные).

Бонусом ту же форму в инсталяторе добавляю одной строкой, и уже в шаблоне инсталятора она выводится с учетом всех правил, подсказок и т.п.

ПС: Это не реклама моего движка, я просто пример MVC привожу. Того же Yii под рукой нет.

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

png drySkin.png
Шутку любишь над Фомой, так люби и над собой. (с) народ. Бесплатные списки читабельных(!) свободных доменов (http://burzhu.net/showthread.php?t=2976) (5L.com) Сайты, All inclusive. 5* (/ru/forum/962215)
tommy-gung
На сайте с 22.11.2006
Offline
287
#122

шаблонизатора явно не хватает

Здесь не могла быть ваша реклама
obius
На сайте с 19.08.2015
Offline
56
#123

mendel,

МВЦ в действие, любо-дорого :)

А что за функция s не понятно? синглтон?

Конфиги держать в json вполне оправдано, но языковые файлы не проще в ini держать? Получим тот же ассоциативный массив с возможностью использовать секции:

файл russian.ini:


[error]
404 = Не найдено
403 = Запрещено

файл test.php:


<?php

$language = parse_ini_file( 'russian.ini', true );

echo '<pre>';
print_r( $language );
echo '</pre>';

$code = 404;

echo $code . ' ' . $language['error'][ $code ];

?>

результат:


Array
(
[error] => Array
(
[404] => Не найдено
[403] => Запрецено
)

)

404 Не найдено
serval
На сайте с 29.06.2011
Offline
191
#124
SeVlad:
Плагин небось взял из "бесплатных из интернета"?

Естественно. Ещё за плагины к вордпрессу платить?

S
На сайте с 23.05.2004
Offline
316
#125

Вот так смотришь другие cms и думаешь "госпади, ну и накашмарили". В результате чего занимаешься не программированием, а изучением тараканов от создателя движка.

У одних тонны конфигураций в ветвлениях массивов или json , другие языковые файлы создают вместо использования gettext, у третьих мания OOP и всего нового, что приводит к тоннам абстракций, наследования и километровым вызовам объекта за объектом.

Это просто подпись.
danforth
На сайте с 18.12.2015
Offline
153
#126
serval:
Естественно. Ещё за плагины к вордпрессу платить?

Проржал с этого поста)) в нем вся суть wordpress.

obius:
МВЦ в действие, любо-дорого
mendel:
я просто пример MVC привожу

Есть только одна проблема: при использовании MVC у вас должен быть шаблонизатор, потому как на данный момент ничто не мешает сайту отвалиться из-за Syntax Error, ну или какой-нибудь мудак сможет во View сделать eval или ещё какую-то хрень. Ну, то есть, само по себе решение с шаблонизацией в виде PHP нельзя назвать не правильным, но зависимость работы приложения от View все равно остается. Ещё, кстати, PSR немного глаз мазолит, но это уже такое)) хозяин - барин.

Junior Web Developer
obius
На сайте с 19.08.2015
Offline
56
#127
Stek:
Вот так смотришь другие cms и думаешь "госпади, ну и накашмарили". В результате чего занимаешься не программированием, а изучением тараканов от создателя движка.

У одних тонны конфигураций в ветвлениях массивов или json , другие языковые файлы создают вместо использования gettext, у третьих мания OOP и всего нового, что приводит к тоннам абстракций, наследования и километровым вызовам объекта за объектом.

И действительно, а зачем нам "тонны абстракций, наследования и километровым вызовам объекта за объектом". Пусть лучше будет изобилие функций, как например у ВП.

Только что установленный ВП интереса ради, без каких либо настроек и плагинов. Так вот он имеет 1900 узер функций ( весь список функций выложил на pastebin.com, вдруг кому будет интересно ). К-во подключенных файлов я даже боюсь смотреть.

2к функций лучше 1 класса, расширенного абстрактным классом и интерфейсом? ну я прям даже и не знаю что и сказать.

По вашему это нормальная практика?

По поводу gettext, быть может вы правы :)

S
На сайте с 23.05.2004
Offline
316
#128
obius:
И действительно, а зачем нам "тонны абстракций, наследования и километровым вызовам объекта за объектом". Пусть лучше будет изобилие функций, как например у ВП.

А где то кто то говорил о функциях ? Я ставлю просто под сомнение ООП ради ООП.

Playerror
На сайте с 28.09.2008
Offline
117
#129

obius, WP тащит legacy, наверное так спроектировали в 2003

Самое интересное, зачем нужна обратная совместимость, если всех подталкивают ставить новые версии WP из-за дырок в предыдущих версиях.

totamon
На сайте с 12.05.2007
Offline
437
#130
obius:
Так вот он имеет 1900 узер функций ( весь список функций выложил на pastebin.com, вдруг кому будет интересно ).

к чему вы так напрягались?) кому надо в курсе, и скажу больше все эти функции задокументированы и описаны и не раз, например русский вариант или в оригинале

о чем вообще речь? любой фреймворк или серьезная CMS имеет такой набор функций или классов, который приходится изучать и применять.

Домены и хостинг https://8fn.ru/regru | Дедик от 3000р https://8fn.ru/73 | VPS в Москве https://8fn.ru/72 | Лучшие ВПС, ТП огонь, все страны! https://8fn.ru/inferno | ХОСТИНГ №1 РОССИИ https://8fn.ru/beget

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий