Как поддержка хостинга может добавить уязвимостей вашему сайту

Недавно мне прислали вопрос в духе «форма отправки сообщений с сайта перестала работать, что делать?». Я ответил, что необходимо проверить настройки подключения к SMTP-серверу и попробовать отправить тестовое письмо — после приема сообщения, сайт отправляет его на почтовый ящик через SMTP сервер.

Continue reading

Advertisements

PHP-сессии и производительность

Интересная статья на тему PHP-сессий: PHP Sessions Can Hurt Your WordPress Performance.

PHP-сессии часто любят использоваться в плагинах, например, в тех, что реализуют авторизацию через соц. сети. Статья очень полезная и актуальная.

Плагин Currency Converter. Курсы валют в WordPress

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

Плагин CurrencyConverter

Для пользователей:

  1. 170+ валют.
  2. Можно выбрать поставщика данных (ЦБ или Open Exchange Rates).
  3. Никакой дополнительной нагрузки на сайт (цены запрашиваются в фоне не влияя на скорость загрузки страниц раз в час и кэшируются).

Для разработчиков:

  1. Намек на MVC.
  2. Composer с автозагрузкой классов.
  3. Что-то вроде небольшого API для вывода курсов валют в любом месте сайта.

CurrencyConverter

Настраиваем Xdebug и PHP Storm для работы с Symfony 2 через консоль

Ставим Xdebug, который на Mac OS X уже установлен, и подключаем в /private/etc/php.ini:

[XDebug]
zend_extension=/usr/lib/php/extensions/no-debug-non-zts-20121212/xdebug.so
xdebug.remote_enable = 1
xdebug.remote_host = 127.0.0.1
xdebug.remote_port = 9000
xdebug.idekey = PHPSTORM
;xdebug.remote_autostart = 1

Обратите внимание, что путь до расширения Xdebug может быть другим в зависимости от системы и ее кривости.

В PHP Storm создаем PHP Script конфигурацию в меню Run → Debug Configurations. В поле File указываем полный (абсолютный) путь до app/console.

Чтобы все завелось нужно в терминале написать:

export XDEBUG_CONFIG="idekey=PHPSTORM"

Включаем прослушивание подключений.

Запускаем наш скрипт через app/console и дебагер работает.

Фреймворк Уи

Yii просто ужаснейший фреймворк. Я возненавидел его так сильно, как никогда прежде не ненавидел всего за пару дней. При этом есть подозрение, что я не видел и большую часть того ужаса, который там творится. Словом, если вы решите разобраться с каким-нибудь фреймворком на PHP лучше даже не открывать Yii.

Дебаг PHP в Atom

Попробовал тут на выходных подебажить PHP через Atom, пока не получилось. Толи я пути меппинга криво пишу, хотя, в итоге абсолютные пути написал, толи config.cson располагаю не там (пробовал в корень проекта и в корень веб-директории где Вордпресс валяется).

Брейкпоинты на маке тоже что-то не ставятся кнопками, через меню Packages и то их визуально не видно.

Кому интересно, расширение: atom.io/packages/php-debug.

Не хочу снова PHP Storm и Java пожалуйста.

В любой непонятной ситуации ищи

Сколько было убито времени на правки разных багов и попытки «придумать» решение — не сосчитать. Со временем я стал умнее и теперь прежде чем писать свой велосипед (патч для чего-либо, новый плагин…), я стараюсь искать ответы на свои вопросы, а не думать самостоятельно — это экономит время и позволяет посмотреть как другие решали тоже самое. В конечном итоге можно и самому решение все равно написать, но с меньшей вероятностью наступишь на какие-нибудь грабли.

Несмотря на все это и гугление всего и вся постоянно, даже сейчас я иногда забываю про это правило.

Ищите, прежде чем делать что-то с нуля самостоятельно! Пусть даже потом все равно сделаете самостоятельно с нуля.

P. S. Для проектов на Github «гуглить» стоит на вкладках Pull Requests и Issues.

Замечания перфекциониста

Вот почему все говнокодят и делают все плохо и не мучаются? Плохой код, плохие презентации, плохие продукты, плохое обслуживание — всем насрать. Лишь бы получить сраные денюжки, чтобы потратить на какие-то безделушки и посиделочки в кафешечках. Я же схожу с ума по каждой мелочи и не могу с такими вещами мириться и сосуществовать.

Например, на прошлой неделе я тут жаловался, что пришлось костыликами пару классов сделать, а сейчас я вижу что и изначальный автор плагина, от которого я начал делать форк, делал точно также в некоторых других местах. Получается в плагине wp-forms уже изначально была кривая архитектура и всех это устраивает и все счастливы, а я схожу с ума.

Я переживаю, что я слои в Фотошопе некрасиво по-английски подписал — недостаточно информативно, а мне присылают PSD-макет где все по-русски подписано. Ну класс же (привет сломанным кодировкам)!

Развитие плагина wp-forms

Плагин WP Forms получил развитие в моем форке. Я добавил несколько новых типов элементов — теперь можно вставить какой-нибудь кусок ХТМЛ-кода прямо в любое место формочки. Правда реализация, частично костыльная, т. к. некоторые атрибуты надо выключать и получилось что-то вроде:

$attributes = $element->get_all_attributes();
// Because this is just a tag (div, span) we don't need this attrs in tag.
unset($attributes['name'], $attributes['tag_name'], $attributes['type'], $attributes['value']);

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

Добавилась поддержка AJAX-запросов. Теперь можно проверять формочку и обновлять ее состояние через Java$cript. На входе принимается обычный $.ajax(), а на выходе приходит объект, описывающий формочку и «пройдясь» по нему можно синхронизировать атрибуты и содержимое всех элементов внутри формы (удалить или добавить классы, расставить дополнительные атрибуты, вывести сообщения об ошибках, показать или скрыть некоторые блоки и т. п.).

Поскольку фантазию при верстке не ограничить и некоторые ХТМЛ-элементы нужно помещать в какую-то обертку пришлось добавить еще один тип элементов — Wrapper, который позволяет хранить в себе дочерние инпуты и кнопочки. Теперь верстальщики использующие Bootstrap и прочее будут довольны (ну, и я тоже).

->add_element(
	WP_Form_Element::create( 'wrapper' )
	->set_name('input_group_contacts')
	->add_class( 'input-group' )
	->set_attribute( 'tag_name', 'span' )
	->set_view( new WP_Form_View_Wrapper() )
	->add_decorator(
		'WP_Form_Decorator_Errors',
		array(
			'position' =>  1,
			'attributes' => array(
				'class' => 'list-unstyled help-block'
			)
		)
	)
	// Добавляем дочерний элемент
	->add_element()
	// ...