Como carregar uma exibição com ajax para que arquivos js / css adicionais necessários à exibição também sejam carregados?

8

Atualmente, estou usando o jQuery para carregar uma visualização, assim:

$.ajax({
    type: 'POST',
    url: Drupal.settings.basePath + 'views/ajax',
    dataType: 'json',
    data: 'view_name=' + viewName + '&view_display_id=default&view_args=' + viewArgument, // Pass a key/value pair.
    success: function(data) {
      var viewHtml = data[1].data;
      target.children().fadeOut(300, function() {
        target.html(viewHtml);

        var newHeightOfTarget = target.children().height();

        target.children().hide();

        target.animate({
          height: newHeightOfTarget
        }, 150);

        target.children().delay(150).fadeIn(300);

        Drupal.attachBehaviors(target);
      });
    },
    error: function(data) {
      target.html('An error occured!');
    }
  });

Meu problema é que, por exemplo, se a exibição usa o módulo 'Apresentação de slides do campo', os arquivos js / css necessários para que ele funcione corretamente não são carregados. O que poderia ser uma boa solução (= gatinhos ilesos) para isso?

Temaruk
fonte
Parece que isso será resolvido no D8 drupal.org/node/561858 . Passar o caminho para o arquivo js / css em Drupal.settings.mymodule e obtê-los com jQuery.getScript () e jQuery.getCSS () (de github.com/furf/jquery-getCSS ) pode ser uma solução alternativa ...
Temaruk
Aparentemente, o Ajax Framework já carrega preguiçosamente os arquivos css / js / library no D7. Ainda tem que se aprofundar, mas eu sinto a solução poderia ser um callback menu de ajax costume per view com ajax envio página ...
Temaruk
Eu tive um problema semelhante , ainda não resolvido, embora eu colocasse um link para ele aqui.
silkAdmin
Não sei o suficiente para escrever uma resposta completa, mas acho que a API AJAX do Chaos Tools já teria resolvido esse problema. Você pode querer usá-lo ou conferir. Os campos editáveis também lidam com esse problema de alguma forma, portanto pode ser mais um código de referência para verificar.
Wizonesolutions
11
@silkAdmin, também postei uma resposta para sua pergunta. Também deve-se notar que no D7 você realmente não precisa usar ctools. A estrutura do Ajax está no D7 Core ( api.drupal.org/api/drupal/includes--ajax.inc/group/ajax )
ericduran

Respostas:

7

Hmm, acho que essa pergunta merece uma recompensa maior :-p, mas não obstante, aqui está minha tentativa de responder a isso.

O Drupal já carrega qualquer css / js extra agora, não consigo encontrar muita documentação e, infelizmente, os arquivos JS não são facilmente documentados sem realmente ler o código, mas já existe.

Você realmente deve tentar evitar fazer a solicitação $ .ajax e, em vez disso, agrupar tudo com o Drupal.ajax também, se você usar o sistema Ajax, nem precisará escrever a solicitação ajax.

Ao implementar uma solicitação Drupal ajax adequada, usando comandos ajax, a maior parte da manipulação do css / js será feita automaticamente.

Observando o código acima, parece que você está fazendo as mesmas visualizações de solicitação que normalmente faria isso sozinho. Portanto, você provavelmente deve permitir que as visualizações tratem a solicitação ajax e sobrescreva os comandos ajax que serão acionados para serem seu comando. Você pode fazer isso implementando um hook_ajax_comamnd_alter, mas é meio ruim com visualizações porque você perde todas as informações contextuais, então eu recomendaria o uso de hook_views_ajax_data_alter.

Eu sei que não há muito código na minha resposta, mas é difícil responder com código, sendo que o código atualmente não está correto.

Para obter mais informações, consulte Drupal.ajax no arquivo misc / ajax.js. Para um exemplo de implementação de uma solicitação ajax com Drupal.ajax, consulte o arquivo ajax das exibições. E se você quiser ver e exemplo de exibições o comportamento normal sendo substituído, alterando os comandos ajax, consulte o módulo views_load_more no qual eu faço esse comportamento.

Também sinta-se à vontade para comentar esta resposta, se algo aqui não estiver claro.

Sobre e para obter mais informações sobre o Ajax Framework, consulte Ajax Framework, por exemplo, veja o módulo de exemplo , mesmo que a maioria do que você queira fazer não seja abordada no módulo de exemplos.

ericduran
fonte
Essa deve ser a direção certa, mas eu gostaria de verificar primeiro. Desde que fiz a pergunta, adquiri alguma experiência com o Ajax Framework do Drupal 7, como criar e usar comandos ajax personalizados. Vou revisitar meu problema e ver o que pode ser feito e atualizar com informações sobre minhas descobertas! Obrigado!
Temaruk
a URL que você está se referindo não existir: api.drupal.org/api/drupal/includes--ajax.inc/group/ajax
shekoufeh