Drupal이 Drupal 동작을 새로운 아약스 컨텐츠에 첨부하도록 함 [Drupal.attachBehaviors () 만 올바른 방식으로 작동하지 않음]


10

drupal.org 에서이 주제에 대해 많은 게시물을 작성했지만 불행히도 잘못된 컨텍스트에서 이루어졌습니다.

나는 그것이 문제가 아니라고 생각하므로 다른 접근법으로 시도해보십시오. 아마도 이것이 해결책 일 수 있습니다. 전체 PHP 페이지를로드하고 아약스로 특정 div를 추출하는 것이 올바르게 작동하지 않았습니다. 그래서 drupal이 내용을로드하고 div에 ajax를 주입 할 수 있다고 생각했습니다. 요청한 URL에서 "ajax = 1"을 찾고있는 hook_preprocess_page 및 hook_preprocess_node를 사용하여 쿼리 한 다음 전체 페이지가없는 컨텐츠 만 제공합니다. 그리고 이제 특정 tpl.php 파일의 도움으로 이론적으로 drupal의 출력을 $ content로 제한 할 수 있습니다. 그리고 여기에 문제가 있습니다. tpl.php 파일을 원래 방식으로 남겨두고 node-ajax.tpl.php에서 "$ content"를 제거하더라도 내 접근 방식이 작동합니다. "올바른 방법으로 작업"을하면 드루팔이 전체 페이지를 다시로드하지 않습니다. 물론 내용이 아닙니다. 그러나 나는 $ content 변수의 원인을 스스로 설명 할 수 없으므로 생성 된 내용의 HTML 일뿐이라고 생각했습니다. 그래서 내 질문은 drupal의 출력을 내용으로 제한 하거나이 작업을 수행하기 위해 잘못된 단계를 수행하는 방법입니다. 다음은 내가 사용하는 모듈 및 js 파일입니다. my_ajax.module :

<?php

function my_ajax_init()
{
    drupal_add_js(drupal_get_path('module', 'my_ajax') . '/my_ajax.js');
}

function my_ajax_preprocess_page(&$vars, $hook)
{

    if (isset($_GET['ajax']) && $_GET['ajax'] == 1)
    {
        $vars['template_file'] = 'page-ajax';
    }
}

function my_ajax_preprocess_node(&$vars, $hook)
{

    if (isset($_GET['ajax']) && $_GET['ajax'] == 1)
    {
        $vars['template_file'] = 'node-ajax';
    }
}

my_ajax.js :

Drupal.behaviors.my_ajax = function (context) {
    $('#content-group-inner .node a').live('click', function (e) {
        var url = $(this).attr('href');
        //$('#content-region-inner').slideUp('slow');
        $('#content-region-inner').empty().html('<img src="ajax-loader.gif" style="margin-left:50%;"/>');
        xhr = $.ajax({
            data: 'ajax=1',
            type: 'GET',
            url: url,
            success: function (data) {
                $('#content-region-inner').html(data);
                Drupal.attachBehaviors(context);
            }
        });
        return false;
    });
};

이것 좀 도와주세요. 모든 제안에 감사드립니다.


2
작은 의견 D7은 경로에서 / nojs와 / ajax를 사용하여 아약스 링크와 표준 링크를 구별합니다. 나중에 두통을 덜 수 있습니다.
Jeremy French

답변:


11

나는 그것을있어. 이것은 올바른 방법으로 작동합니다.

Drupal.behaviors.my_ajax = function (context) {
    $('#content-group-inner a').live('click', function (e) {

        $('#content-group-inner a').addClass('my_ajax-processed');
        var url = $(this).attr('href');
        $('#content-region-inner').empty().html('<img src="ajax-loader.gif" style="margin-left:50%;"/>');        
        $('#content-region-inner').load(url,'ajax=1',function() {
                        Drupal.attachBehaviors('#content-region-inner');
                        });
        return false;
        });
   };

모든 도움에 감사드립니다.


1
자신의 답변을 승인 된 답변으로 표시하고 도움이 된 모든 답변을 찬성해야합니다. 이것은이 질문이 개요에서 해결 된 것으로 표시됩니다. 추가로 투표하면 사용자가 좋은 답변을 제공하도록 장려하는 데 도움이됩니다.
Berdir

첨부물에 "컨텍스트"도 사용해야합니다.
Josh Koenig


contextJosh Koenig가 지적했듯이 사용하지 않는 것은 큰 일이 아닙니다. 이벤트 핸들러는 페이지의 모든 요소에 다시 연결됩니다. 를 사용하면 첫 번째 이벤트 바인딩의 내용과 내용을 context바꿀 때 요소 자체 가 context포함 되므로이 코드를 변경해야 document하므로 간단하게 $('#content-group-inner a',context)작동하지 않습니다.
Alex Skrypnyk

10

귀하의 문제는 성공 함수의 범위에 가변 컨텍스트가 없으므로 첨부 동작이 정의되지 않은 상태에서 작동한다는 것입니다.

네가 할 수있을 것 같아

Drupal.attachBehaviors($('#content-region-inner'));

나는 성공 함수가 닫히고 변수 context(새로운 마크 업이 아닌 오래된 컨텍스트)를 범위 내에서 유지한다고 생각했습니다.
Andy

나는 이 경우 클로저로 작동 하지 않는다고 생각 하지만 그것에 대해 매우 틀릴 수 있습니다.
Jeremy French
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.