bem-site / bem-forum-content-ru

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

Статичные файлы, например, favicon'ы #547

Open sotnikov-link opened 9 years ago

sotnikov-link commented 9 years ago

Доброго времени!

Для создания проекта использовал «yo bem-stub». Выбранные основные технологии: bemtree, bemjson, bh. Выбранные уровни переопределения: desktop, touch-pad, touch-phone. Сборщик — ENB.

Как при описании блока «page», например, в «desktop.bundles/index/index.bemjson.js» не указывать параметр favicon, а использовать значение и ресурсы самого блока, переопределенного на уровне «common»?

Заранее спасибо за помощь!

qfox commented 9 years ago
  1. Проставить в bemtree в возвращаемом объекте (код не подскажу с ходу, но там, вроде, тривиально должно быть);
  2. Проставить в bh в конкретном блоке (или модификаторе), для этого на уровне common создаем файл common/page/page.bh.js, пишем туда:
bh.match('page', function (ctx) {
  ctx.json().favicon = 'новая иконка';
  // если так не сработает, то:
  // ctx.param('favicon', 'новая иконка'); // ← кажется, это самый православный способ
  // или
  // json.favicon = 'новая иконка'; return json;
});

Refs:

sotnikov-link commented 9 years ago

@zxqfox, про первый пункт ничего не понял, второй уже пробовал.

ctx.param('favicon', 'новая иконка'); // ← кажется, это самый православный способ

Если указать в «common.blocks/page/page.bh.js»:

// ...
ctx.param('favicon', 'page.png');
// ...

Параметр попадает на сборку «desktop.bundles/index/index.html», но путь не правильный к «page.png». Ответ сервера: «Cannot GET /desktop.bundles/index/page.png». Нужно добиться автоматического переписывания пути к файлу и в будущем чтобы можно было собрать нормально статику «borschik'ом».

Другие варианты из 2-го пункта попробовал, результаты один в один.

Информация по ссылкам была мне известна, но однозначно, спасибо за помощь!

Мой файл «common.blocks/page/page.bh.js»:

module.exports = function(bh) {

    bh.match('page', function(ctx, json) {
        //ctx.param('favicon', 'page.png');
        //ctx.json().favicon = 'page.png';
        json.favicon = 'page.png'; return json;
    })
}

Объясните про первый пункт подробнее, пожалуйста, плохо знаком с htmltree.

qfox commented 9 years ago

bemtree служит для генерации bemjson дерева из сырых данных, которые можно получать от API или с сервера. На вход у него (собранного шаблона bemtree из кусочков в блоках) обычный объект с указанием корневого блока. Что-то типа:

{
  block: 'root',
  projects: [ ... ],
  users: [ ... ],
  // etc...
}

А на выходе обычная bemjson структура:

{
  block: 'page',
  // ...
  content: [
    { block : 'project-list', content: [ ... ] }, // etc...
  ]
}

И при генерации этой структуры можно и favicon прописать. Выглядят эти шаблоны как bemhtml, но вместо преобразования в HTML bemjson структуры они её генерируют из сырых данных.

Только проблема в том, что от этого у вас путь правильным все равно не станет, тут надо борщик использовать. И с ним Я так и не поигрался полноценно.

Refs:

sotnikov-link commented 9 years ago

@zxqfox, спасибо! Про BEMTREE имел ввиду, что не особо с ним работал, а что и для чего он, я понимаю.

Вроде задачка простая, но как ее решить правильно, не понятно… Мне кажется, что много кто не указывал для каждой страницы «favicon». Решение точно должно быть, буду ждать и думать. ;)