Bootstrap.PHP создавай шаблоны на Bootstrap быстрее и проще

ChAk

Новичок
Хочу представить вам свой первый open source проект Bootstrap.PHP.
Библиотека предназначена для создание компонентов Twitter Bootstrap с помощью php кода.

PHP:
<?=
Button::create('Заблокированная кнопка занимающая всю доступную ширину', '/link/', Icon::TYPE_DOWNLOAD)
	->setType(Button::TYPE_PRIMARY)
	->setWidth(Button::WIDTH_BLOCK)
	->setEnable(false);
?>

Для чего это может быть нужно?
Я верю, что в любой ситуации когда вы используете стандартные компоненты bootstrap, не модифицируя их, вам будет быстрее и удобнее создавать их на Bootstrap.PHP.
Если вы делает панель администратора, а именно там чаще всего и используется Bootstrap, выигрыш от использования Bootstrap.PHP будет особенно заметен.

Лично мне она очень помогла при создании панели профайлера. Панель сделана на основе Navbar с кучей выпадающих списков и окон. Вы представляете какое разнообразие информации в ней представлено и как сильно может отличаться панель от запроса к запросу. Делай я бы ее с помощью обычного php-html шаблона, он бы получился огромный и ориентировать в нем было бы очень сложно. А с помощью Bootstrap.PHP шаблон получился не только на много короче (чуть больше 500 строк), но и на много понятнее.

Использование Bootstrap.PHP созданием админок не ограничивается. Многие компоненты я использовал прямо на сайте например хлебные крошки, Pager, навигация, кнопки, иконки, думаю в будущем пригодиться и другое.

Чем Bootstrap.PHP лучше "чистого" Bootstrap?
Создать выпадающее меню или навигационную панель проще на Bootstrap.PHP, чем на "чистом" Bootstrap. И не только их, чем сложнее компонент, тем более явно это преимущество.
Так как везде работает авто дополнение и прописаны phpdocs на русском, вам скорее всегда даже не придётся заглядывать в документация, чтобы понять, как что-то сделать. Посмотрел на список методов, вспомнил какие возможности есть у компонента.

На кого библиотека ориентирована?
1) Прежде всего на разработчиков делающих свои проекты самостоятельно. Вряд ли такую библиотеку будут использовать в большой команде где верстальщик не знает php.
2) На не очень опытных разработчиков, так как если ты давно работаешь с Bootstrap то возможно для тебе быстрее и привычнее делать все как раньше.
3) На тех кому удобнее работать с библиотеками где документация в коде на русском языке.

Основные пункты, на которые делался акцент при разработке
1) Авто дополнение и документация в коде phpdocs. Это то что делает эту библиотеку такой удобной в использовании
2) Простота. Идея была в том что бы разработчику не пришлось больше заглядывать в документация после того как он с ней в первый раз ознакомился. Не то что он должен был все заполнить, первого ознакомления должно хватить что бы понять принципы.
3) Простое начало. Лично меня всегда подкупает простое начало работы с чужим кодом. Высокий порог входа возьмёшься преодолевать только если уверен, что потом сможешь сэкономить время используя его.

Сайт проекта http://allking.ru/bootstrap.php/

На сайте можно скачать библиотеку либо посмотреть исходники на гитхабе. Там же есть документация и ссылка на тесты. В документации много примеров, но нет списков параметров методов, их можно посмотреть в phpdocs в самом коде, переносить их в документация просто не хватило времени.
 

Adelf

Administrator
Команда форума
Хорошая вещь. У самого такие классики начали образовываться. Поддерживать будешь? :) Bootstrap меняется иногда. Хоть и незначительно в плане интерфейса.

У меня вот, нуба такого вопрос возник... Не юзал я неймспейсы в PHP. До сих пор отбрекиваюсь от них.
PHP:
use BootstrapPHP\Button;
 
// Превый способ (не рекомундуется)
$button = new Button('Текст на кнопке');
А можно как-нибудь use BootstrapPHP\*; или чтонибудь такое.. чтобы каждый класс в use не обьявлять так?
 

Вурдалак

