SAPE ON RAILS. Интеграция PHP-кода SAPE.RU в Ruby on Rails приложение.
Posted by Cooper Mon, 23 Apr 2007 21:52:00 GMT
Наверняка уже многие счастливые обладатели сайтов, разработанных на php или html, установили и с удовольствием пользуются системой купли-продажи ссылок sape.ru. Поскольку мой блог использует Typo движок, написанный на Ruby on Rails, то конкретных инструкций по размещению sape-кода мне найти не удалось ни на форуме sape.ru, ни в Интернет. Поэтому пришлось провести небольшое исследование по способам интеграции Rails и PHP и затем реализовать на основе собранного материала Typo sidebar plug-in.
Первое, что я сделал, это вынес php-код для отображения ссылок, в отдельный файл с именем sape1.php. Этот файл был сохранен в директории /var/www/websites/mysite/public
Как показали первые эксперименты с sape, большая часть проблем с отображением ссылок продавцов была связана с тем, что невозможно определить внутри php-скрипта текущую страницу сайта или доменное имя. Поэтому далее в этом скрипте явно были прописаны параметры, в обычных условиях получаемые из контекста web-сервера: ‘request_uri’, ’host’. А также изменён параметр ’charset’ на UTF-8 в соответствии с используемой кодировкой страниц моего сайта. Значение ‘request_uri’ дополнительно преобразовывалось функцией urlencode() для корректной интерпретации символов кириллицы в URL.
<?php
define('_SAPE_USER', '999999999999999999999999999999999');
require_once('/var/www/websites/mysite/'._SAPE_USER.'/sape.php');
$o['request_uri'] = $_GET['uri'];
$o['request_uri'] = str_replace('%2F', '/', urlencode($o['request_uri']) );
$o['host'] = 'cooper.ezlibrary.com';
$o['charset'] = 'UTF-8';
$sape = new SAPE_client($o);
unset($o);
echo $sape->return_links();
?>
После изменений в php-коде остается создать Sape sidebar plugin , где основная концепция реализована в файле content.rhtml:
<% command = '/usr/local/bin/php -q /var/www/websites/mysite/public/sape1.php uri=' + request.env["REQUEST_URI"].to_s %>
<%= `#{command}` %>
Через административный интерфейс добавляем новый plug-in на sidebar. С появлением новых запросов на размещение в sape.ru:

… они появляются в sidebar области Typo блога:

Так что те, кто ещё не присоединился, в действии систему купли-продажи ссылок Sape.ru теперь и на Ruby On Rails сайтах.
* * UPDATE * *
описанная выше методика была протестирована на системе RedHat EL3 c PHP 4.3.2 Позже возникла необходимость перейти на PHP 5.1 и оказалось, что подход к интеграции php-sape клиента в этом случае немного отличается.
При запуске php-скрипта public/sape1.php из typo-окружения элемент массива $_GET[‘uri’] не инициализируется значением, в результате ссылки на странице не видны. Для исправления ситуации вместо $_GET[‘uri’] нужно использовать $argv[1], также uri имеет уже закодированный вид, так что убираем строку с функцией urlencode():
<?php
define('_SAPE_USER', '999999999999999999999999999999999');
require_once('/var/www/websites/mysite/'._SAPE_USER.'/sape.php');
// replace $_GET[‘uri’] with $argv[1]
$o['request_uri'] = $argv[1];
// remove uri encoding
$o['host'] = 'cooper.ezlibrary.com';
$o['charset'] = 'UTF-8';
$sape = new SAPE_client($o);
unset($o);
echo $sape->return_links();
?>
А в typo-плагине откорректировать файл views/content.rhtml опустив название параметра uri и убрав ключ -q:
<% command = '/usr/local/bin/php /var/www/websites/mysite/public/sape1.php ' + request.env["REQUEST_URI"].to_s %>
<%= `#{command}` %>