Version 4.5.0

This commit is contained in:
Neo committed 2025-12-19 05:51:58 -08:00
1 parent 1a0c7fd3c2
commit f79dcf067a
3791 files changed
+248032 -76372

No files matched your search

@@ -0,0 +1,378 @@
<?php
/**
* @brief RSS Import extension: RssImport
* @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 Pages
* @since 09 Oct 2019
*/
namespace IPS\cms\extensions\core\RssImport;
/* 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;
}
/**
* @brief RSS Import extension: RssImport
*/
class _RssImport
{
/**
* @brief RSSImport Classes
*/
public $classes = array();
/**
* @brief Filestorage class
*/
public $fileStorage = 'cms_Records';
/**
* @brief Encosure images to process
*/
public static $enclosures = array();
/**
* Constructor
*
* @return void
*/
public function __construct()
{
try
{
foreach ( \IPS\cms\Databases::databases() as $id => $database )
{
if ( $database->canImportRss() )
{
$this->classes[] = 'IPS\\cms\\Records' . $id;
}
}
}
catch ( \Exception $e )
{
}
}
/**
* Show in the Admin CP?
*
* @param Object $class The class to check
* @return boolean
*/
public function showInAdminCp( $class ): bool
{
return true;
}
/**
* Return available options for a Form\Select
*
* @return array
*/
public function availableOptions()
{
$options = array();
try
{
foreach ( \IPS\cms\Databases::databases() as $id => $database )
{
if ( $database->canImportRss() )
{
$options['IPS\cms\Records' . $id] = $database->_title;
}
}
}
catch ( \Exception $e )
{
} // If you have not upgraded pages but it is installed, this throws an error
return $options;
}
/**
* Node selector options
*
* @param \IPS\core\Rss\Import|null $rss Existing RSS object if editing|NULL if not
* @return array
*/
public function nodeSelectorOptions( $rss )
{
/* Get the correct class */
$class = $rss->_class;
$nodeClass = $class::$containerNodeClass;
return array( 'class' => $nodeClass );
}
/**
* @param \IPS\core\Rss\Import $rss RSS object
* @param array $article RSS feed article importing
* @param \IPS\Node\Model $container Container object
* @param string $content Post content with read more link if set
* @return \IPS\Content
*/
public function create( \IPS\core\Rss\Import $rss, $article, \IPS\Node\Model $container, $content )
{
$settings = $rss->settings;
$recordClass = $rss->_class;
$member = \IPS\Member::load( $rss->member );
$fieldsClass = '\IPS\cms\Fields' . $recordClass::database()->id;
$customFields = $fieldsClass::fields( $settings, 'add' );
$values = array(
'content_field_' . $recordClass::database()->field_title => $article['title'],
'content_field_' . $recordClass::database()->field_content => $content,
'record_member_id' => $member
);
try
{
$record = $recordClass::createFromForm( $values, $container );
if ( ! $settings['record_open'] )
{
$record->record_locked = 1;
}
if ( $settings['record_hide'] )
{
$record->record_approved = -1;
}
else
{
$record->record_approved = 1;
}
/* Any custom fields? */
foreach( $settings as $k => $v )
{
if ( mb_substr( $k, 0, 6 ) == 'field_' )
{
$id = mb_substr( $k, 6 );
/* Make sure field still exists */
if ( isset( $customFields[ $id ] ) )
{
$record->$k = $v;
}
}
}
$record->record_saved = $article['date']->getTimestamp();
$record->record_updated = $article['date']->getTimestamp();
$record->record_last_comment = $article['date']->getTimestamp();
$record->record_publish_date = $article['date']->getTimestamp();
if ( isset( static::$enclosures[ $article['guid'] ] ) )
{
$record->record_image = (string) static::$enclosures[ $article['guid'] ];
$fixedFieldSettings = $recordClass::database()->fixed_field_settings;
if ( isset( $fixedFieldSettings['record_image']['thumb_dims'] ) )
{
$record->record_image_thumb = (string) static::$enclosures[$article['guid']]->thumbnail( 'cms_Records', $fixedFieldSettings['record_image']['thumb_dims'][0], $fixedFieldSettings['record_image']['thumb_dims'][1] );
}
else
{
$record->record_image_thumb = $record->record_image;
}
}
else if ( isset( $article['attachment'] ) )
{
\IPS\Db::i()->insert( 'core_attachments_map', array(
'attachment_id' => $article['attachment']['attach_id'],
'location_key' => 'cms_Records' . $recordClass::database()->id,
'id1' => $record->primary_id_field,
'id3' => $recordClass::database()->id,
) );
}
$record->save();
return $record;
}
catch( \Exception $e )
{
return NULL;
}
}
/**
* Process the enclosure
*
* @param \IPS\core\Rss\Import $rss
* @param \IPS\Http $response
* @param array $article
* @return bool
*/
public function processEnclosure( \IPS\core\Rss\Import $rss, \IPS\Http\Response $response, $article )
{
$settings = $rss->settings;
$recordClass = $rss->_class;
$fieldsClass = '\IPS\cms\Fields' . $recordClass::database()->id;
if ( empty( $settings['record_image'] ) )
{
return FALSE;
}
try
{
$image = \IPS\Image::create( $response );
$fixedFieldSettings = $recordClass::database()->fixed_field_settings;
$dims = NULL;
if ( isset( $fixedFieldSettings['record_image']['image_dims'] ) and $fixedFieldSettings['record_image']['image_dims'][0] > 0 )
{
$dims = array('maxWidth' => $fixedFieldSettings['record_image']['image_dims'][0], 'maxHeight' => $fixedFieldSettings['record_image']['image_dims'][1]);
}
if ( $dims !== NULL )
{
$image->resizeToMax( $fixedFieldSettings['record_image']['image_dims'][0], $fixedFieldSettings['record_image']['image_dims'][1] );
}
static::$enclosures[ $article['guid'] ] = \IPS\File::create( $this->fileStorage, 'rssImage-' . $article['guid'] . '.' . $image->type, (string)$image );
return TRUE;
}
catch( \Exception $e )
{
return FALSE;
}
}
/**
* Addition Form elements
*
* @param \IPS\Helpers\Form $form The form
* @param \IPS\core\Rss\Import $rss Existing RSS object
* @return void
*/
public function form( &$form, \IPS\core\Rss\Import $rss )
{
$settings = $rss->settings;
$recordClass = $rss->_class;
$nodeClass = $recordClass::$containerNodeClass;
$fieldsClass = '\IPS\cms\Fields' . $recordClass::database()->id;
$customFields = $fieldsClass::fields( $settings, 'add', $rss->node_id ? $nodeClass::load( $rss->node_id ) : NULL );
$form->add( new \IPS\Helpers\Form\Radio( 'rss_import_record_open', ( $settings ? $settings['record_open'] : 1 ), FALSE, array( 'options' => array( 1 => 'unlocked', 0 => 'locked' ) ) ) );
$form->add( new \IPS\Helpers\Form\Radio( 'rss_import_record_hide', ( $settings ? $settings['record_hide'] : 0 ), FALSE, array( 'options' => array( 0 => 'unhidden', 1 => 'hidden' ) ) ) );
if ( $rss->has_enclosures and $fieldsClass::fixedFieldFormShow( 'record_image' ) )
{
$form->add( new \IPS\Helpers\Form\Radio( 'rss_import_record_image', ( $settings ? $settings['record_image'] : 1 ), FALSE, array( 'options' => array( 1 => 'rss_import_record_image_header', 0 => 'rss_import_record_image_inline' ) ) ) );
}
if ( \count( $customFields ) )
{
$fields = array();
foreach( $customFields as $id => $field )
{
if ( $id == $recordClass::database()->field_title or $id == $recordClass::database()->field_content )
{
continue;
}
$fields[] = $field;
}
if ( \count( $fields ) )
{
$form->addHeader('rss_import_cms_defaults');
$form->addMessage('rss_import_cms_defaults_desc', 'ipsType_light');
foreach( $fields as $f )
{
$form->add( $f );
}
}
}
}
/**
* Process additional fields unique to this extension
*
* @param array $values Values from form
* @param \IPS\core\Rss\Import $rss Existing RSS object
* @return array
*/
public function saveForm( &$values, $rss )
{
$return = array(
'record_open' => $values['rss_import_record_open'],
'record_hide' => $values['rss_import_record_hide']
);
unset( $values['rss_import_record_open'], $values['rss_import_record_hide'] );
if ( isset( $values['rss_import_record_image'] ) )
{
$return['record_image'] = $values['rss_import_record_image'];
unset( $values['rss_import_record_image'] );
}
$recordClass = $rss->_class;
$fieldsClass = '\IPS\cms\Fields' . $recordClass::database()->id;
$customValues = array();
foreach( $values as $k => $v )
{
if ( mb_substr( $k, 0, 14 ) === 'content_field_' )
{
$customValues[ $k ] = $v;
unset( $values[ $k ] );
}
}
$customFields = $fieldsClass::fields( $customValues, 'add', NULL );
foreach( $customFields as $key => $field )
{
if ( $key == $recordClass::database()->field_title or $key == $recordClass::database()->field_content )
{
continue;
}
$key = 'field_' . $key;
if ( isset( $customValues[ $field->name ] ) and \get_class( $field ) == 'IPS\Helpers\Form\Upload' )
{
if ( \is_array( $customValues[ $field->name ] ) )
{
$items = array();
foreach( $customValues[ $field->name ] as $obj )
{
$items[] = (string) $obj;
}
$return[ $key ] = implode( ',', $items );
}
else
{
$return[ $key ] = (string) $customValues[ $field->name ];
}
}
/* If we're using decimals, then the database field is set to DECIMALS, so we cannot using stringValue() */
else if ( isset( $customValues[ $field->name ] ) and \get_class( $field ) == 'IPS\Helpers\Form\Number' and ( isset( $field->options['decimals'] ) and $field->options['decimals'] > 0 ) )
{
$return[ $key ] = $field->value;
}
else
{
$return[ $key ] = $field::stringValue( isset( $customValues[ $field->name ] ) ? $customValues[ $field->name ] : NULL );
}
}
return $return;
}
}