вторник, 3 июля 2012 г.

Разработка. Как передать HTTP_REFERER из flash.

Предыстория такова. Есть на некоем ресурсе флеш-виджет которые выполняет какие-то операции с пользовательским контентом. В моем конкретном случае, это фотографии. Задача стояла следующим образом. Необходимо собирать статистику показов с внешних ресурсов, т.е. сколько раз и где флешка засветилась на экранах пользователей. задача так же усложнялась и тем, что по сути показы должны были учитываться не самой флешки, а меняющихся в ней фотографий. Если же вам так же понадобится учитывать показ контента внутри флеш, то, увы, прийдется обратиться к флешеру, сваявшего этот виджет. Зачем я объясню позже.
Итак приступим. Все мы прекрасно знаем, что флешка передать реферера не может, вернее может, но этот реферер будет физическим адресом размещения самой флешки. Что не есть хорошо и нам абсолютно не надо. Так как же передать реферера? Очень просто, достаточно обвернуть выдачу флешки в php-скрипт. В котором мы будем выхватывать реферера учитывать показ. Если же у вас задача, так же как и у меня, "со звездочкой", то делаем нехитрый трюк с редиректом и добавлением параметра в запрос, таким вот образом. Получив реферер, в PHP скрипте, мы генерируем новый запрос к флешке и делаем по нему редирект. Флешка в своб очередь, получив этот параметр, добавляет его к каждому запросу (в моем случае фотографии) к нашему серверу, где этот запрос, обрабатывается скриптом, который учитывает всю необходимую нам информацию, включая реферера. Теперь чтоб совсем все стало ясно, приведу небольшой пример утопического кода (без проверок и пр. только логика, так что, пожалуйста не возмущайтесь понапрасну):

// Файл flashcatch.php
$file = './flash.swf';
$referer = $_SERVER['HTTP_REFERER'];
// Если не надо делать никаких более действий, то прямо здесь счетаем показ
// ...
// Устанавливаем тип содержимого
header('Content-Type: application/x-shockwave-flash');
// Читаем и отдаем флешку.
echo file_get_content($file);
exit();

Если понадобиться добавить параметр для последующего учета показов контента внутри самой флешки то код немного усложниться.

// Файл flashcatch-trick.php
$file = './flash.swf';
$referer = $_SERVER['HTTP_REFERER'];
// Добавляем параметр к запросу на флешку например referer.
if (strpos($_SERVER['REQUEST_URI'], '?')) {
    $connector = '&';
} else {
    $connector = '?';
}
$newRequest = 'http://' . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'] . $connector . 'referer=' . $referer;
// Если запрос является внешним и запрос не содержит в себе параметра referer то делаем редирект
if (isExternalRequest() && !$_REQUEST['referer']) {
    header ('Location: ' . $newRequest);
    exit();
}
// Устанавливаем тип содержимого
header('Content-Type: application/x-shockwave-flash');
// Читаем и отдаем флешку.
echo file_get_content($file);
exit();

И вот тут вспоминаем про флешера, во флешку передаем новый параметр в котором прописан реферер, в моем случае это параметр referer :). А флешер формируя запросы к к серверу для получения фотографий (аудио, видео), подставляет его и сервер при выдаче содержимого флешке учитывает реферера и показ, соответсвенно.

Функция isExternalRequest не приведена, ее не составит труда написать самому. Суть ее думаю ясна, вернет труЪ если это внешний запрос и фальс если свой же сервер запросил флешку.

среда, 27 июня 2012 г.

Google Maps. Курсоры рук для карты.

Если вдруг вам понадобяться такие вот руки как при перемещении курсора над картой или же при перемещении с нажатой кнопкой мыши то вот:
http://maps.google.com/mapfiles/openhand.cur
http://maps.google.com/mapfiles/closedhand.cur

пятница, 18 мая 2012 г.

SEO. 301 редирект с /index на /. Или главная всегда по одному адресу.

