<?php
/**
* @brief Inline Notification Model
* @author <a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
* @copyright (c) Invision Power Services, Inc.
* @license https://www.invisioncommunity.com/legal/standards/
* @package Invision Community
* @since 6 Sep 2013
*/
namespace IPS\Notification;
/* 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;
}
/**
* Inline Notification Model
*/
class _Inline extends \IPS\Patterns\ActiveRecord
{
/**
* @brief [ActiveRecord] Multiton Store
*/
protected static $multitons;
/**
* @brief [ActiveRecord] Database Table
*/
public static $databaseTable = 'core_notifications';
/**
* Set Default Values
*
* @return void
*/
public function setDefaultValues()
{
$this->sent_time = time();
$this->updated_time = time();
}
/**
* Get sent time
*
* @return \IPS\DateTime
*/
public function get_sent_time()
{
return \IPS\DateTime::ts( $this->_data['sent_time'] );
}
/**
* Get updated time
*
* @return \IPS\DateTime
*/
public function get_updated_time()
{
return \IPS\DateTime::ts( $this->_data['updated_time'] );
}
/**
* Get member
*
* @return \IPS\Member
*/
public function get_member()
{
return \IPS\Member::load( $this->_data['member'] );
}
/**
* Set member
*
* @param |IPS\Member $member The member
* @return void
*/
public function set_member( \IPS\Member $member )
{
$this->_data['member'] = $member->member_id;
}
/**
* Get member data
*
* @return array
*/
public function get_member_data()
{
return json_decode( $this->_data['member_data'], TRUE );
}
/**
* Set member data
*
* @param mixed $data Member data
* @return void
*/
public function set_member_data( $data )
{
$this->_data['member_data'] = $data ? json_encode( $data ) : NULL;
}
/**
* Get item
*
* @return object|NULL
*/
public function get_item()
{
if ( $this->_data['item_class'] and $this->_data['item_id'] )
{
try
{
$class = $this->_data['item_class'];
if ( class_exists( $class ) )
{
return $class::load( $this->_data['item_id'] );
}
}
catch ( \OutOfRangeException $e )
{
return NULL;
}
}
return NULL;
}
/**
* Set item
*
* @param object $item The item
* @return void
*/
public function set_item( $item )
{
$idColumn = $item::$databaseColumnId;
$this->_data['item_class'] = get_class( $item );
$this->_data['item_id'] = $item->$idColumn;
}
/**
* Get subitem
*
* @return object|NULL
*/
public function get_item_sub()
{
if ( $this->_data['item_sub_class'] and $this->_data['item_sub_id'] )
{
try
{
$class = $this->_data['item_sub_class'];
if ( class_exists( $class ) )
{
return $class::load( $this->_data['item_sub_id'] );
}
}
catch ( \OutOfRangeException $e )
{
return NULL;
}
}
return NULL;
}
/**
* Get application
*
* @return \IPS\Application
*/
public function get_notification_app()
{
return \IPS\Application::load( $this->_data['notification_app'] );
}
/**
* Set application
*
* @param mixed $data Member data
* @return void
*/
public function set_notification_app( \IPS\Application $app )
{
$this->_data['notification_app'] = $app->directory;
}
/**
* Get extra data
*
* @return array
*/
public function get_extra()
{
return $this->_data['extra'] ? json_decode( $this->_data['extra'], TRUE ) : array();
}
/**
* Set extra data
*
* @param mixed $data Member data
* @return void
*/
public function set_extra( $data )
{
$this->_data['extra'] = $data ? json_encode( $data ) : NULL;
}
/**
* Save Changed Columns
*
* @return void
*/
public function save()
{
parent::save();
$this->member->recountNotifications();
}
/**
* Get data from extension
*
* @return array
* @throws \RuntimeException
*/
public function getData()
{
$method = "parse_{$this->notification_key}";
foreach ( $this->notification_app->extensions( 'core', 'Notifications' ) as $class )
{
if ( method_exists( $class, $method ) )
{
$return = $class->$method( $this );
if ( !isset( $return['unread'] ) )
{
$return['unread'] = !$this->read_time;
}
return $return;
}
}
throw new \RuntimeException;
}
}