I want create simple plugin for add bookmark flag (for nodes) into activity messages.

In my module i have hook_heartbeat_plugin_info():

/**
 * Implements hook_ctools_plugin_api().
 */
function nextdoc_hb_ctools_plugin_api($owner, $api) {
  if ( ($owner == 'heartbeat' && $api == 'heartbeat') ||
       ($owner == 'ds' && $api == 'ds') ||
       ($owner == 'ds_extras' && $api == 'ds_extras') ) {
    return array('version' => 1);
  }

  if ($owner == 'heartbeat_plugins' && $api == 'heartbeat_plugins') {
    return array('version' => 1);
  }
}

/**
 * Implementation of hook_heartbeat_plugin_info().
 * Built-in default plugins that can be used with heartbeat.
 */
function nextdoc_hb_heartbeat_plugin_info() {
  $plugin_names = array();

  if (module_exists('flag')) {
    $plugin_name = new HeartbeatPluginWrapper;
    $plugin_name->disabled = FALSE; /* Edit this to true to make a default plugin_name disabled initially */
    $plugin_name->api_version = 1;
    $plugin_name->plugin_name = 'flagbookmark';
    $plugin_name->label = 'Bookmark related content.';
    $plugin_name->module = 'nextdoc_hb';
    $plugin_name->settings = array();

    $plugin_names['flagbookmark'] = $plugin_name;
  }

  return $plugin_names;
}

Class in file plugins/flagbookmark.inc:

/**
 * Class HeartbeatFlagBookmarkPlugin.
 */
class HeartbeatFlagBookmarkPlugin extends HeartbeatBasePlugin implements iHeartbeatPlugin {

  /**
   * isEnabled().
   */
  public function isEnabled(HeartbeatActivity $heartbeatActivity) {
    return TRUE;
  }

  /**
   * hasAttachments().
   */
  public function hasAttachments() {}

  /**
   * hasButtons().
   */
  public function hasButtons() {
    return TRUE;
  }

  /**
   * pluginUIForm().
   */
  public function pluginUIForm(&$form, &$form_state) {}

  /**
   * pluginAttachmentForm().
   * The form to add attachments to templates.
   */
  public function pluginAttachmentForm(&$form, &$form_state) {}

  /**
   * loadAttachments().
   */
  public function loadAttachments(HeartbeatActivity $heartbeatActivity) {}

  /**
   * renderAttachments().
   */
  public function renderAttachments(HeartbeatActivity $heartbeatActivity) {}

  /**
   * renderButtons().
   */
  public function renderButtons(HeartbeatActivity $heartbeatActivity) {
    $heartbeatActivity->add_button(flag_create_link('bookmarks', $heartbeatActivity->nid));
  }

  /**
   * streamLoaded().
   */
  public function streamLoaded(HeartbeatStream $heartbeatStream) {}
}

File with class (plugins/flagbookmark.inc) is loaded (i test it) but my button can't render. I try print some debugs from class functions (isEnabled, hasAttachments, hasButtons) but no one are called, only function streamLoaded() is called.

Maybe i'm miss something? Thanks.

Comments

havran’s picture

Status: Active » Closed (fixed)

Ok i solve this.

In my module i have hook_heartbeat_plugin_info():

/**
 * Implementation of hook_heartbeat_plugin_info().
 * Built-in default plugins that can be used with heartbeat.
 */
function nextdoc_hb_heartbeat_plugin_info() {
  $plugin_names = array();

  if (module_exists('flag')) {
    $plugin_name = new HeartbeatPluginWrapper;
    $plugin_name->disabled = FALSE; /* Edit this to true to make a default plugin_name disabled initially */
    $plugin_name->api_version = 1;
    $plugin_name->plugin_name = 'flagfollowuser';
    $plugin_name->label = 'Follow user.';
    $plugin_name->module = 'nextdoc_hb';
    $plugin_name->settings = array(
      'enabled' => 0,
    );

    $plugin_names['flagfollowuser'] = $plugin_name;
  }

  return $plugin_names;
}

And my plugin class:

/**
 * @file
 * Flag attachment plugin for heartbeat.
 */

/**
 * Class HeartbeatFlagFollowUserPlugin.
 */
class HeartbeatFlagFollowUserPlugin extends HeartbeatBasePlugin implements iHeartbeatPlugin {

  /**
   * isEnabled().
   */
  public function isEnabled(HeartbeatActivity $heartbeatActivity) {
    return $heartbeatActivity->template->attachments[$this->settings['plugin_name']]['enabled'] == 1 ? TRUE : FALSE;
  }

  /**
   * hasAttachments().
   */
  public function hasAttachments() {
    return TRUE;
  }

  /**
   * hasButtons().
   */
  public function hasButtons() {
    return TRUE;
  }

  /**
   * pluginUIForm().
   */
  public function pluginUIForm(&$form, &$form_state) {}

  /**
   * pluginAttachmentForm().
   * The form to add attachments to templates.
   */
  public function pluginAttachmentForm(&$form, &$form_state) {
    // Create element to trigger this plugin.
    $template = $form_state['item'];

    $form['attachments']['flagfollowuser']['enabled'] = array(
      '#type' => 'checkbox',
      '#title' => t('Enable follow user flag'),
      '#default_value' => isset($template->attachments['flagfollowuser']['enabled']) ?
                          $template->attachments['flagfollowuser']['enabled'] :
                          0,
    );
  }

  /**
   * loadAttachments().
   */
  public function loadAttachments(HeartbeatActivity $heartbeatActivity) {}

  /**
   * renderAttachments().
   */
  public function renderAttachments(HeartbeatActivity $heartbeatActivity) {}

  /**
   * renderButtons().
   */
  public function renderButtons(HeartbeatActivity $heartbeatActivity) {
    $heartbeatActivity->add_button(nextdoc_user_flag_create_link($heartbeatActivity->uid));
  }

  /**
   * streamLoaded().
   */
  public function streamLoaded(HeartbeatStream $heartbeatStream) {}
}

Now i have checkbox in templates for enable/disable my flag link.

Thanks for great work on this module.