Созонов Алексей

Веб-разработчик

Загрузка контента через AJAX

09.08.2015

Недавно наткнулся на интересную статью. Там приводится пример модуля, который загружает определенный контент блока, используя ajax, в зависимости от типа устройства.

Его можно легко переделать так, чтобы содержимое блока подгружалось по определенному адресу.

Вот собственно сам пример:

1) Указываем адрес и callback функцию, которая будет возвращать содержимое

<?php
/**
* Implementation of hook_block_menu().
*/
function mymodule_menu() {
  $items['ajax/load_device'] = array(
    'page callback' => 'mymodule_loadblock',
    'type' => MENU_CALLBACK,
    'access arguments' => array('access content'),
  );
  return $items;
}

2) Callback функция

<?php
function mymodule_loadblock($device = 'mobile') {
  if($device == 'mobile') {
    $html = views_embed_view('myview', "embed_mobile");
  } elseif ($device == 'desktop') {
    $html = views_embed_view('myview', "embed_desktop");
  }
  $result = array(
    'status' => 'ok',
    'html' => $html,
  );
  drupal_json_output($result);
}

3)Создаем блок

<?php
/**
* Implementation of hook_block_info().
*/
function mymodule_block_info() {
  $blocks[0] = array(
    'info' => t('Main'),
  );
  return $blocks;
}
/**
* Implementation of hook_block_view().
*/
function mymodule_block_view($delta='') {
  $block = array();
  switch ($delta) {
    case 0:
      $block['subject'] = t('<none>');
      $block['content'] = theme('mymodule_main');
      break;
  }
  return $block;
}
/**
* Implements hook_theme().
*/
function mymodule_theme() {
  return array(
    'mymodule_main' => array(
      'template' => 'templates/main',
    ),
  );
}

4) Создаем файл в папке templates в модуле mymodule main.tpl.php

<div id="main-block">
  <div id="inner-data">
  </div>
</div>

5) Добавляем js код

(function ($) {
$(function() {
  var device = 'desktop';
  if( /Android|webOS|iPhone|iPad|BlackBerry/i.test(navigator.userAgent) ) 
  {
     device = 'mobile';
  } 
  var url = '/ajax/load_device/' + device;
  $.get(url, function(data) {
    if (data.html) {
      $("#main-block").html(data.html);
    }
  });
});
})(jQuery);
#Drupal