So in my continuing quest to display a form with Solr search results in a Ctools modal window and use a pager, I've managed to get everything to display fine after the initial search, but when I use the pager, I get a white screen with the data in json format instead of everything displayed in the modal again. Here is the relevant code:
function imgsearch_page($ajax, $id, $a, $b) { if ($ajax) { //Load the modal library and add the modal javascript. ctools_include('ajax'); ctools_include('modal'); $form_state = array( 'ajax' => TRUE, 'title' => t('Image Search Form'), 'next_field_id' => $id, ); // Use ctools to generate ajax instructions for the browser to create // a form in a modal popup. $search_form = ctools_modal_form_wrapper('imgsearch_form', $form_state); if (($form_state['executed'] && $form_state['ajax']) || isset($_GET['page'])) { // If the form has been submitted, there may be additional instructions // such as dismissing the modal popup. if (!empty($form_state['ajax_commands'])) { $output = $form_state['ajax_commands']; } if ($form_state['values']['search_terms'] != '' || isset($_GET['search_terms'])) { $page_num = isset($_GET['page']) ? $_GET['page'] : 0; if ($_GET['search_terms']) { $form_state['values']['search_terms'] = $_GET['search_terms']; } $results = nb_image_search_search($form_state['values'], $page_num); if (is_array($results['images']) && count($results['images'] > 0)) { $next_field_id = $form_state['next_field_id']; // Create object to store file and target field info. To be stored in ctools cache. $file_info = new stdClass(); // Generate the field name. field_images is a multivalue field collection, so we just need the next available option // in the $field_images['und'] array. The second number (for field_image) will always be 0 since it // is a single value field. $file_info->fieldname['url'] = '#edit-field-images-und-' . $next_field_id . '-field-image-und-0-imgsearch-file-url'; $file_info->fieldname['person'] = '#edit-field-images-und-' . $next_field_id . '-field-person-und-0-value'; $file_info->fieldname['organization'] = '#edit-field-images-und-' . $next_field_id . '-field-organization-und-0-value'; $file_info->fieldname['year'] = '#edit-field-images-und-' . $next_field_id . '-field-year-und-0-value'; $file_info->fids = array(); // Theme the results as a table. $header = array(t('Image'), t('File Name'), t('Add to field')); $rows = array(); foreach ($results['images'] as $image) { // Create image style derivative for each image. $imagestyle = array( 'style_name' => 'thumbnail', 'path' => $image['filepath'] . $image['filename'], 'width' => '', 'height' => '', 'alt' => '', 'title' => $image['filename'], ); $styled_image = theme('image_style', $imagestyle); $fid = $image['fid']; $rows[] = array( 'image' => $styled_image, 'name' => $image['filename'], 'add' => ctools_ajax_text_button("select", "imgsearch/nojs/imgadd/" . $fid . '/' . $next_field_id, t('Select')), ); $file_info->fids[$fid] = $image['filename']; // Cache values for Person, Organization, and Year if they exist. foreach (array('person', 'organization', 'year') as $field) { if (isset($image[$field])) { $file_info->meta[$fid][$field] = $image[$field]; } } } //Cache image name in ctools object cache so it can be used later in nb_image_search_image_add() ctools_include('object-cache'); ctools_object_cache_set('imgsearch', 'imgsearch_' . $next_field_id, $file_info); // Create a render array ($build) which will be themed as a table with a // pager. $build['search_form'] = isset($search_form[0]) ? drupal_build_form('imgsearch_form', $form_state) : $search_form; $build['imgsearch_table'] = array( '#theme' => 'table', '#header' => $header, '#rows' => $rows, '#empty' => t('There were no matching results found'), ); // Attach the pager theme. $pager = pager_default_initialize($results['total_found'], $results['rows']); $build['imgsearch_pager'] = array( '#theme' => 'pager', '#parameters' => array( 'search_terms' => $form_state['values']['search_terms'], //TODO: add params for Person, Organization, and Year. ), ); $form_state['values']['title'] = t('Search Results'); $output = ctools_modal_form_render($form_state['values'], $build); print ajax_render($output); drupal_exit(); } else { $build['no_results'] = array( 'markup' => '<div class="no-results>No images found</div>', ); } } } elseif (!isset($output)) { $output = ctools_modal_form_wrapper('imgsearch_form', $form_state); // Return the ajax instructions to the browser via ajax_render(). print ajax_render($output); drupal_exit(); } } else { return drupal_get_form('imgsearch_form', $id); } } The only real difference is that since form field values are removed somehow when the form is submitted via ajax, I use the #parameters element in the pager array, which puts it in $_GET[], allowing me to access it in the search function (nb_image_search_search()). The page argument is also there, put there by the pager. Since ctools_modal_form_wrapper() returns the form in rendered mode, I have to rebuild it again to pass it to ctools_modal_form_render().
Other than that, I don't see any differences. I've stepped through the code all the way to the call to drupal_json_encode() in ajax_render(), but can't get any farther than that.
What would be causing the json to just be displayed on a white screen instead of displaying in the modal, but only when I'm using the pager link?
Thanks.