178 lines
4.2 KiB
PHP
178 lines
4.2 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @brief Icon
|
|
* @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
|
|
* @subpackage
|
|
* @since 3/26/2024
|
|
*/
|
|
|
|
namespace IPS\Node;
|
|
|
|
/* To prevent PHP errors (extending class does not exist) revealing path */
|
|
|
|
use ErrorException;
|
|
use Exception;
|
|
use IPS\File;
|
|
use IPS\Helpers\Form;
|
|
use IPS\Helpers\Form\Icon as FormIcon;
|
|
use IPS\Helpers\Form\Radio;
|
|
use IPS\Helpers\Form\Upload;
|
|
use IPS\Theme;
|
|
use function is_array;
|
|
|
|
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
|
{
|
|
header( ( $_SERVER['SERVER_PROTOCOL'] ?? 'HTTP/1.0' ) . ' 403 Forbidden' );
|
|
exit;
|
|
}
|
|
|
|
trait Icon
|
|
{
|
|
/**
|
|
* @brief The column that holds the icon data, without the prefix
|
|
*/
|
|
public static string $iconColumn = 'icon';
|
|
|
|
/**
|
|
* @return string
|
|
*/
|
|
public function get_icon_type() : string
|
|
{
|
|
$iconColumn = static::$iconColumn;
|
|
if ( $this->$iconColumn and $iconData = json_decode( $this->$iconColumn, TRUE ) )
|
|
{
|
|
return 'icon';
|
|
}
|
|
|
|
return ( $this->$iconColumn ) ? 'upload' : 'none';
|
|
}
|
|
|
|
/**
|
|
* @return string
|
|
*/
|
|
public static function iconFormPrefix() : string
|
|
{
|
|
return static::$iconFormPrefix ?? '';
|
|
}
|
|
|
|
/**
|
|
* @return string
|
|
*/
|
|
public static function iconStorageExtension() : string
|
|
{
|
|
return static::$iconStorageExtension ?? '';
|
|
}
|
|
|
|
/**
|
|
* Add icon fields to the node form
|
|
*
|
|
* @param Form $form
|
|
* @return void
|
|
*/
|
|
public function iconFormFields( Form &$form ) : void
|
|
{
|
|
$prefix = static::iconFormPrefix();
|
|
$form->add( new Radio( $prefix . 'icon_choose', $this->icon_type, null, [
|
|
'options' => [
|
|
'none' => $prefix . 'icon_choose_icon_none',
|
|
'icon' => $prefix . 'icon_choose_icon',
|
|
'upload' => $prefix . 'icon_choose_upload'
|
|
],
|
|
'toggles' => [
|
|
'icon' => [ $prefix . 'icon_picker' ], 'upload' => [ $prefix . 'icon_upload' ] ],
|
|
'disableCopy' => true
|
|
], null, null, null, $prefix . 'icon_choose' ) );
|
|
|
|
$form->add( new Upload( $prefix . 'icon_upload', ( $this->icon_type == 'upload' ) ? File::get( static::iconStorageExtension(), $this->icon ) : NULL, FALSE, array( 'image' => TRUE, 'storageExtension' => static::iconStorageExtension() ), NULL, NULL, NULL, $prefix . 'icon_upload' ) );
|
|
|
|
$form->add( new FormIcon( $prefix . 'icon_picker', ( $this->icon_type == 'icon' ? json_decode( $this->icon, true ) : null ), FALSE, array(), NULL, NULL, NULL, $prefix . 'icon_picker' ) );
|
|
}
|
|
|
|
/**
|
|
* Handle the above icon fields
|
|
*
|
|
* @param array $values
|
|
* @return array
|
|
*/
|
|
public function formatIconFieldValues( array $values ) : array
|
|
{
|
|
/* Icon? Me? No. */
|
|
$iconValue = null;
|
|
$prefix = static::iconFormPrefix();
|
|
if ( isset( $values[ $prefix . 'icon_choose' ] ) )
|
|
{
|
|
switch ( $values[ $prefix . 'icon_choose' ] )
|
|
{
|
|
case 'upload':
|
|
if ( $values[ $prefix . 'icon_upload'] )
|
|
{
|
|
$iconValue = (string) $values[ $prefix . 'icon_upload'];
|
|
}
|
|
break;
|
|
case 'icon':
|
|
if ( is_array( $values[ $prefix . 'icon_picker'] ) )
|
|
{
|
|
$iconValue = json_encode( $values[ $prefix . 'icon_picker'] );
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
$values[ $prefix . static::$iconColumn ] = $iconValue;
|
|
|
|
unset( $values[ $prefix . 'icon_choose' ], $values[ $prefix . 'icon_upload' ], $values[ $prefix . 'icon_picker' ] );
|
|
|
|
return $values;
|
|
}
|
|
|
|
/**
|
|
* If the icon was uploaded, return the file
|
|
*
|
|
* @return File|null
|
|
*/
|
|
public function getIconFile() : ?File
|
|
{
|
|
$iconColumn = static::$iconColumn;
|
|
if( $this->icon_type == 'upload' )
|
|
{
|
|
try
|
|
{
|
|
return File::get( static::iconStorageExtension(), $this->$iconColumn );
|
|
}
|
|
catch( Exception $e ){}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Return icon as a string
|
|
*
|
|
* @return string
|
|
* @throws ErrorException
|
|
*/
|
|
public function getIcon(): string
|
|
{
|
|
$iconColumn = static::$iconColumn;
|
|
if ( $iconData = json_decode( $this->$iconColumn, true ) )
|
|
{
|
|
$iconData = $iconData[0];
|
|
|
|
if ( isset( $iconData['html'] ) )
|
|
{
|
|
return $iconData['html'];
|
|
}
|
|
}
|
|
else if ( ! empty( $this->$iconColumn ) and $iconFile = $this->getIconFile() )
|
|
{
|
|
/* Must be an upload */
|
|
return Theme::i()->getTemplate( 'global', 'core', 'front' )->uploadedIcon( $iconFile );
|
|
}
|
|
|
|
return '';
|
|
}
|
|
} |