PluginProbe
Document Gallery / 2.2.4
Document Gallery v2.2.4
trunk 0.8 0.8.5 1.0 1.0.1 1.0.2 1.0.3 1.0.4 1.1 1.2 1.2.1 1.3 1.3.1 1.4 1.4.1 1.4.2 1.4.3 2.0 2.0.1 2.0.10 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 All 94 releases
← All changes | document-gallery.php +139 -41 2.0.52.2.4 View file →
@@ -4,9 +4,9 @@
4 4 /*
5 5 Plugin Name: Document Gallery
6 6 Plugin URI: http://wordpress.org/extend/plugins/document-gallery/
7 7 Description: Display non-images (and images) in gallery format on a page or post with the [dg] shortcode.
8 - Version: 2.0.5
8 + Version: 2.2.4
9 9 Author: Dan Rossiter
10 10 Author URI: http://danrossiter.org/
11 11 License: GPLv2
12 12 Text Domain: document-gallery
@@ -11,10 +11,12 @@
11 11 License: GPLv2
12 12 Text Domain: document-gallery
13 13 */
14 14
15 +define('DG_VERSION', '2.2.4');
16 +
15 17 // define helper paths & URLs
16 -define('DG_VERSION', '2.0.5');
18 +define('DG_BASENAME', plugin_basename(__FILE__));
17 19 define('DG_URL', plugin_dir_url(__FILE__));
18 20 define('DG_PATH', plugin_dir_path(__FILE__));
19 21 define('DG_WPINC_PATH', ABSPATH . WPINC . '/');
20 22 define('DG_WPADMIN_PATH', ABSPATH . 'wp-admin/');
@@ -23,13 +25,23 @@
23 25 global $dg_options;
24 26 define('DG_OPTION_NAME', 'document_gallery');
25 27 $dg_options = get_option(DG_OPTION_NAME, null);
26 28
27 -// handle activation and uninstallation
29 +// logging functionality
30 +include_once DG_PATH . 'inc/class-logger.php';
31 +
32 +// handle activation, updates, and uninstallation
28 33 include_once DG_PATH . 'inc/class-setup.php';
34 +register_activation_hook(__FILE__, array('DG_Setup', 'activate'));
35 +add_action('wpmu_new_blog', array('DG_Setup','activateNewBlog'));
36 +register_uninstall_hook(__FILE__, array('DG_Setup', 'uninstall'));
29 37 DG_Setup::maybeUpdate();
30 -register_uninstall_hook(__FILE__, array('DG_Setup', 'uninstall'));
31 38
39 +// validate options if desired
40 +if ($dg_options['validation']) {
41 + add_action('init', array('DocumentGallery', 'addValidation'));
42 +}
43 +
32 44 // I18n
33 45 add_action('plugins_loaded', array('DocumentGallery', 'loadTextDomain'));
34 46
35 47 // cleanup cached data when thumbed attachment deleted
@@ -40,17 +52,14 @@
40 52 // admin house keeping
41 53 include_once DG_PATH . 'admin/class-admin.php';
42 54
43 55 // add settings link
44 - add_filter('plugin_action_links_' . plugin_basename(__FILE__),
45 - array('DG_Admin', 'addSettingsLink'));
46 -
56 + add_filter('plugin_action_links_' . DG_BASENAME, array('DG_Admin', 'addSettingsLink'));
57 +
47 58 // build options page
48 59 add_action('admin_menu', array('DG_Admin', 'addAdminPage'));
49 - if (!empty($GLOBALS['pagenow'])
50 - && ('options-general.php' === $GLOBALS['pagenow'] // output
51 - || 'options.php' === $GLOBALS['pagenow'])) { // validation
52 - add_action('admin_init', array('DG_Admin', 'registerSettings'));
60 + if (DG_Admin::doRegisterSettings()) {
61 + add_action('admin_init', array('DG_Admin', 'registerSettings'));
53 62 }
54 63 } else {
55 64 // styling for gallery
56 65 if (empty($dg_options['css']['text'])) {
@@ -84,10 +93,10 @@
84 93 /**
85 94 * Takes values passed from attributes and returns sutable HTML to represent
86 95 * all valid attachments requested.
87 96 *
88 - * @param array $atts Arguments from the user.
89 - * @return string HTML for the Document Gallery.
97 + * @param multitype:string $atts Arguments from the user.
98 + * @return string HTML for the Document Gallery.
90 99 */
91 100 public static function doShortcode($atts) {
92 101 include_once 'inc/class-gallery.php';
93 102
@@ -92,9 +101,9 @@
92 101 include_once 'inc/class-gallery.php';
93 102
94 103 $start = microtime(true);
95 104 $gallery = (string)new DG_Gallery($atts);
96 - DocumentGallery::writeLog('Generation Time: ' . (microtime(true) - $start) . ' s');
105 + DG_Logger::writeLog(DG_LogLevel::Detail, 'Generation Time: ' . sprintf('%.2f', (microtime(true) - $start)) . ' s');
97 106
98 107 return $gallery;
99 108 }
100 109
@@ -101,10 +110,9 @@
101 110 /**
102 111 * Enqueue standard DG CSS.
103 112 */
104 113 public static function enqueueGalleryStyle() {
105 - wp_register_style('document-gallery', DG_URL . 'assets/css/style.css', null, DG_VERSION);
106 - wp_enqueue_style('document-gallery');
114 + wp_enqueue_style('document-gallery', DG_URL . 'assets/css/style.css', null, DG_VERSION);
107 115 }
108 116
109 117 /**
110 118 * Enqueue user's custom DG CSS.
@@ -118,10 +126,10 @@
118 126
119 127 /**
120 128 * Add query custom CSS query string.
121 129 * Taken from here: http://ottopress.com/2010/dont-include-wp-load-please/
122 - * @param array $vars
123 - * @return array
130 + * @param multitype:string $vars Variables to be added.
131 + * @return multitype:string All variables to be included in query string.
124 132 */
125 133 public static function addCustomStyleQueryVar($vars) {
126 134 $vars[] = self::$query_var;
127 135 return $vars;
@@ -140,9 +148,9 @@
140 148 header('Cache-Control: no-transform,public,maxage=' . 31536000);
141 149 header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 31536000) . ' GMT');
142 150 header('Last-Modified: ' . $dg_options['css']['last-modified']);
143 151 header('ETag: ' . $dg_options['css']['etag']);
144 -
152 +
145 153 echo $dg_options['css']['minified'];
146 154 exit;
147 155 }
148 156 }
@@ -147,33 +155,16 @@
147 155 }
148 156 }
149 157
150 158 /*==========================================================================
151 - * Logging
159 + * I18n
152 160 *=========================================================================*/
153 161
154 162 /**
155 - * Appends error log with $entry if WordPress is in debug mode.
156 - *
157 - * @param str $entry
163 + * Loads language files into WP core.
158 164 */
159 - public static function writeLog($entry) {
160 - if (defined('WP_DEBUG') && WP_DEBUG) {
161 - $err = 'DG: ' . print_r($entry, true) . PHP_EOL;
162 - if (defined('ERRORLOGFILE')) {
163 - error_log($err, 3, ERRORLOGFILE);
164 - } else {
165 - error_log($err);
166 - }
167 - }
168 - }
169 -
170 - /*==========================================================================
171 - * I18n
172 - *=========================================================================*/
173 -
174 165 public static function loadTextDomain() {
175 - load_plugin_textdomain('document-gallery', false, dirname(plugin_basename(__FILE__ )) . '/languages/');
166 + load_plugin_textdomain('document-gallery', false, dirname(DG_BASENAME) . '/languages/');
176 167 }
177 168
178 169 /*==========================================================================
179 170 * HELPER FUNCTIONS
@@ -179,12 +170,119 @@
179 170 * HELPER FUNCTIONS
180 171 *=========================================================================*/
181 172
182 173 /**
174 + * @param int $blog ID of the blog to be retrieved in multisite env.
175 + * @return multitype:unknown Options for the blog.
176 + */
177 + public static function getOptions($blog = null) {
178 + global $dg_options;
179 + return is_null($blog)
180 + ? $dg_options
181 + : get_blog_option($blog, DG_OPTION_NAME, null);
182 + }
183 +
184 + /**
185 + * @param multitype:unknown $options
186 + * @param int $blog ID of the blog to be set in multisite env.
187 + */
188 + public static function setOptions($options, $blog = null) {
189 + if (is_null($blog)) {
190 + global $dg_options;
191 + update_option(DG_OPTION_NAME, $options);
192 + $dg_options = $options;
193 + } else {
194 + update_blog_option($blog, DG_OPTION_NAME, $options);
195 + }
196 + }
197 +
198 + /**
199 + * @param int $blog ID of the blog to be deleted in multisite env.
200 + */
201 + public static function deleteOptions($blog = null) {
202 + if (is_null($blog)) {
203 + delete_option(DG_OPTION_NAME);
204 + } else {
205 + delete_blog_option($blog, DG_OPTION_NAME);
206 + }
207 + }
208 +
209 + /**
210 + * Adds hook to validate DG options every time save is attempted.
211 + */
212 + public static function addValidation() {
213 + add_filter('pre_update_option_' . DG_OPTION_NAME, array('DocumentGallery', 'validateOptionsStructure'), 10, 2);
214 + }
215 +
216 + /**
217 + * Checks whether the given options match the option schema.
218 + * @param multivar $new The new options to be validated.
219 + * @param multivar $old The old options.
220 + * @return array The options to be saved.
221 + */
222 + public static function validateOptionsStructure($new, $old) {
223 + if (self::isValidOptionsStructure($new)) {
224 + $ret = $new;
225 + } else {
226 + $ret = $old;
227 + DG_Logger::writeLog(DG_LogLevel::Error, 'Attempted to save invalid options.' . PHP_EOL . print_r($new, true), true, true);
228 + }
229 +
230 + return $ret;
231 + }
232 +
233 + /**
234 + * @param multivar|unknown $o The options structure to validate.
235 + * @param multivar $schema The schema to validate against (note that only keys matter -- non-array values are ignored).
236 + * @return bool Whether the given options structure matches the schema.
237 + */
238 + private static function isValidOptionsStructure($o, $schema = null) {
239 + if (is_null($schema)) {
240 + include_once DG_PATH . 'inc/class-setup.php';
241 + $schema = DG_Setup::getDefaultOptions(true);
242 + }
243 +
244 + // simple checks first
245 + $valid = is_array($o) && (count($schema) === count($o));
246 +
247 + if ($valid) {
248 + foreach ($schema as $sk => $sv) {
249 + $valid = array_key_exists($sk, $o);
250 + if (is_array($sv) && !empty($sv)) {
251 + $valid = $valid && self::isValidOptionsStructure($o[$sk], $sv);
252 + }
253 +
254 + if (!$valid) {
255 + break;
256 + }
257 + }
258 + }
259 +
260 + return $valid;
261 + }
262 +
263 + /**
264 + * Function takes a GMT timestamp and returns a date/time string in the
265 + * current timezone and WP format.
266 + * @param int $timestamp The GMT timestamp to translate.
267 + * @return string The local time in the WP date/time format.
268 + */
269 + public static function localDateTimeFromTimestamp($timestamp) {
270 + static $gmt_offet = null;
271 + static $wp_format = null;
272 + if (is_null($gmt_offet)) {
273 + $gmt_offet = get_option('gmt_offset');
274 + $wp_format = get_option('date_format').' '.get_option('time_format');
275 + }
276 +
277 + return date($wp_format, $timestamp + $gmt_offet * 3600);
278 + }
279 +
280 + /**
183 281 * Compiles any custom CSS plus the default CSS together,
184 282 * minifying in the process.
185 - * @param str $custom The custom CSS to compile.
186 - * @return str Compiled CSS, including both standard and any custom.
283 + * @param string $custom The custom CSS to compile.
284 + * @return string Compiled CSS, including both standard and any custom.
187 285 */
188 286 public static function compileCustomCss($custom) {
189 287 $css = file_get_contents(DG_PATH . 'assets/css/style.css');
190 288 $css .= str_replace('>', '>', esc_html($custom));