a1221c937a03d08314003a1674ad6194ea9c6f4a
[civicrm-core.git] / CRM / Admin / Form / WordReplacements.php
1 <?php
2 /*
3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.6 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2014 |
7 +--------------------------------------------------------------------+
8 | This file is a part of CiviCRM. |
9 | |
10 | CiviCRM is free software; you can copy, modify, and distribute it |
11 | under the terms of the GNU Affero General Public License |
12 | Version 3, 19 November 2007 and the CiviCRM Licensing Exception. |
13 | |
14 | CiviCRM is distributed in the hope that it will be useful, but |
15 | WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
17 | See the GNU Affero General Public License for more details. |
18 | |
19 | You should have received a copy of the GNU Affero General Public |
20 | License and the CiviCRM Licensing Exception along |
21 | with this program; if not, contact CiviCRM LLC |
22 | at info[AT]civicrm[DOT]org. If you have questions about the |
23 | GNU Affero General Public License or the licensing of CiviCRM, |
24 | see the CiviCRM license FAQ at http://civicrm.org/licensing |
25 +--------------------------------------------------------------------+
26 */
27
28 /**
29 *
30 * @package CRM
31 * @copyright CiviCRM LLC (c) 2004-2014
32 * $Id$
33 *
34 */
35 class CRM_Admin_Form_WordReplacements extends CRM_Core_Form {
36 protected $_numStrings = 10;
37
38 protected $_stringName = NULL;
39
40 protected $_defaults = NULL;
41
42 public function preProcess() {
43 // This controller was originally written to CRUD $config->locale_custom_strings,
44 // but that's no longer the canonical store. Re-sync from canonical store to ensure
45 // that we display that latest data. This is inefficient - at some point, we
46 // should rewrite this UI.
47 CRM_Core_BAO_WordReplacement::rebuild(FALSE);
48
49 $this->_soInstance = CRM_Utils_Array::value('instance', $_GET);
50 $this->assign('soInstance', $this->_soInstance);
51 $breadCrumbUrl = CRM_Utils_System::url('civicrm/admin/options/wordreplacements',
52 "reset=1"
53 );
54 $breadCrumb = array(array('title' => ts('Word Replacements'),
55 'url' => $breadCrumbUrl,
56 ));
57 CRM_Utils_System::appendBreadCrumb($breadCrumb);
58 }
59
60 /**
61 * @return array
62 */
63 public function setDefaultValues() {
64 if ($this->_defaults !== NULL) {
65 return $this->_defaults;
66 }
67
68 $this->_defaults = array();
69
70 $config = CRM_Core_Config::singleton();
71
72 $values = $config->localeCustomStrings[$config->lcMessages];
73 $i = 1;
74
75 $enableDisable = array(
76 1 => 'enabled',
77 0 => 'disabled',
78 );
79
80 $cardMatch = array('wildcardMatch', 'exactMatch');
81
82 foreach ($enableDisable as $key => $val) {
83 foreach ($cardMatch as $kc => $vc) {
84 if (!empty($values[$val][$vc])) {
85 foreach ($values[$val][$vc] as $k => $v) {
86 $this->_defaults["enabled"][$i] = $key;
87 $this->_defaults["cb"][$i] = $kc;
88 $this->_defaults["old"][$i] = $k;
89 $this->_defaults["new"][$i] = $v;
90 $i++;
91 }
92 }
93 }
94 }
95
96 $name = $this->_stringName = "custom_string_override_{$config->lcMessages}";
97 if (isset($config->$name) &&
98 is_array($config->$name)
99 ) {
100 $this->_numStrings = 1;
101 foreach ($config->$name as $old => $newValues) {
102 $this->_numStrings++;
103 $this->_numStrings += 9;
104 }
105 }
106 else {
107 $this->_numStrings = 10;
108 }
109
110 return $this->_defaults;
111 }
112
113 /**
114 * Build the form object
115 *
116 * @return void
117 */
118 public function buildQuickForm() {
119 $config = CRM_Core_Config::singleton();
120 $values = $config->localeCustomStrings[$config->lcMessages];
121
122 //CRM-14179
123 $instances = 0;
124 foreach ( $values as $valMatchType ) {
125 foreach ( $valMatchType as $valPairs ) {
126 $instances += count($valPairs);
127 }
128 }
129
130 if ($instances > 10) {
131 $this->_numStrings = $instances;
132 }
133
134 $soInstances = range(1, $this->_numStrings, 1);
135 $stringOverrideInstances = array();
136 if ($this->_soInstance) {
137 $soInstances = array($this->_soInstance);
138 }
139 elseif (!empty($_POST['old'])) {
140 $soInstances = $stringOverrideInstances = array_keys($_POST['old']);
141 }
142 elseif (!empty($this->_defaults) && is_array($this->_defaults)) {
143 $stringOverrideInstances = array_keys($this->_defaults['new']);
144 if (count($this->_defaults['old']) > count($this->_defaults['new'])) {
145 $stringOverrideInstances = array_keys($this->_defaults['old']);
146 }
147 }
148 foreach ($soInstances as $instance) {
149 $this->addElement('checkbox', "enabled[$instance]");
150 $this->add('textarea', "old[$instance]", NULL, array('rows' => 1, 'cols' => 40));
151 $this->add('textarea', "new[$instance]", NULL, array('rows' => 1, 'cols' => 40));
152 $this->addElement('checkbox', "cb[$instance]");
153 }
154 $this->assign('numStrings', $this->_numStrings);
155 if ($this->_soInstance) {
156 return;
157 }
158
159 $this->assign('stringOverrideInstances', empty($stringOverrideInstances) ? FALSE : $stringOverrideInstances);
160
161 $this->addButtons(array(
162 array(
163 'type' => 'next',
164 'name' => ts('Save'),
165 'isDefault' => TRUE,
166 ),
167 array(
168 'type' => 'cancel',
169 'name' => ts('Cancel'),
170 ),
171 )
172 );
173 $this->addFormRule(array('CRM_Admin_Form_WordReplacements', 'formRule'), $this);
174 }
175
176 /**
177 * Global validation rules for the form
178 *
179 * @param array $values posted values of the form
180 *
181 * @return array list of errors to be posted back to the form
182 * @static
183 */
184 public static function formRule($values) {
185 $errors = array();
186
187 $oldValues = CRM_Utils_Array::value('old', $values);
188 $newValues = CRM_Utils_Array::value('new', $values);
189 $enabled = CRM_Utils_Array::value('enabled', $values);
190 $exactMatch = CRM_Utils_Array::value('cb', $values);
191
192 foreach ($oldValues as $k => $v) {
193 if ($v && !$newValues[$k]) {
194 $errors['new[' . $k . ']'] = ts('Please Enter the value for Replacement Word');
195 }
196 elseif (!$v && $newValues[$k]) {
197 $errors['old[' . $k . ']'] = ts('Please Enter the value for Original Word');
198 }
199 elseif ((empty($newValues[$k]) && empty($oldValues[$k]))
200 && (!empty($enabled[$k]) || !empty($exactMatch[$k]))
201 ) {
202 $errors['old[' . $k . ']'] = ts('Please Enter the value for Original Word');
203 $errors['new[' . $k . ']'] = ts('Please Enter the value for Replacement Word');
204 }
205 }
206
207 return $errors;
208 }
209
210 /**
211 * Process the form submission
212 *
213 *
214 * @return void
215 */
216 public function postProcess() {
217 $params = $this->controller->exportValues($this->_name);
218 $this->_numStrings = sizeof($params['old']);
219
220 $enabled['exactMatch'] = $enabled['wildcardMatch'] = $disabled['exactMatch'] = $disabled['wildcardMatch'] = array();
221 for ($i = 1; $i <= $this->_numStrings; $i++) {
222 if (!empty($params['new'][$i]) && !empty($params['old'][$i])) {
223 if (isset($params['enabled']) && !empty($params['enabled'][$i])) {
224 if (!empty($params['cb']) && !empty($params['cb'][$i])) {
225 $enabled['exactMatch'] += array($params['old'][$i] => $params['new'][$i]);
226 }
227 else {
228 $enabled['wildcardMatch'] += array($params['old'][$i] => $params['new'][$i]);
229 }
230 }
231 else {
232 if (isset($params['cb']) && is_array($params['cb']) && array_key_exists($i, $params['cb'])) {
233 $disabled['exactMatch'] += array($params['old'][$i] => $params['new'][$i]);
234 }
235 else {
236 $disabled['wildcardMatch'] += array($params['old'][$i] => $params['new'][$i]);
237 }
238 }
239 }
240 }
241
242 $overrides = array(
243 'enabled' => $enabled,
244 'disabled' => $disabled,
245 );
246
247 $config = CRM_Core_Config::singleton();
248
249 $domain = new CRM_Core_DAO_Domain();
250 $domain->find(TRUE);
251
252 if ($domain->locales && $config->localeCustomStrings) {
253 // for multilingual
254 $addReplacements = $config->localeCustomStrings;
255 $addReplacements[$config->lcMessages] = $overrides;
256 $stringOverride = serialize($addReplacements);
257 }
258 else {
259 // for single language
260 $stringOverride = serialize(array($config->lcMessages => $overrides));
261 }
262
263 $params = array('locale_custom_strings' => $stringOverride);
264 $id = CRM_Core_Config::domainID();
265
266 $wordReplacementSettings = CRM_Core_BAO_Domain::edit($params, $id);
267
268 if ($wordReplacementSettings) {
269 // This controller was originally written to CRUD $config->locale_custom_strings,
270 // but that's no longer the canonical store. Sync changes to canonical store.
271 // This is inefficient - at some point, we should rewrite this UI.
272 CRM_Core_BAO_WordReplacement::rebuildWordReplacementTable();
273
274 CRM_Core_Session::setStatus("", ts("Settings Saved"), "success");
275 CRM_Utils_System::redirect(CRM_Utils_System::url('civicrm/admin/options/wordreplacements',
276 "reset=1"
277 ));
278 }
279 }
280 }