На главной странице есть лента новостей. Она состоит из:
1. Дата новости;
2. Анонс новости;
3. Ссылка на саму новость.
Захотелось мне реализовать ajax-загрузку основного текста новости на место ссылки.
Изучив “как создать свой модуль”, основы javascript, jquery и вспомнив основы php-программирования я все таки реализовал свою идею. Возможно для профи это 5 минутное дело, у меня ушло около 5 дней в совокупности. Работу модуля можете посмотреть на www.appri.ru.
Модуль назвал loadnews. Здесь обноленный код.
Файл loadnews.module:
<?php
/*
* Implementing hook_init
*/
function loadnews_init() {
drupal_add_css(drupal_get_path('module', 'loadnews') . "/loadnews.css");
drupal_add_js(drupal_get_path('module', 'loadnews') ."/loadnews.js");
}
/*
* Implementation hook_perm
*/
function loadnews_perm() {
return array('access onthisdate content');
}
/**
* Implementation hook_menu()
*/
function loadnews_menu() {
// Элемент меню с соответствующим путем
$items['loadnews'] = array (
// Функция, которая будет "обрабатывать" путь
'page callback' => 'loadnews_ajax',
// Права на доступ к пути
'access arguments' => array('access content'),
// Элемент не будет отображаться в меню сайта
'type' => MENU_CALLBACK,
);
return $items;
}
/* Функция обработки запроса */
function loadnews_ajax() {
/*
* Ссылка на на новость передается методом GET в переменной 'url'
* В БД алисы адресов хранятся без первого слеша, поэтом удаляем его
*/
$url = substr($_GET['url'], 1);
// По полученному алиасу ищем в таблице url_alias соответствующий системный адрес
$sys_url = db_result(db_query("SELECT n.src FROM {url_alias} n WHERE dst = '%s'", $url));
/* Адрес получаем в виде "node/nid". Нам нужно получить параметр nid.
* Для этого разбиваем строку на массив из 2-х элементов, второй который наш nid
*/
$sys_url_array = explode('/',$sys_url);
// Сохраняем наш nid в переменную
$nid = $sys_url_array['1'];
// Выбираем поле основного текста новости "field_news_text_value" из таблицы "content_type_news"
$result = db_result(db_query("SELECT n.field_news_text_value FROM {content_type_news} n WHERE n.nid = '%d'", $nid));
// Наш ответ клиенту
drupal_json(array('status' => 1, 'data' => $result));
}
?>Файл loadnews.js:
Drupal.behaviors.loadnews = function(context) { // Добавляем для всех ссылок в блоке новостей class =loadnews $('#block-views-news-block_news', context).find('a').addClass('loadnews') // Реагируем на клик .bind('click', function() { // Передаем с методом get адрес ссылки var href = $(this).attr('href'); // Переменная, это куда мы будем выводить ответ var target = $(this).parents(".field-content"); // Прячем ссылку $(this).hide(); // Вместо нее выводим анимацию $(target).append("<div class=loading></div>"); // Получаем данные с сервера $.get(Drupal.settings.basePath + 'loadnews', {url:href} , function(response) { // Сохраняем ответ в переменной var result = Drupal.parseJson(response); // Прячем анимацию $(target).find(".loading").hide(); // Вместо нее ставим "Свернуть" $(target).append("<span class=hidenews>Свернуть</span>"); $(target).append("<span class=shownews>Подробнее...</span>"); $(target).find(".shownews").hide(); // Создаем блок для вывода текста новости $(target).append("<div class='newstext'></div>"); // Изначально блок будет скрыт, чтобы потом красиво его развернуть $(target).find("div.newstext").hide(); // Загружаем текст из переменной в блок $(target).find("div.newstext").html(result.data); // Красиво раскрываем наш блок $(target).find("div.newstext").slideDown("fast").addClass("active"); // Реализация скрытия и раскрытия блока (нужно оптимизировать код) $(target).find(".hidenews").click(function() { $(target).find(".hidenews").hide(); $(target).find("div.newstext").slideUp("fast").removeClass("active"); $(target).find(".shownews").show(); }); $(target).find(".shownews").click(function() { $(target).find(".shownews").hide(); $(target).find("div.newstext").slideDown("fast").addClass("active"); $(target).find(".hidenews").show(); }); }); return false; }); }
Хотелось бы услышать мнения и замечания профи по коду. Спасибо за внимание.
| Прикрепленный файл | Размер |
|---|---|
| loadnews_v6.x-1.6.zip | 3.62 кб |
Источник: http://www.drupal.ru/node/66172
Добавить комментарий к записи "Загрузка поля cck ajax-запросом."
Чтобы комментировать, необходимо войти в систему.