You are here

class InstapageCmsPluginConnector in Instapage plugin 8.3

Same name and namespace in other branches
  1. 7.3 core/connectors/InstapageCmsPluginConnector.php \InstapageCmsPluginConnector

Main connector class, used to integrate with PHP-based CMSes. It's job is to detect a CMS that executes the code and select proper CMS Connector.

Hierarchy

Expanded class hierarchy of InstapageCmsPluginConnector

File

core/connectors/InstapageCmsPluginConnector.php, line 6

View source
class InstapageCmsPluginConnector {

  /**
   * @var object $selectedConnector Proper connector for current CMS.
   */
  private static $selectedConnector = null;

  /**
   * @var string $selectedLanguage Language of current CMS. Currently only english is supported.
   */
  private static $selectedLanguage = 'en-GB';

  /**
   * @var array $languageArray An array with proper dictionary.
   */
  private static $languageArray = null;

  /**
   * Gets selected language.
   */
  public static function getSelectedLanguage() {
    return self::$selectedLanguage;
  }

  /**
   * Checks if connector used in secured https:// env
   * @return bool
   */
  public static function isSSL() {
    return in_array(filter_input(INPUT_SERVER, 'HTTPS'), [
      'on',
      1,
    ]) || filter_input(INPUT_SERVER, 'HTTP_X_FORWARDED_PROTO') == 'https' || filter_input(INPUT_SERVER, 'REQUEST_SCHEME') == 'https';
  }

  /**
   * Checks if WordPress is a currently used CMS.
   *
   * @return boolean
   */
  public static function isWP() {
    if (defined('ABSPATH') && defined('WPINC') && defined('WP_CONTENT_DIR')) {
      return true;
    }
    return false;
  }

  /**
   * Checks if Drupal 8 is a currently used CMS.
   *
   * @return boolean
   */
  public static function isDrupal8() {
    if (class_exists('\\Drupal\\Core\\DrupalKernel')) {
      return true;
    }
    return false;
  }

  /**
   * Checks if Drupal 7 is a currently used CMS.
   *
   * @return boolean
   */
  public static function isDrupal7() {
    if (defined('VERSION') && VERSION > 7.0 && VERSION < 8.0) {
      return true;
    }
    return false;
  }

  /**
   * Selects a proper connector based on currently used CMS.
   *
   * @return object Selected connector.
   */
  public static function getSelectedConnector() {
    if (self::$selectedConnector === null) {
      switch (true) {
        case self::isWP():
          require_once INSTAPAGE_PLUGIN_PATH . '/connectors/InstapageCmsPluginWPConnector.php';
          self::$selectedConnector = new InstapageCmsPluginWPConnector();
          break;
        case self::isDrupal7():
          require_once INSTAPAGE_PLUGIN_PATH . '/connectors/InstapageCmsPluginDrupal7Connector.php';
          self::$selectedConnector = new InstapageCmsPluginDrupal7Connector();
          break;
        case self::isDrupal8():
          require_once INSTAPAGE_PLUGIN_PATH . '/connectors/InstapageCmsPluginDrupal8Connector.php';
          self::$selectedConnector = new InstapageCmsPluginDrupal8Connector();
          break;
        default:
          die('Unsupported CMS');
      }
    }
    return self::$selectedConnector;
  }

  /**
   * Gets the plugin's directory name in current CMS.
   *
   * @return string Directory name.
   */
  public static function getPluginDirectoryName() {
    return self::getSelectedConnector()
      ->getPluginDirectoryName();
  }

  /**
   * Gets the current user access rights to the Instapage plugin.
   *
   * @return bool Returns true if user can manage the Instapage plugin.
   */
  public static function currentUserCanManage() {
    return self::getSelectedConnector()
      ->currentUserCanManage();
  }

  /**
   * Gets the value of language variable.
   */
  public static function lang() {
    return self::getSelectedConnector()
      ->lang(func_get_args());
  }

  /**
   * Gets the sitemane.
   *
   * @param bool $sanitized If the name should be sanitized.
   *
   * @return string Sitename, sanitized or not.
   */
  public static function getSitename($sanitized = false) {
    return self::getSelectedConnector()
      ->getSitename($sanitized);
  }

  /**
   * Gets the site base URL.
   *
   * @param bool $protocol Value returned with protocol or not.
   *
   * @return string Site base URL. With protocol or not.
   */
  public static function getSiteURL($protocol = true) {
    return self::getSelectedConnector()
      ->getSiteURL($protocol);
  }

