Как стать автором
Обновить
14
0
Сергей @BR0kEN

DevOps, Solutions Architect

Отправить сообщение
Поддержка PHP 7, пока что, оставляет желать лучшего даже на уровне «return type hints». А вот «remote edit» — приятная штука!

Скриншотишка
PHPStorm 9
Позволю себе прорекламировать свой модуль MIME Info и патч для модуля Libraries, которые позволяет выкачивать, перемещать и обновлять библиотеки с помощью Drush. :)
Любые. У Друпала все поля одинаковы (те, которые аттачатся к сущностям, не путать с Form API) и экспортируются тоже одинаково.
Еще как выгружаются. Вы что, никогда не работали с модулем Features?

Воркфлоу приблизительно такой:

  1. Создание бандла.
  2. Наполнение полями.
  3. Создание фичи, в которой должен присутствовать сам бандл, поля и зависимости.

П.С. Завтра опубликую 7.x-1.2 версию, в которой любая структура (поля, группы полей, модули виджетов etc.) бандла будет подтягиватся автоматически.
Спасибо за подборку и за то, что отыскали и упомянули мой новоиспеченный модуль — Fieldable Panel Panes Bundles. Буду рад фидбеку!

Рад что Хабр понемногу Друпализируется!
Смотрится — это одно. Мне, например, в том же PSR не нравится отступ в 4 пробела, в Drupal — перенос блочных операторов (if — else, try — catch) на новую строку и много других правил… Тут важно понимать, что они были приняты и одобрены тысячами довольно не глупых людей со всего мира не просто так. Если ты используешь какую-то систему, то обязан следовать тем правилам, которые заложены в ее идеологии. Иначе же — должно разрабатываться собственное решение (CMS/CMF/Framework), собственные стандарты и правила.

Хотя есть, правда, еще один выход — контрибьютинг — предложение своих, обоснованных, идей и их реализацию сообществу разработчиков (если open source, как в случае с Drupal).
У вас везде разное форматирование — где табы, где пробелы их их разные количества. Как пример: github.com/servekon/drupal7-transfer-meter-readings/blob/master/transfer_meter_readings.admin.inc#L50-L52

Совет: почитайте о кодинг стандартах Drupal и используйте для проверки CodeSniffer (или MessDetector). Отчет с ошибками форматирования будет большой.

P.S. Отступы в сорцах Drupal — 2 пробела.
Почему забыли о кодинг стандартах Drupal и используете хаотичное оформление?
Memphis23Rus, соболезную вашей памяти, т.к. предыдущая статья была неделю назад.

jojo97, статья-то другая и автор тоже, а вот материал один, ничего нового. Даже не о чем на эту тему дискутировать.

<sarcasm>Даешь по статье о HTML Import раз в неделю. Уверен, еще много кто в своих блогах об этом написал.</sarcasm>
Можно было просто дополнить сюда.

З.Ы. На данном этапе развития — бесполезная фича.
Поддержка стремится к "нулю".
Не самый приятный проект. Стандарты кодирования, лично мне, не по душе. Да и качество особо не радует, взяв, например, этот метод или этот кусок, в котором два раза выполняется функция, вместо сохранения значения в переменную (какая там производительность, принцип DRY, ааууу?). Также можно заметить классы, якобы ООП подход, да вот только непонятно какие сущности пытались описать: одни статические, независимые друг от друга, методы, а некоторые, вроде и не статические но не несут в себе реализации экземпляра (пусть и singleton). И это только за минуту просмотра репозитория со случайно открытыми файлами…

Помимо всего этого, данный проект — это «велосипед» в котором придется разбираться. Уже представляю ситуацию с использованием на продакшене, где этот самый Themosis ломается и программист погружается в бесполезный дебаг с крепким словцом.
Писал с iPad, ночью, по-этому так «сухо». Сейчас попробую все разжевать.

Во-первых, не i18n (internationalization), а всего лишь i10n (localization). Не путайте.

Во-вторых, на GitHub у вас написанно:
Super-simple gettext translation in pure JS
и, хочу я сказать, что Gettext тут не при чем.

В-третьих, у инструментов, перечисленных вверху поста, нет зависимостей. Библиотека/фреймворк, под которую написан плагин/дополнение не может быть зависимостью, а только ноборот.

