Creating a SiteDrive Integration

We are always adding new integrations, however you can also add your own custom provider or custom post types. The following is a sample from our Gravity Forms integration.

<?php

namespace SiteDrive\GravityForms;

use GFAPI;
use SiteDrive\Data\Files;

const LOGO = SITEDRIVE_URL . 'assets/img/gravityforms-default.png';

// Grab a gravity form by our meta key and id we use
function getByMetaID($metaID, $sendID = true) {
  $forms = GFAPI::get_forms();

  foreach ($forms as $form) {
    if ($form[Files::META_KEY] !== $metaID) {
      continue;
    }

    return $sendID
      ? $form['id']
      : $form;
  }

  return null;
}

function getByID($id) {
  $forms = GFAPI::get_forms();

  foreach ($forms as $form) {
    if ($form['id'] !== (int)$id) {
      continue;
    }

    return $form;
  }

  return null;
}

// Checks if keys in export are that of a gravity forms export
function isExport($json) {
  return !empty($json['fields']) || !empty($json['button']);
}

// Registry as a provider
sitedrive_provider_register('gravityforms', [
  'name' => __('Gravity Forms', SITEDRIVE_LOCALIZE),

  'icon' => SITEDRIVE_URL . 'assets/img/gravity-forms-icon.jpg',

  'file_process' => function($file) {
    $file['image'] = LOGO;
    $file['last_updated'] = get_the_modified_date('U', $file['type_id']);

    return $file;
  },

  'import_status' => function($default, $drive, $file) {

    $metaId = sitedrive_generate_meta_id($drive, $file);

    // Check if imported at all
    $imported = getByMetaID($metaId, false);

    if (empty($imported)) {
      return Files::NOT_IMPORTED;
    }

    // Send status based on updated time
    $importedUpdated = $imported[Files::META_UPDATED_KEY];

    return (int)$importedUpdated === (int)$file['last_updated']
      ? Files::SYNCED
      : FILES::OUT_OF_SYNC;
  },

  'download' => function($file) {
    $form = GFAPI::get_form($file['type_id']);

    return sitedrive_base64_json_encode($form);
  },

  'import' => function($drive, $file, $contents) {
    $metaId = sitedrive_generate_meta_id($drive, $file);

    // Grab json data
    $json = sitedrive_base64_json_decode($contents);
    unset($json['id']);

    $foundID = getByMetaID($metaId);

    // Set meta key
    $json[Files::META_KEY] = $metaId;
    $json[Files::META_UPDATED_KEY] = $file['last_updated'];

    // Update or add form
    if ($foundID) {
      $json['id'] = $foundID;
      GFAPI::update_form($json);
    } else {
      $foundID = GFAPI::add_form($json);
    }

    return $foundID;
  },

  'finder' => function($args = []) {
    if (!empty($args['offset'])) {
      return [];
    }

    $search = $args['search'];

    $forms = GFAPI::get_forms();

    $results = [];

    foreach ($forms as $form) {
      if (!empty($search) && stripos($form['title'], $search) === false) {
        continue;
      }

      $results[] = [
        'name' => $form['title'],
        'id' => $form['id'],
        'image' => LOGO,
        'type' => 'gravityforms',
      ];
    }

    return [
      'results' => $results,
    ];
  },

  // File uploaded is a valid attachment type
  'is_file_type' => function($file) {
    $json = sitedrive_safe_json_decode($file['data']);

    // Directly from Gravity Forms export
    if (!empty($json['0'])) {
      return isExport($json['0']);
    }

    // Singular our download
    return isExport($json);
  },

  'upload' => function($file) {
    $json = sitedrive_safe_json_decode($file['data']);

    // Singular import
    if (isExport($json)) {
      $out = [];

      $out['type_id'] = GFAPI::add_form($json);

      $form = GFAPI::get_form($out['type_id']);

      $out['name'] = $form['title'];

      return $out;
    }

    // Multi export from Gravity Forms itself
    $ids = [];

    foreach ($json as $form) {
      $ids[] = GFAPI::add_form($form);
    }

    return $ids;
  },

  'init' => function() {
    // Delete form handler
    add_action('gform_after_delete_form', function($form_id) {
      sitedrive_file_delete_by([
        'type' => 'gravityforms',
        'type_id' => $form_id,
      ]);
    });
  },
]);

Still need help? Contact Us Contact Us