Загрузите представление drupal в правое поле с помощью ajax - PullRequest
0 голосов
/ 27 марта 2012

Я использую Drupal 6 и создал 2 одинаковых столбца в layout.css
В левом столбце у меня есть представление со списком узлов. К каждому узлу прикреплено представление со списком его дочерних узлов (с использованием присоединения представлений и аргумента ссылки на узел).

Я хотел бы иметь возможность щелкнуть ссылку на каждом из этих узлов левого столбца и вызвать его дочернее представление в правом столбце с помощью ajax.

Я пытался поместить jquery / javascript в заголовок node-xxx.tpl.php, вызывая viewattach через внешнюю страницу с именем ajaxview.php, то есть:

<script type="text/javascript">
Drupal.behaviors.ajaxview = function(context) {
$("#ajaxclick").click(function(){
        $("#container").load("http://path/to/ajaxview.php 
        });
}
</script>

<a id="ajaxclick" href= "#">Click me</a>
<div id="container"></div>

И в ajaxview.php:

<div id="rightcolumn"><?php print $node->content[Comments_node_content_1]['#value'];?></div>

Я получаю только пустую страницу ...

Как я могу заставить дочернее представление появляться в правом столбце при каждом нажатии на узел в левом столбце?

Есть ли лучший способ?

1 Ответ

1 голос
/ 28 марта 2012

Ваш файл ajaxview.php не находится в том же контексте, что и ваш код в node-xxx.tpl.php, и это означает, что он не имеет доступа к переменной $ node.Ваш файл ajaxview.php выполняется как новый скрипт, вероятно, за пределами Drupal, если вы действительно назвали его ajaxview.php.

Вы должны рассмотреть возможность создания пути в хуке меню и вызвать этот путь с помощью ajax в вашем узле.xxx.tpl.php.

<?php

function test_menu() {
  $items = array();

  $items['myajax'] = array(
    'title' => 'My Ajax',
    'page callback' => 'test_myajax',
    'description' => 'Test',
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );

  return $items;
}


function test_myajax($nid) {
  $node = node_load($nid);
  print '<div id="rightcolumn">';
  print $node->content['Comments_node_content_1']['#value'];
  print '</div>';
  exit();
}

Этот код создаст новый путь "myajax" (который вы должны переименовать в нечто более значимое для вас), который должен вызываться с идентификатором узла, подобным этому:

http://yoursite/myajax/999

, где 999 - идентификатор узла.

Это означает, что в вашем коде, который вызывает ajax, вы должны передать nid текущего просматриваемого узла.Есть разные способы сделать это, в зависимости от вашего контекста.

Вот пример javascript, который работает с кодом выше (я тестировал его локально).

<script type="text/javascript">
Drupal.behaviors.ajaxview = function(context) {
    $("#ajaxclick").click(function(){
        $("#container-test").load(Drupal.settings.basePath + "myajax/" + 999); 
    });
}
</script>

<a id="ajaxclick" href= "#">Click me</a>
<div id="container-test"></div>
...