Загрузка поля cck ajax-запросом.

На главной странице есть лента новостей. Она состоит из:
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-запросом."

Чтобы комментировать, необходимо войти в систему.

© 2009 Обзор CMS