  /**
   * Gets the site home URL.
   *
   * @param bool $protocol Value returned with protocol or not.
   *
   * @return string Site home URL. With protocol or not.
   */
  public static function getHomeURL($protocol = true) {
    return self::getSelectedConnector()
      ->getHomeURL($protocol);
  }

  /**
   * Gets the currently used CMS name.
   *
   * @return string CMS name.
   */
  public static function getCMSName() {
    return self::getSelectedConnector()
      ->getCMSName();
  }

  /**
   * Gets the currently used CMS version.
   * @uses   self::getSelectedConnector()
   * @return string CMS version.
   */
  public static function getCMSVersion() {
    return self::getSelectedConnector()
      ->getCMSVersion();
  }

  /**
   * Gets the currently used MySQL version.
   * @uses   self::getSelectedConnector()
   * @return string MySQL version.
   */
  public static function getMySQLVersion() {
    $sql = 'SELECT VERSION() as version';
    $result = self::getSelectedConnector()
      ->getRow($sql);
    return $result->version;
  }

  /**
   * Checks if API is accessible
   * @uses   self::getSelectedConnector()
   * @return bool
   */
  public static function isAPIAccessible() {
    return self::getSelectedConnector()
      ->isAPIAccessible();
  }

  /**
   * Checks if SEO friendly urls are enabled
   * @uses   self::getSelectedConnector()
   * @return bool
   */
  public static function areSEOFriendlyUrlsEnabled() {
    return self::getSelectedConnector()
      ->areSEOFriendlyUrlsEnabled();
  }

  /**
   * Sends an e-mail using CMS native email sending method.
   *
   * @param string $to Receiver address.
   * @param string $subject A subject.
   * @param string $message A message.
   * @param string $headers Message headers. Default: ''.
   * @param aray $attachments Attachments.
   *
   * @return bool True on success.
   */
  public static function mail($to, $subject, $message, $headers = '', $attachments = array()) {
    return self::getSelectedConnector()
      ->mail($to, $subject, $message, $headers, $attachments);
  }

  /**
   * Gets the AJAX URL for currently used CMS.
   *
   * @return string AJAX URL.
   */
  public static function getAjaxURL() {
    return self::getSelectedConnector()
      ->getAjaxURL();
  }

  /**
   * Adds a declaration of JS to Instapage plugin's dashboard in admin panel.
   *
   * @param string $handle Name of the script.
   * @param string $file Path to JS file.
   * @param bool $inFooter Can the file be loaded in the footer?
   */
  public static function addAdminJS($handle, $file, $inFooter = false) {
    return self::getSelectedConnector()
      ->addAdminJSaddAdminJS($handle, $file, $inFooter);
  }

  /**
   * Adds a declaration of CSS to Instapage plugin's dashboard in admin panel.
   *
   * @param string $handle Name of the script.
   * @param string $file Path to CSS file.
   */
  public static function addAdminCSS($handle, $file) {
    return self::getSelectedConnector()
      ->addAdminCSS($handle, $file);
  }

  /**
   * Properly escapes the HTML.
   *
   * @param string $html HTML to escape.
   * @return string Escaped HTML.
   */
  public static function escapeHTML($html) {
    return self::getSelectedConnector()
      ->escapeHTML($html);
  }

  /**
   * Checks (and displays) if a landing page should be displayed instead of normal content served by CMS.
   *
   * @param string $type Type of page to check ('page', 'home' or '404').
   * @param string $slug Slug to check. Default: ''.
   */
  public static function checkPage($type, $slug = '') {
    return self::getSelectedConnector()
      ->checkPage($type, $slug);
  }

  /**
   * Checks if there is a need to replace content of CMS with a landing page. Prevents content replacement on admin/login pages.
   *
   * @return bool True if replace is possible.
   */
  public static function isHtmlReplaceNecessary() {
    return self::getSelectedConnector()
      ->isHtmlReplaceNecessary();
  }

  /**
   * Initiates Instapage plugin's DB structure and loads plugin's classes and selected connector.
   */
  public static function initPlugin() {
    $db = InstapageCmsPluginDBModel::getInstance();
    $db
      ->initPluginTables();
    self::getSelectedConnector()
      ->initPlugin();
  }

  /**
   * Removes the plugin.
   */
  public static function removePlugin() {
    return self::getSelectedConnector()
      ->removePlugin();
  }

  /**
   * Gets the slugs of all landing pages stored in the plugin's DB.
   * @deprecated
   * @return array Stored slugs.
   */
  public static function getLandingPageSlugs() {
    $db = InstapageCmsPluginDBModel::getInstance();
    $sql = 'SELECT id, slug, \'\' AS editUrl FROM ' . $db->pagesTable . ' WHERE type = \'page\' AND slug <> \'\'';
    $results = $db
      ->getResults($sql);
    return $results;
  }