Код вашей библиотеки с моими комментариями
// Неправильное определение переменной: нет ключевого
// слова "var" - несоблюдение строгих стандартов JS.
pojs = {
    // Непонятное имя свойства
    _l: null,
    // Непонятное имя свойства
    _r: false,
    // Непонятное имя свойства
    _p: {},
    // Непонятное имя параметра
    init: function(l) {
        this._l = l;
        this._load();
    },
    _: function(key, args) {
        // Избыточное выражение.
        // Проще:
        //  this._p[key] || key
        //
        // Неправильное форматирование кода. Не только здесь, повсеместно.
        // Рекомендую к прочтению JS Style Guide: https://github.com/BR0kEN-/javascript
        //
        // В данном случае лучше так:
        //  var t = this._p[key] || key,
        //      a;
        var t = this._p.hasOwnProperty(key) ? this._p[key] : key, a;
        // Неправильная проверка. "args" может быть строкой и удовлетворять условие.
        // Пример:
        //  var args = 'string';
        //
        //  if (args) {
        //    for (var arg in args) {
        //      // args[arg] = s
        //      // args[arg] = t
        //      // args[arg] = r
        //      // args[arg] = i
        //      // args[arg] = n
        //      // args[arg] = g
        //    }
        //  }
        if (args) {
            for (a in args) {
                t = t.replace(/%s/, args[a]);
            }
        }
        return t;
    },
    // Неправильный подход. Необходимо использовать
    // событие "load" для XMLHttp объекта.
    //
    // Отсутствие проверки на тип.
    // Пример:
    //  pojs.ready('fucking code');
    //  Uncaught TypeError: string is not a function
    ready: function(cb) {
        var _t = this, i = setInterval(function() {
            if (_t._r) {
                cb();
                clearInterval(i);
            }
        }, 10);
    },
    _load: function() {
        // "'localStorage' in window" и "window['localStorage'] !== null" - одно и то же.
        var _t = this, x, lsa = 'localStorage' in window && window['localStorage'] !== null, cache = null;
        if (_t._l) {
            if (lsa) {
                cache = localStorage.getItem('pojs_' + _t._l);
                if (cache) {
                    _t._p = JSON.parse(cache);
                    _t._r = true;
                    return;
                }
            }

            x = new XMLHttpRequest();
            x.onreadystatechange = function() {
                // Избыточная вложенность и неправильное обращение к объекту.
                //
                // Выражение записывается так:
                // if (this.readyState === 4 && this.status === 200) {
                //   // actions
                // }
                //
                // Или же еще проще:
                // if (this.response) {
                //   // actions
                // }
                //
                // Помимо этого, в IE8, данный код обрастет ошибками:
                //  - отсутствие объекта XMLHttpRequest;
                //  - отсутствие объекта console.
                if (x.readyState === 4) {
                    if (x.status === 200) {
                        // Выше, почему-то, есть проверка на существование
                        // localStorage, а тут подразумевается что объект
                        // будет во что бы то ни стало?
                        localStorage.setItem('pojs_' + _t._l, x.responseText);
                        _t._p = JSON.parse(x.responseText);
                    } else {
                        console.error('Can not load JSON from ' + _t._l);
                    }
                    _t._r = true;
                }
            };
            x.open('GET', this._l, true);
            x.send();
        } else {
            _t._r = true;
        }
    }
};

P.S. Создал pull request на GitHub.
Отличный метод…

    ready: function(cb) {
        var _t = this, i = setInterval(function() {
            if (_t._r) {
                cb();
                clearInterval(i);
            }
        }, 10);
    },


Да еще и несоблюдение JS стандартов.
Похоже я слишком «нормальный» т. к. хоть сколь рационального способа применения этому я не найду за всю жизнь.
Культурное окончание строки — для слабаков.
О чем/к чему вообще текст выше? Где примеры плохих и хороших практик, сравнивание, анализирование?

~5 ссылок и информация о том, что подход к выборке по селектору может отличатся от браузера к браузеру — это не статья.
По-моему однородный, полупрозрачный фон намного лучше «дороги единорога», нет?

Для сравнения:

image

P.S. А вы мастер скриншотов :) Если, вдруг, не знали, то скриншот делается нажатием кнопки «Home» и «Блокировать».
Ну как посмотреть. Мне вот, пуговицу больше напоминает.

Информация

В рейтинге
Не участвует
Откуда
Днепр, Днепропетровская обл., Украина
Дата рождения
Зарегистрирован
Активность