Invision Power Services, Inc. * @copyright (c) Invision Power Services, Inc. * @license https://www.invisioncommunity.com/legal/standards/ * @package Invision Community * @since 13 Jun 2013 */ namespace IPS\Content\Promote; /* To prevent PHP errors (extending class does not exist) revealing path */ if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) ) { header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' ); exit; } /** * Promote Handler */ abstract class _PromoteAbstract extends \IPS\Patterns\ActiveRecord { /** * @brief [ActiveRecord] Multiton Store */ protected static $multitons; /** * @brief [ActiveRecord] Database Table */ public static $databaseTable = 'core_social_promote_sharers'; /** * @brief [ActiveRecord] Database Prefix */ public static $databasePrefix = 'sharer_'; /** * @brief [ActiveRecord] ID Database Column */ public static $databaseColumnId = 'key'; /** * @brief [Node] Order Database Column */ public static $databaseColumnOrder = 'key'; /** * @brief [Node] Automatically set position for new nodes */ public static $automaticPositionDetermination = FALSE; /** * @brief Default settings */ public $defaultSettings = array(); /** * @brief The last response sent back */ public $response = NULL; /** * @brief \IPS\core\Promote object */ public $promote = NULL; /** * Construct ActiveRecord from database row * * @param array $data Row from database table * @param bool $updateMultitonStoreIfExists Replace current object in multiton store if it already exists there? * @return static */ public static function constructFromData( $data, $updateMultitonStoreIfExists = TRUE ) { /* Initiate an object */ $classname = '\\IPS\Content\\Promote\\' . \ucfirst( $data['sharer_key'] ); if ( !class_exists( $classname ) ) { throw new \RuntimeException; } $obj = new $classname; $obj->_new = FALSE; /* Import data */ $databasePrefixLength = \strlen( static::$databasePrefix ); foreach ( $data as $k => $v ) { if( static::$databasePrefix ) { $k = \substr( $k, $databasePrefixLength ); } $obj->$k = $v; } $obj->changed = array(); /* Return */ return $obj; } /** * @brief Member */ protected $member; /** * Constructor * * \IPS\Member $member The member * @returns $this for daisy chaining */ public function setMember( \IPS\Member $member ) { $this->member = $member; return $this; } /** * Returns the lowercase key * * @returns string */ public function get__key() { return mb_strtolower( $this->key ); } /** * Get settings * * @return array */ public function get_settings() { return array_merge( $this->defaultSettings, json_decode( $this->_data['settings'], TRUE ) ); } /** * Can a member promote using this service? * * @return bool */ public function canPromote() { return $this->enabled and \IPS\core\Promote::canPromote( $this->member ); } /** * Get image * * @return string */ abstract public function getPhoto(); /** * Get name * * @return string */ abstract public function getName(); /** * Return the published URL * * @param array $data Data returned from a successful POST * @return \IPS\Http\Url * @throws InvalidArgumentException */ abstract function getUrl( $data ); /** * Bulk save settings * * @param array $settings Array of (k => v) settings * @return void */ public function saveSettings( $settings ) { $this->settings = json_encode( array_merge( $this->settings, $settings ) ); $this->save(); } /** * [ActiveRecord] Save Changed Columns * * @return void */ function save() { parent::save(); unset( \IPS\Data\Store::i()->promoters ); } }