Add pane to panel display database
2014 11 Oct

Programmatically add pane to panel display in database

Following is an example code that shows how to add a custom content pane to a panel display. NOTE: this code is for adding pane to a panel display which exists in the database and not in a feature file.

Create a  new custom content pane using the function panels_new_pane($type, $subtype, $set_defaults = FALSE).

$new_pane = panels_new_pane('custom','custom',TRUE);

Once the new pane is successfully created set its content and visibility rule.

if ($new_pane) {
  // Set up content for new custom content pane
  $new_pane->configuration['admin_title'] = t(‘This is an example pane’);
  $new_pane->configuration['body'] = ‘<p>’ . t(‘Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.’) . ‘</p>’;
}

 

As an example I am setting the ‘String URL’ visibility rule for this pane. So I'll be showing my new pane only on the path 'example-page'.

ctools_include('context');
$plugin = ctools_get_access_plugin('path_visibility');
$plugin = ctools_access_new_test($plugin);
$plugin['settings']['paths'] = ‘example-page’;
$new_pane->access['plugins'][] = $plugin;

 

Now we must load the panel display to add the new pane. As an example I am adding the new pane to a region ‘sidebar_block’.

For this we need the did value for the panel display. For finding out the did, you have to work a little harder :)

#1 First find out the machine name of your panel display. You can figure that out on the panel display edit page itself by following the url - admin/structure/pages/nojs/operation/site_template/handlers/site_template_panel_context_N/content. ‘site_template_panel_context_N’ is the machine name for your panel display where N will be an integer.

#2 Next look in the table ‘page_manager_handlers’, inside the column ‘conf’. Fetch that column from the database for the row corresponding to your panel display, ie. the name field should match your panel display machine name. Unserialize the conf data and the variable ‘did’ inside the array will be the did value you are looking for.

You could user the following code to figure out your did. 

$query = db_select('page_manager_handlers', 'pmh')
->fields('pmh', array('conf'))
->condition('pmh.name', 'site_template_panel_context_N');
$result = $query->execute()->fetchColumn();
$conf = unserialize($result);
print $conf['did'];

Once you have your did, you then have to load the panel display, add your new pane and save it. Thats it!

$did = 1; // considering did = 1 as an example here
$display = panels_load_display($did);
if($display) {
  $display->add_pane($new_pane, 'sidebar_blocks');
  panels_save_display($display);
}

So here is the entire code

// Create new pane and configure content and visibility settings
$new_pane = panels_new_pane('custom','custom',TRUE);
if ($new_pane) {
  // Set up content for new custom content pane
  $new_pane->configuration['admin_title'] = t(‘This is an example pane’);
  $new_pane->configuration['body'] = ‘<p>’ . t(‘Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.’) . ‘</p>’;

  // Set up path visibility rule for new custom content pane
  ctools_include('context');
  $plugin = ctools_get_access_plugin('path_visibility');
  $plugin = ctools_access_new_test($plugin);
  $plugin['settings']['paths'] = ‘example-page’;
  $new_pane->access['plugins'][] = $plugin;

  $query = db_select('page_manager_handlers', 'pmh')
           ->fields('pmh', array('conf'))
           ->condition('pmh.name', 'site_template_panel_context_N');
  $result = $query->execute()->fetchColumn();
  $conf = unserialize($result);

  // Load the panel display to add the new pane.
  $did = $conf['did'];
  if (is_numeric($did)) {
    $display = panels_load_display($did);
    if($display) {
      $display->add_pane($new_pane, 'sidebar_blocks');
      panels_save_display($display);
    }
  }
  else {
    drupal_set_message(t('Incorrect reference to panels display'), 'warning', FALSE);
    watchdog('hcl_campaign', 'did passed to panels_load_display is not int - @did.', array('@did' => $did));
  }
}
else {
  drupal_set_message(t('Failed to create new pane.'), 'warning', FALSE);
}

Following the above code you could add existing content line blocks, views, page elements, mini panels, etc. Then you could set different settings for the pane like visibility settings, style settings, css settings etc. You could manually add panes using the panel's UI and play around with their settings and then load the panel display object and look at the settings for those panes to see how to implement the same programmatically. You should surely use the Devel module - https://www.drupal.org/project/devel and look around in the panels API for further help - https://www.drupal.org/project/panels.

When I had to implement this, I spent almost an entire day searching through google with as many keywords I could think of but not a single article that I found could help me with this task. Finally, I went through the panel’s API and within a few hours I had my job done! So here’s hoping this saves somebody at least sometime and gives them some direction :)

Please let me know in the comments if you have any queries :) And all the best with this!

Latest Blogs

webshop

Drupal: The ideal solution for your e-Commerce Website

In the last few decades, the online merchandising sector has made strides at an unprecedented pace following that, the demand and emergence of many e-commerce platforms are on the rise. 

Read More

Drupal 9 Upgrade

The Roadmap to upgrade Drupal site to Drupal 9

Drupal is approaching with its next big evolution and the upcoming release that is none other than Drupal 9.

Read More

How to Choose Web Development Agencies

Points to check before choosing the right website development company

In today’s day and age, where the digital population is increasing exponentially, no credible business can or should refrain from having a strong and steady web presence.

Read More

Wordpress to Drupal

Should I plan to move my Wordpress Website into the Latest Drupal version?

If you're here, I assume you already have a website built on WordPress but you're not satisfied with it, or perhaps you're here to have a clear idea about why you should give a thought to migrating

Read More