Cargar vista con ajax

ilrojas's picture

He creado un tipo de contenido, el cual tiene un campo select y un campo node_reference(en el cual voy a mostrar con una vista los elementos de un tipo de contenido relacionado con el valor seleccionado), necesito cargar la vista en el mismo form, a la cual le debo pasar el valor del select como argumento cada vez que este cambie.
Para ello he creado un modulo e implementado una función mi_modulo_form_alter,he llegado a enviar por ajax el valor del select en el evento onchange de este, pero no logro mostrar la vista, he intentado con varios ejemplo que he encontrado pero no se donde he fallado. Necesito ayuda.

He aqui mi funcion:

<?php
function mi_modulo_form_alter(&$form, &$form_state, $form_id){
        if(
$form_id=='factura_node_form'){
           if(isset(
$_POST["view_arg"])){
                  
/*aqui debería pasar el arg a la vista, cargarla y mostrarla*/         
              
}          
          
drupal_add_js('jQuery(document).ready(function ($) {
                   $("#edit-field-datos-del-cliente-factura-und").change(function() {
                      $.ajax({
                           type: "POST",
                            url: "?q=node/add/factura",
                          async: true,
                           data: {view_arg:this.value},
                           dataType: "json"
                     });
                                });                             
               });'
, 'inline');           
           }          
       }
?>

Comments

Otra solución

ilrojas's picture

No se si pudiera de otra forma hacer lo que necesito. Necesito ayuda. Gracias

may I write in english or

xdemocle's picture

may I write in english or italian?

Gentoo lover, web developer, Drupal specialist, LAMP and web administrator linux oriented.

you are making am ajax

xdemocle's picture

you are making an ajax request, but you are not including the response action.
something like below:

$.ajax({
type: "POST",
url: "?q=node/add/factura",
async: true,
data: {view_arg:this.value},
dataType: "json"
}).done(function(response) {

// Do something with response
// Try console in the browser
console.log(response);

});

Gentoo lover, web developer, Drupal specialist, LAMP and web administrator linux oriented.

Tuve tu mismo problema y

Ruby232's picture

Tuve tu mismo problema y decidí hacer una entidad propio a código pero no te aconsejo eso, se me ocurre que puedes modificar el formulario del tipo de contenido y cargar los valores con Ajax , pero no estoy seguro que resulte, nos informas de tus resultados.

Te dejo un ejemplo de como lo hicimos, pero es un formulario echo por nosotros tendrías que ver como hacerle esto con los tipos de contenido.

<?php
$form
['proyecto_id'] = array(
       
'#type' => 'select',
       
'#title' => t('Proyecto'),
       
'#required' => TRUE,
       
'#options' => $projects,
       
'#multiple' => FALSE,
       
'#size' => count($projects),
       
'#default_value' => !$project ? '' : $project->name,
       
// Bind an ajax callback to the change event (which is the default for the
        // select form type) of the first dropdown. It will replace the second
        // dropdown when rebuilt
       
'#ajax' => array(
           
// When 'event' occurs, Drupal will perform an ajax request in the
            // background. Usually the default value is sufficient (eg. change for
            // select elements), but valid values include any jQuery event,
            // most notably 'mousedown', 'blur', and 'submit'.
           
'event' => 'change',
           
'callback' => 'ajax_proyecto_dependent_dropdown_callback',
           
'wrapper' => 'dropdown_second_replace',
        ),
    );

//cargar los usuarios que pertenecen al proyecto
$form['tarea_usuario'] = array(
       
'#type' => 'select',
       
'#title' => t('Usuario'),
       
'#required' => TRUE,
       
'#prefix' => '<div id="dropdown_second_replace">',
       
'#suffix' => '</div>',
       
'#options' => ajax_tarea_usuario_dropdown_options(!$project ? '' : $project->name),
       
//'#autocomplete_path' => 'user/autocomplete',
       
'#default_value' => !$user ? '' : $user->name,
    );


function
ajax_proyecto_dependent_dropdown_callback($form, $form_state) {
  return
$form['tarea_usuario'];
}
?>

Prueba esta solucion

eduardo.flores's picture

Algo asi te podria servir:

<?php
 
// Agregar un hook_menu para poder hacer un GET y que regrese el contenido de la vista
// el page callback es la funcion que se va a ejecutar al llamar a esta URL (getview/nombre_vista/display_id)
 
function mi_modulo_menu() {
       
$items['getview/%/%'] = array(
          
'page callback' => 'mi_modulo_get_view',
           
'page arguments' => array(1, 2),
         
'access callback' => true
    
);
     return
$items;
}
 
  
// esta funcion va a cargar la vista e imprimir el contenido
   // esto va a regresar como respuesta a tu llamada AJAX
function mi_modulo_get_view($nombre_vista, $display_id){
       print
views_embed_view($nombre_vista, $display_id);
    }
 
   function
mi_modulo_form_alter(&$form, &$form_state, $form_id){
     if(
$form_id=='factura_node_form'){
          
drupal_add_js('jQuery(document).ready(function ($) {
              $("#edit-field-datos-del-cliente-factura-und").change(function() {
                   $.GET({
                        url: "?q=getview/" + this.value + "/default",
                      success: function(respuesta){
                          // aqui puedes hacer que la respuesta se cargue en un div o donde la necesites
                         $("#midiv").html(respuesta);
                     }
                  });
                });                             
          });'
, 'inline');           
       }          
   }
?>

Intentalo y comenta como te fue con esto.

Eduardo.

jquery_ajax_load

hatuhay's picture

Utiliza el módulo jquery_ajax_load y tienes tu solición en 2 minutos.
Puedes pasar parámetros por la URL para cargar tu vista.

He logrado un avance

ilrojas's picture

Hola a todos, hasta el momento he logrado cargar la vista pasándole como parámetro el valor del select, pero no he lo grado cargar esta en el div que he he difinido para eso $("#edit-field-ordenes-atendidas-und"). No se si esta será la forma correcta de enviar la vista, pero al parecer en el reponse no está llegando nada.

<?php
 
function mi_modulo_form_alter(&$form, &$form_state, $form_id){
     if(
$form_id=='factura_node_form'){
           if(isset(
$_POST["view_arg"])){
              
$view=views_get_view('ordenes_por_cliente');
            
$view->set_display('references_1');
              
$view->set_use_ajax(TRUE);
             
$view->set_arguments(array($_POST["view_arg"]));                              
              
$view->pre_execute();
              
$view->execute();
               print
$view->render();
              
             
drupal_add_js('jQuery(document).ready(function ($) {
                   $("#edit-field-datos-del-cliente-factura-und").change(function() {
                      $.ajax({
                           type: "POST",
                            url: Drupal.settings.basePath + "?q=node/add/factura",
                           async: true,
                           data: {
                                view_arg:this.value
                                },
                         dataType: "json",
                            success: function(response){
                               console.log(response[1].data);
                              if(response[1]!==undefined){                                  
                                   var viewHtml=response[1].data;                                 
                                   $("#edit-field-ordenes-atendidas-und").append(viewHtml);
                                 Drupal.attachBehaviors();
                                  }
                              }
                             
                       });
                                });                             
               });'
, 'inline');           
           }          
       }          
?>

Saludos y espero comentarios.

Spanish

Group organizers

Group events

Add to calendar

Group notifications

This group offers an RSS feed. Or subscribe to these personalized, sitewide feeds:

Hot content this week