root/trunk/classes/journal/JournalSettingsDAO.inc.php @ 3596

Revision 3596, 11.5 kB (checked in by marcio.galvao, 11 years ago)

#21

Line 
1<?php
2
3/**
4 * @file classes/journal/JournalSettingsDAO.inc.php
5 *
6 * Copyright (c) 2003-2008 John Willinsky
7 * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING.
8 *
9 * @class JournalSettingsDAO
10 * @ingroup journal
11 *
12 * @brief Operations for retrieving and modifying journal settings.
13 */
14
15// $Id: JournalSettingsDAO.inc.php,v 1.29 2008/07/07 17:02:52 asmecher Exp $
16
17
18class JournalSettingsDAO extends DAO {
19    function &_getCache($journalId) {
20        static $settingCache;
21        if (!isset($settingCache)) {
22            $settingCache = array();
23        }
24        if (!isset($settingCache[$journalId])) {
25            import('cache.CacheManager');
26            $cacheManager =& CacheManager::getManager();
27            $settingCache[$journalId] = $cacheManager->getCache(
28                'journalSettings', $journalId,
29                array($this, '_cacheMiss')
30            );
31        }
32        return $settingCache[$journalId];
33    }
34
35    /**
36     * Retrieve a journal setting value.
37     * @param $journalId int
38     * @param $name string
39     * @param $locale string optional
40     * @return mixed
41     */
42    function &getSetting($journalId, $name, $locale = null) {
43        $cache =& $this->_getCache($journalId);
44        $returner = $cache->get($name);
45       
46        if ($name=='commentsInstructionsText') {
47            //var_dump($returner);
48            //echo('<br>=='.$journalId.'..'.$name.' '.$locale);
49        }
50        if ($locale !== null) {
51            if (!isset($returner[$locale]) || !is_array($returner)) {               
52                unset($returner);
53                $returner = null;
54                return $returner;               
55            }
56            return $returner[$locale];
57        }
58        return $returner;
59    }
60
61    function _cacheMiss(&$cache, $id) {
62        $settings =& $this->getJournalSettings($cache->getCacheId());
63        if (!isset($settings[$id])) {
64            // Make sure that even null values are cached
65            $cache->setCache($id, null);
66            return null;
67        }
68        return $settings[$id];
69    }
70
71    /**
72     * Retrieve and cache all settings for a journal.
73     * @param $journalId int
74     * @return array
75     */
76    function &getJournalSettings($journalId) {
77        $journalSettings = array();
78
79        $result = &$this->retrieve(
80            'SELECT setting_name, setting_value, setting_type, locale FROM journal_settings WHERE journal_id = ?', $journalId
81        );
82
83        if ($result->RecordCount() == 0) {
84            $returner = null;
85            $result->Close();
86            return $returner;
87
88        } else {
89            while (!$result->EOF) {
90                $row = &$result->getRowAssoc(false);
91                $value = $this->convertFromDB($row['setting_value'], $row['setting_type']);
92                if ($row['locale'] == '') $journalSettings[$row['setting_name']] = $value;
93                else $journalSettings[$row['setting_name']][$row['locale']] = $value;
94                $result->MoveNext();
95            }
96            $result->close();
97            unset($result);
98
99            $cache =& $this->_getCache($journalId);
100            $cache->setEntireCache($journalSettings);
101            //print_r($journalSettings);
102            return $journalSettings;
103        }
104    }
105
106    /**
107     * Add/update a journal setting.
108     * @param $journalId int
109     * @param $name string
110     * @param $value mixed
111     * @param $type string data type of the setting. If omitted, type will be guessed
112     * @param $isLocalized boolean
113     */
114    function updateSetting($journalId, $name, $value, $type = null, $isLocalized = false) {
115   
116        $cache =& $this->_getCache($journalId);
117        $cache->setCache($name, $value);
118
119        $keyFields = array('setting_name', 'locale', 'journal_id');
120       
121        if (!$isLocalized) {
122            $value = $this->convertToDB($value, $type);
123            $this->replace('journal_settings',
124                array(
125                    'journal_id' => $journalId,
126                    'setting_name' => $name,
127                    'setting_value' => $value,
128                    'setting_type' => $type,
129                    'locale' => ''
130                ),
131                $keyFields
132            );
133        } else {           
134            if (is_array($value)) foreach ($value as $locale => $localeValue) {           
135                // Scielo fix substr($locale,0,5)
136                $this->update('DELETE FROM journal_settings WHERE journal_id = ? AND setting_name = ? AND locale = ?', array($journalId, $name, substr($locale,0,5)));
137                if (empty($localeValue)) continue;
138                $type = null;
139                $this->update('INSERT INTO journal_settings
140                    (journal_id, setting_name, setting_value, setting_type, locale)
141                    VALUES (?, ?, ?, ?, ?)',
142                    array(
143                        $journalId, $name, $this->convertToDB($localeValue, $type), $type, $locale
144                    )
145                );
146            }
147        }
148    }
149
150    /**
151     * Delete a journal setting.
152     * @param $journalId int
153     * @param $name string
154     */
155    function deleteSetting($journalId, $name, $locale = null) {
156        $cache =& $this->_getCache($journalId);
157        $cache->setCache($name, null);
158
159        $params = array($journalId, $name);
160        $sql = 'DELETE FROM journal_settings WHERE journal_id = ? AND setting_name = ?';
161        if ($locale !== null) {
162            $params[] = $locale;
163            $sql .= ' AND locale = ?';
164        }
165
166        return $this->update($sql, $params);
167    }
168
169    /**
170     * Delete all settings for a journal.
171     * @param $journalId int
172     */
173    function deleteSettingsByJournal($journalId) {
174        $cache =& $this->_getCache($journalId);
175        $cache->flush();
176
177        return $this->update(
178                'DELETE FROM journal_settings WHERE journal_id = ?', $journalId
179        );
180    }
181
182    /**
183     * Used internally by installSettings to perform variable and translation replacements.
184     * @param $rawInput string contains text including variable and/or translate replacements.
185     * @param $paramArray array contains variables for replacement
186     * @returns string
187     */
188    function _performReplacement($rawInput, $paramArray = array()) {
189        $value = preg_replace_callback('{{translate key="([^"]+)"}}', '_installer_regexp_callback', $rawInput);
190        foreach ($paramArray as $pKey => $pValue) {
191            $value = str_replace('{$' . $pKey . '}', $pValue, $value);
192        }
193        return $value;
194    }
195
196    /**
197     * Used internally by installSettings to recursively build nested arrays.
198     * Deals with translation and variable replacement calls.
199     * @param $node object XMLNode <array> tag
200     * @param $paramArray array Parameters to be replaced in key/value contents
201     */
202    function &_buildObject (&$node, $paramArray = array()) {
203        $value = array();
204        foreach ($node->getChildren() as $element) {
205            $key = $element->getAttribute('key');
206            $childArray = &$element->getChildByName('array');
207            if (isset($childArray)) {
208                $content = $this->_buildObject($childArray, $paramArray);
209            } else {
210                $content = $this->_performReplacement($element->getValue(), $paramArray);
211            }
212            if (!empty($key)) {
213                $key = $this->_performReplacement($key, $paramArray);
214                $value[$key] = $content;
215            } else $value[] = $content;
216        }
217        return $value;
218    }
219
220    /**
221     * Install journal settings from an XML file.
222     * @param $journalId int ID of journal for settings to apply to
223     * @param $filename string Name of XML file to parse and install
224     * @param $paramArray array Optional parameters for variable replacement in settings
225     */
226    function installSettings($journalId, $filename, $paramArray = array()) {
227        $xmlParser = &new XMLParser();
228        $tree = $xmlParser->parse($filename);
229
230        if (!$tree) {
231            $xmlParser->destroy();
232            return false;
233        }
234
235        foreach ($tree->getChildren() as $setting) {
236            $nameNode = &$setting->getChildByName('name');
237            $valueNode = &$setting->getChildByName('value');
238
239            if (isset($nameNode) && isset($valueNode)) {
240                $type = $setting->getAttribute('type');
241                $isLocaleField = $setting->getAttribute('locale');
242                $name = &$nameNode->getValue();
243
244                if ($type == 'object') {
245                    $arrayNode = &$valueNode->getChildByName('array');
246                    $value = $this->_buildObject($arrayNode, $paramArray);
247                } else {
248                    $value = $this->_performReplacement($valueNode->getValue(), $paramArray);
249                }
250
251                // Replace translate calls with translated content
252                $this->updateSetting(
253                    $journalId,
254                    $name,
255                    $isLocaleField?array(Locale::getLocale() => $value):$value,
256                    $type,
257                    $isLocaleField
258                );
259            }
260        }
261
262        $xmlParser->destroy();
263
264    }
265
266    /**
267     * Used internally by reloadLocalizedSettingDefaults to perform variable and translation replacements.
268     * @param $rawInput string contains text including variable and/or translate replacements.
269     * @param $paramArray array contains variables for replacement
270     * @param $locale string contains the name of the locale that should be used for the translation
271     * @returns string
272     */
273    function _performLocalizedReplacement($rawInput, $paramArray = array(), $locale = null) {
274        $value = preg_replace_callback('{{translate key="([^"]+)"}}',
275                                                                    // this only translates from mail locale file
276                                                                    create_function('$matches',
277                                                                        '$locale = "' . $locale . '";'.
278                                                                        '$localeFileName = Locale::getMainLocaleFilename($locale);'.
279                                                                        '$localeFile =& new LocaleFile($locale, $localeFileName);'.
280                                                                        'return $localeFile->translate($matches[1]);'
281                                                                        ),
282                                                                        $rawInput);
283        foreach ($paramArray as $pKey => $pValue) {
284            $value = str_replace('{$' . $pKey . '}', $pValue, $value);
285        }
286        return $value;
287    }
288
289    /**
290     * Used internally by reloadLocalizedSettingDefaults to recursively build nested arrays.
291     * Deals with translation and variable replacement calls.
292     * @param $node object XMLNode <array> tag
293     * @param $paramArray array Parameters to be replaced in key/value contents
294     * @param $locale string contains the name of the locale that should be used for the translation
295     */
296    function &_buildLocalizedObject (&$node, $paramArray = array(), $locale = null) {
297        $value = array();
298        foreach ($node->getChildren() as $element) {
299            $key = $element->getAttribute('key');
300            $childArray = &$element->getChildByName('array');
301            if (isset($childArray)) {
302                $content = $this->_buildLocalizedObject($childArray, $paramArray, $locale);
303            } else {
304                $content = $this->_performLocalizedReplacement($element->getValue(), $paramArray, $locale);
305            }
306            if (!empty($key)) {
307                $key = $this->_performLocalizedReplacement($key, $paramArray, $locale);
308                $value[$key] = $content;
309            } else $value[] = $content;
310        }
311        return $value;
312    }
313
314    /**
315     * Install locale field Only journal settings from an XML file.
316     * @param $journalId int ID of journal for settings to apply to
317     * @param $filename string Name of XML file to parse and install
318     * @param $paramArray array Optional parameters for variable replacement in settings
319     * @param $locale string locale id for which settings will be loaded
320     */
321    function reloadLocalizedDefaultSettings($journalId, $filename, $paramArray, $locale) {
322        $xmlParser = &new XMLParser();
323        $tree = $xmlParser->parse($filename);
324
325        if (!$tree) {
326            $xmlParser->destroy();
327            return false;
328        }
329
330        foreach ($tree->getChildren() as $setting) {
331            $nameNode = &$setting->getChildByName('name');
332            $valueNode = &$setting->getChildByName('value');
333
334            if (isset($nameNode) && isset($valueNode)) {
335                $type = $setting->getAttribute('type');
336                $isLocaleField = $setting->getAttribute('locale');
337                $name = &$nameNode->getValue();
338
339                //skip all settings that are not locale fields
340                if (!$isLocaleField) continue;
341
342                if ($type == 'object') {
343                    $arrayNode = &$valueNode->getChildByName('array');
344                    $value = $this->_buildLocalizedObject($arrayNode, $paramArray, $locale);
345                } else {
346                    $value = $this->_performLocalizedReplacement($valueNode->getValue(), $paramArray, $locale);
347                }
348               
349                // Replace translate calls with translated content
350                $this->updateSetting(
351                    $journalId,
352                    $name,
353                    array($locale => $value),
354                    $type,
355                    true
356                );
357            }
358        }
359
360        $xmlParser->destroy();
361
362    }
363}
364
365/**
366 * Used internally by journal setting installation code to perform translation function.
367 */
368function _installer_regexp_callback($matches) {
369    return Locale::translate($matches[1]);
370}
371
372?>
Note: See TracBrowser for help on using the browser.