  /**
   * Checks if given slug is prohibited in terms of publishing a landing page. If it's free - will return false. Otherwise an array with slug details will be returned
   * @param  string $slug Slug to be checked
   * @uses   InstapageCmsPluginDBModel::$pagesTable
   * @uses   InstapageCmsPluginDBModel::getInstance()
   * @uses   InstapageCmsPluginDBModel::getResults()
   * @return bool|array
   */
  public static function isProhibitedLandingPageSlug($slug) {
    $db = InstapageCmsPluginDBModel::getInstance();
    $sql = 'SELECT id, slug, \'\' AS editUrl FROM ' . $db->pagesTable . ' WHERE type = \'page\' AND slug = \'%s\' LIMIT 1';
    $results = $db
      ->getResults($sql, $slug);
    return $results;
  }

  /**
   * Executes an action requested via AJAX.
   */
  public static function ajaxCallback() {
    ini_set('display_errors', 0);
    header('Content-Type: application/json');
    $post = isset($_POST['data']) ? json_decode(urldecode($_POST['data'])) : array();
    $post->data = isset($post->data) ? $post->data : null;
    if (!empty($post->action)) {
      InstapageCmsPluginAjaxController::getInstance()
        ->doAction($post->action, $post->data);
    }
    die;
  }

  /**
   * Gets the settings module, a CMS-dependant part of the Settings page.
   *
   * @return string HTML form with settings for currently used CMS only.
   */
  public static function getSettingsModule() {
    return self::getSelectedConnector()
      ->getSettingsModule();
  }

  /**
   * Gets requirements section for settings module
   * @param  array $features
   * @uses   self::getMySQLVersion()
   * @uses   self::isAPIAccessible()
   * @uses   self::areSEOFriendlyUrlsEnabled()
   * @uses   self::lang()
   * @uses   InstapageCmsPluginHelper::getRawVersion()
   * @uses   InstapageCmsPluginHelper::isRegularMySQL()
   * @uses   InstapageCmsPluginHelper::isMariaDBMySQL()
   * @return string HTML
   */
  public static function getPluginRequirements($features) {
    $dbVersion = InstapageCmsPluginConnector::getMySQLVersion();
    $commonFeatures = array(
      array(
        'label' => InstapageCmsPluginConnector::lang('PHP 5.5+'),
        'condition' => version_compare(phpversion(), '5.5.0', '>='),
      ),
      array(
        'label' => InstapageCmsPluginConnector::lang('MySQL 5.5.3+ / MariaDB 5.5+'),
        'condition' => InstapageCmsPluginHelper::isRegularMySQL($dbVersion) && version_compare(InstapageCmsPluginHelper::getRawVersion($dbVersion), '5.5.3', '>=') || InstapageCmsPluginHelper::isMariaDBMySQL($dbVersion) && version_compare(InstapageCmsPluginHelper::getRawVersion($dbVersion), '5.5.0', '>='),
      ),
      array(
        'label' => InstapageCmsPluginConnector::lang('PHP Curl extension or another way to make remote requests'),
        'condition' => InstapageCmsPluginConnector::isAPIAccessible(),
      ),
      array(
        'label' => InstapageCmsPluginConnector::lang('Enabled clean / SEO friendly URLs'),
        'condition' => InstapageCmsPluginConnector::areSEOFriendlyUrlsEnabled(),
      ),
      array(
        'label' => InstapageCmsPluginConnector::lang('Every request for landing page requires a request to our page server (' . InstapageCmsPluginConnector::getURLWithSelectedProtocol(INSTAPAGE_ENTERPRISE_ENDPOINT) . ') and this URL has to be accessible.'),
        'condition' => InstapageCmsPluginConnector::isAPIAccessible(),
      ),
    );
    $features = array_merge($features, $commonFeatures);
    ob_start();
    ?>
    <div class="custom-params-form ui-section">
      <h3 class="ui-subtitle"><?php

    echo InstapageCmsPluginConnector::lang('Plugin requirements');
    ?></h3>
      <p class="l-space-bottom-primary"><?php

    echo InstapageCmsPluginConnector::lang('Instapage plugin requires following settings to work correctly:');
    ?></p>
      <ul class="c-list">
        <?php

    foreach ($features as $feature) {
      ?>
          <li class="c-list-item">
            &ndash; <span class="<?php

      echo $feature['condition'] ? 'u-text--success' : 'u-text--danger';
      ?>">
              <?php

      echo $feature['label'];
      ?>
            </span>
          </li>
        <?php

    }
    ?>
      </ul>
    </div>
    <?php

    $html = ob_get_contents();
    ob_end_clean();
    return $html;
  }