Продвинутый новичок
Adelf, нет, use — это тупо алиас. Если в ходе выполнения встретился класс и он имеет не абсолютное имя, то сначала просматривается список use, а потом считается, он он в текущем неймспейсе.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
PHP:
->addButtonToFooter()

->makeInverse()

->startDropdown()
Это треш, конечно, и не ООП.

Пользу вижу для каких нибудь цмс-ок, где надо динамически встраиваться в существующую архитектуру.
 

ChAk

Новичок
Adelf

PHP:
 use BootstrapPHP\*
К сожалению так нельзя
Придеться как то так тут ни чего не поделаешь

PHP:
use \BootstrapPHP\ButtonToolbar;
use \BootstrapPHP\ButtonGroup;
use \BootstrapPHP\Button;
use \BootstrapPHP\Icon;
У меня Phpstorm он добавляет use автоматически так что я даже не замечаю как они появляются где то вверху файла.
 

Вурдалак

Продвинутый новичок
А писать use \... не рекомендуется, ибо там ничего кроме fully qualified name и не может быть.
 

ChAk

Новичок
флоппик
PHP:
->addButtonToFooter()
->makeInverse()
->startDropdown()
Это треш, конечно, и не ООП.
PHP:
->addButtonToFooter()
->makeInverse()
Нормальные методы ни понимая к чему здесь предираетесь

PHP:
->startDropdown()
Другое дело, очень спорное решение, а если посмотреть в код то еще и мало понятное, но осознанное
Поверьте, что я очень много думал над этим моментом и реализовать там по-другому что бы при этом осталось все просто и работало авто дополнение я просто не знаю, как. Помните я писал что простота в приоритете.
Для того что бы другие могли понять о чем речь приведу пример целиком
PHP:
Tabs::create
	->addItem('Ссылка 1 (активная)', '/1/', false, true)
	->addItem('Ссылка 2', '/2/')
	->addItem('Ссылка 3 (заблокирована)', '/3/', true)
	->startDropdown('Выпадающее меню')
		->addItem('Ссылка 4', '/4/')
		->addDivider()
		->addItem('Ссылка 5 (заблокировна)', '/5/', true)
	->endDropdown()
	->addItem('И еще одна ссылка', '/6/');
 

keltanas

marty cats
В данный момент уже существуют готовые шаблоны/виджеты для популярных фреймворков, чтобы в представлениях использовать элементы в стиле бутстрапа.
А то, что ты предлагаешь - это велосипед для велосипеда )))

Нет, работу ты конечно проделал большую, молодец )) Только не рентабельную.
 

ChAk

Новичок
Поддерживать будешь? :) Bootstrap меняется иногда. Хоть и незначительно в плане интерфейса.
Если что-то будет меняться в ветке 2.3 то 100% буду вносит изменения.
Что касается версии 3 там работы будет больше, но почти наверняка буду делать поддержку и этой версии так как подозреваю, что 3я версия уже на подходе и будет обидно, что библиотека, на которую я потратил много времени, станет некому не нужной, а то что она будет не кому не нужно если в ней будет поддержка версии 2.3 при том что последняя версия будет 3 это точно, ведь все захотят последнюю версию.
Кстати это еще один существенный плюс возможность переехать на новую версия сменив библиотеку и внеся минимальные изменения в php код
 

ChAk

Новичок
В данный момент уже существуют готовые шаблоны/виджеты для популярных фреймворков, чтобы в представлениях использовать элементы в стиле бутстрапа.
Да и они даже пользуются некоторой популярностью. У меня нет привязки к фреймворкам и это плюс. Но нет документации на английском и phpdocs на русском это минус, так как ограничивает потенциальный круг пользователей.

Нет, работу ты конечно проделал большую, молодец )) Только не рентабельную.
Спасибо. Ну то что я на этом не заработаю, это точно, ну да ладно не все же брать иногда нужно отдавать :) Я понял о чем ты это я шучу
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Нормальные методы ни понимая к чему здесь предираетесь
в нормальном ООП тут должно быть что то вроде
PHP:
new Navbar({ 'type' => Navbar::INVERSE })
->addElement(new Dropdown(...)
    ->addElement(...)
    ->addElement(...)
    ->addSeparator()...)
