bem-site / bem-forum-content-ru

Content BEM forum for Russian speak users
MIT License
56 stars 6 forks source link

Yii + bem full stack #448

Open vegas0250 opened 9 years ago

vegas0250 commented 9 years ago

Философия "не mvc" ?

  1. Насколько я понял, методология придерживается идеи 1 страницы. Т.е. у нас нет $layout в котором лежит $content, где $content это какая-то view'ха. Как разрешить этот вопрос в рамках методологии БЭМ? Все что у нас есть это макеты в .bundlers и блоки в .blocks.
  2. Мы сверстали статику, и получили index.html, index.css, index.js, мы отдали это backend'у, на баке прогреры натыкают переменных которые пришли из контроллеров, и как только появляется необходимость поменять структуру странички, например добавить блок "заявки", то начинается боль. Нам снова надо пересобрать страничку через bem и отдать прогерам перезаписав работу бакендчиков? Как избежать этой боли?
vithar commented 9 years ago

Насколько я понял, методология придерживается идеи 1 страницы. Т.е. у нас нет $layout в котором лежит $content, где $content это какая-то view'ха. Как разрешить этот вопрос в рамках методологии БЭМ? Все что у нас есть это макеты в .bundlers и блоки в .blocks.

Если я правильно понял вопрос, layout это точно такой же блок, как и то, что лежит внутри него.

Предположим, что на вход у нас такие данные:

var data = [
    {
        "news": $newsForPage1,
        "content": $contentForPage1
    },
    {
        "news": $newsForPage2,
        "content": $contentForPage2
    },
    {
        "news": $newsForPage3,
        "content": $contentForPage3
    }
]

Для того, чтобы получить что-то типа такого HTML для каждой страницы

<div class="layout">
    <div class="layout__sidebar">
        <div class="news">$newsForPageN</div>
    </div>
    <div class="layout__content">
        <div class="content">$contentForPageN</div>
    </div>
</div>

потребуется примерно такая функция, генерирующая HTML:

data.forEach(function(page, index) {
    require('fs').writeFileSync('page' + index + '.html', BEMHTML.apply({
        block: 'layout',
        content: [
            elem: 'sidebar',
            content: {
                block: 'news', content: page.news
            },
            elem: 'content',
            content: {
                block: 'content', content: page.content
            }
        ]
    }));
});
vegas0250 commented 9 years ago

Если я правильно понял вопрос, layout это точно такой же блок, как и то, что лежит внутри него.

Совершенно верно, можем ли мы физически разделить 1 bemjson на 2, по аналогии с layout и view в известных framework'ах?

P.S. Второй вопрос в силе :)

qfox commented 9 years ago

Нам снова надо пересобрать страничку через bem и отдать прогерам перезаписав работу бакендчиков? Как избежать этой боли?

Вам нужен bemjson и шаблоны. Если отдать шаблоны на пхп — будет все ок.

vithar commented 9 years ago

Я обновил комментарий, посмотрите.

vithar commented 9 years ago

Мы сверстали статику, и получили index.html, index.css, index.js, мы отдали это backend'у, на баке прогреры натыкают переменных которые пришли из контроллеров, и как только появляется необходимость поменять структуру странички, например добавить блок "заявки", то начинается боль. Нам снова надо пересобрать страничку через bem и отдать прогерам перезаписав работу бакендчиков? Как избежать этой боли?

Наиучший, но самый сложный к внедрению вариант: бекенд ничего не знает про фронденд, собирает данные и в виде JSON передаёт их фронтенду. Фронтенд трансформирует JSON в BEMJSON добавляя логику фрондента, а потом переводит BEMJSON в HTML на сервере или на клиенте.

qfox commented 9 years ago

@vegas0250 @vithar стоит заметить, что так же можно и сам bemjson склеивать.

И не стоит забывать про вариант, когда у вас есть тонкий слой шаблонизации для сборки страниц из html на сервере в виде nodejs приложения, или с помощью отдельной v8.

p.s. ну и про bh-php тоже — можно и в него посмотреть ;-)

vegas0250 commented 9 years ago

@zxqfox @vithar Большое спасибо за развернутые, и своевременные ответы. Осталось раздуплить :) Вопросов больше не имею.

tadatuta commented 9 years ago

@vegas0250 удалось ли разобраться?

vegas0250 commented 9 years ago

@tadatuta прочитал много материала и просмотрел несколько видео понял что исходный full-stack не очень подходит для легкой интергации с yii. bemtree накатывает данные на bemjson, bemjson трансформируется в html с учетом bemhtml.

