Обо мне

4X_Pro
4X_Pro
Живу в Сети с 25 ноября 2000 г.
Веду блог с 8 января 2011 г.

Контакты

Немного рекламы

Рубрика: "Web-программирование" - Xpro.Su: заметки о жизни в Интернете

Рубрика: "Web-программирование"

Асинхронная загрузка при наличии inline JavaScript

Web-программирование, Ускорение сайтов Оставить отзыв »

Часто при ускорении загрузки сайта не получается сделать асинхронной загрузку тяжелых библиотек вроде jQuery из-за того, что зависимый от них код вставлен прямо в HTML-страницу с помощью тега script (так называемый inline JavaScript), а вынести его в отдельный файл и использовать HeadJS по каким-либо причинам нет возможности. Чаще всего такое встречается, когда JavaScript генерируется CMS. Но недавно я узнал, как можно сделать загрузку асинхронной и в этом случае: через пользовательские события (custom events). Делается это так: существующий inline-код оборачиваем функцией-обработчиком события с выбранным нами именем, например jQeuryLoaded:

Читать далее »

Решение проблемы с mysql_connect в PHP 7

Web-программирование Оставить отзыв »

Как известно, в PHP7 окончательно удалили расширение mysql, и теперь функции вида mysql_connect, mysql_query вызывают ошибку "Call to undefined function". Тем не менее, еще встречается код, который использует именно эти функции, и который, зачастую, бывает сложно быстро исправить. Заставить работать такой код на PHP7 достаточно просто — нужно определить эти функции самостоятельно и вызывать в них соответствующие функции из расширения MySQLi. Недавно столкнулся с такой ситуацией и сделал небольшой файл mysql.php, в котором объявил наиболее часто используемые функции.

Подключить его можно следующим образом:

if (version_compare(PHP_VERSION, '7.0.0','>=')) include 'mysql.php';

Абсолютный URL на PHP

Web-программирование Оставить отзыв »

К моему большому удивлению, в PHP нет готовой функции для построения абсолютного URL по относительному и базовому. Пришлось писать ее самому. И вот что получилось:

Читать далее »

Безопасный редирект или как защититься от спамвертайзинга

Web-программирование, Сайтостроительство 3 отзывов »

Сегодня получил письмо от хостера, в котором говорилось, что на один из моих сайтов поступила жалоба на спамвертайзинг, и приводился пример спамного письма. Из него выяснилось, что на самом деле спамом рекламируется совершенно другой сайт, а от моего используется только скрипт, который делал редирект со статусом 301 на указанный ему в параметрах адрес.
Таким образом, в современных условиях наличие на сайте скрипта, который позволяет делать редирект без какой-либо проверки, небезопасно. Возникла мысль, как можно его защитить, но при этом не слишком усложнять. Решение нашлось быстро: передаем в скрипт редиректа два параметра, один из которых — это сам URL, второй — хеш, который считается от URL и некоторой строки-ключа. Редирект происходит только тогда, когда рассчитанный на основе URL хеш совпадет с переданным, в остальных случаях выдается ошибка 404. (Естественно, при этом придется поправить все те места на сайте, где генерируется ссылка на скрипт с редиректом, чтобы рассчитать и добавить хеш.) В результате получаем вот такой скрипт:

Читать далее »

Как отформатировать сумму и дату на JavaScript

Web-программирование, Сайтостроительство Оставить отзыв »

Недавно потребовалось вывести в Интернет-магазине сумму заказа с десятичными разделителями, причем сделать это с помощью JavaScript. Стал искать, есть ли встроенные средства для этого и обнаружил объект NumberFormat. В простейшем случае форматирование выполняется так: var str = new Intl.NumberFormat().format(value), где value — это число, которое нужно отформатировать. По умолчанию используются свойства системной локали, но можно и указать ее явно: new Intl.NumberFormat('ru-RU'), и хеш с опциями в качестве второго параметра. Напримр, new Intl.NumberFormat('ru-RU', { style: 'currency', currency: 'RUB', currencyDisplay: 'symbol'}) явно указывает, что нужно использовать форматирование, применяемое для денежных сумм, использовать валюту рубль и выводить не "руб.", а ₽. О других опциях можно узнать в справочнике.

Поскольку некоторые старые броузеры с этим объектом работать не умеют, рекомендую выполнять проверку с помощью такой функции:

function formatPrice(value) {
  if (Intl.NumberFormat) return new Intl.NumberFormat('ru-RU',{ style: 'currency', currency: 'RUB', currencyDisplay: 'symbol'}).format(value); 
  else return value; // если броузер не поддерживает этот объект, оставляем все как есть, без обработки
}

Для форматирования даты используйте объект Intl.DateTimeFormat c аналогичным методом format.

Google Maps: перемещение карты и маркеров

Web-программирование 1 отзыв »

