Plugin altering 'account' schema

By jenolan - October 7, 2016

Hi I am tinkering again, I need to create (if not present) an extra filed in the website membership table (if plugin installed).

Is the 'correct' method to simply loadSchema() twiddle the array saveSchema() and then createMissingSchemaTablesAndFields()?

Thanks,
Larry

---



Peace and Long Life

By Dave - October 19, 2016

Hey Larry, 

If you've haven't already done this.  Here's some sample plugin code from "Simple Forum" that adds fields to a schema when it's not already there:

// plugin actions
addAction('section_init', '_sforum_pluginSetup_updateAccountsSchema', null, 1);

// make sure that all required accounts schema changes are made - runs when user visits plugins menu
function _sforum_pluginSetup_updateAccountsSchema($tableName) {
  $isPluginMenu = $tableName == 'admin' && @$_REQUEST['action'] == 'plugins';
  if ($tableName && !$isPluginMenu) { return; } // only run on plugin menu

  // ensure membership account schema has appropriate fields
  $order = time();
  $fieldsToEnsure = array(
    '__sforum_header__' => array(
      'order'           => ++$order,
      'label'           => '',
      'type'            => 'separator',
      'separatorType'   => 'header bar',
      'separatorHeader' => 'Forum Settings',
      'separatorHTML'   => '',
      'isSystemField'     => '1',
    ),
    '_sforum_signature' => array(
      'order'             => ++$order,
      'label'             => 'Signature',
      'type'              => 'textbox',
      'autoFormat'        => '0',
      'isSystemField'     => '1',
    ),
    '_sforum_adminForums' => array(
      'order'             => ++$order,
      'label'             => 'Admin for Forums',
      'type'              => 'list',
      'indexed'           => '0',
      'defaultValue'      => '',
      'fieldPrefix'       => '',
      'description'       => '',
      'isRequired'        => '0',
      'isUnique'          => '0',
      'listType'          => 'checkboxes',
      'optionsType'       => 'table',
      'optionsTablename'  => '_frm_forums',
      'optionsValueField' => 'num',
      'optionsLabelField' => 'name',
      'isSystemField'     => '1',
    ),
  );

  // add fields to accounts table if necessary
  $accountsTable = coalesce( @$GLOBALS['WSM_ACCOUNTS_TABLE'], 'accounts');
  $accountSchema = loadSchema($accountsTable);
  $updated = false;
  foreach ($fieldsToEnsure as $newFieldName => $newFieldSchema) {
    if (!@$accountSchema[$newFieldName]) {
      $accountSchema[$newFieldName] = $newFieldSchema;
      $updated = true;
    }
  }

  // save schema if necessary
  if ($updated) {
    saveSchema( $accountsTable, $accountSchema );
    createMissingSchemaTablesAndFields();
  }
  
  // add email templates
  // SFORUM-NOTIFY-POST
  emailTemplate_addToDB(array(
    'template_id'  => "SFORUM-NOTIFY-POST",
    'description'  => "Sent to users when their forum posts are replied to",
    'placeholders' => array('user.email','post.username','post.read_link','post.reply_link','post.unsubscribe_link','post.message_snippet','topic.subject','forum'), // array of placeholder names
    'from'         => "#settings.adminEmail#",
    'to'           => "#user.email#",
    'subject'      => "New comment on: #topic.subject#",
    'html'         => <<<__HTML__
<p><strong>#post.username#</strong> has commented on: <strong><a href="#post.read_link#">#topic.subject#</a></strong></p>
<p style="padding-left: 30px;"><em>#post.message_snippet#... <a href="#post.read_link#">more</a></em></p>
<p style="padding-left: 30px;"><a href="#post.read_link#"><strong>See Comment</strong></a>  |  <strong><a href="#post.reply_link#">Reply to comment</a></strong><em><strong><a href="#post.reply_link#"><br /><br /></a></strong></em></p>
<hr />
<p><span style="color: #808080;">This update was sent to #user.email# because you commented on this forum topic, are subscribed to this thread, or are subscribed to this forum.</span><br /><span style="color: #808080;">If you don't want to receive updates on this forum topic, please <span style="color: #3366ff;"><a href="#post.unsubscribe_link#"><span style="color: #3366ff;">unsubscribe</span></a></span>.</span></p>
__HTML__
,
  'placeholders' => <<<__PLACEH__
#user.email#
#post.username#
#post.read_link#
#post.reply_link#
#post.unsubscribe_link#
#post.message_snippet#
#topic.subject#
#forum#

#server.http_host#
#server.remote_addr#
#settings.adminEmail#
#settings.adminUrl#
#settings.programName#
#settings.programName#
__PLACEH__
  ));
}

You can remove the bit about adding a default email template if you don't need that.

Hope that helps!

Dave Edis - Senior Developer
interactivetools.com

By jenolan - October 19, 2016

Thanks I will have a gander, have had to stop work on /bin/plex due to a couple of clients having site issues....

Larry

---



Peace and Long Life