Для того чтобы главная страница сайта всегда была доступна по одному адресу, например, есть сайт www.some.com, я его могу открыть двумя способами. Первый набрать в адресной строке браузера непосредственно www.some.com или www.some.com/index. При этом во втором случае я получаю тоже самое что и при первом. Некоторые поговариют, что это не хорошо переваривается поисковиками, поэтому сделаем небольшую операцию используя возможности модуля для Apache - mod_rewrite.
# Указываем правило, если запрос будет состоять из /index
RewriteCond  %{REQUEST_URI} ^/index$ [NC]
# То применим для него редиркт 301, т.е. "переехали" на ПМЖ
RewriteRule ^.*$ / [R=301,L]

понедельник, 7 мая 2012 г.

Magento. Как сбросить админский пароль на админку.

Для сброса пароля необходимо сделать следующее.
1. Если вы не помните или не знаете как называется пользователь с админскими правами, то выполните такой запрос:

SELECT * FROM admin_user;
В полученом списке выберите необходимого пользователя где будет указано что это админ.
2. Далее выполняем такой запрос:
UPDATE admin_user SET password=CONCAT(MD5('{соль}{пароль}'), ':{соль}') WHERE username='{пользователь_админ}';
Где заменить {пароль} на новый пароль, {соль} на любую последовательность символов, ну соль, одним словом, а {пользователь_админ} — на того пользователя, которого мы нашли по первому запросу.

Up: Как правильно заметил Max St слово password которое идет после {новый_пароль} это, цитирую :), "строка, которую указали для шифрования при установке magento".

среда, 18 апреля 2012 г.

MySQL. Как сделать дамб БД с хранимыми процедурами, и не только.

Иногда приходится перенести дамп базы данных (MySQL), и перенести его не просто так, а с хранимыми внутри БД процедурами, чтобы приказать mysqldump делать дамп с оными надо выполнить такую вот команду:
mysqldump -uUser -pPass --routines --extended-insert DBName > /dir/file.sql
Для бекапа дампа и одновременного сжатия его можно воспользоваться таким вот способом.
mysqldump -uUser -pPass DBName | gzip > /dir/file.sql.gz
Чтобы развернуть дамп завернутый :) таким вот способом надо сделать вот так:
gunzip < /dir/file.sql.gz | mysql -uUser -pPass DBName
Если вы хотите сделать бекап только одной таблицы, для этого утилите mysqldump надо указать следующий ключ --tables table1 table2, и через пробел все таблицы которые вы хотите задампить. Вот примерчик:
mysqldump -uUser -pPass DBName --tables table1 table2 > /dir/file.sql.gz

пятница, 6 апреля 2012 г.

Magento. Как получить суффикс добавляемый в ЧПУ ссылку

Недавно возникла необходимость получить суффикс ссылки в Magento, это то что добавляется в конец ссылки имитируя физический документ, ну к примеру http://www.example.com/some/seo/link, - это без суффикса, а http://www.example.com/some/seo/link.html - с суффиксом. Это задается в админке, т.е. может меняться пользователем. Получить это в коде можно очень просто.
// Для ссылки на товар
Mage::getStoreConfig('catalog/seo/product_url_suffix');
// Для ссылки на категорию
Mage::getStoreConfig('catalog/seo/category_url_suffix');

четверг, 5 апреля 2012 г.

CSS. Ненумерованный (bullit) список с маркерами-символами

Способ задать, к примеру, в списке в качестве маркера, такое длинное, смачное тире "—" не просто, ну в смысле, просто, но не так как этого хотелось бы. Внизу представлены CSS правила для этого хитрого дела. Разбирать не буду, что для чего, кому что-то не понятно — в комменты, пожалуйста. Я отвечу.
ul.bullit-dash li {
    padding: 0;
    margin: 0;
    list-style-type: none;
    behavior: expression( !this.before
    ? this.before = this.innerHTML = '— ' + this.innerHTML : '' );
    text-indent: -1.24em;
}

ul.bullit-dash li:before {
    content: '\2014\a0';
}