->addElement(new Button({'type' => Button::SUCCESS})
    ->setType(Button::WARNING)...)...
 

ChAk

Новичок
в нормальном ООП тут должно быть что то вроде
PHP:
new Navbar({ 'type' => Navbar::INVERSE })
->addElement(new Dropdown(...)
    ->addElement(...)
    ->addElement(...)
    ->addSeparator()...)
->addElement(new Button({'type' => Button::SUCCESS})
    ->setType(Button::WARNING)...)...
Спасибо что не поленился написать пример как считаешь правильно.

Твой пример касается только метода makeInverse() про addButtonToFooter(), кстати это метод модального окна, тут ничего ну да ладно

Оставим на суд других какой подход лучше
Я посмотрев на твой склоняюсь к том что мой все таки лучше, с учетом того что бывает только два состояния Inverse и по умолчанию
PHP:
// твой  
new Navbar({ 'type' => Navbar::INVERSE })
// мой
Navbar::create()->makeInverse();
Твой не возможно написать не заглянув в документацию, мой очевиден как только ты видишь список доступных методов.
 

hell0w0rd

Продвинутый новичок
Хоть убейте не понимаю чем удобно:
PHP:
<?=
Button::create('Кнопка с заданными атрибутами')
	->attributes->setId('myButton')
	->attributes->addClass('class_1')
	->attributes->addClass(array('class_2', 'class_n'))
	->attributes->addData('name-1', 'value 1')
	->attributes->addData(array('name-2' => 'value 2', 'name-n' => 'value n'));
?>
вместо
PHP:
<a
	id="myButton"
	class="btn class_1 class_2 class_n"
	data-name-1="value 1" data-name-2="value 2" data-name-n="value n"
>
	Кнопка с заданными атрибутами
</a>
И если уж делать такую библиотеку - должна на мой взгляд быть фабрика со всеми элементами
 

ChAk

Новичок
Хоть убейте не понимаю чем удобно
В данном примере действительно не очевидно поэтому поясню.
Во-первых, в реально проекте, по крайней мере у меня, у вас будет добавляться классы и data атрибуты в зависимости от условий. Условия в php выглядят в органичнее и понятнее чем html шаблоне, хотя тут на любителя.
Во-вторых, если бы это была не кнопка, а кнопка с выпадающим списком, то коды на php уже бы выигрывал от html кода чисто визуально во всех отношениях. Я не говорю уже что в реальном проекте это могут быть еще более сложные конструкции, где вам бы и в голову не пришло сравнивать php шаблон с html.
Ну и куча других преимуществ о которых я уже писал

И если уж делать такую библиотеку - должна на мой взгляд быть фабрика со всеми элементами
Для включения в библиотеку были выбраны только те, которые скорее всего будут использовать как есть, то есть с внесением в их код минимальных изменений. Вряд ли вы будете что-то сильно менять в кнопках Bootstrap’а или в панели навигации, их функционала достаточно. Чего не скажешь, например, о таблицах или формах, конструкторы которых, могли бы быть отдельными большими проектами.
 

hell0w0rd

Продвинутый новичок
куча других преимуществ - это ничто. Нет таких. Основное - не надо думать о разметке, ide дает подсказки, что бы еще такого можно было-бы впихнуть. По классам - автокомплит есть, разметку - да, надо помнить. С другой стороны она достаточно последовательна и понятна, в 3 версии вроде упрощают еще больше, могу ошибаться.
В реальном проекте вы не будете делать так, как у вас описано в доках. У вас будет набор переменных, и замечательным текущим интерфейсом мы воспользоваться не сможем
Под фабрикой я имел ввиду класс, который будет нам рожать элементы, например так:
BootstrapFactory::createButton()
PS
1) у вас в доках полагаю опечатка:
echo Button::create(htmlspecialchars('<inpute>'))->setTag(Button::TAG_INPUT);
2)
PHP:
$class = __CLASS__;
return new $class($direction);
это круто, но лучше юзать return new static($direction);
3) Приведите код к стандартам psr, добавьте composer.json, выложите на пакагист, без этого лень даже пробовать, если честно:)
PPS еще лицензию укажите
 

