Модули для моего нового сайта

Главные вкладки

Аватар пользователя edhel edhel 7 сентября 2006 в 6:06

На сайте, который ща делаем, уже сделали несколько небольших модулей. Если кому надо - пишите.

  • погода с gismeteo.ru (берет из xml, создает блок, обновляет через cron),
  • метапоиск (форма для поиска сайтов, картинок, новостей и проч. с помощью google/Яndex, форма просто делает редирект на поисковик),
  • модуль для корректировки breadcrumb: прямо в исходнике модуля в массивах указывается какие типы материалов и материалы каких категорий к каким разделам меню должны относиться (это чтобы при выборе, к примеру, новостей/статей из списков не терялся breadcrumb).

Комментарии

Аватар пользователя edhel edhel 8 сентября 2006 в 7:27

Третий node_breadcrumb.module:


<?php
global $TAXONOMY2MENU, $TYPE2MENU;
$TAXONOMY2MENU = array(
// tid => mid
5 => 72,
6 => 71
);
$TYPE2MENU = array (
// type => mid
'content-resource' => 88
);

function node_breadcrumb_help($section) {
switch ($section) {
case 'admin/modules#description':
return t('Устанавливает корректный путь (breadcrumb) к материалам в зависимости от их категории или типа.');
}
}

function node_breadcrumb_nodeapi(&$node, $op, $teaser = NULL, $page = NULL) {
global $TAXONOMY2MENU, $TYPE2MENU;
if ($op != 'view' || !$page) return;
$taxonomy = array_pop($node->taxonomy);
$mid = $TAXONOMY2MENU[$taxonomy->tid];
if (empty($mid))
$mid = $TYPE2MENU[$node->type];
if (empty($mid)) return;
$location = array();
while ($mid && ($item = menu_get_item($mid))) {
array_unshift($location, $item);
$mid = $item['pid'];
}
$location[] = array('path'=>"node/$node->nid",'title'=>$node->title);
menu_set_location($location);
}
?>

Аватар пользователя Natalie Natalie 9 сентября 2006 в 19:14

Не надо никуда вставлять. Сохраните содержимое как файл node_breadcrumb.module, перепишите в директорию с модулями и включить в админке, как обычно.
---
---
All content management systems suck, Drupal just happens to suck less. -- Boris Mann at DrupalCON Amsterdam, August 2005.

Аватар пользователя edhel edhel 11 сентября 2006 в 6:20

gismeteo.module:


<?php
// author: Barhatov Andrew aka edhel
// created: 22.08.2006

global $GISMETEO_TOWN, $GISMETEO_URL;
$GISMETEO_TOWN = 29574;
$GISMETEO_URL = "http://informer.gismeteo.ru/xml/${GISMETEO_TOWN}_1.xml";

function gismeteo_help($section) {
switch($section) {
case 'admin/modules#description':
return t('Прогноз погоды от GISMETEO.RU в виде блока.');
}
}

function gismeteo_cron() {
global $GISMETEO_URL;
// читаем и парсим XML-документ
$result = drupal_http_request($GISMETEO_URL);
if ($result->code != 200) {
watchdog('gismeteo', t('Не удалось загрузить прогноз погоды со страницы %url', array('%url' => $GISMETEO_URL)), WATCHDOG_ERROR);
return;
}
if (!($doc = domxml_open_mem($result->data))) {
watchdog('gismeteo', t('Получен неверный XML-код с прогнозом погоды со страницы %url', array('%url' => $GISMETEO_URL)), WATCHDOG_ERROR);
return;
}
// извлекаем название города
$town = $doc->get_elements_by_tagname("TOWN");
$town = $town[0];
$town_name = mb_convert_encoding(urldecode($town->get_attribute("sname")), "UTF-8", "windows-1251");
// извлекаем прогноз
$_forecasts = $doc->get_elements_by_tagname("FORECAST");
foreach ($_forecasts as $_forecast) {
$forecast = null;
$forecast->day = $_forecast->get_attribute("day");
$forecast->month = $_forecast->get_attribute("month");
$forecast->year = $_forecast->get_attribute("year");
$forecast->tod = $_forecast->get_attribute("tod");
$forecast->weekday = $_forecast->get_attribute("weekday");
foreach ($_forecast->child_nodes() as $child) {
switch ($child->tagname) {
case 'TEMPERATURE' : // температура воздуха, в градусах Цельсия
$forecast->temperature_min = $child->get_attribute("min");
$forecast->temperature_max = $child->get_attribute("max");
break;
case 'PHENOMENA' : // атмосферные явления
$forecast->cloudiness = $child->get_attribute("cloudiness");
$forecast->precipitation = $child->get_attribute("precipitation");
$forecast->rpower = $child->get_attribute("rpower");
$forecast->spower = $child->get_attribute("spower");
break;
case 'PRESSURE' : // атмосферное давление, в мм.рт.ст.
$forecast->pressure_min = $child->get_attribute("min");
$forecast->pressure_max = $child->get_attribute("max");
break;
case 'WIND' : // приземный ветер
$forecast->wind_min = $child->get_attribute("min");
$forecast->wind_max = $child->get_attribute("max");
$forecast->wind_direction = $child->get_attribute("direction");
break;
case 'RELWET' : // относительная влажность воздуха, в %
$forecast->relwet_min = $child->get_attribute("min");
$forecast->relwet_max = $child->get_attribute("max");
break;
case 'HEAT' : // комфорт - температура воздуха по ощущению одетого по сезону человека, выходящего на улицу
$forecast->heat_min = $child->get_attribute("min");
$forecast->heat_max = $child->get_attribute("max");
break;
}
}
// расшифровываем некоторые значения
//$date = array(date("d.m.Y")=>'сегодня', date("d.m.Y",time()+24*60*60)=>'завтра');
//$forecast->date = $date[sprintf("%02d.%02d.%4d", $forecast->day, $forecast->month, $forecast->year)];
$forecast->date = sprintf("%02d.%02d.%4d", $forecast->day, $forecast->month, $forecast->year);
$month = array('','январь','февраль','март','апрель','май','июнь','июль','август','сентябрь','октябрь','ноябрь','декабрь');
$forecast->month_name = $month[$forecast->month];
$day_time = array('ночь','утро','день','вечер');
$forecast->day_time = $day_time[$forecast->tod];
$weekday = array('','воскресенье','понедельник','вторник','среда','четверг','пятница','суббота');
$weekday_brief = array('','ВС','ПН','ВТ','СР','ЧТ','ПТ','СБ');
$forecast->weekday_name = $weekday[$forecast->weekday];
$forecast->weekday_name_brief = $weekday_brief[$forecast->weekday];
$forecast->temperature = _gismeteo_average($forecast->temperature_min, $forecast->temperature_max);
$cloudiness = array('ясно','малооблачно','облачно','пасмурно');
$forecast->cloudiness = $cloudiness[$forecast->cloudiness];
$precipitation = array(4=>'дождь',5=>'ливень',6=>'снег',7=>'снег',8=>'гроза',10=>'без осадков');
$maybe = in_array($forecast->precipitation, array(4,6,7)) && $forecast->rpower == 0 ? "возможен " : "";
$maybe = $forecast->precipitation == 8 && $forecast->spower == 0 ? "возможна " : $maybe;
$forecast->precipitation = $maybe . $precipitation[$forecast->precipitation];
$forecast->pressure = _gismeteo_average($forecast->pressure_min, $forecast->pressure_max);
$forecast->wind = _gismeteo_average($forecast->wind_min, $forecast->wind_max);
$direction = array('северный','северо-восточный','восточный','юго-восточный','южный','юго-западный','западный','северо-западный');
$forecast->wind_direction = $direction[$forecast->wind_direction];
$forecast->relwet = _gismeteo_average($forecast->relwet_min, $forecast->relwet_max);
$forecast->heat = _gismeteo_average($forecast->heat_min, $forecast->heat_max);
// сохраняем прогноз
$forecasts[$forecast->date][] = $forecast;
}
variable_set("gismeteo_forecasts", $forecasts);
variable_set("gismeteo_town", $town_name);
_gismeteo_debug($forecasts);
}

