Ответы пользователя по тегу PHP
  • Полный цикл жизни проекта: html,css,js > php, шаблоны, изменения, переиспользование?

    qfox
    @qfox
    Ответы есть у меня
    Текущий подход достаточно заморочен, если знаешь все прелести БЭМ.

    Сейчас мы делаем:
    0. Дизайнер нарисовал макет
    1. Верстаем руками html: a.html
    2. пишем руками стили: a.css
    3. пишем руками js: a.js
    4. Это все передаем бекендеру и он:
    5. Доверстывает хтмл и разбивает на шаблоны, из a.html получает A.tmpl, B.tmpl, C.tmpl, ...
    6. Дописывает стили в своих файлах, а часто еще и разбивает их на части: A.scss, B.scss, ...
    7. Дописывает js, и тоже часто разбивает: A.js, B.js, C.js
    8. Какой-то бэкенд собирает из кусков шаблонов страницу, и часто создает css, js только из нужных кусков

    А дальше: Пришел новый макет. И что делать?

    И БЭМ в данном случае решает проблему, поскольку у него есть стек технологий, позволяющий верстальщику работать сразу с шаблонами и разобранными js/css(less/sass/stylus) файлами.

    На практике получается так:
    0. Макет.
    1. Верстальщик смотрит на макет, и разбивает его на куски (компоненты) сразу;
    2. Пишет bemjson (или jsx) вместо html;
    3. Создает шаблоны, стили и js для каждого из блоков;
    4. Передает это все бэкенд программисту (обычно через гит, потому что так удобнее);
    5. Бэкендер без изменений использует эти файлы для генерации страницы, и просто генерирует описанный верстальщиком bemjson (или jsx).

    И, О МАГИЯ, они могут работать над проектом параллельно, даже если придет новый макет.

    C php действительно есть нюансы, которые сложно разглядеть, просто потому, что нет большого кол-ва пользователей и стек не устоялся.
    Мы у себя используем велосипед, который собирает все сам, и почти готовы перейти на enb используя bh-php.
    Большая проблема, как оказалось, использование декларативных шаблонизаторов — верстальщики не сразу въезжают что и как. Но когда въехали — я не знаю тех, кто возвращается на императивные (типа мусташей, джейдов, smarty, etc.).

    Можно начать с https://github.com/bem/project-stub/tree/php-bem-bh и позадавать вопросы на форуме https://ru.bem.info/forum/ — люди поделятся своими историями.
    Ответ написан
    Комментировать
  • Как правильнее парсить результаты ajax запроса?

    qfox
    @qfox
    Ответы есть у меня
    Если использовать https://github.com/bem/bh и https://github.com/bem/bh-php (шаблоны там почти 1-в-1, с точностью до $ в переменных), то можно выгружать шаблоны и на фронт, и на бекенде собирать нужное.

    Еще лучше использовать прослойку на nodejs чисто для сборки html для первого захода, поисковиков, людей без JS, и не думать про это в целом, а на PHP оставить всю логику и использовать как API.

    Еще, чтобы уменьшить размер передаваемых данных:
    а) gzip;
    б) raw-json;
    в) protobuf.

    Если передавать только нужное и не потеряться — нужно сделать двухпроходную шаблонизацию, т.е. в 2 шага — 1) конвертируем из сырых данных в некий промежуточный view-ориентированный json, а затем из последнего собираем html с помощью шаблонов на матчерах.

    Если любите экспериметировать, можете попробовать еще вот так:
    // Допустим, у нас есть выгруженные шаблоны на фронт
    bh.match('users-list', function ... );
    bh.match('user', function ... );
    // etc.
    // дальше мы должны получить данные с бекенда, для простоты укажем их явно
    var usersFromBackend = [{name: 'Vasya', id: 5}, {id: 42, name: 'Petya'}, ...];
    // как получили — собираем каким-то образом некую view-ориентированную структуру типа:
    var viewOriented = {
      // здесь можно использовать и что-то более умное
      block : 'users-list',
      content : fromBackend.map(function (el) {
        return {
          block : 'user',
          // привязываем к users-list по БЭМ
          // (мало ли понадобится что-то в стилях-скриптах подтюнить)
          mix : { block : 'users-list', elem : 'item' }, 
          // выводим контент в каждый div
          content : {
            block : 'link',
            mix : { block : 'user', elem : 'link' },
            url : el.url || '/users/' + el.id,
            text : el.name
          }
        };
      })
    };
    // И после получаем готовый HTML еще одной операцией, который останется куда-то вставить
    console.log(bh.apply(viewOriented));


    При том, что шаблоны у нас одинаковые (для php с точностью до $ в переменных) для фронта и бекенда — кол-во дублируемого кода падает. Появляется возможность вставлять одинаковые блоки в разные места на странице с разными данными, структурировать CSS (самое известное из BEM, даже гугл рекомендует), и т.д.
    Ответ написан
    Комментировать
  • Возврат данных cURL в виде массива?

    qfox
    @qfox
    Ответы есть у меня
    Вам нужна сериализация и десериализация данных.

    Serialize+unserialize
    json_encode+json_decode
    etc.

    Т.е., в скрипте 1 вместо `echo $out` вы делаете `json_decode($out);`.
    А в скрипте 2 вместо `var_export($arr);` делаете `echo json_encode($arr);`.

    Не забудьте завернуть сообщения об ошибках в скрипте 2 в такой же json, чтобы в скрипте 1 делать меньше телодвижений. Т.е. сделайте так, чтобы скрипт 2 всегда возвращал json.

    Т.е., вместо:
    if (!$dbconn) {
      echo "Произошла ошибка подключения к базе.";
    }

    Нужно
    if (!$dbconn) {
      echo json_encode(["error" => "Произошла ошибка подключения к базе."]);
    }
    Ответ написан
    2 комментария
  • Как создать шаблон с помощью .tpl .php форматов?

    qfox
    @qfox
    Ответы есть у меня
    Все зависит от шаблонизатора, который вас устроит.

    twig.sensiolabs.org
    https://github.com/smarty-php/smarty/
    https://github.com/alexeyrybak/blitz (habrahabr.ru/post/18695)
    habrahabr.ru/post/128645

    Либо же, что-то типа xslt:
    https://github.com/bem/bh-php

    Если нужен более точный ответ — определитесь с вопросом ;-)
    Ответ написан
    Комментировать
  • Можно ли php заменить на node.js?

    qfox
    @qfox
    Ответы есть у меня
    Архитектура PHP и Node.JS разная, поэтому в общем случае — нет.

    Но в частных случаях, например, на домашних страничках или каких-то сервисных ручках — это работает на ура.

    К сожалению, пока никто не написал аналог связки apache+mod_php для node.js, чтобы можно было просто изменяя файлы тут же видеть результат в браузере, но это дело времени ;-)
    Ответ написан
    Комментировать