ChAk

Новичок
1) у вас в доках полагаю опечатка:
Спасибо поправил

PHP:
return new static($direction);
Не знал, спасибо.

Приведите код к стандартам psr, добавьте composer.json, выложите на пакагист, без этого лень даже пробовать, если честно:)
PPS еще лицензию укажите
Если вы о стандарте psr именования файлов то такой выбран для того что бы автозагрузщик был максимально простым. Он есть в комплекте подключается одной строкой так что не вижу ни какой проблемы, какая вам разница какие стандарты внутри чужой для вас библиотеки лежит в отдельной папке и вы ее даже не видите. Сomposer добавлять не хочу так как и так потратил времени больше чем запланировал, дал себе слово что больше время на нее без острой необходимости не трачу. Если окажется что она нужна заметному числу людей то и Сomposer прикручу. В лицензиях не разбираюсь поэтому ни чего не могу сказать. Можно делать то что логично, скачивать и использовать для своих нужд.
 

Вурдалак

Продвинутый новичок
Создай папку src, туда перемести весь код, создай в корне composer.json с содержимым типа
Код:
{
    "name": "chalenkoa/bootstrap.php",
    "description": "Bla bla bla, bla bla bla",
    "keywords": ["twitter-bootstrap", "blabla"],
    "homepage": "https://github.com/chalenkoa/Bootstrap.PHP/",
    "type": "library",
    "license": "MIT",
    "authors": [
        {
            "name": "chalenkoa",
            "email": "[email protected]"
        }
    ],
    "require": {
        "php": ">=5.3.0"
    },
    "autoload": {
        "classmap": ["src/"]
    }
}
Зарегайся на https://packagist.org/ и впиши адрес репозитория. Над именем типа «chalenkoa/bootstrap.php» подумай сам, потом изменить вроде бы уже нельзя.

Займёт минут 10. Потом удали свой автозагрузчик.

А потом сделай папку tests и перепиши вот это на PHPUnit:
PHP:
<?php

namespace BootstrapPHP;

class ButtonTest extends \PHPUnit_Framework_TestCase
{
	public function testRending()
	{
		$this->assertEquals(
			'<a href="/link/" class="btn">Simple button</a>',
			Button::create('Simple button', '/link/')
		);
	}
}
И убери все русские комментарии, перепиши на английский.
 
  • Like
Реакции: Gas

ChAk

Новичок
Вурдалак
Спасибо за рассказ о вашем мнении "как надо", у меня есть свое виденье и библиотека сделана так как кажеться правильным мне.
С Сomposer я ни когда дел не имел и уверен что 10 минутами там дело ограничиться разве что у того кто это уже делал, но точно не у меня
 

Вурдалак

Продвинутый новичок
Прикинь, ты выпускаешь электронное устройство и говоришь, что вилку для розетки ты сделал свою, потому что она тебе больше нравится. Тот факт, что людям придётся покупать переходник, тебя не волнует. Тогда никто, кроме тебя, не будет пользоваться библиотекой.
 

ChAk

Новичок
Вурдалак
Вурдалак ты настоящий Вурдалак. Не обижайся я шучу.
Ты правда веришь что не кто не будет пользоваться библиотекой из за того что она не доступна в виде пакета composer . Я не верю, что ты так думаешь.
Ну серьезно. Конечно ты прав если выпускать библиотеку в open source то нужно ее оформлять как принято в сообществе, а сейчас это psr тесты PHPUnit и composer. Но только если это библиотека уровня самого Bootstrap ну или в 10 раз менее популярная. Моя же скорее всего не претендует и на сотую долю популярности оригинального Bootstrap и трудозатраты на нее я старался все таки минимизировать, хотя конечно же сделал на много больше нежели то что мне пришлось бы делать если бы я делал ее для себя. Ну не требуйте же от меня слишком много. Если библиотека станет популярной, а я не верю, что отсутствие composer помешает ей стать таковой, я разумеется отнесусь к ней с должным уважением и приведу ее к нужному виду, но не раньше. Спасибо за понимание.
 
Сверху