  /**
   * Toggles ssl on/off in given url
   *
   * @param  $url
   * @uses   InstapageCmsPluginHelper::getOption()
   * @return string
   */
  public static function getURLWithSelectedProtocol($url) {
    $useHttpsProtocol = InstapageCmsPluginHelper::getOption('ssl', false);
    $protocolsToToggle = [
      'http://',
      'https://',
    ];
    list($search, $replace) = $useHttpsProtocol ? $protocolsToToggle : array_reverse($protocolsToToggle);
    return str_ireplace($search, $replace, $url);
  }

}

Members

Namesort descending Modifiers Type Description Overrides
InstapageCmsPluginConnector::$languageArray private static property
InstapageCmsPluginConnector::$selectedConnector private static property
InstapageCmsPluginConnector::$selectedLanguage private static property
InstapageCmsPluginConnector::addAdminCSS public static function Adds a declaration of CSS to Instapage plugin's dashboard in admin panel.
InstapageCmsPluginConnector::addAdminJS public static function Adds a declaration of JS to Instapage plugin's dashboard in admin panel.
InstapageCmsPluginConnector::ajaxCallback public static function Executes an action requested via AJAX.
InstapageCmsPluginConnector::areSEOFriendlyUrlsEnabled public static function Checks if SEO friendly urls are enabled @uses self::getSelectedConnector()
InstapageCmsPluginConnector::checkPage public static function Checks (and displays) if a landing page should be displayed instead of normal content served by CMS.
InstapageCmsPluginConnector::currentUserCanManage public static function Gets the current user access rights to the Instapage plugin.
InstapageCmsPluginConnector::escapeHTML public static function Properly escapes the HTML.
InstapageCmsPluginConnector::getAjaxURL public static function Gets the AJAX URL for currently used CMS.
InstapageCmsPluginConnector::getCMSName public static function Gets the currently used CMS name.
InstapageCmsPluginConnector::getCMSVersion public static function Gets the currently used CMS version. @uses self::getSelectedConnector()
InstapageCmsPluginConnector::getHomeURL public static function Gets the site home URL.
InstapageCmsPluginConnector::getLandingPageSlugs public static function Gets the slugs of all landing pages stored in the plugin's DB.
InstapageCmsPluginConnector::getMySQLVersion public static function Gets the currently used MySQL version. @uses self::getSelectedConnector()
InstapageCmsPluginConnector::getPluginDirectoryName public static function Gets the plugin's directory name in current CMS.
InstapageCmsPluginConnector::getPluginRequirements public static function Gets requirements section for settings module
InstapageCmsPluginConnector::getSelectedConnector public static function Selects a proper connector based on currently used CMS.
InstapageCmsPluginConnector::getSelectedLanguage public static function Gets selected language.
InstapageCmsPluginConnector::getSettingsModule public static function Gets the settings module, a CMS-dependant part of the Settings page.
InstapageCmsPluginConnector::getSitename public static function Gets the sitemane.
InstapageCmsPluginConnector::getSiteURL public static function Gets the site base URL.
InstapageCmsPluginConnector::getURLWithSelectedProtocol public static function Toggles ssl on/off in given url
InstapageCmsPluginConnector::initPlugin public static function Initiates Instapage plugin's DB structure and loads plugin's classes and selected connector.
InstapageCmsPluginConnector::isAPIAccessible public static function Checks if API is accessible @uses self::getSelectedConnector()
InstapageCmsPluginConnector::isDrupal7 public static function Checks if Drupal 7 is a currently used CMS.
InstapageCmsPluginConnector::isDrupal8 public static function Checks if Drupal 8 is a currently used CMS.
InstapageCmsPluginConnector::isHtmlReplaceNecessary public static function Checks if there is a need to replace content of CMS with a landing page. Prevents content replacement on admin/login pages.
InstapageCmsPluginConnector::isProhibitedLandingPageSlug public static function Checks if given slug is prohibited in terms of publishing a landing page. If it's free - will return false. Otherwise an array with slug details will be returned
InstapageCmsPluginConnector::isSSL public static function Checks if connector used in secured https:// env
InstapageCmsPluginConnector::isWP public static function Checks if WordPress is a currently used CMS.
InstapageCmsPluginConnector::lang public static function Gets the value of language variable.
InstapageCmsPluginConnector::mail public static function Sends an e-mail using CMS native email sending method.
InstapageCmsPluginConnector::removePlugin public static function Removes the plugin.