В одном из предыдущих сообщений я писал про то, как вывести карту с помощью Google Maps API и поставить на ней маркер. Тема, как выяснилось, весьма востребованная, и я решил начать по ней серию публикаций, где буду рассказывать о том, как сделать различые действия с Google Maps. Итак, сегодня речь пойдет о перемещении самой карты и маркеров на ней при наступлении каких-либо внешних событий.

Читать далее »

Регулярные выражения для выделения ссылок

Web-программирование Оставить отзыв »

Недавно потребовалось сделать автоматическое обрамление ссылок в тег <a>. Хотя на первый взгляд, задача совершенно тривиальная, обнаружилось несколько подводных камней. Во-первых, не все пользователи указывают протокол (http:// или https:// в ссылках). Во-вторых, требовалось распознавать ссылки не только на домен, но и на конкретную страницу сайта или вовсе содержать параметры после знака ?. В-третьих, распознавать кириллические домены. Кроме этого, нужно было сделать так, чтобы уже корректно обрамленная в тег ссылка не обрамлялась повторно, а также обеспечить безопасность, предусмотрев защиту от XSS, а также свести к минимуму ложные срабатывания.

Исходя из этих требований, были приняты следующие решения:

Читать далее »

Получаем курс валют с помощью PHP и SOAP

Web-программирование, Сайтостроительство Оставить отзыв »

Часто при работе с Интернет-магазинами требуется сделать так, чтобы курсы валют обновлялись автоматически. Делается это достаточно просто. На сайте cbr.ru предусмотрено несколько Web-сервисов, работающих по протоколу SOAP и выдающих необходимую информацию. Итак, вот простой код, который получает информацию о курсе евро:

$wsdl = 'http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?WSDL'; // указываем адрес WSDL-описания SOAP-сервиса, оттуда PHP возьмет информацию о доступных методах и их параметрах
try {
  $euro_to = 0; 
  $cbr = new SoapClient($wsdl,array('soap_version'=> SOAP_1_2, 'exceptions'=>true)); // создаем клиент для подключения к SOAP-сервису 
  $date = $cbr->GetLatestDateTime(); // получаем последнюю дату, за которую есть курс 
// можно, ко формировать ее вручную, но нужно учитывать, что по выходным и праздникам торги не проводятся, поэтому лучше сделать так
  $result = $cbr->GetCursOnDateXML(array('On_date'=>$date->GetLatestDateTimeResult)); //запрашиваем данные о курсах за указанную дату в формате XML
// к сожалению, возможности запросить курс отдельной валюты не предусмотрено, поэтому придется пройтись циклом по всем полученным
  if ($result->GetCursOnDateXMLResult->any) {  // если в ответе сервера есть XML с курсами валют
    $xml = new SimpleXMLElement($result->GetCursOnDateXMLResult->any); // открываем его как XML-объект
    foreach ($xml->ValuteCursOnDate as $currency) { // и начинаем обходить
    	if ($currency->VchCode=='EUR') { // VchCode содержит код валюты, для евро это EUR, для доллара — USD
    		$euro_to = floatval($currency->Vcurs); // цена за указанное в Vnom количество валюты 
    		$euro_from = $currency->Vnom; // для доллара и евро количество равно единице, для других валют может отличаться
// чтобы получить реальный курс за одну единицу валюты, нужно разделить $currency->Vcurs на $currency->Vnom
    	}
    }
    if ($euro_to!=0) { 
     // здесь можно вставить код, который обновляет данные в магазине
    }
  }
  else echo 'Error!';
}
catch (Exception $e) { // на всякий случай обработчик ошибок
	echo 'Error: '.$e->getMessage();
}

Загрузка JavaScript по имени класса

Web-программирование, Сайтостроительство, Ускорение сайтов Оставить отзыв »

В прошлом сообщении я рассказал о том, как сделать загрузку JavaScript и CSS полностью асинхронной на примере простого сайта всего с двумя файлами скриптов. На практике же гораздо чаще встречаются ситуации, когда на сайте используется несколько различных скриптов, причем они различаются для разных страниц сайта. Допустим, у нас есть сайт, на котором мы хотим показывать изображения в lightbox, страницы с формой комментария, для которых мы хотим показать WYSIWYG-редактор, и несколько форм, где нужно ввести дату. Рассмотрим несколько вариантов, как можно организовать загрузку скриптов.

Читать далее »

HeadJS или полностью асинхронная загрузка сайта

Web-программирование, Сайтостроительство, Ускорение сайтов 2 отзывов »

Один из самых важных показателей для современного сайта -- как можно более быстрая загрузка и начало показа содержимого. Чтобы этого достичь, нужно устранить задержки, связанные с ожиданием подгрузки внешних ресурсов, сделав их асинхронными. Прежде я уже писал, как можно сделать асинхронными виджеты социальных сетей. Но недавно я нашел скрипт, который позволяет сделать асинхронной загрузку всех JavaScript и CSS-файлов, используемых на сайте. Называется он HeadJS, и кроме асинхронной загрузки имеет умеет еще делать feature detection, с помощью чего можно загружать скрипты выборочно в зависимости от возможностей устройства, с которого зашел пользователь.

Читать далее »