Version 4.5.0
This commit is contained in:
1 parent
1a0c7fd3c2
commit
f79dcf067a
3791 files changed
+248032
-76372
No files matched your search
@@ -12,7 +12,7 @@
|
||||
namespace IPS\cms\modules\admin\databases;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
@@ -23,6 +23,11 @@ if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
*/
|
||||
class _categories extends \IPS\Node\Controller
|
||||
{
|
||||
/**
|
||||
* @brief Has been CSRF-protected
|
||||
*/
|
||||
public static $csrfProtected = TRUE;
|
||||
|
||||
/**
|
||||
* Node Class
|
||||
*/
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
namespace IPS\cms\modules\admin\databases;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
@@ -23,6 +23,11 @@ if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
*/
|
||||
class _databases extends \IPS\Node\Controller
|
||||
{
|
||||
/**
|
||||
* @brief Has been CSRF-protected
|
||||
*/
|
||||
public static $csrfProtected = TRUE;
|
||||
|
||||
/**
|
||||
* Node Class
|
||||
*/
|
||||
@@ -52,23 +57,23 @@ class _databases extends \IPS\Node\Controller
|
||||
|
||||
/* Columns */
|
||||
$table->joins = array(
|
||||
array( 'select' => 'w.word_custom as database_name', 'from' => array( 'core_sys_lang_words', 'w' ), 'where' => "w.word_key=CONCAT( 'content_db_', cms_databases.database_id ) AND w.lang_id=" . \IPS\Member::loggedIn()->language()->id )
|
||||
array( 'select' => 'w.word_custom', 'from' => array( 'core_sys_lang_words', 'w' ), 'where' => "w.word_key=CONCAT( 'content_db_', cms_databases.database_id ) AND w.lang_id=" . \IPS\Member::loggedIn()->language()->id )
|
||||
);
|
||||
|
||||
$table->include = array( 'database_name', 'database_record_count', 'database_category_count' );
|
||||
$table->include = array( 'word_custom', 'database_record_count', 'database_category_count' );
|
||||
$table->widths = array(
|
||||
'database_name' => '50'
|
||||
'word_custom' => '50'
|
||||
);
|
||||
|
||||
$table->mainColumn = 'database_name';
|
||||
$table->quickSearch = 'database_name';
|
||||
$table->mainColumn = 'word_custom';
|
||||
$table->quickSearch = 'word_custom';
|
||||
|
||||
$table->sortBy = $table->sortBy ?: 'database_name';
|
||||
$table->sortBy = $table->sortBy ?: 'word_custom';
|
||||
$table->sortDirection = $table->sortDirection ?: 'asc';
|
||||
|
||||
/* Parsers */
|
||||
$table->parsers = array(
|
||||
'database_name' => function( $val, $row )
|
||||
'word_custom' => function( $val, $row )
|
||||
{
|
||||
$page = NULL;
|
||||
$database = NULL;
|
||||
@@ -247,7 +252,7 @@ class _databases extends \IPS\Node\Controller
|
||||
move_uploaded_file( $values['cms_database_import'], $tempFile );
|
||||
|
||||
/* Initate a redirector */
|
||||
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=cms&module=databases&controller=databases&do=import' )->setQueryString( array( 'file' => $tempFile, 'key' => md5_file( $tempFile ) ) ) );
|
||||
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=cms&module=databases&controller=databases&do=import' )->setQueryString( array( 'file' => $tempFile, 'key' => md5_file( $tempFile ) ) )->csrf() );
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -266,6 +271,7 @@ class _databases extends \IPS\Node\Controller
|
||||
public function import()
|
||||
{
|
||||
\IPS\Dispatcher::i()->checkAcpPermission( 'databases_add' );
|
||||
\IPS\Session::i()->csrfCheck();
|
||||
|
||||
if ( !file_exists( \IPS\Request::i()->file ) or md5_file( \IPS\Request::i()->file ) !== \IPS\Request::i()->key )
|
||||
{
|
||||
@@ -273,7 +279,7 @@ class _databases extends \IPS\Node\Controller
|
||||
}
|
||||
|
||||
\IPS\Output::i()->output = new \IPS\Helpers\MultipleRedirect(
|
||||
\IPS\Http\Url::internal( 'app=cms&module=databases&controller=databases&do=import' )->setQueryString( array( 'file' => \IPS\Request::i()->file, 'key' => \IPS\Request::i()->key ) ),
|
||||
\IPS\Http\Url::internal( 'app=cms&module=databases&controller=databases&do=import' )->setQueryString( array( 'file' => \IPS\Request::i()->file, 'key' => \IPS\Request::i()->key ) )->csrf(),
|
||||
function( $data )
|
||||
{
|
||||
/* Open XML file */
|
||||
@@ -289,10 +295,10 @@ class _databases extends \IPS\Node\Controller
|
||||
/* Is this the first batch? */
|
||||
$database = null;
|
||||
$i = 0;
|
||||
if ( !is_array( $data ) )
|
||||
if ( !\is_array( $data ) )
|
||||
{
|
||||
$database = new \IPS\cms\Databases;
|
||||
$database->key = mt_rand();
|
||||
$database->key = 'import_' . mt_rand();
|
||||
$database->save();
|
||||
|
||||
/* Set default perms, these will be editable post DB import */
|
||||
@@ -435,7 +441,7 @@ class _databases extends \IPS\Node\Controller
|
||||
{
|
||||
while ( $xml->read() )
|
||||
{
|
||||
if( ! in_array( $xml->name, $areas ) OR $xml->nodeType != \XMLReader::ELEMENT )
|
||||
if( ! \in_array( $xml->name, $areas ) OR $xml->nodeType != \XMLReader::ELEMENT )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
@@ -467,7 +473,7 @@ class _databases extends \IPS\Node\Controller
|
||||
$perms = array();
|
||||
foreach( $node->attributes() as $k => $v )
|
||||
{
|
||||
if ( mb_substr( $k, 0, 5 ) === 'perm_' or in_array( $k, array( 'app', 'owner_only', 'friend_only', 'authorized_users' ) ) )
|
||||
if ( mb_substr( $k, 0, 5 ) === 'perm_' or \in_array( $k, array( 'app', 'owner_only', 'friend_only', 'authorized_users' ) ) )
|
||||
{
|
||||
$perms[ $k ] = (string) $v;
|
||||
}
|
||||
@@ -488,7 +494,7 @@ class _databases extends \IPS\Node\Controller
|
||||
|
||||
$tryJson = json_decode( $v, TRUE );
|
||||
|
||||
if ( $k === 'field_display_json' AND is_array( $tryJson ) )
|
||||
if ( $k === 'field_display_json' AND \is_array( $tryJson ) )
|
||||
{
|
||||
$displayJson = $tryJson;
|
||||
continue;
|
||||
@@ -585,14 +591,14 @@ class _databases extends \IPS\Node\Controller
|
||||
$perms = array();
|
||||
foreach( $node->attributes() as $k => $v )
|
||||
{
|
||||
if ( mb_substr( $k, 0, 5 ) === 'perm_' or in_array( $k, array( 'app', 'owner_only', 'friend_only', 'authorized_users' ) ) )
|
||||
if ( mb_substr( $k, 0, 5 ) === 'perm_' or \in_array( $k, array( 'app', 'owner_only', 'friend_only', 'authorized_users' ) ) )
|
||||
{
|
||||
$perms[ $k ] = (string) $v;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
$attrs[ $k ] = ( in_array( $k, array( 'category_parent_id' ) ) ) ? (int) $v : (string) $v;
|
||||
$attrs[ $k ] = ( \in_array( $k, array( 'category_parent_id' ) ) ) ? (int) $v : (string) $v;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -612,12 +618,13 @@ class _databases extends \IPS\Node\Controller
|
||||
/* Create a category */
|
||||
$category = new \IPS\cms\Categories;
|
||||
$category->database_id = $database->id;
|
||||
$category::$permType = 'categories_' . $database->id;
|
||||
|
||||
$category->saveForm( $category->formatFormValues( $attrs ) );
|
||||
|
||||
if ( $category->fields AND $category->fields !== '*' )
|
||||
{
|
||||
if ( is_array( $category->fields ) )
|
||||
if ( \is_array( $category->fields ) )
|
||||
{
|
||||
$field_map = \IPS\Data\Store::i()->db_import_field_map;
|
||||
$newMap = array();
|
||||
@@ -630,7 +637,7 @@ class _databases extends \IPS\Node\Controller
|
||||
}
|
||||
}
|
||||
|
||||
if ( count( $newMap ) )
|
||||
if ( \count( $newMap ) )
|
||||
{
|
||||
$category->fields = json_encode( $newMap );
|
||||
$category->save();
|
||||
@@ -784,7 +791,7 @@ class _databases extends \IPS\Node\Controller
|
||||
if ( isset( \IPS\Data\Store::i()->db_import_field_map ) )
|
||||
{
|
||||
$map = \IPS\Data\Store::i()->db_import_field_map;
|
||||
$sortId = intval( mb_substr( $database->field_sort, 6 ) );
|
||||
$sortId = \intval( mb_substr( $database->field_sort, 6 ) );
|
||||
|
||||
if ( isset( $map[ $sortId ] ) )
|
||||
{
|
||||
@@ -870,7 +877,7 @@ class _databases extends \IPS\Node\Controller
|
||||
'comment_bump', 'forum_record', 'forum_comments', 'forum_delete', 'forum_forum', 'forum_prefix', 'forum_suffix', 'search', 'tags_enabled', 'tags_noprefixes', 'tags_predefined', 'fixed_field_perms',
|
||||
'cat_index_type', 'template_form', 'template_featured', 'featured_settings', 'options' ) as $field )
|
||||
{
|
||||
if ( is_array( $database->$field ) )
|
||||
if ( \is_array( $database->$field ) )
|
||||
{
|
||||
$arrays[ $field ] = $database->$field;
|
||||
}
|
||||
@@ -881,7 +888,7 @@ class _databases extends \IPS\Node\Controller
|
||||
if ( $database->$field instanceof \IPS\Patterns\Bitwise )
|
||||
{
|
||||
$bwfield = $database->$field;
|
||||
$store = intval( $bwfield->values['options'] );
|
||||
$store = \intval( $bwfield->values['options'] );
|
||||
}
|
||||
|
||||
$xml->startAttribute( $field );
|
||||
@@ -890,7 +897,7 @@ class _databases extends \IPS\Node\Controller
|
||||
}
|
||||
}
|
||||
|
||||
if ( count( $arrays ) )
|
||||
if ( \count( $arrays ) )
|
||||
{
|
||||
foreach( $arrays as $field => $v )
|
||||
{
|
||||
@@ -927,7 +934,7 @@ class _databases extends \IPS\Node\Controller
|
||||
|
||||
foreach( $row as $k => $v )
|
||||
{
|
||||
if ( array_key_exists( $k, $fieldSchema['columns'] ) AND ! in_array( $k, $removeFields ) AND ! in_array( $k, $textFields ) )
|
||||
if ( array_key_exists( $k, $fieldSchema['columns'] ) AND ! \in_array( $k, $removeFields ) AND ! \in_array( $k, $textFields ) )
|
||||
{
|
||||
$xml->startAttribute( $k );
|
||||
$xml->text( $v );
|
||||
@@ -974,7 +981,7 @@ class _databases extends \IPS\Node\Controller
|
||||
|
||||
foreach( $row as $k => $v )
|
||||
{
|
||||
if ( array_key_exists( $k, $categorySchema['columns'] ) AND ! in_array( $k, $removeFields ) AND ! in_array( $k, $textFields ) )
|
||||
if ( array_key_exists( $k, $categorySchema['columns'] ) AND ! \in_array( $k, $removeFields ) AND ! \in_array( $k, $textFields ) )
|
||||
{
|
||||
$xml->startAttribute( $k );
|
||||
$xml->text( $v );
|
||||
@@ -1010,7 +1017,7 @@ class _databases extends \IPS\Node\Controller
|
||||
|
||||
foreach( array('template_listing', 'template_display', 'template_categories', 'template_featured') as $area )
|
||||
{
|
||||
if ( isset( $templates['cms']['database'][ $database->$area ] ) and is_array( $templates['cms']['database'][ $database->$area ] ) )
|
||||
if ( isset( $templates['cms']['database'][ $database->$area ] ) and \is_array( $templates['cms']['database'][ $database->$area ] ) )
|
||||
{
|
||||
/* Only fetch edited/added templates, no point in fetching default theme templates */
|
||||
foreach( $templates['cms']['database'][ $database->$area ] as $key => $item )
|
||||
@@ -1034,7 +1041,7 @@ class _databases extends \IPS\Node\Controller
|
||||
}
|
||||
}
|
||||
|
||||
if ( count( $toSave ) )
|
||||
if ( \count( $toSave ) )
|
||||
{
|
||||
foreach( $toSave as $group => $items )
|
||||
{
|
||||
@@ -1116,6 +1123,31 @@ class _databases extends \IPS\Node\Controller
|
||||
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=cms&module=databases&controller=databases' ), 'deleted' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Permissions
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function permissions()
|
||||
{
|
||||
parent::permissions();
|
||||
|
||||
$database = \IPS\cms\Databases::load( \IPS\Request::i()->id );
|
||||
|
||||
try
|
||||
{
|
||||
if( $database->page_id AND \IPS\cms\Pages\Page::load( $database->page_id )->permissions()['perm_view'] != '*' )
|
||||
{
|
||||
/* We want the message to show at the top, so get our output as we will start over */
|
||||
$output = \IPS\Output::i()->output;
|
||||
|
||||
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate( 'global', 'core' )->message( \IPS\Member::loggedIn()->language()->addToStack('database_page_permissions_restrict', FALSE, array( 'sprintf' => array( $database->page_id ) ) ), 'warning' );
|
||||
\IPS\Output::i()->output .= $output;
|
||||
}
|
||||
}
|
||||
catch( \OutOfRangeException $e ){}
|
||||
}
|
||||
|
||||
/**
|
||||
* Promote
|
||||
*
|
||||
@@ -1161,6 +1193,8 @@ class _databases extends \IPS\Node\Controller
|
||||
*/
|
||||
public function rebuildTopicContent()
|
||||
{
|
||||
\IPS\Session::i()->csrfCheck();
|
||||
|
||||
if ( isset( \IPS\Request::i()->process ) )
|
||||
{
|
||||
\IPS\Task::queue( 'cms', 'ResyncTopicContent', array( 'databaseId' => \IPS\Request::i()->id ), 3, array( 'databaseId' ) );
|
||||
@@ -1181,6 +1215,7 @@ class _databases extends \IPS\Node\Controller
|
||||
{
|
||||
if ( isset( \IPS\Request::i()->process ) )
|
||||
{
|
||||
\IPS\Session::i()->csrfCheck();
|
||||
\IPS\Task::queue( 'core', 'RebuildItemCounts', array( 'class' => 'IPS\cms\Records' . \IPS\Request::i()->id ), 3, array( 'class' ) );
|
||||
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=cms&module=databases&controller=databases&do=form&id=' . \IPS\Request::i()->id ), 'database_rebuild_added' );
|
||||
}
|
||||
@@ -1193,6 +1228,7 @@ class _databases extends \IPS\Node\Controller
|
||||
/**
|
||||
* Add/Edit
|
||||
*
|
||||
* @csrfChecked Uses $this->_getDatabaseForm() which uses Form Helper 7 Oct 2019
|
||||
* @return void
|
||||
*/
|
||||
public function form()
|
||||
@@ -1244,7 +1280,7 @@ class _databases extends \IPS\Node\Controller
|
||||
|
||||
if ( ! $values['database_key'] )
|
||||
{
|
||||
if ( is_array( $values['database_name'] ) )
|
||||
if ( \is_array( $values['database_name'] ) )
|
||||
{
|
||||
$keyToUse = mt_rand();
|
||||
foreach( $values['database_name'] as $langId => $word )
|
||||
@@ -1343,11 +1379,8 @@ class _databases extends \IPS\Node\Controller
|
||||
{
|
||||
$current->tags_enabled = (int) $values['database_tags_enabled'];
|
||||
$current->tags_noprefixes = !(bool) $values['database_tags_noprefixes'];
|
||||
|
||||
if ( ! \IPS\Settings::i()->tags_open_system )
|
||||
{
|
||||
$current->tags_predefined = ( is_array( $values['database_tags_predefined'] ) ) ? implode( ',', array_filter( array_map( 'trim', $values['database_tags_predefined'] ) ) ) : NULL;
|
||||
}
|
||||
$current->tags_predefined = ( \is_array( $values['database_tags_predefined'] ) ) ? implode( ',', array_filter( array_map( 'trim', $values['database_tags_predefined'] ) ) ) : NULL;
|
||||
|
||||
}
|
||||
|
||||
$categories = 0;
|
||||
@@ -1375,6 +1408,16 @@ class _databases extends \IPS\Node\Controller
|
||||
|
||||
if ( \IPS\Application::appIsEnabled( 'forums' ) )
|
||||
{
|
||||
/* Are we changing where comments go? */
|
||||
if ( !$new AND ( (int) $current->forum_record != (int) $values['database_forum_record'] OR (int) $current->forum_comments != (int) $values['database_forum_comments'] ) )
|
||||
{
|
||||
\IPS\Task::queue( 'cms', 'MoveComments', array(
|
||||
'databaseId' => $current->id,
|
||||
'to' => ( $values['database_forum_comments'] AND $values['database_forum_record'] ) ? 'forums' : 'pages',
|
||||
'deleteTopics' => (bool) ( !$values['database_forum_record'] )
|
||||
), 1, array( 'databaseId', 'to' ) );
|
||||
}
|
||||
|
||||
$current->forum_record = (int) $values['database_forum_record'];
|
||||
$current->forum_comments = (int) $values['database_forum_comments'];
|
||||
$current->forum_forum = ( ! $values['database_forum_forum'] ) ? 0 : $values['database_forum_forum']->id;
|
||||
@@ -1388,7 +1431,10 @@ class _databases extends \IPS\Node\Controller
|
||||
$current->forum_comments = 0;
|
||||
$current->forum_delete = 0;
|
||||
}
|
||||
|
||||
|
||||
/* SEO */
|
||||
$current->canonical_flag = (int) $values['database_canonical_flag'];
|
||||
|
||||
$fieldSettingJson = array();
|
||||
|
||||
foreach( $values as $k => $v )
|
||||
@@ -1429,6 +1475,7 @@ class _databases extends \IPS\Node\Controller
|
||||
$category->allow_rating = $values['category_allow_rating'];
|
||||
$category->can_view_others = $values['category_can_view_others'];
|
||||
$category->save();
|
||||
$category->cloneDatabasePermissions();
|
||||
}
|
||||
|
||||
if ( $new )
|
||||
@@ -1607,7 +1654,7 @@ class _databases extends \IPS\Node\Controller
|
||||
|
||||
foreach( $FieldsClass::data() as $id => $field )
|
||||
{
|
||||
if ( in_array( $field->type, array( 'checkbox', 'multiselect', 'attachments' ) ) )
|
||||
if ( \in_array( $field->type, array( 'checkbox', 'multiselect', 'attachments' ) ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
@@ -1646,10 +1693,10 @@ class _databases extends \IPS\Node\Controller
|
||||
|
||||
$form->addHeader( 'cms_database_form_display' );
|
||||
|
||||
$form->add( new \IPS\Helpers\Form\Select( 'database_template_categories', ! empty( $current ) ? $current->template_categories : NULL, FALSE, array( 'options' => $templatesCat ), NULL, NULL, NULL, 'database_template_categories' ) );
|
||||
$form->add( new \IPS\Helpers\Form\Select( 'database_template_listing' , ! empty( $current ) ? $current->template_listing : NULL, FALSE, array( 'options' => $templatesList ) ) );
|
||||
$form->add( new \IPS\Helpers\Form\Select( 'database_template_display' , ! empty( $current ) ? $current->template_display : NULL, FALSE, array( 'options' => $templatesDisplay ) ) );
|
||||
$form->add( new \IPS\Helpers\Form\Select( 'database_template_form' , ! empty( $current ) ? $current->template_form : NULL, FALSE, array( 'options' => $templatesForm ) ) );
|
||||
$form->add( new \IPS\Helpers\Form\Select( 'database_template_categories', ! empty( $current ) ? $current->template_categories : NULL, FALSE, array( 'options' => $templatesCat ), NULL, NULL, \IPS\Theme::i()->getTemplate( 'databases', 'cms' )->templateGoButton('database_template_categories'), 'database_template_categories' ) );
|
||||
$form->add( new \IPS\Helpers\Form\Select( 'database_template_listing' , ! empty( $current ) ? $current->template_listing : NULL, FALSE, array( 'options' => $templatesList ), NULL, NULL, \IPS\Theme::i()->getTemplate( 'databases', 'cms' )->templateGoButton('database_template_listing'), 'database_template_listing' ) );
|
||||
$form->add( new \IPS\Helpers\Form\Select( 'database_template_display' , ! empty( $current ) ? $current->template_display : NULL, FALSE, array( 'options' => $templatesDisplay ), NULL, NULL, \IPS\Theme::i()->getTemplate( 'databases', 'cms' )->templateGoButton('database_template_display'), 'database_template_display' ) );
|
||||
$form->add( new \IPS\Helpers\Form\Select( 'database_template_form' , ! empty( $current ) ? $current->template_form : NULL, FALSE, array( 'options' => $templatesForm ), NULL, NULL, \IPS\Theme::i()->getTemplate( 'databases', 'cms' )->templateGoButton('database_template_form'), 'database_template_form' ) );
|
||||
|
||||
$form->add( new \IPS\Helpers\Form\Text( 'database_key', ! empty( $current ) ? $current->key : FALSE, FALSE, array(), function( $val )
|
||||
{
|
||||
@@ -1745,10 +1792,7 @@ class _databases extends \IPS\Node\Controller
|
||||
|
||||
$form->add( new \IPS\Helpers\Form\YesNo( 'database_tags_enabled' , $current ? $current->tags_enabled : FALSE, FALSE, array( 'togglesOn' => array( 'database_tags_noprefixes', 'database_tags_predefined' ) ), NULL, NULL, NULL, 'database_tags_enabled' ) );
|
||||
$form->add( new \IPS\Helpers\Form\YesNo( 'database_tags_noprefixes', $current ? ! $current->tags_noprefixes : FALSE, FALSE, array(), NULL, NULL, NULL, 'database_tags_noprefixes' ) );
|
||||
if ( ! \IPS\Settings::i()->tags_open_system )
|
||||
{
|
||||
$form->add( new \IPS\Helpers\Form\Text( 'database_tags_predefined', $current ? $current->tags_predefined: '', FALSE, array( 'autocomplete' => array( 'unique' => 'true' ), 'nullLang' => 'database_tags_predefined_unlimited' ), NULL, NULL, NULL, 'database_tags_predefined' ) );
|
||||
}
|
||||
$form->add( new \IPS\Helpers\Form\Text( 'database_tags_predefined', $current ? $current->tags_predefined: '', FALSE, array( 'autocomplete' => array( 'unique' => 'true' ), 'nullLang' => 'database_tags_predefined_unlimited' ), NULL, NULL, NULL, 'database_tags_predefined' ) );
|
||||
}
|
||||
|
||||
$form->addHeader( 'content_database_form_options_fields' );
|
||||
@@ -1774,12 +1818,12 @@ class _databases extends \IPS\Node\Controller
|
||||
|
||||
$ffsettings = $current->fixed_field_settings;
|
||||
|
||||
if ( isset( $ffsettings['record_image']['image_dims'] ) and is_array( $ffsettings['record_image']['image_dims'] ) )
|
||||
if ( isset( $ffsettings['record_image']['image_dims'] ) and \is_array( $ffsettings['record_image']['image_dims'] ) )
|
||||
{
|
||||
$widthHeight = $ffsettings['record_image']['image_dims'];
|
||||
}
|
||||
|
||||
if ( isset( $ffsettings['record_image']['thumb_dims'] ) and is_array( $ffsettings['record_image']['thumb_dims'] ) )
|
||||
if ( isset( $ffsettings['record_image']['thumb_dims'] ) and \is_array( $ffsettings['record_image']['thumb_dims'] ) )
|
||||
{
|
||||
$thumbWidthHeight = $ffsettings['record_image']['thumb_dims'];
|
||||
}
|
||||
@@ -1857,6 +1901,17 @@ class _databases extends \IPS\Node\Controller
|
||||
$form->add( new \IPS\Helpers\Form\YesNo( 'database_forum_delete' , $current ? $current->forum_delete : FALSE, FALSE, array(), NULL, NULL, NULL, 'database_forum_delete' ) );
|
||||
}
|
||||
|
||||
/* SEO */
|
||||
$form->addTab( 'content_database_form_seo' );
|
||||
$form->addHeader( 'database_canonical_header' );
|
||||
|
||||
$form->add( new \IPS\Helpers\Form\Radio( 'database_canonical_flag', ! empty( $current ) ? $current->canonical_flag : NULL, FALSE, array(
|
||||
'options' => array(
|
||||
'0' => 'database_canonical_flag_0',
|
||||
'1' => 'database_canonical_flag_1'
|
||||
)
|
||||
) ) );
|
||||
|
||||
if ( ! $current )
|
||||
{
|
||||
$form->addTab( 'content_database_form_options_page' );
|
||||
@@ -1920,7 +1975,7 @@ class _databases extends \IPS\Node\Controller
|
||||
|
||||
foreach( $pageFormFields as $name => $field )
|
||||
{
|
||||
if ( is_array( $field ) )
|
||||
if ( \is_array( $field ) )
|
||||
{
|
||||
$form->addHeader( $field[0] );
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
namespace IPS\cms\modules\admin\databases;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
@@ -23,6 +23,11 @@ if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
*/
|
||||
class _fields extends \IPS\Node\Controller
|
||||
{
|
||||
/**
|
||||
* @brief Has been CSRF-protected
|
||||
*/
|
||||
public static $csrfProtected = TRUE;
|
||||
|
||||
/**
|
||||
* Node Class
|
||||
*/
|
||||
@@ -130,6 +135,8 @@ class _fields extends \IPS\Node\Controller
|
||||
*/
|
||||
public function enableToggle()
|
||||
{
|
||||
\IPS\Session::i()->csrfCheck();
|
||||
|
||||
$class = '\IPS\cms\Fields' . \IPS\Request::i()->database_id;
|
||||
|
||||
$class::setFixedFieldVisibility( \IPS\Request::i()->id, (boolean) \IPS\Request::i()->status );
|
||||
@@ -152,6 +159,8 @@ class _fields extends \IPS\Node\Controller
|
||||
*/
|
||||
public function setAsTitle()
|
||||
{
|
||||
\IPS\Session::i()->csrfCheck();
|
||||
|
||||
$class = '\IPS\cms\Fields' . \IPS\Request::i()->database_id;
|
||||
$database = \IPS\cms\Databases::load( \IPS\Request::i()->database_id );
|
||||
|
||||
@@ -180,6 +189,8 @@ class _fields extends \IPS\Node\Controller
|
||||
*/
|
||||
public function setAsContent()
|
||||
{
|
||||
\IPS\Session::i()->csrfCheck();
|
||||
|
||||
$class = '\IPS\cms\Fields' . \IPS\Request::i()->database_id;
|
||||
$database = \IPS\cms\Databases::load( \IPS\Request::i()->database_id );
|
||||
|
||||
@@ -236,7 +247,7 @@ class _fields extends \IPS\Node\Controller
|
||||
$matrix->columns[ $k ] = function( $key, $value, $data ) use ( $perms, $k, $v )
|
||||
{
|
||||
$groupId = mb_substr( $key, 0, -( 2 + mb_strlen( $k ) ) );
|
||||
return new \IPS\Helpers\Form\Checkbox( $key, isset( $perms[ "perm_{$v}" ] ) and ( $perms[ "perm_{$v}" ] === '*' or in_array( $groupId, explode( ',', $perms[ "perm_{$v}" ] ) ) ) );
|
||||
return new \IPS\Helpers\Form\Checkbox( $key, isset( $perms[ "perm_{$v}" ] ) and ( $perms[ "perm_{$v}" ] === '*' or \in_array( $groupId, explode( ',', $perms[ "perm_{$v}" ] ) ) ) );
|
||||
};
|
||||
$matrix->checkAlls[ $k ] = ( $perms[ "perm_{$v}" ] === '*' );
|
||||
}
|
||||
@@ -276,7 +287,7 @@ class _fields extends \IPS\Node\Controller
|
||||
{
|
||||
foreach ( $permMap as $k => $v )
|
||||
{
|
||||
if ( isset( $perms[ $k ] ) and $perms[ $k ] and is_array( $_perms[ $v ] ) )
|
||||
if ( isset( $perms[ $k ] ) and $perms[ $k ] and \is_array( $_perms[ $v ] ) )
|
||||
{
|
||||
$_perms[ $v ][] = $group;
|
||||
}
|
||||
@@ -286,7 +297,7 @@ class _fields extends \IPS\Node\Controller
|
||||
/* Finalise */
|
||||
foreach ( $_perms as $k => $v )
|
||||
{
|
||||
$save[ "perm_{$k}" ] = is_array( $v ) ? implode( $v, ',' ) : $v;
|
||||
$save[ "perm_{$k}" ] = \is_array( $v ) ? implode( ',', $v ) : $v;
|
||||
}
|
||||
|
||||
$class::setFixedFieldPermissions( \IPS\Request::i()->field, $save );
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
namespace IPS\cms\modules\admin\databases;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
@@ -23,6 +23,11 @@ if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
*/
|
||||
class _records extends \IPS\Dispatcher\Controller
|
||||
{
|
||||
/**
|
||||
* @brief Has been CSRF-protected
|
||||
*/
|
||||
public static $csrfProtected = TRUE;
|
||||
|
||||
/**
|
||||
* Execute
|
||||
*
|
||||
@@ -362,7 +367,7 @@ class _records extends \IPS\Dispatcher\Controller
|
||||
|
||||
foreach( $formElements as $name => $field )
|
||||
{
|
||||
if ( in_array( $name, $manuallyHandledFields ) )
|
||||
if ( \in_array( $name, $manuallyHandledFields ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
@@ -411,7 +416,12 @@ class _records extends \IPS\Dispatcher\Controller
|
||||
)
|
||||
), NULL, NULL, NULL, 'record_author_choice' ) );
|
||||
|
||||
$form->add( new \IPS\Helpers\Form\Member( 'record_member_id', ( $currentMember and $currentMember->member_id ) ? $currentMember : NULL, FALSE, array(), NULL, NULL, NULL, 'record_member_id' ) );
|
||||
$form->add( new \IPS\Helpers\Form\Member( 'record_member_id', ( $currentMember and $currentMember->member_id ) ? $currentMember : NULL, FALSE, array(), function( $val ) {
|
||||
if( !$val AND \IPS\Request::i()->record_author_choice == 'notme' )
|
||||
{
|
||||
throw new \DomainException( 'form_required' );
|
||||
}
|
||||
}, NULL, NULL, 'record_member_id' ) );
|
||||
|
||||
if ( isset( $formElements['record_allow_comments'] ) )
|
||||
{
|
||||
@@ -487,7 +497,7 @@ class _records extends \IPS\Dispatcher\Controller
|
||||
}
|
||||
else if ( ! $current->member_id and $values['record_author_choice'] !== 'guest' )
|
||||
{
|
||||
$values['record_member_id'] = \IPS\Member::loggedIn();
|
||||
$values['record_member_id'] = ( $values['record_author_choice'] === 'me' ) ? \IPS\Member::loggedIn() : $values['record_member_id'];
|
||||
$changeAuthor = TRUE;
|
||||
}
|
||||
else if ( $values['record_author_choice'] === 'me' )
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
namespace IPS\cms\modules\admin\pages;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
@@ -23,10 +23,15 @@ if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
*/
|
||||
class _ajax extends \IPS\Dispatcher\Controller
|
||||
{
|
||||
/**
|
||||
* @brief Has been CSRF-protected
|
||||
*/
|
||||
public static $csrfProtected = TRUE;
|
||||
|
||||
/**
|
||||
* Return a CSS or HTML menu
|
||||
*
|
||||
* @return html
|
||||
* @return void
|
||||
*/
|
||||
public function loadMenu()
|
||||
{
|
||||
@@ -73,7 +78,7 @@ class _ajax extends \IPS\Dispatcher\Controller
|
||||
/**
|
||||
* Return HTML template as JSON
|
||||
*
|
||||
* @return string
|
||||
* @return void
|
||||
*/
|
||||
public function loadTemplate()
|
||||
{
|
||||
@@ -121,7 +126,7 @@ class _ajax extends \IPS\Dispatcher\Controller
|
||||
{
|
||||
try
|
||||
{
|
||||
if ( is_numeric( $t_key ) )
|
||||
if ( \is_numeric( $t_key ) )
|
||||
{
|
||||
$template = \IPS\cms\Templates::load( $t_key, 'template_id' );
|
||||
}
|
||||
@@ -160,7 +165,112 @@ class _ajax extends \IPS\Dispatcher\Controller
|
||||
}
|
||||
else
|
||||
{
|
||||
\IPS\Output::i()->sendOutput( \IPS\Theme::i()->getTemplate( 'global', 'core' )->blankTemplate( \IPS\Theme::i()->getTemplate( 'templates', 'cms', 'admin' )->viewTemplate( $templateArray ) ), 200, 'text/html', \IPS\Output::i()->httpHeaders );
|
||||
\IPS\Output::i()->sendOutput( \IPS\Theme::i()->getTemplate( 'global', 'core' )->blankTemplate( \IPS\Theme::i()->getTemplate( 'templates', 'cms', 'admin' )->viewTemplate( $templateArray ) ), 200, 'text/html' );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* [AJAX] Search templates
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function searchtemplates()
|
||||
{
|
||||
\IPS\Dispatcher::i()->checkAcpPermission( 'template_manage' );
|
||||
|
||||
$where = array();
|
||||
if ( \IPS\Request::i()->term )
|
||||
{
|
||||
$where[] = array( '( LOWER(template_title) LIKE ? OR LOWER(template_content) LIKE ? )', '%' . mb_strtolower( \IPS\Request::i()->term ) . '%', '%' . mb_strtolower( \IPS\Request::i()->term ) . '%' );
|
||||
}
|
||||
|
||||
if ( ! \in_array( 'custom', explode( ',', \IPS\Request::i()->filters ) ) )
|
||||
{
|
||||
$where[] = array( 'template_master=1 OR (template_user_created=1 and template_user_edited=0)' );
|
||||
}
|
||||
|
||||
if ( ! \in_array( 'unmodified', explode( ',', \IPS\Request::i()->filters ) ) )
|
||||
{
|
||||
$where[] = array( 'template_user_created=1 and template_user_edited=1' );
|
||||
}
|
||||
|
||||
$select = \IPS\Db::i()->select(
|
||||
'*',
|
||||
'cms_templates',
|
||||
$where,
|
||||
'template_location, template_group, template_title, template_master desc'
|
||||
);
|
||||
|
||||
$return = array();
|
||||
foreach( $select as $result )
|
||||
{
|
||||
$return[ $result['template_location'] ][ $result['template_group'] ][ $result['template_key'] ] = $result['template_title'];
|
||||
}
|
||||
|
||||
\IPS\Output::i()->json( $return );
|
||||
}
|
||||
|
||||
/**
|
||||
* Load Tags
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function loadTags(): void
|
||||
{
|
||||
$page = NULL;
|
||||
if ( isset( \IPS\Request::i()->pageId ) )
|
||||
{
|
||||
try
|
||||
{
|
||||
$page = \IPS\cms\Pages\Page::load( \IPS\Request::i()->pageId );
|
||||
}
|
||||
catch( \OutOfRangeException $e ) {}
|
||||
}
|
||||
|
||||
$tags = array();
|
||||
$tagLinks = array();
|
||||
|
||||
if ( $page and $page->id == \IPS\Settings::i()->cms_error_page )
|
||||
{
|
||||
$tags['cms_error_page']['{error_message}'] = 'cms_error_page_message';
|
||||
$tags['cms_error_page']['{error_code}'] = 'cms_error_page_code';
|
||||
}
|
||||
|
||||
foreach( \IPS\cms\Databases::roots( NULL, NULL ) as $id => $db )
|
||||
{
|
||||
if ( ! $db->page_id )
|
||||
{
|
||||
$tags['cms_tag_databases']['{database="' . $db->key . '"}'] = $db->_title;
|
||||
}
|
||||
}
|
||||
|
||||
foreach( \IPS\cms\Blocks\Block::roots( NULL, NULL ) as $id => $block )
|
||||
{
|
||||
$tags['cms_tag_blocks']['{block="' . $block->key . '"}'] = $block->_title;
|
||||
}
|
||||
|
||||
foreach( \IPS\Db::i()->select( '*', 'cms_pages', NULL, 'page_full_path ASC', array( 0, 50 ) ) as $page )
|
||||
{
|
||||
$tags['cms_tag_pages']['{pageurl="' . $page['page_full_path'] . '"}' ] = \IPS\Member::loggedIn()->language()->addToStack( \IPS\cms\Pages\Page::$titleLangPrefix . $page['page_id'] );
|
||||
}
|
||||
|
||||
/* If we can manage words, then the header needs to always show */
|
||||
if ( \IPS\Member::loggedIn()->hasAcpRestriction( 'core', 'languages', 'lang_words' ) )
|
||||
{
|
||||
$tags['cms_tag_lang'] = array();
|
||||
$tagLinks['cms_tag_lang'] = array(
|
||||
'icon' => 'plus',
|
||||
'title' => \IPS\Member::loggedIn()->language()->addToStack('add_word'),
|
||||
'link' => \IPS\Http\Url::internal( "app=core&module=languages&controller=languages&do=addWord" ),
|
||||
'data' => array( 'ipsDialog' => '', 'ipsDialog-title' => \IPS\Member::loggedIn()->language()->addToStack( 'add_word' ), 'ipsDialog-remoteSubmit' => TRUE, 'action' => "wordForm" )
|
||||
);
|
||||
}
|
||||
|
||||
foreach( \IPS\Db::i()->select( '*', 'core_sys_lang_words', array( "word_is_custom=? AND lang_id=?", 1, \IPS\Member::loggedIn()->language()->_id ) ) AS $lang )
|
||||
{
|
||||
$tags['cms_tag_lang']['{lang="' . $lang['word_key'] . '"}'] = $lang['word_custom'] ?: $lang['word_default'];
|
||||
}
|
||||
|
||||
\IPS\Output::i()->sendOutput( \IPS\Theme::i()->getTemplate( 'global', 'core' )->blankTemplate( \IPS\Theme::i()->getTemplate( 'forms', 'core', 'global' )->editorTags( $tags, $tagLinks ) ), 200, 'text/html' );
|
||||
}
|
||||
}
|
||||
@@ -12,7 +12,7 @@
|
||||
namespace IPS\cms\modules\admin\pages;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
@@ -23,6 +23,11 @@ if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
*/
|
||||
class _blocks extends \IPS\Node\Controller
|
||||
{
|
||||
/**
|
||||
* @brief Has been CSRF-protected
|
||||
*/
|
||||
public static $csrfProtected = TRUE;
|
||||
|
||||
/**
|
||||
* Node Class
|
||||
*/
|
||||
@@ -82,6 +87,7 @@ class _blocks extends \IPS\Node\Controller
|
||||
{
|
||||
if ( isset( \IPS\Request::i()->id ) )
|
||||
{
|
||||
\IPS\Session::i()->csrfCheck();
|
||||
\IPS\cms\Blocks\Block::deleteCompiled( \IPS\Request::i()->id );
|
||||
}
|
||||
|
||||
@@ -100,6 +106,17 @@ class _blocks extends \IPS\Node\Controller
|
||||
|
||||
return $buttons;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetch any additional HTML for this row
|
||||
*
|
||||
* @param object $node Node returned from $nodeClass::load()
|
||||
* @return NULL|string
|
||||
*/
|
||||
public function _getRowHtml( $node )
|
||||
{
|
||||
return \IPS\Theme::i()->getTemplate( 'blocks', 'cms', 'admin' )->rowHtml( $node );
|
||||
}
|
||||
|
||||
/**
|
||||
* Add block, pre form
|
||||
@@ -211,4 +228,33 @@ class _blocks extends \IPS\Node\Controller
|
||||
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack('block_embed_title');
|
||||
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate( 'global', 'core', 'admin' )->block( '', \IPS\Theme::i()->getTemplate( 'blocks', 'cms', 'admin' )->embedCode( $block, $embedKey ) );;
|
||||
}
|
||||
|
||||
/**
|
||||
* Load tags
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function loadTags(): void
|
||||
{
|
||||
$tags = array();
|
||||
$tagLinks = array();
|
||||
|
||||
/* If we can manage words, then the header needs to always show */
|
||||
if ( \IPS\Member::loggedIn()->hasAcpRestriction( 'core', 'languages', 'lang_words' ) )
|
||||
{
|
||||
$tags['cms_tag_lang'] = array();
|
||||
$tagLinks['cms_tag_lang'] = array(
|
||||
'icon' => 'plus',
|
||||
'title' => \IPS\Member::loggedIn()->language()->addToStack('add_word'),
|
||||
'link' => \IPS\Http\Url::internal( "app=core&module=languages&controller=languages&do=addWord" ),
|
||||
'data' => array( 'ipsDialog' => '', 'ipsDialog-title' => \IPS\Member::loggedIn()->language()->addToStack( 'add_word' ), 'ipsDialog-remoteSubmit' => TRUE )
|
||||
);
|
||||
}
|
||||
foreach( \IPS\Db::i()->select( '*', 'core_sys_lang_words', array( "word_is_custom=? AND lang_id=?", 1, \IPS\Member::loggedIn()->language()->_id ) ) AS $lang )
|
||||
{
|
||||
$tags['cms_tag_lang']['{lang="' . $lang['word_key'] . '"}'] = $lang['word_custom'] ?: $lang['word_default'];
|
||||
}
|
||||
|
||||
\IPS\Output::i()->sendOutput( \IPS\Theme::i()->getTemplate( 'global', 'core' )->blankTemplate( \IPS\Theme::i()->getTemplate( 'forms', 'core', 'global' )->editorTags( $tags, $tagLinks ) ), 200, 'text/html' );
|
||||
}
|
||||
}
|
||||
@@ -12,7 +12,7 @@
|
||||
namespace IPS\cms\modules\admin\pages;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
@@ -23,6 +23,11 @@ if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
*/
|
||||
class _media extends \IPS\Node\Controller
|
||||
{
|
||||
/**
|
||||
* @brief Has been CSRF-protected
|
||||
*/
|
||||
public static $csrfProtected = TRUE;
|
||||
|
||||
/**
|
||||
* Node Class
|
||||
*/
|
||||
@@ -75,15 +80,17 @@ class _media extends \IPS\Node\Controller
|
||||
*/
|
||||
public function deleteByFileIds()
|
||||
{
|
||||
\IPS\Session::i()->csrfCheck();
|
||||
|
||||
if ( isset( \IPS\Request::i()->fileIds ) )
|
||||
{
|
||||
$ids = \IPS\Request::i()->fileIds;
|
||||
|
||||
if ( ! is_array( $ids ) )
|
||||
if ( ! \is_array( $ids ) )
|
||||
{
|
||||
$try = json_decode( $ids, TRUE );
|
||||
|
||||
if ( ! is_array( $try ) )
|
||||
if ( ! \is_array( $try ) )
|
||||
{
|
||||
$ids = array( $ids );
|
||||
}
|
||||
@@ -93,7 +100,7 @@ class _media extends \IPS\Node\Controller
|
||||
}
|
||||
}
|
||||
|
||||
if ( count( $ids ) )
|
||||
if ( \count( $ids ) )
|
||||
{
|
||||
\IPS\cms\Media::deleteByFileIds( $ids );
|
||||
}
|
||||
@@ -134,7 +141,7 @@ class _media extends \IPS\Node\Controller
|
||||
}
|
||||
|
||||
if( \IPS\Request::i()->isAjax() ){
|
||||
\IPS\Output::i()->sendOutput( json_encode( $rows ), 200, 'application/json', \IPS\Output::i()->httpHeaders );
|
||||
\IPS\Output::i()->sendOutput( json_encode( $rows ), 200, 'application/json' );
|
||||
}
|
||||
|
||||
return $data;
|
||||
@@ -179,7 +186,7 @@ class _media extends \IPS\Node\Controller
|
||||
}
|
||||
|
||||
if( \IPS\Request::i()->isAjax() ){
|
||||
\IPS\Output::i()->sendOutput( json_encode( $rows ), 200, 'application/json', \IPS\Output::i()->httpHeaders );
|
||||
\IPS\Output::i()->sendOutput( json_encode( $rows ), 200, 'application/json' );
|
||||
}
|
||||
|
||||
return $rows;
|
||||
@@ -195,7 +202,7 @@ class _media extends \IPS\Node\Controller
|
||||
|
||||
if( \IPS\Request::i()->isAjax() )
|
||||
{
|
||||
\IPS\Output::i()->sendOutput( $output, 200, 'text/html', \IPS\Output::i()->httpHeaders );
|
||||
\IPS\Output::i()->sendOutput( $output, 200, 'text/html' );
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -228,7 +235,7 @@ class _media extends \IPS\Node\Controller
|
||||
$form = new \IPS\Helpers\Form( 'form', 'upload' );
|
||||
$form->class = 'ipsForm_vertical ipsForm_noLabels';
|
||||
|
||||
$form->add( new \IPS\Helpers\Form\Upload( 'media_filename', NULL, FALSE, array( 'allowedFileTypes' => array_merge( \IPS\File::$safeFileExtensions, array( 'pdf' ) ), 'obscure' => FALSE, 'maxFileSize' => 5, 'storageExtension' => 'cms_Media', 'storageContainer' => 'pages_media', 'multiple' => FALSE, 'minimize' => FALSE ), NULL, NULL, NULL, 'media_filename' ) );
|
||||
$form->add( new \IPS\Helpers\Form\Upload( 'media_filename', NULL, FALSE, array( 'allowedFileTypes' => array_merge( \IPS\File::$safeFileExtensions, array( 'pdf' ) ), 'obscure' => FALSE, 'storageExtension' => 'cms_Media', 'storageContainer' => 'pages_media', 'multiple' => FALSE, 'minimize' => FALSE ), NULL, NULL, NULL, 'media_filename' ) );
|
||||
|
||||
if ( $values = $form->values() )
|
||||
{
|
||||
@@ -277,7 +284,7 @@ class _media extends \IPS\Node\Controller
|
||||
}
|
||||
}
|
||||
|
||||
\IPS\Output::i()->sendOutput( json_encode( array( 'fileID' => $media->id, 'folderID' => $media->parent, 'rows' => $rows ) ), 200, 'application/json', \IPS\Output::i()->httpHeaders );
|
||||
\IPS\Output::i()->sendOutput( json_encode( array( 'fileID' => $media->id, 'folderID' => $media->parent, 'rows' => $rows ) ), 200, 'application/json' );
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -298,7 +305,7 @@ class _media extends \IPS\Node\Controller
|
||||
$form = new \IPS\Helpers\Form( 'form', 'upload' );
|
||||
$form->class = 'ipsForm_vertical ipsForm_noLabels';
|
||||
|
||||
$form->add( new \IPS\Helpers\Form\Upload( 'media_filename', NULL, FALSE, array( 'allowedFileTypes' => array_merge( \IPS\File::$safeFileExtensions, array( 'pdf', 'svg' ) ), 'obscure' => FALSE, 'maxFileSize' => 5, 'storageExtension' => 'cms_Media', 'storageContainer' => 'pages_media', 'multiple' => true, 'minimize' => FALSE ), NULL, NULL, NULL, 'media_filename' ) );
|
||||
$form->add( new \IPS\Helpers\Form\Upload( 'media_filename', NULL, FALSE, array( 'allowedFileTypes' => array_merge( \IPS\File::$safeFileExtensions, array( 'pdf', 'svg' ) ), 'obscure' => FALSE, 'storageExtension' => 'cms_Media', 'storageContainer' => 'pages_media', 'multiple' => true, 'minimize' => FALSE ), NULL, NULL, NULL, 'media_filename' ) );
|
||||
|
||||
if ( ! isset( \IPS\Request::i()->media_parent ) and ! \IPS\Request::i()->media_parent )
|
||||
{
|
||||
@@ -380,7 +387,7 @@ class _media extends \IPS\Node\Controller
|
||||
}
|
||||
}
|
||||
|
||||
\IPS\Output::i()->sendOutput( json_encode( array( 'count' => $count, 'folderID' => $parent, 'rows' => $rows ) ), 200, 'application/json', \IPS\Output::i()->httpHeaders );
|
||||
\IPS\Output::i()->sendOutput( json_encode( array( 'count' => $count, 'folderID' => $parent, 'rows' => $rows ) ), 200, 'application/json' );
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -412,7 +419,7 @@ class _media extends \IPS\Node\Controller
|
||||
|
||||
if( \IPS\Request::i()->isAjax() )
|
||||
{
|
||||
\IPS\Output::i()->sendOutput( json_encode( $rows ), 200, 'application/json', \IPS\Output::i()->httpHeaders );
|
||||
\IPS\Output::i()->sendOutput( json_encode( $rows ), 200, 'application/json' );
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -453,13 +460,13 @@ class _media extends \IPS\Node\Controller
|
||||
$output['dimensions'] = $dimensions[0] . ' x ' . $dimensions[1];
|
||||
}
|
||||
|
||||
\IPS\Output::i()->sendOutput( json_encode( $output ), 200, 'application/json', \IPS\Output::i()->httpHeaders );
|
||||
\IPS\Output::i()->sendOutput( json_encode( $output ), 200, 'application/json' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Return HTML for a page row
|
||||
*
|
||||
* @param array $row Row data
|
||||
* @param array $item Row data
|
||||
* @param object $url \IPS\Http\Url object
|
||||
* @return string HTML
|
||||
*/
|
||||
@@ -471,7 +478,7 @@ class _media extends \IPS\Node\Controller
|
||||
/**
|
||||
* Return HTML for a folder row
|
||||
*
|
||||
* @param array $row Row data
|
||||
* @param array $folder Row data
|
||||
* @param object $url \IPS\Http\Url object
|
||||
* @return string HTML
|
||||
*/
|
||||
@@ -484,7 +491,7 @@ class _media extends \IPS\Node\Controller
|
||||
/**
|
||||
* Fetch rows of folders/pages
|
||||
*
|
||||
* @param int $folderId Parent ID to fetch from
|
||||
* @param int $folderId Parent ID to fetch from
|
||||
*/
|
||||
public static function getRowsForTree( $folderId=0 )
|
||||
{
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
namespace IPS\cms\modules\admin\pages;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
@@ -24,6 +24,11 @@ exit;
|
||||
*/
|
||||
class _pages extends \IPS\Node\Controller
|
||||
{
|
||||
/**
|
||||
* @brief Has been CSRF-protected
|
||||
*/
|
||||
public static $csrfProtected = TRUE;
|
||||
|
||||
/**
|
||||
* Node Class
|
||||
*/
|
||||
@@ -122,14 +127,6 @@ class _pages extends \IPS\Node\Controller
|
||||
FALSE
|
||||
);
|
||||
|
||||
/* Add a button for managing DB settings */
|
||||
\IPS\Output::i()->sidebar['actions']['pagessettings'] = array(
|
||||
'title' => 'cms_pages_settings',
|
||||
'icon' => 'wrench',
|
||||
'link' => \IPS\Http\Url::internal( 'app=cms&module=pages&controller=pages&do=settings' ),
|
||||
'data' => array( 'ipsDialog' => '', 'ipsDialog-title' => \IPS\Member::loggedIn()->language()->addToStack('cms_pages_settings') )
|
||||
);
|
||||
|
||||
if ( \IPS\Member::loggedIn()->hasAcpRestriction( 'cms', 'pages', 'page_add' ) )
|
||||
{
|
||||
\IPS\Output::i()->sidebar['actions']['add_folder'] = array(
|
||||
@@ -150,115 +147,6 @@ class _pages extends \IPS\Node\Controller
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Page settings form
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function settings()
|
||||
{
|
||||
$url = parse_url( \IPS\Settings::i()->base_url );
|
||||
$disabled = FALSE;
|
||||
$options = array();
|
||||
$url['path'] = preg_replace( '#^/?(.+?)?/?$#', '\1', $url['path'] );
|
||||
|
||||
$disabled = ( \IPS\Settings::i()->cms_use_different_gateway or $url['path'] ) ? FALSE : TRUE;
|
||||
$dirs = explode( '/', $url['path'] );
|
||||
|
||||
if ( count( $dirs ) )
|
||||
{
|
||||
array_pop( $dirs );
|
||||
$base = $url['scheme'] . '://' . $url['host'];
|
||||
if ( isset( $url['port'] ) )
|
||||
{
|
||||
$base .= ':' .$url['port'];
|
||||
}
|
||||
|
||||
$base .= '/';
|
||||
$options[ $base ] = $base;
|
||||
foreach( $dirs as $dir )
|
||||
{
|
||||
$base .= $dir . '/';
|
||||
$options[ $base ] = $base;
|
||||
}
|
||||
}
|
||||
|
||||
if ( $disabled )
|
||||
{
|
||||
\IPS\Member::loggedIn()->language()->words['cms_use_different_gateway_warning'] = \IPS\Member::loggedIn()->language()->addToStack('cms_pages_different_gateway_impossible');
|
||||
}
|
||||
|
||||
if ( \IPS\Settings::i()->htaccess_mod_rewrite )
|
||||
{
|
||||
\IPS\Member::loggedIn()->language()->words['cms_root_page_url_desc'] = \IPS\Member::loggedIn()->language()->addToStack('cms_root_page_url_rewrite_desc');
|
||||
}
|
||||
|
||||
$form = new \IPS\Helpers\Form( 'form', 'save' );
|
||||
$form->add( new \IPS\Helpers\Form\YesNo( 'cms_use_different_gateway', \IPS\Settings::i()->cms_use_different_gateway, FALSE, array( 'togglesOn' => array( 'cms_root_page_url' ), 'disabled' => $disabled ) ) );
|
||||
$form->add( new \IPS\Helpers\Form\Select( 'cms_root_page_url', \IPS\Settings::i()->cms_root_page_url, FALSE, array( 'options' => $options ), function( $val )
|
||||
{
|
||||
if ( $val and \IPS\Request::i()->cms_use_different_gateway )
|
||||
{
|
||||
if ( mb_substr( $val, -1 ) !== '/' )
|
||||
{
|
||||
$val .= '/';
|
||||
}
|
||||
|
||||
$page = \IPS\cms\Pages\Page::getDefaultPage();
|
||||
|
||||
$response = \IPS\Http\Url::external( ( \IPS\Settings::i()->htaccess_mod_rewrite ? $val . $page->full_path : $val . 'index.php?/' . $page->full_path ) )->request( NULL, NULL, FALSE )->get();
|
||||
|
||||
if ( $response->httpResponseCode != 200 and $response->httpResponseCode != 303 and ( \IPS\Settings::i()->site_online OR $response->httpResponseCode != 503 ) )
|
||||
{
|
||||
if ( \IPS\Settings::i()->htaccess_mod_rewrite )
|
||||
{
|
||||
throw new \LogicException( 'pages_different_gateway_load_error_rewrite' );
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new \LogicException( 'pages_different_gateway_load_error' );
|
||||
}
|
||||
}
|
||||
}
|
||||
}, NULL, NULL, 'cms_root_page_url' ) );
|
||||
|
||||
$form->add( new \IPS\Helpers\Form\Node( 'cms_error_page', \IPS\Settings::i()->cms_error_page ? \IPS\Settings::i()->cms_error_page : 0, FALSE,array(
|
||||
'class' => '\IPS\cms\Pages\Page',
|
||||
'zeroVal' => 'cms_error_page_none',
|
||||
'subnodes' => true,
|
||||
'permissionCheck' => function( $node )
|
||||
{
|
||||
return $node->type == 'html';
|
||||
}
|
||||
) ) );
|
||||
|
||||
if ( $values = $form->values() )
|
||||
{
|
||||
$form->saveAsSettings();
|
||||
\IPS\Member::clearCreateMenu();
|
||||
|
||||
/* Clear Sidebar Caches */
|
||||
\IPS\Widget::deleteCaches();
|
||||
|
||||
/* Possible gateway choice changed and thusly menu and page_urls will change */
|
||||
if ( isset( \IPS\Data\Store::i()->pages_page_urls ) )
|
||||
{
|
||||
unset( \IPS\Data\Store::i()->pages_page_urls );
|
||||
}
|
||||
|
||||
if ( isset( \IPS\Data\Store::i()->frontNavigation ) )
|
||||
{
|
||||
unset( \IPS\Data\Store::i()->frontNavigation );
|
||||
}
|
||||
|
||||
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( "app=cms&module=pages&controller=pages" ), 'saved' );
|
||||
}
|
||||
|
||||
/* Display */
|
||||
\IPS\Output::i()->output .= \IPS\Theme::i()->getTemplate( 'global', 'core', 'admin' )->block( \IPS\Member::loggedIn()->language()->addToStack('cms_pages_settings'), $form, FALSE );
|
||||
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack('cms_pages_settings');
|
||||
}
|
||||
|
||||
/**
|
||||
* Download .htaccess file
|
||||
*
|
||||
@@ -269,7 +157,7 @@ class _pages extends \IPS\Node\Controller
|
||||
$dir = str_replace( \IPS\CP_DIRECTORY . '/index.php', '', $_SERVER['PHP_SELF'] );
|
||||
$dirs = explode( '/', trim( $dir, '/' ) );
|
||||
|
||||
if ( count( $dirs ) )
|
||||
if ( \count( $dirs ) )
|
||||
{
|
||||
array_pop( $dirs );
|
||||
$dir = implode( '/', $dirs );
|
||||
@@ -350,6 +238,7 @@ FILE;
|
||||
{
|
||||
if ( isset( \IPS\Request::i()->id ) )
|
||||
{
|
||||
\IPS\Session::i()->csrfCheck();
|
||||
\IPS\cms\Pages\Page::deleteCompiled( \IPS\Request::i()->id );
|
||||
}
|
||||
|
||||
@@ -363,10 +252,23 @@ FILE;
|
||||
*/
|
||||
protected function setAsDefault()
|
||||
{
|
||||
\IPS\Session::i()->csrfCheck();
|
||||
\IPS\cms\Pages\Page::load( \IPS\Request::i()->id )->setAsDefault();
|
||||
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( "app=cms&module=pages&controller=pages" ), 'saved' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Set as default error page
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function toggleDefaultError()
|
||||
{
|
||||
\IPS\Session::i()->csrfCheck();
|
||||
\IPS\Settings::i()->changeValues( array( 'cms_error_page' => \IPS\Request::i()->id ? \IPS\Request::i()->id : NULL ) );
|
||||
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( "app=cms&module=pages&controller=pages" ), 'saved' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Tree Search
|
||||
*
|
||||
@@ -395,7 +297,7 @@ FILE;
|
||||
/**
|
||||
* Return HTML for a page row
|
||||
*
|
||||
* @param array $row Row data
|
||||
* @param array $page Row data
|
||||
* @param object $url \IPS\Http\Url object
|
||||
* @return string HTML
|
||||
*/
|
||||
@@ -413,7 +315,7 @@ FILE;
|
||||
/**
|
||||
* Return HTML for a folder row
|
||||
*
|
||||
* @param array $row Row data
|
||||
* @param array $folder Row data
|
||||
* @param object $url \IPS\Http\Url object
|
||||
* @return string HTML
|
||||
*/
|
||||
@@ -425,7 +327,7 @@ FILE;
|
||||
/**
|
||||
* Fetch rows of folders/pages
|
||||
*
|
||||
* @param int $folderId Parent ID to fetch from
|
||||
* @param int $folderId Parent ID to fetch from
|
||||
*/
|
||||
public static function getRowsForTree( $folderId=0 )
|
||||
{
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
namespace IPS\cms\modules\admin\pages;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
@@ -23,6 +23,11 @@ if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
*/
|
||||
class _templates extends \IPS\Dispatcher\Controller
|
||||
{
|
||||
/**
|
||||
* @brief Has been CSRF-protected
|
||||
*/
|
||||
public static $csrfProtected = TRUE;
|
||||
|
||||
/**
|
||||
* Execute
|
||||
*
|
||||
@@ -41,6 +46,8 @@ class _templates extends \IPS\Dispatcher\Controller
|
||||
*/
|
||||
public function importInDev()
|
||||
{
|
||||
\IPS\Session::i()->csrfCheck();
|
||||
|
||||
\IPS\cms\Theme::importInDev('database');
|
||||
\IPS\cms\Theme::importInDev('page');
|
||||
|
||||
@@ -67,7 +74,7 @@ class _templates extends \IPS\Dispatcher\Controller
|
||||
move_uploaded_file( $values['cms_templates_import'], $tempFile );
|
||||
|
||||
/* Initate a redirector */
|
||||
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=cms&module=pages&controller=templates&do=importProcess' )->setQueryString( array( 'file' => $tempFile, 'key' => md5_file( $tempFile ) ) ) );
|
||||
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=cms&module=pages&controller=templates&do=importProcess' )->csrf()->setQueryString( array( 'file' => $tempFile, 'key' => md5_file( $tempFile ) ) ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -85,100 +92,198 @@ class _templates extends \IPS\Dispatcher\Controller
|
||||
*/
|
||||
public function importProcess()
|
||||
{
|
||||
\IPS\Session::i()->csrfCheck();
|
||||
|
||||
if ( !file_exists( \IPS\Request::i()->file ) or md5_file( \IPS\Request::i()->file ) !== \IPS\Request::i()->key )
|
||||
{
|
||||
\IPS\Output::i()->error( 'generic_error', '3T285/3', 403, '' );
|
||||
}
|
||||
|
||||
/* Open XML file */
|
||||
$xml = new \IPS\Xml\XMLReader;
|
||||
$xml->open( \IPS\Request::i()->file );
|
||||
$prefix = 'm' . date('m') . '_' . date('d') . '_' . date('y') . '_';
|
||||
$templates = \IPS\cms\Theme::i()->getRawTemplates( 'cms', NULL, NULL, \IPS\cms\Theme::RETURN_ALL );
|
||||
|
||||
if ( ! @$xml->read() )
|
||||
$result = NULL;
|
||||
try
|
||||
{
|
||||
$result = \IPS\cms\Templates::importUserTemplateXml( \IPS\Request::i()->file );
|
||||
}
|
||||
catch( \Throwable $e )
|
||||
{
|
||||
@unlink( \IPS\Request::i()->file );
|
||||
\IPS\Output::i()->error( 'xml_upload_invalid', '2C163/1', 403, '' );
|
||||
}
|
||||
$xml->read();
|
||||
while ( $xml->read() )
|
||||
|
||||
/* Done */
|
||||
if ( $result instanceof \IPS\Http\Url\Internal )
|
||||
{
|
||||
if ( $xml->name === 'template' )
|
||||
\IPS\Output::i()->redirect( $result );
|
||||
}
|
||||
else
|
||||
{
|
||||
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=cms&module=pages&controller=templates&do=manage' ), 'cms_templates_imported' );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Show and manage conflicts
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function conflicts()
|
||||
{
|
||||
$key = \intval( \IPS\Request::i()->key );
|
||||
$form = new \IPS\Helpers\Form( 'form', 'theme_conflict_save' );
|
||||
$conflicts = array();
|
||||
|
||||
/* If this is part of plugin/app installation, set relevant form data */
|
||||
if( \IPS\Request::i()->app OR \IPS\Request::i()->plugin )
|
||||
{
|
||||
if( \IPS\Request::i()->app )
|
||||
{
|
||||
$node = new \SimpleXMLElement( $xml->readOuterXML() );
|
||||
$attrs = array();
|
||||
$form->hiddenValues['app'] = \IPS\Request::i()->app;
|
||||
}
|
||||
elseif( \IPS\Request::i()->plugin )
|
||||
{
|
||||
$form->hiddenValues['plugin'] = \IPS\Request::i()->plugin;
|
||||
}
|
||||
|
||||
foreach( $node->attributes() as $k => $v )
|
||||
{
|
||||
$attrs[ $k ] = (string) $v;
|
||||
}
|
||||
if( \IPS\Request::i()->marketplace )
|
||||
{
|
||||
$form->hiddenValues['marketplace'] = (int) \IPS\Request::i()->marketplace;
|
||||
}
|
||||
|
||||
/* Any kids of your own? */
|
||||
foreach( $node->children() as $k => $v )
|
||||
{
|
||||
$tryJson = json_decode( $v, TRUE );
|
||||
$attrs[ $k ] = ( $tryJson ) ? $tryJson : (string) $v;
|
||||
}
|
||||
if( \IPS\Request::i()->lang )
|
||||
{
|
||||
$form->hiddenValues['lang'] = \IPS\Request::i()->lang;
|
||||
}
|
||||
}
|
||||
|
||||
if ( isset( $attrs['template_title'] ) and isset( $attrs['template_location'] ) and isset( $attrs['template_group'] ) )
|
||||
/* Get conflict data */
|
||||
foreach( \IPS\Db::i()->select( '*', 'cms_template_conflicts', array( 'conflict_key=?', $key ) )->setKeyField( 'conflict_id' ) as $cid => $data )
|
||||
{
|
||||
$conflicts[ $cid ] = $data;
|
||||
}
|
||||
|
||||
require_once \IPS\ROOT_PATH . "/system/3rd_party/Diff/class.Diff.php";
|
||||
|
||||
foreach( $conflicts as $cid => $data )
|
||||
{
|
||||
try
|
||||
{
|
||||
$template = \IPS\cms\Templates::load( $data['conflict_item_id'], 'template_id' );
|
||||
|
||||
if ( !\IPS\Login::compareHashes( md5( $data['conflict_content'] ), md5( $template->content ) ) )
|
||||
{
|
||||
/* Got this template? */
|
||||
if ( $attrs['template_location'] === 'database' )
|
||||
if ( mb_strlen( $data['conflict_content'] ) <= 10000 )
|
||||
{
|
||||
/* Database templates are really governed by the group as they are a collection of templates */
|
||||
if ( isset( $templates['cms'][$attrs['template_location']][$attrs['template_group']] ) )
|
||||
{
|
||||
$attrs['template_group'] = $prefix . $attrs['template_group'];
|
||||
}
|
||||
$conflicts[ $cid ]['diff'] = \Diff::toTable( \Diff::compare( $template->content, $data['conflict_content'] ) );
|
||||
$conflicts[ $cid ]['large'] = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* But post and block templates are not */
|
||||
if ( isset( $templates['cms'][$attrs['template_location']][$attrs['template_group']] ) )
|
||||
{
|
||||
$exists = FALSE;
|
||||
foreach ( $templates['cms'][$attrs['template_location']][$attrs['template_group']] as $key => $template )
|
||||
{
|
||||
if ( $template['template_title'] === $attrs['template_title'] )
|
||||
{
|
||||
$exists = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ( $exists )
|
||||
{
|
||||
$attrs['template_title'] = $prefix . $attrs['template_title'];
|
||||
}
|
||||
}
|
||||
$conflicts[ $cid ]['diff'] = \IPS\Theme::i()->getTemplate( 'customization' )->templateConflictLarge( $template->content, $data['conflict_content'], 'html' );
|
||||
$conflicts[ $cid ]['large'] = true;
|
||||
}
|
||||
|
||||
$obj = new \IPS\cms\Templates;
|
||||
$obj->location = $attrs['template_location'];
|
||||
$obj->group = $attrs['template_group'];
|
||||
$obj->title = $attrs['template_title'];
|
||||
$obj->params = $attrs['template_params'];
|
||||
$obj->content = $attrs['template_content'];
|
||||
$obj->original_group = $attrs['template_original_group'];
|
||||
$obj->type = 'template';
|
||||
$obj->user_created = 1;
|
||||
$obj->user_edited = 1;
|
||||
$obj->desc = '';
|
||||
$obj->save();
|
||||
$form->add( new \IPS\Helpers\Form\Radio( 'conflict_' . $data['conflict_id'], 'old', false, array('options' => array('old' => '', 'new' => '')) ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
unset( $conflicts[ $cid ] );
|
||||
}
|
||||
}
|
||||
catch( \Exception $e )
|
||||
{
|
||||
unset( $conflicts[ $cid ] );
|
||||
}
|
||||
}
|
||||
|
||||
$obj->key = $obj->location . \IPS\Http\Url\Friendly::seoTitle( $obj->group ) . '_' . \IPS\Http\Url\Friendly::seoTitle( $obj->title ) . '_' . $obj->id;
|
||||
$obj->save();
|
||||
if ( $values = $form->values() )
|
||||
{
|
||||
$conflicts = array();
|
||||
$conflictIds = array();
|
||||
$templates = array();
|
||||
|
||||
foreach( $values as $k => $v )
|
||||
{
|
||||
if ( \substr( $k, 0, 9 ) == 'conflict_' )
|
||||
{
|
||||
if ( $v == 'new' )
|
||||
{
|
||||
$conflictIds[ (int) \substr( $k, 9 ) ] = $v;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$xml->next();
|
||||
if ( \count( $conflictIds ) )
|
||||
{
|
||||
/* Get conflict data */
|
||||
foreach( \IPS\Db::i()->select( '*', 'cms_template_conflicts', \IPS\Db::i()->in( 'conflict_id', array_keys( $conflictIds ) ) )->setKeyField( 'conflict_id' ) as $cid => $data )
|
||||
{
|
||||
$conflicts[ $data['conflict_item_id'] ] = $data;
|
||||
}
|
||||
}
|
||||
|
||||
if ( \count( $conflicts ) )
|
||||
{
|
||||
$templates = iterator_to_array( \IPS\Db::i()->select(
|
||||
'*',
|
||||
'cms_templates',
|
||||
array( \IPS\Db::i()->in( 'template_id', array_keys( $conflicts ) ) )
|
||||
)->setKeyField( 'template_id' ) );
|
||||
}
|
||||
|
||||
foreach( $templates as $templateid => $template )
|
||||
{
|
||||
if ( isset( $conflicts[ $template['template_id'] ] ) )
|
||||
{
|
||||
try
|
||||
{
|
||||
$templateObj = \IPS\cms\Templates::load( $template['template_id'], 'template_id' );
|
||||
$templateObj->params = $conflicts[ $template['template_id'] ]['conflict_data'];
|
||||
$templateObj->content = $conflicts[ $template['template_id'] ]['conflict_content'];
|
||||
$templateObj->user_edited = (int) $templateObj->isDifferentFromMaster();
|
||||
$templateObj->save();
|
||||
}
|
||||
catch( \Exception $e ) { }
|
||||
}
|
||||
}
|
||||
|
||||
/* Clear out conflicts for this theme set */
|
||||
\IPS\Db::i()->delete( 'cms_template_conflicts', array('conflict_key=?', \IPS\Request::i()->key ) );
|
||||
|
||||
$lang = NULL;
|
||||
if( !empty( $values['lang'] ) )
|
||||
{
|
||||
$lang = $values['lang'] == 'updated' ? 'app_now_updated' : 'app_now_installed';
|
||||
}
|
||||
|
||||
if( !empty( $values['marketplace'] ) )
|
||||
{
|
||||
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=core&module=marketplace&controller=marketplace&do=viewFile&id=' . $values['marketplace'] ), $lang );
|
||||
}
|
||||
elseif( !empty( $values['app'] ) )
|
||||
{
|
||||
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=core&module=applications&controller=applications' ), $lang );
|
||||
}
|
||||
elseif( !empty( $values['plugin'] ) )
|
||||
{
|
||||
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=core&module=applications&controller=plugins' ), 'plugin_now_installed' );
|
||||
}
|
||||
|
||||
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=cms&module=pages&controller=templates&do=manage' ), 'completed' );
|
||||
}
|
||||
|
||||
@unlink( \IPS\Request::i()->file );
|
||||
if ( \count( $conflicts ) )
|
||||
{
|
||||
\IPS\Output::i()->cssFiles = array_merge( \IPS\Output::i()->cssFiles, \IPS\Theme::i()->css( 'system/diff.css', 'core', 'admin' ) );
|
||||
\IPS\Output::i()->jsFiles = array_merge( \IPS\Output::i()->jsFiles, \IPS\Output::i()->js( 'codemirror/codemirror.js', 'core', 'interface' ) );
|
||||
\IPS\Output::i()->cssFiles = array_merge( \IPS\Output::i()->cssFiles, \IPS\Theme::i()->css( 'codemirror/codemirror.css', 'core', 'interface' ) );
|
||||
\IPS\Output::i()->cssFiles = array_merge( \IPS\Output::i()->cssFiles, \IPS\Theme::i()->css( 'customization/themes.css', 'core', 'admin' ) );
|
||||
\IPS\Output::i()->jsFiles = array_merge( \IPS\Output::i()->jsFiles, \IPS\Output::i()->js( 'admin_templates.js', 'core', 'admin' ) );
|
||||
|
||||
/* Done */
|
||||
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=cms&module=pages&controller=templates&do=manage' ), 'cms_templates_imported' );
|
||||
\IPS\Output::i()->output = $form->customTemplate( array( \IPS\Theme::i()->getTemplate( 'templates', 'cms' ), 'templateConflict' ), $conflicts );
|
||||
}
|
||||
else
|
||||
{
|
||||
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=cms&module=pages&controller=templates&do=manage' ), 'completed' );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -188,149 +293,17 @@ class _templates extends \IPS\Dispatcher\Controller
|
||||
*/
|
||||
public function export()
|
||||
{
|
||||
$form = new \IPS\Helpers\Form( 'form', 'next' );
|
||||
$templates = array();
|
||||
|
||||
$form->addMessage( 'cms_templates_export_description', 'ipsMessage ipsMessage_information' );
|
||||
foreach( \IPS\cms\Templates::getTemplates( \IPS\cms\Templates::RETURN_DATABASE_ONLY + \IPS\cms\Templates::RETURN_ALL ) as $template )
|
||||
{
|
||||
$title = \IPS\cms\Templates::readableGroupName( $template->group );
|
||||
|
||||
if ( $template->location === 'database' )
|
||||
{
|
||||
$templates['database'][ $template->group ] = $title;
|
||||
}
|
||||
else if ( $template->location === 'block' )
|
||||
{
|
||||
$templates['block'][ $template->key ] = $title . ' > ' . $template->title;
|
||||
}
|
||||
else if ( $template->location === 'page' )
|
||||
{
|
||||
$templates['page'][ $template->key ] = $title . ' > ' . $template->title;
|
||||
}
|
||||
}
|
||||
|
||||
foreach( $templates as $location => $data )
|
||||
{
|
||||
$form->add( new \IPS\Helpers\Form\CheckboxSet( 'templates_' . $location, FALSE, FALSE, array( 'options' => $data ) ) );
|
||||
}
|
||||
$form->addButton( 'cms_templates_export_return', 'link', \IPS\Http\Url::internal( "app=cms&module=pages&controller=templates" ) );
|
||||
$form = \IPS\cms\Templates::exportForm();
|
||||
|
||||
if ( $values = $form->values() )
|
||||
{
|
||||
$exportTemplates = array();
|
||||
foreach( $templates as $location => $data )
|
||||
{
|
||||
if ( isset( $values[ 'templates_' . $location ] ) and count( $values[ 'templates_' . $location ] ) )
|
||||
{
|
||||
if ( $location === 'database' )
|
||||
{
|
||||
$tmp = \IPS\cms\Theme::i()->getRawTemplates( 'cms', array('database'), array_values( $values[ 'templates_' . $location ] ) );
|
||||
$xml = \IPS\cms\Templates::exportAsXml( $values );
|
||||
|
||||
foreach( $tmp['cms'] as $loc => $data )
|
||||
{
|
||||
if ( $loc === $location )
|
||||
{
|
||||
foreach ( $data as $key => $tdata )
|
||||
{
|
||||
foreach ( $tdata as $tkey => $tkdata )
|
||||
{
|
||||
$exportTemplates['cms'][ $location ][ $key ][ $tkey ] = $tkdata;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$tmp = \IPS\cms\Theme::i()->getRawTemplates( 'cms', array( $location ), NULL, \IPS\cms\Theme::RETURN_DATABASE_ONLY + \IPS\cms\Theme::RETURN_ALL );
|
||||
|
||||
foreach( $tmp['cms'] as $loc => $data )
|
||||
{
|
||||
if ( $loc === $location )
|
||||
{
|
||||
foreach( $data as $key => $tdata )
|
||||
{
|
||||
foreach( $tdata as $tkey => $tkdata )
|
||||
{
|
||||
if ( in_array( $tkey, $values[ 'templates_' . $location ] ) )
|
||||
{
|
||||
$exportTemplates['cms'][ $location ][ $key ][ $tkey ] = $tkdata;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( count( $exportTemplates ) )
|
||||
{
|
||||
/* Init */
|
||||
$xml = new \XMLWriter;
|
||||
$xml->openMemory();
|
||||
$xml->setIndent( TRUE );
|
||||
$xml->startDocument( '1.0', 'UTF-8' );
|
||||
|
||||
/* Root tag */
|
||||
$xml->startElement('templates');
|
||||
|
||||
foreach ( $exportTemplates as $app => $location )
|
||||
{
|
||||
foreach ( $location as $key => $data )
|
||||
{
|
||||
foreach ( $data as $group => $template )
|
||||
{
|
||||
foreach( $template as $key => $templateData )
|
||||
{
|
||||
/* Initiate the <template> tag */
|
||||
$xml->startElement( 'template' );
|
||||
|
||||
foreach ( $templateData as $k => $v )
|
||||
{
|
||||
if ( ! in_array( \substr( $k, 9 ), array( 'content', 'params' ) ) )
|
||||
{
|
||||
$xml->startAttribute( $k );
|
||||
$xml->text( $v );
|
||||
$xml->endAttribute();
|
||||
}
|
||||
}
|
||||
|
||||
/* Write (potential) HTML fields */
|
||||
foreach( array( 'template_params', 'template_content' ) as $field )
|
||||
{
|
||||
if ( isset( $templateData[ $field ] ) )
|
||||
{
|
||||
$xml->startElement( $field );
|
||||
if ( preg_match( '/<|>|&/', $templateData[ $field ] ) )
|
||||
{
|
||||
$xml->writeCData( str_replace( ']]>', ']]]]><![CDATA[>', $templateData[ $field ] ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
$xml->text( $templateData[ $field ] );
|
||||
}
|
||||
$xml->endElement();
|
||||
}
|
||||
}
|
||||
|
||||
/* Close the <template> tag */
|
||||
$xml->endElement();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Finish */
|
||||
$xml->endDocument();
|
||||
|
||||
\IPS\Output::i()->sendOutput( $xml->outputMemory(), 200, 'application/xml', array( 'Content-Disposition' => \IPS\Output::getContentDisposition( 'attachment', "pages_templates.xml" ) ) );
|
||||
}
|
||||
else
|
||||
if( $xml === NULL )
|
||||
{
|
||||
\IPS\Output::i()->error( 'cms_no_templates_selected', '1T285/1', 403, '' );
|
||||
}
|
||||
\IPS\Output::i()->sendOutput( $xml->outputMemory(), 200, 'application/xml', array( 'Content-Disposition' => \IPS\Output::getContentDisposition( 'attachment', "pages_templates.xml" ) ) );
|
||||
}
|
||||
|
||||
\IPS\Output::i()->breadcrumb[] = array( \IPS\Http\Url::internal( "app=cms&module=pages&controller=templates" ), \IPS\Member::loggedIn()->language()->addToStack( 'menu__cms_pages_templates' ) );
|
||||
@@ -430,7 +403,7 @@ class _templates extends \IPS\Dispatcher\Controller
|
||||
\IPS\Output::i()->sidebar['actions']['add'] = array(
|
||||
'icon' => 'cog',
|
||||
'title' => 'content_import_dev_templates',
|
||||
'link' => \IPS\Http\Url::internal( "app=cms&module=pages&controller=templates&do=importInDev" ),
|
||||
'link' => \IPS\Http\Url::internal( "app=cms&module=pages&controller=templates&do=importInDev" )->csrf(),
|
||||
'data' => array()
|
||||
);
|
||||
}
|
||||
@@ -523,10 +496,21 @@ class _templates extends \IPS\Dispatcher\Controller
|
||||
/* PHP Keywords cannot be used as template names - so make sure the full template name is not in the list */
|
||||
$keywords = array( 'abstract', 'and', 'array', 'as', 'break', 'callable', 'case', 'catch', 'class', 'clone', 'const', 'continue', 'declare', 'default', 'die', 'do', 'echo', 'else', 'elseif', 'empty', 'enddeclare', 'endfor', 'endforeach', 'endif', 'endswitch', 'endwhile', 'eval', 'exit', 'extends', 'final', 'for', 'foreach', 'function', 'global', 'goto', 'if', 'implements', 'include', 'include_once', 'instanceof', 'insteadof', 'interface', 'isset', 'list', 'namespace', 'new', 'or', 'print', 'private', 'protected', 'public', 'require', 'require_once', 'return', 'static', 'switch', 'throw', 'trait', 'try', 'unset', 'use', 'var', 'while', 'xor' );
|
||||
|
||||
if ( in_array( $val, $keywords ) )
|
||||
if ( \in_array( $val, $keywords ) )
|
||||
{
|
||||
throw new \DomainException( \IPS\Member::loggedIn()->language()->addToStack( 'template_reserved_word', FALSE, array( 'htmlsprintf' => array( \IPS\Member::loggedIn()->language()->formatList( $keywords ) ) ) ) );
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
$count = \IPS\Db::i()->select( 'COUNT(*)', 'cms_templates', array( "LOWER(template_title)=?", mb_strtolower( str_replace( ' ', '_', $val ) ) ) )->first();
|
||||
|
||||
if ( $count )
|
||||
{
|
||||
throw new \DomainException( 'cms_template_title_exists' );
|
||||
}
|
||||
}
|
||||
catch( \UnderflowException $e ) {}
|
||||
} ) );
|
||||
|
||||
/* Very specific */
|
||||
@@ -558,7 +542,7 @@ class _templates extends \IPS\Dispatcher\Controller
|
||||
foreach ( \IPS\Db::i()->select( "*", 'core_widgets', array( 'embeddable=1') ) as $widget )
|
||||
{
|
||||
/* Skip disabled applications */
|
||||
if ( !in_array( $widget['app'], array_keys( \IPS\Application::enabledApplications() ) ) )
|
||||
if ( !\in_array( $widget['app'], array_keys( \IPS\Application::enabledApplications() ) ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
@@ -609,7 +593,7 @@ class _templates extends \IPS\Dispatcher\Controller
|
||||
}
|
||||
}
|
||||
|
||||
if ( ! count( $groups ) )
|
||||
if ( ! \count( $groups ) )
|
||||
{
|
||||
$groups[ $type ] = \IPS\cms\Templates::readableGroupName( $type );
|
||||
}
|
||||
@@ -621,7 +605,18 @@ class _templates extends \IPS\Dispatcher\Controller
|
||||
'new' => array( 'group_new' ) )
|
||||
) ) );
|
||||
|
||||
$form->add( new \IPS\Helpers\Form\Text( 'template_group_new', NULL, FALSE, array( 'regex' => '/^([a-z_][a-z0-9_]+?)?$/' ), NULL, NULL, NULL, 'group_new' ) );
|
||||
$form->add( new \IPS\Helpers\Form\Text( 'template_group_new', NULL, FALSE, array( 'regex' => '/^([a-z_][a-z0-9_]+?)?$/' ), function( $val ) {
|
||||
try
|
||||
{
|
||||
$count = \IPS\Db::i()->select( 'COUNT(*)', 'cms_templates', array( "LOWER(template_group)=?", mb_strtolower( str_replace( ' ', '_', $val ) ) ) )->first();
|
||||
|
||||
if ( $count )
|
||||
{
|
||||
throw new \DomainException( 'cms_template_group_exists' );
|
||||
}
|
||||
}
|
||||
catch( \UnderflowException $e ) {}
|
||||
}, NULL, NULL, 'group_new' ) );
|
||||
$form->add( new \IPS\Helpers\Form\Select( 'template_group_existing', NULL, FALSE, array( 'options' => $groups ), NULL, NULL, NULL, 'group_existing' ) );
|
||||
}
|
||||
|
||||
@@ -779,7 +774,7 @@ class _templates extends \IPS\Dispatcher\Controller
|
||||
}
|
||||
else
|
||||
{
|
||||
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=cms&module=pages&controller=templates' ), 'saved' );
|
||||
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=cms&module=pages&controller=templates' )->setQueryString( ['id' => $newTemplate->id, 't_location' => $newTemplate->location, 't_type' => $type ] ), 'saved' );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -846,6 +841,27 @@ class _templates extends \IPS\Dispatcher\Controller
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Show a difference report for an individual template file
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function diffTemplate()
|
||||
{
|
||||
$customVersion = \IPS\Db::i()->select( '*', 'cms_templates', array( 'template_id=?', (int) \IPS\Request::i()->t_item_id ) )->first();
|
||||
|
||||
try
|
||||
{
|
||||
$original = \IPS\Db::i()->select( 'template_content', 'cms_templates', array( 'template_location=? and template_group=? and template_title=? and template_master=1', $customVersion['template_location'], $customVersion['template_original_group'], $customVersion['template_title'] ) )->first();
|
||||
}
|
||||
catch( \UnderflowException $e )
|
||||
{
|
||||
$original = FALSE;
|
||||
}
|
||||
|
||||
\IPS\Output::i()->json( $original );
|
||||
}
|
||||
|
||||
/**
|
||||
* Saves a template
|
||||
*
|
||||
@@ -853,6 +869,8 @@ class _templates extends \IPS\Dispatcher\Controller
|
||||
*/
|
||||
public function save()
|
||||
{
|
||||
\IPS\Session::i()->csrfCheck();
|
||||
|
||||
$key = \IPS\Request::i()->t_key;
|
||||
|
||||
$contentKey = 'editor_' . $key;
|
||||
@@ -864,12 +882,33 @@ class _templates extends \IPS\Dispatcher\Controller
|
||||
try
|
||||
{
|
||||
$obj = \IPS\cms\Templates::load( $key );
|
||||
|
||||
$obj->location = \IPS\Request::i()->t_location;
|
||||
$obj->group = empty( \IPS\Request::i()->t_group ) ? null : \IPS\Request::i()->t_group;
|
||||
$obj->title = \IPS\Request::i()->t_name;
|
||||
$obj->params = $variables;
|
||||
$obj->content = $content;
|
||||
|
||||
if ( $obj->master )
|
||||
{
|
||||
/* Do not edit a master bit directly, but overload it */
|
||||
$clone = new \IPS\cms\Templates;
|
||||
$clone->key = $obj->key;
|
||||
$clone->title = \IPS\Request::i()->t_name;
|
||||
$clone->content = $content;
|
||||
$clone->location = \IPS\Request::i()->t_location;
|
||||
$clone->group = empty( \IPS\Request::i()->t_group ) ? null : \IPS\Request::i()->t_group;
|
||||
$clone->params = $variables;
|
||||
$clone->container = $obj->container;
|
||||
$clone->position = $obj->position;
|
||||
$clone->user_edited = 1;
|
||||
$clone->master = 0;
|
||||
$clone->save();
|
||||
}
|
||||
else
|
||||
{
|
||||
$obj->location = \IPS\Request::i()->t_location;
|
||||
$obj->group = empty( \IPS\Request::i()->t_group ) ? null : \IPS\Request::i()->t_group;
|
||||
$obj->title = \IPS\Request::i()->t_name;
|
||||
$obj->params = $variables;
|
||||
$obj->content = $content;
|
||||
$obj->user_edited = 1;
|
||||
}
|
||||
|
||||
if( $description )
|
||||
{
|
||||
$obj->description = $description;
|
||||
@@ -935,7 +974,7 @@ class _templates extends \IPS\Dispatcher\Controller
|
||||
$databases[ $database['database_id'] ] = \IPS\cms\Databases::constructFromData( $database );
|
||||
}
|
||||
|
||||
if ( count( $databases ) )
|
||||
if ( \count( $databases ) )
|
||||
{
|
||||
$names = array();
|
||||
foreach( $databases as $db )
|
||||
@@ -946,8 +985,25 @@ class _templates extends \IPS\Dispatcher\Controller
|
||||
$form->addMessage( \IPS\Member::loggedIn()->language()->addToStack( 'cms_database_template_used_in', NULL, array( 'sprintf' => array( \IPS\Member::loggedIn()->language()->formatList( $names ) ) ) ), 'ipsMessage ipsMessage_info' );
|
||||
}
|
||||
|
||||
$form->add( new \IPS\Helpers\Form\Text( 'cms_database_group_name', \IPS\cms\Templates::readableGroupName( \IPS\Request::i()->group ), NULL, array( 'regex' => '/^([A-Z_][A-Z0-9_\.\s]+?)$/i' ) ) );
|
||||
$form->addButton( "delete", "link", \IPS\Http\Url::internal( 'app=cms&module=pages&controller=templates&do=deleteTemplateGroup&group=' . \IPS\Request::i()->group . '&t_location=' . \IPS\Request::i()->t_location ), 'ipsButton ipsButton_negative', array( 'data-confirm' => 'true' ) );
|
||||
$form->add( new \IPS\Helpers\Form\Text( 'cms_database_group_name', \IPS\cms\Templates::readableGroupName( \IPS\Request::i()->group ), NULL, array( 'regex' => '/^([A-Z_][A-Z0-9_\.\s]+?)$/i' ), function( $val ) {
|
||||
/* PHP Keywords cannot be used as template names - so make sure the full template name is not in the list */
|
||||
$keywords = array( 'abstract', 'and', 'array', 'as', 'break', 'callable', 'case', 'catch', 'class', 'clone', 'const', 'continue', 'declare', 'default', 'die', 'do', 'echo', 'else', 'elseif', 'empty', 'enddeclare', 'endfor', 'endforeach', 'endif', 'endswitch', 'endwhile', 'eval', 'exit', 'extends', 'final', 'for', 'foreach', 'function', 'global', 'goto', 'if', 'implements', 'include', 'include_once', 'instanceof', 'insteadof', 'interface', 'isset', 'list', 'namespace', 'new', 'or', 'print', 'private', 'protected', 'public', 'require', 'require_once', 'return', 'static', 'switch', 'throw', 'trait', 'try', 'unset', 'use', 'var', 'while', 'xor' );
|
||||
|
||||
if ( \in_array( $val, $keywords ) )
|
||||
{
|
||||
throw new \DomainException( \IPS\Member::loggedIn()->language()->addToStack( 'template_reserved_word', FALSE, array( 'htmlsprintf' => array( \IPS\Member::loggedIn()->language()->formatList( $keywords ) ) ) ) );
|
||||
}
|
||||
|
||||
if ( mb_strtolower( str_replace( ' ', '_', $val ) ) != mb_strtolower( str_replace( ' ', '_', \IPS\Request::i()->group ) ) )
|
||||
{
|
||||
$count = \IPS\Db::i()->select( 'COUNT(*)', 'cms_templates', array( "LOWER(template_group)=?", mb_strtolower( str_replace( ' ', '_', $val ) ) ) )->first();
|
||||
if ( $count )
|
||||
{
|
||||
throw new \DomainException( 'cms_template_group_exists' );
|
||||
}
|
||||
}
|
||||
} ) );
|
||||
$form->addButton( "delete", "link", \IPS\Http\Url::internal( 'app=cms&module=pages&controller=templates&do=deleteTemplateGroup&group=' . \IPS\Request::i()->group . '&t_location=' . \IPS\Request::i()->t_location )->csrf(), 'ipsButton ipsButton_negative', array( 'data-confirm' => 'true' ) );
|
||||
|
||||
if ( $values = $form->values() )
|
||||
{
|
||||
@@ -983,6 +1039,8 @@ class _templates extends \IPS\Dispatcher\Controller
|
||||
*/
|
||||
protected function findAndUpdateTemplates( $new, $old )
|
||||
{
|
||||
\IPS\Session::i()->csrfCheck();
|
||||
|
||||
foreach( \IPS\Db::i()->select( '*', 'cms_templates', array( 'template_content LIKE ?', '%' . $old . '%' ) ) as $template )
|
||||
{
|
||||
/* Make sure template tags call the correct group */
|
||||
@@ -1025,6 +1083,8 @@ class _templates extends \IPS\Dispatcher\Controller
|
||||
*/
|
||||
public function deleteTemplateGroup()
|
||||
{
|
||||
\IPS\Session::i()->csrfCheck();
|
||||
|
||||
foreach( \IPS\cms\Templates::$databaseDefaults as $field => $template )
|
||||
{
|
||||
\IPS\Db::i()->update( 'cms_databases', array( 'database_template_' . $field => $template ), array( 'database_template_' . $field . ' =?', \IPS\Request::i()->group ) );
|
||||
|
||||
Reference in new issue
Block a user