Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
| Total | |
7.27% |
4 / 55 |
|
50.00% |
2 / 4 |
CRAP | |
0.00% |
0 / 1 |
| style_update | |
7.27% |
4 / 55 |
|
50.00% |
2 / 4 |
306.83 | |
0.00% |
0 / 1 |
| depends_on | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
| update_data | |
100.00% |
3 / 3 |
|
100.00% |
1 / 1 |
1 | |||
| update_installed_styles | |
0.00% |
0 / 39 |
|
0.00% |
0 / 1 |
110 | |||
| find_style_dirs | |
0.00% |
0 / 12 |
|
0.00% |
0 / 1 |
56 | |||
| 1 | <?php |
| 2 | /** |
| 3 | * |
| 4 | * This file is part of the phpBB Forum Software package. |
| 5 | * |
| 6 | * @copyright (c) phpBB Limited <https://www.phpbb.com> |
| 7 | * @license GNU General Public License, version 2 (GPL-2.0) |
| 8 | * |
| 9 | * For full copyright and license information, please see |
| 10 | * the docs/CREDITS.txt file. |
| 11 | * |
| 12 | */ |
| 13 | |
| 14 | namespace phpbb\db\migration\data\v31x; |
| 15 | |
| 16 | class style_update extends \phpbb\db\migration\migration |
| 17 | { |
| 18 | public static function depends_on() |
| 19 | { |
| 20 | return array('\phpbb\db\migration\data\v310\gold'); |
| 21 | } |
| 22 | |
| 23 | public function update_data() |
| 24 | { |
| 25 | return array( |
| 26 | array('custom', array(array($this, 'update_installed_styles'))), |
| 27 | ); |
| 28 | } |
| 29 | |
| 30 | public function update_installed_styles() |
| 31 | { |
| 32 | // Get all currently available styles |
| 33 | $styles = $this->find_style_dirs(); |
| 34 | $style_paths = $style_ids = array(); |
| 35 | |
| 36 | $sql = 'SELECT style_path, style_id |
| 37 | FROM ' . $this->table_prefix . 'styles'; |
| 38 | $result = $this->db->sql_query($sql); |
| 39 | while ($styles_row = $this->db->sql_fetchrow()) |
| 40 | { |
| 41 | if (in_array($styles_row['style_path'], $styles)) |
| 42 | { |
| 43 | $style_paths[] = $styles_row['style_path']; |
| 44 | $style_ids[] = $styles_row['style_id']; |
| 45 | } |
| 46 | } |
| 47 | $this->db->sql_freeresult($result); |
| 48 | |
| 49 | // Install prosilver if no style is available and prosilver can be installed |
| 50 | if (empty($style_paths) && in_array('prosilver', $styles)) |
| 51 | { |
| 52 | // Try to parse config file |
| 53 | $cfg = parse_cfg_file($this->phpbb_root_path . 'styles/prosilver/style.cfg'); |
| 54 | |
| 55 | // Stop running this if both prosilver cfg file and composer.json file can't be read |
| 56 | if (empty($cfg) && !file_exists($this->phpbb_root_path . 'styles/prosilver/composer.json')) |
| 57 | { |
| 58 | throw new \RuntimeException('No styles available and could not fall back to prosilver.'); |
| 59 | } |
| 60 | |
| 61 | $style = array( |
| 62 | 'style_name' => 'prosilver', |
| 63 | 'style_copyright' => '© phpBB Limited', |
| 64 | 'style_active' => 1, |
| 65 | 'style_path' => 'prosilver', |
| 66 | 'bbcode_bitfield' => 'kNg=', |
| 67 | 'style_parent_id' => 0, |
| 68 | 'style_parent_tree' => '', |
| 69 | ); |
| 70 | |
| 71 | // Add to database |
| 72 | $this->db->sql_transaction('begin'); |
| 73 | |
| 74 | $sql = 'INSERT INTO ' . $this->table_prefix . 'styles |
| 75 | ' . $this->db->sql_build_array('INSERT', $style); |
| 76 | $this->db->sql_query($sql); |
| 77 | |
| 78 | $style_id = $this->db->sql_nextid(); |
| 79 | $style_ids[] = $style_id; |
| 80 | |
| 81 | $this->db->sql_transaction('commit'); |
| 82 | |
| 83 | // Set prosilver to default style |
| 84 | $this->config->set('default_style', $style_id); |
| 85 | } |
| 86 | else if (empty($styles) && empty($style_paths)) |
| 87 | { |
| 88 | throw new \RuntimeException('No valid styles available'); |
| 89 | } |
| 90 | |
| 91 | // Make sure default style is available |
| 92 | if (!in_array($this->config['default_style'], $style_ids)) |
| 93 | { |
| 94 | $this->config->set('default_style', array_pop($style_ids)); |
| 95 | } |
| 96 | |
| 97 | // Reset users to default style if their user_style is nonexistent |
| 98 | $sql = 'UPDATE ' . $this->table_prefix . "users |
| 99 | SET user_style = {$this->config['default_style']} |
| 100 | WHERE " . $this->db->sql_in_set('user_style', $style_ids, true, true); |
| 101 | $this->db->sql_query($sql); |
| 102 | } |
| 103 | |
| 104 | /** |
| 105 | * Find all directories that have styles |
| 106 | * Copied from acp_styles |
| 107 | * |
| 108 | * @return array Directory names |
| 109 | */ |
| 110 | protected function find_style_dirs() |
| 111 | { |
| 112 | $styles = array(); |
| 113 | $styles_path = $this->phpbb_root_path . 'styles/'; |
| 114 | |
| 115 | $dp = @opendir($styles_path); |
| 116 | if ($dp) |
| 117 | { |
| 118 | while (($file = readdir($dp)) !== false) |
| 119 | { |
| 120 | $dir = $styles_path . $file; |
| 121 | if ($file[0] == '.' || !is_dir($dir)) |
| 122 | { |
| 123 | continue; |
| 124 | } |
| 125 | |
| 126 | if (file_exists("{$dir}/composer.json") || file_exists("{$dir}/style.cfg")) |
| 127 | { |
| 128 | $styles[] = $file; |
| 129 | } |
| 130 | } |
| 131 | closedir($dp); |
| 132 | } |
| 133 | |
| 134 | return $styles; |
| 135 | } |
| 136 | } |