Какое то непонятное название для статьи получилось, расшифрую что имелось в виду. Допустим, у вас есть некий сайт, контент с которого было бы удобно представить в виде блочка на другом сайта. Цели могут быть разными — это может быть реклама сайта с динамически изменяющимся контентом (к примеру брифинг новостей или ротация заголовков статей с некого сайта-источника), это может быть внедрение какого информационного сервиса, который вы (возможно даже платно) разрешаете размещать на других сайтах (примеры — курсы валют, погоды и т.п.)
Вводная (условия задачи)
Разместить информационный блок с другого сайта (сайта-источника) в виде вставки HTML кода, вроде:
1 |
<script src="..." type="text/javascript"></script> |
Сайт-источник работает на drupal, организуем здесь возможность запроса информационных блоков на другими сайтами по средством генерации соответствующего кода скрипта, и оформим это в виде специального модуля.
Решение
Надо помнить, что все изображения (картинки) и стили должны содержаться на сайте-источнике. Т.е. HTML блок должен иметь абсолютные ссылки как для адресов картинок (img), так и для cсылок-якорей (a), так и для изображений, описываемых в каскадных стилях. При этом описание стилей передается вместе с блоком HTML.
Сайты-приемники, запрашивают скрипт с сайта-источника по некоторому адресу. Допустим — это некий адрес — http://www.source.ru/widget.js. Тогда в модуле (пусть этот модуль называется widgetmodule) на сайте-источнике у нас появится примерно такой код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
/* hook menu settings */ function widgetmodule_menu() { $items = array(); ... //сборщик cкрипта для виджета $items['widget.js'] = array( 'page callback' => '_exportsource_js', 'access arguments' => array('access content'), 'type' => MENU_CALLBACK ); return $items; } |
Где в функции _exportsource_js реализуется создание нужного нам кода javascript. Рассмотрим эту функцию подробнее.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
function _exportsource_js() { //гипотетические функции, получающие HTML и CSS содержание экспортируемого блока $block = _get_HTML_content(...); $CSS = _get_CSS_content(...); //формируем абсолютные пути $siteurl = 'http://' . $_SERVER["HTTP_HOST"]; //все экспортируемые изображения у нас находятся в подпапке модуля widgetmodule - widget $widget_url = $siteurl . '/' . drupal_get_path('module', 'widgetmodule') . '/widget/'; //подстановка абслютных путей вместо относительных в HTML и СSS блоках $block = str_ireplace(array('href="/', 'src="/'), array('href="' . $siteurl . '/', 'src="' . $siteurl . '/'), $block); $content = '<style>' . str_ireplace('url(/', 'url(' . $widget_url, $CSS) . '</style>'; //возможно, для контента нужен будет какой то дополнительный HTML контейнер перед экспортом $content .= <<<__jsfile_ ... {$block} ... __jsfile_; //преобразуем весь CSS и HTML код в строковую константу javascript и пишем её в документ echo "var z = " . drupal_to_js($content) . ";"; echo "document.write(z);"; //финиш die; } |
Т.е. механизм — как видно — весьма прост. А технические задачи вроде объявления специального адреса скрипта выводящего блок, создание валидного кода javascript — все решается средствами drupal.
Есть вопросы? -пишите!