Version 4.6.0

This commit is contained in:
Neo committed 2025-12-19 05:55:31 -08:00
1 parent f79dcf067a
commit 517a5e1f70
2036 files changed
+110041 -26162

No files matched your search

+12 -4
View File
@@ -240,9 +240,9 @@ class _Folder extends \IPS\Node\Model
try
{
$test = \IPS\cms\Pages\Folder::load( \IPS\Http\Url\Friendly::seoTitle( $val ), 'folder_name' );
$test = \IPS\cms\Pages\Folder::load( ( $val === '.well-known' ) ? $val : \IPS\Http\Url\Friendly::seoTitle( $val ), 'folder_name' );
if ( ! empty( \IPS\Request::i()->id ) and $test->id != \IPS\Request::i()->id )
if ( empty( \IPS\Request::i()->id ) or $test->id != \IPS\Request::i()->id )
{
throw new \InvalidArgumentException('content_folder_name_in_use');
}
@@ -250,7 +250,7 @@ class _Folder extends \IPS\Node\Model
catch ( \OutOfRangeException $e )
{
/* If we hit here, we don't have an existing folder by that name so check for a collision */
if ( \IPS\Request::i()->folder_parent_id == 0 AND \IPS\cms\Pages\Page::isFurlCollision( \IPS\Http\Url\Friendly::seoTitle( $val ) ) )
if ( \IPS\Request::i()->folder_parent_id == 0 AND \IPS\cms\Pages\Page::isFurlCollision( ( $val === '.well-known' ) ? $val : \IPS\Http\Url\Friendly::seoTitle( $val ) ) )
{
throw new \InvalidArgumentException('content_folder_name_furl_collision');
}
@@ -300,7 +300,15 @@ class _Folder extends \IPS\Node\Model
if( isset( $values['folder_name'] ) )
{
$values['name'] = \IPS\Http\Url\Friendly::seoTitle( $values['folder_name'] );
/* If the folder name is explicitly .well-known, allow that as it will allow sites on CiC to use Apple Pay */
if ( $values['folder_name'] === '.well-known' )
{
$values['name'] = $values['folder_name'];
}
else
{
$values['name'] = \IPS\Http\Url\Friendly::seoTitle( $values['folder_name'] );
}
unset( $values['folder_name'] );
}
+3 -17
View File
@@ -59,11 +59,6 @@ class _Page extends \IPS\Node\Model implements \IPS\Node\Permissions
*/
protected static $multitonMap = array();
/**
* @brief [Node] Parent ID Database Column
*/
public static $databaseColumnParent = 'folder_id';
/**
* @brief [Node] Parent Node ID Database Column
*/
@@ -954,17 +949,6 @@ class _Page extends \IPS\Node\Model implements \IPS\Node\Permissions
return \IPS\Data\Store::i()->pages_page_urls;
}
/**
* Returns (and builds if required) the pages id => url datastore
*
* @return array
* @deprecated
*/
public static function getPageUrlStore()
{
return static::getStore();
}
/**
* Get page path, returning stripped path and current page number
*
@@ -1550,7 +1534,7 @@ class _Page extends \IPS\Node\Model implements \IPS\Node\Permissions
'options' => array( 0 => 'menu_manager_access_type_inherit', 1 => 'menu_manager_access_type_override' ),
'toggles' => array( 1 => array( 'menu_manager_access' ) )
), NULL, NULL, NULL, 'menu_manager_access_type' ) );
$form->add( new \IPS\Helpers\Form\Select( 'menu_manager_access', '*', NULL, array( 'multiple' => TRUE, 'options' => $groups, 'unlimited' => '*', 'unlimitedLang' => 'everyone' ), NULL, NULL, NULL, 'menu_manager_access' ) );
$form->add( new \IPS\Helpers\Form\CheckboxSet( 'menu_manager_access', '*', NULL, array( 'multiple' => TRUE, 'options' => $groups, 'unlimited' => '*', 'unlimitedLang' => 'everyone', 'impliedUnlimited' => TRUE ), NULL, NULL, NULL, 'menu_manager_access' ) );
}
if ( $pageType === 'builder' )
@@ -2318,6 +2302,8 @@ class _Page extends \IPS\Node\Model implements \IPS\Node\Permissions
{
\IPS\Output::i()->breadcrumb['module'] = array( $this->url(), $this->_title );
}
\IPS\Output::i()->pageName = $this->full_path;
if ( isset( \IPS\Settings::i()->cms_error_page ) and \IPS\Settings::i()->cms_error_page and \IPS\Settings::i()->cms_error_page == $this->id )
{
+34 -2
View File
@@ -123,7 +123,7 @@ class _PageItem extends \IPS\Content\Item implements \IPS\Content\Searchable
* @param array $reactions Reaction Data
* @return string
*/
public static function searchResult( array $indexData, array $authorData, array $itemData, array $containerData = NULL, array $reputationData, $reviewRating, $iPostedIn, $view, $asItem, $canIgnoreComments=FALSE, $template=NULL, $reactions=array() )
public static function searchResult( array $indexData, array $authorData, array $itemData, ?array $containerData, array $reputationData, $reviewRating, $iPostedIn, $view, $asItem, $canIgnoreComments=FALSE, $template=NULL, $reactions=array() )
{
$indexData['index_title'] = \IPS\Member::loggedIn()->language()->addToStack( 'cms_page_' . $indexData['index_item_id'] );
return parent::searchResult( $indexData, $authorData, $itemData, $containerData, $reputationData, $reviewRating, $iPostedIn, $view, $asItem, $canIgnoreComments, $template, $reactions );
@@ -168,7 +168,39 @@ class _PageItem extends \IPS\Content\Item implements \IPS\Content\Searchable
}
else
{
return $this->content;
/* Remove {tags="foo"} */
$this->content = preg_replace( '#\{([a-z]+?=([\'"]).+?\\2 ?+)}#', '', $this->content );
/* Convert {{}} logic into html tags */
$this->content = preg_replace( '#{{(if|foreach)([^{]+?)}}#', '<ips$1 data="$2">', $this->content );
$this->content = preg_replace( '#{{end(if|foreach)}}#', '</ips$1>', $this->content );
/* Remove custom PHP {{$foo = $this->test();}} */
$this->content = preg_replace( '#{{(.+?)}}#', '', $this->content );
$source = new \IPS\Xml\DOMDocument( '1.0', 'UTF-8' );
$source->loadHTML( \IPS\Xml\DOMDocument::wrapHtml( $this->content ) );
/* And then remove the HTML logic */
$domElemsToRemove = array();
foreach ( $source->getElementsByTagname('ipsif') as $domElement )
{
$domElemsToRemove[] = $domElement;
}
foreach ( $source->getElementsByTagname('ipsforeach') as $domElement )
{
$domElemsToRemove[] = $domElement;
}
foreach( $domElemsToRemove as $domElement )
{
$domElement->parentNode->removeChild($domElement);
}
$content = \IPS\Text\DOMParser::getDocumentBodyContents( $source );
return $content;
}
}