Version 5.0.0 beta 1

This commit is contained in:
Neo committed 2025-12-19 16:27:35 -08:00
1 parent 25ddeb65d6
commit 15c7beabc5
6736 files changed
+627902 -497943

No files matched your search

+59 -45
View File
@@ -11,57 +11,71 @@
namespace IPS\core\Statistics;
/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
use InvalidArgumentException;
use IPS\Application;
use IPS\Db;
use IPS\Http\Url;
use IPS\Member;
use OutOfRangeException;
use UnderflowException;
use function array_keys;
use function defined;
use function is_array;
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
header( ( $_SERVER['SERVER_PROTOCOL'] ?? 'HTTP/1.0' ) . ' 403 Forbidden' );
exit;
}
/**
* Statistics Charts
*/
abstract class _Chart
abstract class Chart
{
/**
* @brief Controller
*/
public $controller = NULL;
public ?string $controller = NULL;
/**
* Get Chart
*
* @param \IPS\Http\Url $url URL the chart is being shown on.
* @param Url $url URL the chart is being shown on.
*
* @return \IPS\Helpers\Chart
*/
abstract public function getChart( \IPS\Http\Url $url ): \IPS\Helpers\Chart;
abstract public function getChart( Url $url ): \IPS\Helpers\Chart;
/**
* Load from Extension
*
* @return static
* @throws \OutOfRangeException
* @param string $app
* @param string $extension
* @return static
*/
public static function loadFromExtension( string $app, string $extension ): static
{
$extensions = \IPS\Application::load( $app )->extensions( 'core', 'Statistics' );
if ( isset( $extensions[ $extension ] ) )
$extensions = Application::load( $app )->extensions( 'core', 'Statistics' );
if ( in_array( $extension, array_keys( $extensions ) ) )
{
return $extensions[ $extension ];
}
throw new \OutOfRangeException;
throw new OutOfRangeException;
}
/**
* Load from Controller
*
* @param string $controller
* @return static
* @throws \OutOfRangeException
* @throws OutOfRangeException
*/
public static function loadFromController( string $controller ): static
{
foreach( \IPS\Application::allExtensions( 'core', 'Statistics', FALSE ) AS $extension )
foreach( Application::allExtensions( 'core', 'Statistics', FALSE ) AS $extension )
{
if ( $extension->controller AND $extension->controller === $controller )
{
@@ -69,57 +83,57 @@ abstract class _Chart
}
}
throw new \OutOfRangeException;
throw new OutOfRangeException;
}
/**
* Construct a saved chart from data
*
* @param array|int $data Chart ID or pre-loaded chart data.
* @param \IPS\Http\Url $url URL chart is shown on
* @param \IPS\Member|bool $check Check chart is owned by a specific member, or the currently logged in member if TRUE. If FALSE, no permission checking.
* @param Url $url URL chart is shown on
* @param Member|bool $check Check chart is owned by a specific member, or the currently logged in member if TRUE. If FALSE, no permission checking.
*
* @return \IPS\Helpers\Chart
* @throws \OutOfRangeException
* @throws \InvalidArgumentException
* @throws OutOfRangeException
* @throws InvalidArgumentException
*/
public static function constructMemberChartFromData( array|int $data, \IPS\Http\Url $url, \IPS\Member|bool $check = TRUE ): \IPS\Helpers\Chart
public static function constructMemberChartFromData( array|int $data, Url $url, Member|bool $check = TRUE ): \IPS\Helpers\Chart
{
try
{
if ( $check === FALSE )
{
if ( !\is_array( $data ) )
if ( !is_array( $data ) )
{
$data = \IPS\Db::i()->select( '*', 'core_saved_charts', array( "id=?", $data ) )->first();
$data = Db::i()->select( '*', 'core_saved_charts', array( "id=?", $data ) )->first();
}
}
else if ( ( $check instanceof \IPS\Member ) AND $check->member_id )
else if ( ( $check instanceof Member ) AND $check->member_id )
{
if ( !\is_array( $data ) )
if ( !is_array( $data ) )
{
$data = \IPS\Db::i()->select( '*', 'core_saved_charts', array( "chart_id=? AND chart_member=?", $data, $check->member_id ) )->first();
$data = Db::i()->select( '*', 'core_saved_charts', array( "chart_id=? AND chart_member=?", $data, $check->member_id ) )->first();
}
else if ( $data['chart_member'] !== $check->member_id )
{
throw new \UnderflowException;
throw new UnderflowException;
}
}
else if ( $check === TRUE AND \IPS\Member::loggedIn()->member_id )
else if ( $check === TRUE AND Member::loggedIn()->member_id )
{
if ( !\is_array( $data ) )
if ( !is_array( $data ) )
{
$data = \IPS\Db::i()->select( '*','core_saved_charts', array( "chart_id=? AND chart_member=?", $data, \IPS\Member::loggedIn()->member_id ) )->first();
$data = Db::i()->select( '*','core_saved_charts', array( "chart_id=? AND chart_member=?", $data, Member::loggedIn()->member_id ) )->first();
}
else if ( $data['chart_member'] !== \IPS\Member::loggedIn()->member_id )
else if ( $data['chart_member'] !== Member::loggedIn()->member_id )
{
throw new \UnderflowException;
throw new UnderflowException;
}
}
else
{
/* If we're here, we were passed a guest object which isn't going to work. Throw a different exception as this should lead directly to a bugfix since this should never happen. */
throw new \InvalidArgumentException;
throw new InvalidArgumentException;
}
$extension = static::loadFromController( $data['chart_controller'] );
@@ -146,35 +160,35 @@ abstract class _Chart
return $chart;
}
catch( \UnderflowException $e )
catch( UnderflowException $e )
{
/* Chart doesn't exist, or isn't owned by $member */
throw new \OutOfRangeException;
throw new OutOfRangeException;
}
}
/**
* Get charts for Member
*
* @param \IPS\Http\Url $url URL
* @param Url $url URL
* @param bool $idsOnly Return only ID's belonging to the user for lazyloading.
* @param \IPS\Member|null $member Member, or NULL for currently logged in member.
* @param Member|null $member Member, or NULL for currently logged in member.
*
* @return array
* @throws \InvalidArgumentException
* @throws InvalidArgumentException
*/
public static function getChartsForMember( \IPS\Http\Url $url, bool $idsOnly = FALSE, ?\IPS\Member $member = NULL ): array
public static function getChartsForMember( Url $url, bool $idsOnly = FALSE, ?Member $member = NULL ): array
{
$member ??= \IPS\Member::loggedIn();
$member ??= Member::loggedIn();
if ( !$member->member_id )
{
throw new \InvalidArgumentException;
throw new InvalidArgumentException;
}
$return = [];
foreach( \IPS\Db::i()->select( '*', 'core_saved_charts', array( "chart_member=?", $member->member_id ) ) AS $chart )
foreach( Db::i()->select( '*', 'core_saved_charts', array( "chart_member=?", $member->member_id ) ) AS $chart )
{
if ( $idsOnly )
{
@@ -190,7 +204,7 @@ abstract class _Chart
'data' => $chart
);
}
catch( \OutOfRangeException )
catch( OutOfRangeException )
{
continue;
}