Такой подход мне показался не очень удобным, и я решил что структуры bemjson у меня не будет. В связи с этим есть простой html, и правильно оформленные "blocks" и .deps.js. Напишу плагин gulp для получения всех используемых блоков, элементов и модификаций на странице в html (/protected/views), и передачи их сборщику для подтягивания всех используемых блоков на странице и их зависимостей. Ещё не решил подойдет ли стандартный сборщик если я ему отдам например fake bemjson, или напишу свой сразу с coffee.

Интересно знать пишу ли я велосипед?

P.S. для js попробую i-bem__dom

tadatuta commented 9 years ago

@vegas0250 да, скорее всего получится велосипед. Попробую помочь этого избежать.

Чтобы получить из правильно оформленного HTML декларацию со всеми использованными в нем блоками, можно применить html2bemjson, а на основании него собрать все необходимые файлы.

Пример сборки типичного проекта на основе HTML с помощью bem-tools есть тут, для ENB сделать по аналогии должно быть просто. Если потребуется, готов помочь.

Альтернативный вариант — это вообще не смотреть на HTML, создать файл декларации вручную, указать в нем лишь один родительский блок (например, page), а все остальные блоки указывать в deps.js-файлах.

PS: мы потихоньку движемся к тому, чтобы начать собирать БЭМ-проекты с помощью gulp, но каких-либо сроков по-прежнему нет.

vegas0250 commented 9 years ago

@tadatuta

а все остальные блоки указывать в deps.js-файлах.

Тогда понадобиться тазик для кровавых слез.

html2bemjson прекрасная вещь, то что нужно, не хочется bem или enb сервер для сборки подтягивать, можно ли как то оформить в библиотеку сборщик который на вход получает bemjson на выходе выбираем destination, и радуемся полному циклу для любого framework'a или CMS.

P.S. Ткните в исходники сборки для bemjson и deps.js. Не могу что-то найти и времени на поиск жалко, заранее спасибо :) (Жалко потому что на работе надо работать работу :))

tadatuta commented 9 years ago

Тогда понадобиться тазик для кровавых слез.

В самом простом случае это будет выглядеть как page.deps.js, содержащий что-то типа

({
    shouldDeps: ['header', 'logo', 'main', 'sidebar', 'link', 'footer'] // и так далее
})

вроде вполне можно осилить?

можно ли как то оформить в библиотеку сборщик который на вход получает bemjson на выходе выбираем destination, и радуемся полному циклу

На самом деле можно, скажем, для gulp создать таск, который будет тупо запускать bem make или enb make, а потом перекладывать артефакты в destination. Это задача на 5 минут.

А вот задача про сборку deps без bem-tools/enb — уже гораздо сложнее. Сейчас работа идет над модулем bem-deps, который возьмет на себя часть задачи. Подробнее о том, что должен делать такой модуль см. https://github.com/bem-incubator/bem-deps/issues/2

Текущие технологии для сборки deps на ENB см. тут: https://github.com/enb-bem/enb-bem-techs/tree/master/techs (deps и deps-old). Для bem-tools — здесь: https://github.com/bem/bem-tools/blob/support/0.9.x/lib/techs/v2/deps.js.js.

vegas0250 commented 9 years ago

@tadatuta

вроде вполне можно осилить?

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

На самом деле можно, скажем, для gulp создать таск, который будет тупо запускать bem make или enb make, а потом перекладывать артефакты в destination. Это задача на 5 минут.

Попробую так :)

vegas0250 commented 9 years ago

@tadatuta большое спасибо, завел цикл, но он не оптимизирован ибо пересобираются все страницы, буду признателен если дадите линк на грамотное руководство по enb make.

Сделал так, gulp.watch повесил на views/*.php => (html2bemjson) => получаем валидный bemjson.

И второй gulp.watch слушает *.bemjson.js => enb make

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

tadatuta commented 9 years ago

@vegas0250 хороших документов прямо сейчас вряд ли смогу посоветовать, мы потихоньку работаем над их написанием. Сейчас все, что есть, доступно по ссылкам на bem.info (https://ru.bem.info/tools/bem/enb-bem/).

Но я вчера обновил html2bemjson (появился парсинг модификаторов вместо миксов и несколько тестов), написал enb-html-to-bemjson и поддержал использование в https://github.com/tadatuta/bem-project-stub-he (см. последний коммит).