Version 4.3.0

This commit is contained in:
Neo committed 2025-12-19 05:47:12 -08:00
1 parent 96997ddd8e
commit fe1acf984a
1349 files changed
+116159 -67711

No files matched your search

+69 -40
View File
@@ -648,29 +648,7 @@ abstract class _Comment extends \IPS\Content
}
return FALSE;
}
/**
* Can report?
*
* @param \IPS\Member|NULL $member The member to check for (NULL for currently logged in member)
* @return bool
*/
public function canReport( $member=NULL )
{
if ( !( $this instanceof \IPS\Content\ReportCenter ) )
{
return FALSE;
}
if ( $this->hidden() === 1 )
{
return FALSE;
}
$member = $member ?: \IPS\Member::loggedIn();
return ( $member->group['g_can_report'] == '1' or in_array( get_class( $this->item() ), explode( ',', $member->group['g_can_report'] ) ) );
}
/**
* Search Index Permissions
*
@@ -977,7 +955,7 @@ abstract class _Comment extends \IPS\Content
$this->save();
/* The new item needs to re-claim any attachments associated with this comment */
\IPS\Db::i()->update( 'core_attachments_map', array( 'id1' => $item->$idColumn ), array( "location_key=? AND id1=? AND id2=?", $oldItem::$application . '_' . ucfirst( $oldItem::$module ), $oldItem->$idColumn, $this->$commentIdColumn ) );
\IPS\Db::i()->update( 'core_attachments_map', array( 'id1' => $item->$idColumn ), array( "location_key=? AND id1=? AND id2=?", $oldItem::$application . '_' . mb_ucfirst( $oldItem::$module ), $oldItem->$idColumn, $this->$commentIdColumn ) );
/* Update notifications */
\IPS\Db::i()->update( 'core_notifications', array( 'item_id' => $item->$idColumn ), array( 'item_class=? and item_id=? and item_sub_class=? and item_sub_id=?', (string) get_class( $item ), $oldItem->$idColumn, (string) get_called_class(), $this->$commentIdColumn ) );
@@ -1059,7 +1037,7 @@ abstract class _Comment extends \IPS\Content
}
/* Unclaim attachments */
\IPS\File::unclaimAttachments( $itemClass::$application . '_' . ucfirst( $itemClass::$module ), $itemId, $this->$idColumn );
\IPS\File::unclaimAttachments( $itemClass::$application . '_' . mb_ucfirst( $itemClass::$module ), $itemId, $this->$idColumn );
/* Reduce the number of comment/reviews count on the item but only if the item is unapproved or visible
* - hidden as opposed to unapproved items do not get included in either of the unapproved_comments/num_comments columns */
@@ -1179,6 +1157,11 @@ abstract class _Comment extends \IPS\Content
public function changeAuthor( \IPS\Member $newAuthor )
{
$oldAuthor = $this->author();
if( $oldAuthor->member_id == $newAuthor->member_id )
{
return;
}
/* Update the row */
parent::changeAuthor( $newAuthor );
@@ -1237,6 +1220,11 @@ abstract class _Comment extends \IPS\Content
return \IPS\Theme::i()->getTemplate( 'global', static::$application )->commentTableHeader( $this, $this->item() );
}
/**
* @brief Cached containers we can access
*/
protected static $permissionSelect = array();
/**
* Get comments based on some arbitrary parameters
*
@@ -1392,10 +1380,22 @@ abstract class _Comment extends \IPS\Content
if ( $joinContainer AND isset( $itemClass::$containerNodeClass ) )
{
$containerClass = $itemClass::$containerNodeClass;
$joins[] = array(
'from' => $containerClass::$databaseTable,
'where' => array_merge( array( array( $itemClass::$databaseTable . '.' . $itemClass::$databasePrefix . $itemClass::$databaseColumnMap['container'] . '=' . $containerClass::$databaseTable . '.' . $containerClass::$databasePrefix . $containerClass::$databaseColumnId ) ), $containerWhere )
);
if( $joins !== NULL )
{
array_unshift( $joins, array(
'from' => $containerClass::$databaseTable,
'where' => array_merge( array( array( $itemClass::$databaseTable . '.' . $itemClass::$databasePrefix . $itemClass::$databaseColumnMap['container'] . '=' . $containerClass::$databaseTable . '.' . $containerClass::$databasePrefix . $containerClass::$databaseColumnId ) ), $containerWhere )
) );
}
else
{
$joins = array(
array(
'from' => $containerClass::$databaseTable,
'where' => array_merge( array( array( $itemClass::$databaseTable . '.' . $itemClass::$databasePrefix . $itemClass::$databaseColumnMap['container'] . '=' . $containerClass::$databaseTable . '.' . $containerClass::$databasePrefix . $containerClass::$databaseColumnId ) ), $containerWhere )
)
);
}
}
/* Build the select clause */
@@ -1417,7 +1417,7 @@ abstract class _Comment extends \IPS\Content
->join( $itemClass::$databaseTable, array_merge( array( array( static::$databaseTable . "." . static::$databasePrefix . static::$databaseColumnMap['item'] . "=" . $itemClass::$databaseTable . "." . $itemClass::$databasePrefix . $itemClass::$databaseColumnId ) ), $itemWhere ), 'STRAIGHT_JOIN' );
}
if ( count( $joins ) )
if ( $joins !== NULL AND count( $joins ) )
{
foreach( $joins as $join )
{
@@ -1428,7 +1428,7 @@ abstract class _Comment extends \IPS\Content
}
$selectClause = static::$databaseTable . '.*';
if ( count( $joins ) )
if ( $joins !== NULL AND count( $joins ) )
{
foreach( $joins as $join )
{
@@ -1441,15 +1441,43 @@ abstract class _Comment extends \IPS\Content
if ( in_array( 'IPS\Content\Permissions', class_implements( $itemClass ) ) AND $permissionKey !== NULL )
{
$member = $member ?: \IPS\Member::loggedIn();
$containerClass = $itemClass::$containerNodeClass;
$member = $member ?: \IPS\Member::loggedIn();
$categories = array();
$lookupKey = md5( $containerClass::$permApp . $containerClass::$permType . $permissionKey . json_encode( $member->groups ) );
if( !isset( static::$permissionSelect[ $lookupKey ] ) )
{
static::$permissionSelect[ $lookupKey ] = array();
$permQuery = \IPS\Db::i()->select( 'perm_type_id', 'core_permission_index', array( "core_permission_index.app='" . $containerClass::$permApp . "' AND core_permission_index.perm_type='" . $containerClass::$permType . "' AND (" . \IPS\Db::i()->findInSet( 'perm_' . $containerClass::$permissionMap[ $permissionKey ], $member->permissionArray() ) . ' OR ' . 'perm_' . $containerClass::$permissionMap[ $permissionKey ] . "='*' )" ) );
if ( count( $containerWhere ) )
{
$permQuery->join( $containerClass::$databaseTable, array_merge( $containerWhere, array( 'core_permission_index.perm_type_id=' . $containerClass::$databaseTable . '.' . $containerClass::$databasePrefix . $containerClass::$databaseColumnId ) ), 'STRAIGHT_JOIN' );
}
foreach( $permQuery as $result )
{
static::$permissionSelect[ $lookupKey ][] = $result;
}
}
$categories = static::$permissionSelect[ $lookupKey ];
if( count( $categories ) )
{
$where[] = array( $itemClass::$databaseTable . "." . $itemClass::$databasePrefix . $itemClass::$databaseColumnMap['container'] . ' IN(' . implode( ',', $categories ) . ')' );
}
else
{
$where[] = array( $itemClass::$databaseTable . "." . $itemClass::$databasePrefix . $itemClass::$databaseColumnMap['container'] . '=0' );
}
$selectClause .= ', ' . $itemClass::$databaseTable . '.*';
$select = \IPS\Db::i()->select( $selectClause, static::$databaseTable, $where, $order, $limit, NULL, NULL, $queryFlags )
->join( $itemClass::$databaseTable, array_merge( array( array( static::$databaseTable . "." . static::$databasePrefix . static::$databaseColumnMap['item'] . "=" . $itemClass::$databaseTable . "." . $itemClass::$databasePrefix . $itemClass::$databaseColumnId ) ), $itemWhere ), 'STRAIGHT_JOIN' )
->join( 'core_permission_index', array( "core_permission_index.app=? AND core_permission_index.perm_type=? AND core_permission_index.perm_type_id=" . $itemClass::$databaseTable . "." . $itemClass::$databasePrefix . $itemClass::$databaseColumnMap['container'] . ' AND (' . \IPS\Db::i()->findInSet( 'perm_' . $containerClass::$permissionMap[ $permissionKey ], $member->groups ) . ' OR ' . 'perm_' . $containerClass::$permissionMap[ $permissionKey ] . '=? )', $containerClass::$permApp, $containerClass::$permType, '*' ), 'STRAIGHT_JOIN' );
->join( $itemClass::$databaseTable, array_merge( array( array( static::$databaseTable . "." . static::$databasePrefix . static::$databaseColumnMap['item'] . "=" . $itemClass::$databaseTable . "." . $itemClass::$databasePrefix . $itemClass::$databaseColumnId ) ), $itemWhere ), 'STRAIGHT_JOIN' );
}
else
{
@@ -1457,7 +1485,7 @@ abstract class _Comment extends \IPS\Content
->join( $itemClass::$databaseTable, array_merge( array( array( static::$databaseTable . "." . static::$databasePrefix . static::$databaseColumnMap['item'] . "=" . $itemClass::$databaseTable . "." . $itemClass::$databasePrefix . $itemClass::$databaseColumnId ) ), $itemWhere ), 'STRAIGHT_JOIN' );
}
if ( count( $joins ) )
if ( $joins !== NULL AND count( $joins ) )
{
foreach( $joins as $join )
{
@@ -1514,7 +1542,7 @@ abstract class _Comment extends \IPS\Content
$item = $this->item();
$attachments = array();
$itemIdColumn = $item::$databaseColumnId;
$internal = \IPS\Db::i()->select( 'attachment_id', 'core_attachments_map', array( 'location_key=? and id1=? and id2=?', $item::$application . '_' . ucfirst( $item::$module ), $item->$itemIdColumn, $this->$idColumn ) );
$internal = \IPS\Db::i()->select( 'attachment_id', 'core_attachments_map', array( 'location_key=? and id1=? and id2=?', $item::$application . '_' . mb_ucfirst( $item::$module ), $item->$itemIdColumn, $this->$idColumn ) );
foreach( \IPS\Db::i()->select( '*', 'core_attachments', array( array( 'attach_id IN(?)', $internal ), array( 'attach_is_image=1' ) ), 'attach_id ASC', $limit ) as $row )
{
@@ -1584,6 +1612,7 @@ abstract class _Comment extends \IPS\Content
/**
* Get output for API
*
* @param \IPS\Member|NULL $authorizedMember The member making the API request or NULL for API Key / client_credentials
* @return array
* @apiresponse int id ID number
* @apiresponse int item_id The ID number of the item this belongs to
@@ -1593,14 +1622,14 @@ abstract class _Comment extends \IPS\Content
* @apiresponse bool hidden Is hidden?
* @apiresponse string url URL to content
*/
public function apiOutput()
public function apiOutput( \IPS\Member $authorizedMember = NULL )
{
$idColumn = static::$databaseColumnId;
$itemColumn = static::$databaseColumnMap['item'];
return array(
'id' => $this->$idColumn,
'item_id' => $this->$itemColumn,
'author' => $this->author()->apiOutput(),
'author' => $this->author()->apiOutput( $authorizedMember ),
'date' => \IPS\DateTime::ts( $this->mapped('date') )->rfc3339(),
'content' => $this->content(),
'hidden' => (bool) $this->hidden(),