function gismeteo_block($op = 'list', $delta = 0, $edit = array()) {
$town = variable_get("gismeteo_town",'');
if ($op == 'list') {
$blocks[] = array('info'=>t("Погода в г. $town"));
return $blocks;
} elseif ($op == 'view') {
switch ($delta) {
case 0:
$forecasts = variable_get("gismeteo_forecasts",'');
$block = array('subject'=>t("Погода в г. $town"), 'content'=>theme('gismeteo_weather',$forecasts));
break;
}
return $block;
}
}

function theme_gismeteo_weather($forecasts) {
$c = "

";
foreach (array(date("d.m.Y")=>"Сегодня", date("d.m.Y",time()+24*60*60)=>"Завтра") as $date=>$today_tommorow) {
$forecast = $forecasts[$date][0];
if (empty($forecast)) continue;
$c .= sprintf("
%s (%s %02d.%02d)

", $today_tommorow, $forecast->weekday_name_brief, $forecast->day, $forecast->month);
foreach ($forecasts[$date] as $forecast) {
$c .= sprintf("

$forecast->day_time
%+02d..%+02d
", $forecast->temperature_min, $forecast->temperature_max);
$info = array();
if (!empty($forecast->cloudiness)) $info[] = $forecast->cloudiness;
if (!empty($forecast->precipitation)) $info[] = $forecast->precipitation;
$c .= join(", ", $info) . "

";
}
$c .= "

";
}
$c .= "

";
return $c;
}

function _gismeteo_average($min,$max) {
return (integer)round(($min + $max) / 2);
}

?>

Аватар пользователя zhecsan zhecsan 2 марта 2007 в 14:46

Спасибо за скрипт, но создал я текстовый файл, назвал его gismeteo.module, после чего он перестал быть тектовым и скопировал туда содежимое этого скрипта.. Дальше положил папку с модулями в друпале.. К сожалею я не могу его увидеть, чтобы добавить как модуль в админке друпала.. Что я делаю не так?.. Помогите пожалуйста, кто понял мою ошибку...

Аватар пользователя Terranova Terranova 17 сентября 2006 в 19:28

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

Аватар пользователя kiev1 kiev1 17 сентября 2006 в 23:40

друпал не умирает - просто кто-то не умеет смотреть логи сервера на предмет нахождения ошибочек

Аватар пользователя edhel edhel 28 апреля 2007 в 10:33

1) Файлы модуля должны быть в UTF-8, а как вы их создаете непонятно.
2) Для 5-го друпала еще и info-файл нужен.

Ну вот ловите уже собранный модуль.

Аватар пользователя worona worona 29 апреля 2007 в 0:06

Поймал, поставил - белая смерть
Fatal error: Cannot use string offset as an array in /home/users/w/worona01/docs/modules/gismeteo/gismeteo.module on line 126

Аватар пользователя edhel edhel 2 апреля 2008 в 19:02

в логе веб-сервера и дрюпала что пишется-то? мб dom xml не включен в пхп или mbstring? у меня на сайте стабильно до сих пор работает с 2006 года