diff options
Diffstat (limited to 'application/render')
-rw-r--r-- | application/render/PageBuilder.php | 213 | ||||
-rw-r--r-- | application/render/ThemeUtils.php | 34 |
2 files changed, 247 insertions, 0 deletions
diff --git a/application/render/PageBuilder.php b/application/render/PageBuilder.php new file mode 100644 index 00000000..0569b67f --- /dev/null +++ b/application/render/PageBuilder.php | |||
@@ -0,0 +1,213 @@ | |||
1 | <?php | ||
2 | |||
3 | namespace Shaarli\Render; | ||
4 | |||
5 | use Exception; | ||
6 | use RainTPL; | ||
7 | use Shaarli\ApplicationUtils; | ||
8 | use Shaarli\Bookmark\LinkDB; | ||
9 | use Shaarli\Config\ConfigManager; | ||
10 | use Shaarli\Thumbnailer; | ||
11 | |||
12 | /** | ||
13 | * This class is in charge of building the final page. | ||
14 | * (This is basically a wrapper around RainTPL which pre-fills some fields.) | ||
15 | * $p = new PageBuilder(); | ||
16 | * $p->assign('myfield','myvalue'); | ||
17 | * $p->renderPage('mytemplate'); | ||
18 | */ | ||
19 | class PageBuilder | ||
20 | { | ||
21 | /** | ||
22 | * @var RainTPL RainTPL instance. | ||
23 | */ | ||
24 | private $tpl; | ||
25 | |||
26 | /** | ||
27 | * @var ConfigManager $conf Configuration Manager instance. | ||
28 | */ | ||
29 | protected $conf; | ||
30 | |||
31 | /** | ||
32 | * @var array $_SESSION | ||
33 | */ | ||
34 | protected $session; | ||
35 | |||
36 | /** | ||
37 | * @var LinkDB $linkDB instance. | ||
38 | */ | ||
39 | protected $linkDB; | ||
40 | |||
41 | /** | ||
42 | * @var null|string XSRF token | ||
43 | */ | ||
44 | protected $token; | ||
45 | |||
46 | /** | ||
47 | * @var bool $isLoggedIn Whether the user is logged in | ||
48 | */ | ||
49 | protected $isLoggedIn = false; | ||
50 | |||
51 | /** | ||
52 | * PageBuilder constructor. | ||
53 | * $tpl is initialized at false for lazy loading. | ||
54 | * | ||
55 | * @param ConfigManager $conf Configuration Manager instance (reference). | ||
56 | * @param array $session $_SESSION array | ||
57 | * @param LinkDB $linkDB instance. | ||
58 | * @param string $token Session token | ||
59 | * @param bool $isLoggedIn | ||
60 | */ | ||
61 | public function __construct(&$conf, $session, $linkDB = null, $token = null, $isLoggedIn = false) | ||
62 | { | ||
63 | $this->tpl = false; | ||
64 | $this->conf = $conf; | ||
65 | $this->session = $session; | ||
66 | $this->linkDB = $linkDB; | ||
67 | $this->token = $token; | ||
68 | $this->isLoggedIn = $isLoggedIn; | ||
69 | } | ||
70 | |||
71 | /** | ||
72 | * Initialize all default tpl tags. | ||
73 | */ | ||
74 | private function initialize() | ||
75 | { | ||
76 | $this->tpl = new RainTPL(); | ||
77 | |||
78 | try { | ||
79 | $version = ApplicationUtils::checkUpdate( | ||
80 | SHAARLI_VERSION, | ||
81 | $this->conf->get('resource.update_check'), | ||
82 | $this->conf->get('updates.check_updates_interval'), | ||
83 | $this->conf->get('updates.check_updates'), | ||
84 | $this->isLoggedIn, | ||
85 | $this->conf->get('updates.check_updates_branch') | ||
86 | ); | ||
87 | $this->tpl->assign('newVersion', escape($version)); | ||
88 | $this->tpl->assign('versionError', ''); | ||
89 | } catch (Exception $exc) { | ||
90 | logm($this->conf->get('resource.log'), $_SERVER['REMOTE_ADDR'], $exc->getMessage()); | ||
91 | $this->tpl->assign('newVersion', ''); | ||
92 | $this->tpl->assign('versionError', escape($exc->getMessage())); | ||
93 | } | ||
94 | |||
95 | $this->tpl->assign('is_logged_in', $this->isLoggedIn); | ||
96 | $this->tpl->assign('feedurl', escape(index_url($_SERVER))); | ||
97 | $searchcrits = ''; // Search criteria | ||
98 | if (!empty($_GET['searchtags'])) { | ||
99 | $searchcrits .= '&searchtags=' . urlencode($_GET['searchtags']); | ||
100 | } | ||
101 | if (!empty($_GET['searchterm'])) { | ||
102 | $searchcrits .= '&searchterm=' . urlencode($_GET['searchterm']); | ||
103 | } | ||
104 | $this->tpl->assign('searchcrits', $searchcrits); | ||
105 | $this->tpl->assign('source', index_url($_SERVER)); | ||
106 | $this->tpl->assign('version', SHAARLI_VERSION); | ||
107 | $this->tpl->assign( | ||
108 | 'version_hash', | ||
109 | ApplicationUtils::getVersionHash(SHAARLI_VERSION, $this->conf->get('credentials.salt')) | ||
110 | ); | ||
111 | $this->tpl->assign('index_url', index_url($_SERVER)); | ||
112 | $visibility = !empty($_SESSION['visibility']) ? $_SESSION['visibility'] : ''; | ||
113 | $this->tpl->assign('visibility', $visibility); | ||
114 | $this->tpl->assign('untaggedonly', !empty($_SESSION['untaggedonly'])); | ||
115 | $this->tpl->assign('pagetitle', $this->conf->get('general.title', 'Shaarli')); | ||
116 | if ($this->conf->exists('general.header_link')) { | ||
117 | $this->tpl->assign('titleLink', $this->conf->get('general.header_link')); | ||
118 | } | ||
119 | $this->tpl->assign('shaarlititle', $this->conf->get('general.title', 'Shaarli')); | ||
120 | $this->tpl->assign('openshaarli', $this->conf->get('security.open_shaarli', false)); | ||
121 | $this->tpl->assign('showatom', $this->conf->get('feed.show_atom', true)); | ||
122 | $this->tpl->assign('feed_type', $this->conf->get('feed.show_atom', true) !== false ? 'atom' : 'rss'); | ||
123 | $this->tpl->assign('hide_timestamps', $this->conf->get('privacy.hide_timestamps', false)); | ||
124 | $this->tpl->assign('token', $this->token); | ||
125 | |||
126 | if ($this->linkDB !== null) { | ||
127 | $this->tpl->assign('tags', $this->linkDB->linksCountPerTag()); | ||
128 | } | ||
129 | |||
130 | $this->tpl->assign( | ||
131 | 'thumbnails_enabled', | ||
132 | $this->conf->get('thumbnails.mode', Thumbnailer::MODE_NONE) !== Thumbnailer::MODE_NONE | ||
133 | ); | ||
134 | $this->tpl->assign('thumbnails_width', $this->conf->get('thumbnails.width')); | ||
135 | $this->tpl->assign('thumbnails_height', $this->conf->get('thumbnails.height')); | ||
136 | |||
137 | if (!empty($_SESSION['warnings'])) { | ||
138 | $this->tpl->assign('global_warnings', $_SESSION['warnings']); | ||
139 | unset($_SESSION['warnings']); | ||
140 | } | ||
141 | |||
142 | // To be removed with a proper theme configuration. | ||
143 | $this->tpl->assign('conf', $this->conf); | ||
144 | } | ||
145 | |||
146 | /** | ||
147 | * The following assign() method is basically the same as RainTPL (except lazy loading) | ||
148 | * | ||
149 | * @param string $placeholder Template placeholder. | ||
150 | * @param mixed $value Value to assign. | ||
151 | */ | ||
152 | public function assign($placeholder, $value) | ||
153 | { | ||
154 | if ($this->tpl === false) { | ||
155 | $this->initialize(); | ||
156 | } | ||
157 | $this->tpl->assign($placeholder, $value); | ||
158 | } | ||
159 | |||
160 | /** | ||
161 | * Assign an array of data to the template builder. | ||
162 | * | ||
163 | * @param array $data Data to assign. | ||
164 | * | ||
165 | * @return false if invalid data. | ||
166 | */ | ||
167 | public function assignAll($data) | ||
168 | { | ||
169 | if ($this->tpl === false) { | ||
170 | $this->initialize(); | ||
171 | } | ||
172 | |||
173 | if (empty($data) || !is_array($data)) { | ||
174 | return false; | ||
175 | } | ||
176 | |||
177 | foreach ($data as $key => $value) { | ||
178 | $this->assign($key, $value); | ||
179 | } | ||
180 | return true; | ||
181 | } | ||
182 | |||
183 | /** | ||
184 | * Render a specific page (using a template file). | ||
185 | * e.g. $pb->renderPage('picwall'); | ||
186 | * | ||
187 | * @param string $page Template filename (without extension). | ||
188 | */ | ||
189 | public function renderPage($page) | ||
190 | { | ||
191 | if ($this->tpl === false) { | ||
192 | $this->initialize(); | ||
193 | } | ||
194 | |||
195 | $this->tpl->draw($page); | ||
196 | } | ||
197 | |||
198 | /** | ||
199 | * Render a 404 page (uses the template : tpl/404.tpl) | ||
200 | * usage: $PAGE->render404('The link was deleted') | ||
201 | * | ||
202 | * @param string $message A message to display what is not found | ||
203 | */ | ||
204 | public function render404($message = '') | ||
205 | { | ||
206 | if (empty($message)) { | ||
207 | $message = t('The page you are trying to reach does not exist or has been deleted.'); | ||
208 | } | ||
209 | header($_SERVER['SERVER_PROTOCOL'] . ' ' . t('404 Not Found')); | ||
210 | $this->tpl->assign('error_message', $message); | ||
211 | $this->renderPage('404'); | ||
212 | } | ||
213 | } | ||
diff --git a/application/render/ThemeUtils.php b/application/render/ThemeUtils.php new file mode 100644 index 00000000..86096c64 --- /dev/null +++ b/application/render/ThemeUtils.php | |||
@@ -0,0 +1,34 @@ | |||
1 | <?php | ||
2 | |||
3 | namespace Shaarli\Render; | ||
4 | |||
5 | /** | ||
6 | * Class ThemeUtils | ||
7 | * | ||
8 | * Utility functions related to theme management. | ||
9 | * | ||
10 | * @package Shaarli | ||
11 | */ | ||
12 | class ThemeUtils | ||
13 | { | ||
14 | /** | ||
15 | * Get a list of available themes. | ||
16 | * | ||
17 | * It will return the name of any directory present in the template folder. | ||
18 | * | ||
19 | * @param string $tplDir Templates main directory. | ||
20 | * | ||
21 | * @return array List of theme names. | ||
22 | */ | ||
23 | public static function getThemes($tplDir) | ||
24 | { | ||
25 | $tplDir = rtrim($tplDir, '/'); | ||
26 | $allTheme = glob($tplDir.'/*', GLOB_ONLYDIR); | ||
27 | $themes = []; | ||
28 | foreach ($allTheme as $value) { | ||
29 | $themes[] = str_replace($tplDir.'/', '', $value); | ||
30 | } | ||
31 | |||
32 | return $themes; | ||
33 | } | ||
34 | } | ||