forked from phpbb/phpbb
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge remote-tracking branch 'github-marc1706/ticket/13263' into prep…
…-release-3.1.1 * github-marc1706/ticket/13263: [ticket/13263] Make sure default style exists and clean up code [ticket/13263] Only install/set prosilver if no style available [ticket/13263] Use prosilver as default style if user's style doesn't exist
- Loading branch information
Showing
1 changed file
with
136 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,136 @@ | ||
<?php | ||
/** | ||
* | ||
* This file is part of the phpBB Forum Software package. | ||
* | ||
* @copyright (c) phpBB Limited <https://www.phpbb.com> | ||
* @license GNU General Public License, version 2 (GPL-2.0) | ||
* | ||
* For full copyright and license information, please see | ||
* the docs/CREDITS.txt file. | ||
* | ||
*/ | ||
|
||
namespace phpbb\db\migration\data\v31x; | ||
|
||
class style_update extends \phpbb\db\migration\migration | ||
{ | ||
static public function depends_on() | ||
{ | ||
return array('\phpbb\db\migration\data\v310\gold'); | ||
} | ||
|
||
public function update_data() | ||
{ | ||
return array( | ||
array('custom', array(array($this, 'update_installed_styles'))), | ||
); | ||
} | ||
|
||
public function update_installed_styles() | ||
{ | ||
// Get all currently available styles | ||
$styles = $this->find_style_dirs(); | ||
$style_paths = $style_ids = array(); | ||
|
||
$sql = 'SELECT style_path, style_id | ||
FROM ' . $this->table_prefix . 'styles'; | ||
$result = $this->db->sql_query($sql); | ||
while ($styles_row = $this->db->sql_fetchrow()) | ||
{ | ||
if (in_array($styles_row['style_path'], $styles)) | ||
{ | ||
$style_paths[] = $styles_row['style_path']; | ||
$style_ids[] = $styles_row['style_id']; | ||
} | ||
} | ||
$this->db->sql_freeresult($result); | ||
|
||
// Install prosilver if no style is available and prosilver can be installed | ||
if (empty($style_paths) && in_array('prosilver', $styles)) | ||
{ | ||
// Try to parse config file | ||
$cfg = parse_cfg_file($this->phpbb_root_path . 'styles/prosilver/style.cfg'); | ||
|
||
// Stop running this if prosilver cfg file can't be read | ||
if (empty($cfg)) | ||
{ | ||
throw new \RuntimeException('No styles available and could not fall back to prosilver.'); | ||
} | ||
|
||
$style = array( | ||
'style_name' => 'prosilver', | ||
'style_copyright' => '© phpBB Limited', | ||
'style_active' => 1, | ||
'style_path' => 'prosilver', | ||
'bbcode_bitfield' => 'kNg=', | ||
'style_parent_id' => 0, | ||
'style_parent_tree' => '', | ||
); | ||
|
||
// Add to database | ||
$this->db->sql_transaction('begin'); | ||
|
||
$sql = 'INSERT INTO ' . $this->table_prefix . 'styles | ||
' . $this->db->sql_build_array('INSERT', $style); | ||
$this->db->sql_query($sql); | ||
|
||
$style_id = $this->db->sql_nextid(); | ||
$style_ids[] = $style_id; | ||
|
||
$this->db->sql_transaction('commit'); | ||
|
||
// Set prosilver to default style | ||
$this->config->set('default_style', $style_id); | ||
} | ||
else if (empty($styles) && empty($available_styles)) | ||
{ | ||
throw new \RuntimeException('No valid styles available'); | ||
} | ||
|
||
// Make sure default style is available | ||
if (!in_array($this->config['default_style'], $style_ids)) | ||
{ | ||
$this->config->set('default_style', array_pop($style_ids)); | ||
} | ||
|
||
// Reset users to default style if their user_style is nonexistent | ||
$sql = 'UPDATE ' . $this->table_prefix . "users | ||
SET user_style = {$this->config['default_style']} | ||
WHERE " . $this->db->sql_in_set('user_style', $style_ids, true, true); | ||
$this->db->sql_query($sql); | ||
} | ||
|
||
/** | ||
* Find all directories that have styles | ||
* Copied from acp_styles | ||
* | ||
* @return array Directory names | ||
*/ | ||
protected function find_style_dirs() | ||
{ | ||
$styles = array(); | ||
$styles_path = $this->phpbb_root_path . 'styles/'; | ||
|
||
$dp = @opendir($styles_path); | ||
if ($dp) | ||
{ | ||
while (($file = readdir($dp)) !== false) | ||
{ | ||
$dir = $styles_path . $file; | ||
if ($file[0] == '.' || !is_dir($dir)) | ||
{ | ||
continue; | ||
} | ||
|
||
if (file_exists("{$dir}/style.cfg")) | ||
{ | ||
$styles[] = $file; | ||
} | ||
} | ||
closedir($dp); | ||
} | ||
|
||
return $styles; | ||
} | ||
} |