dolibarr  19.0.0-dev
doc_generic_stock_odt.modules.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (C) 2010-2012 Laurent Destailleur <eldy@stocks.sourceforge.net>
3  * Copyright (C) 2012 Juanjo Menent <jmenent@2byte.es>
4  * Copyright (C) 2018 Frédéric France <frederic.france@netlogic.fr>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <https://www.gnu.org/licenses/>.
18 * or see https://www.gnu.org/
19 */
20 
27 require_once DOL_DOCUMENT_ROOT.'/core/modules/stock/modules_stock.php';
28 require_once DOL_DOCUMENT_ROOT.'/product/stock/class/entrepot.class.php';
29 require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
30 require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
31 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
32 require_once DOL_DOCUMENT_ROOT.'/core/lib/doc.lib.php';
33 
34 
39 {
44  public $emetteur;
45 
49  public $version = 'dolibarr';
50 
56  public function __construct($db)
57  {
58  global $conf, $langs, $mysoc;
59 
60  // Load translation files required by the page
61  $langs->loadLangs(array("main", "companies"));
62 
63  $this->db = $db;
64  $this->name = "ODT templates";
65  $this->description = $langs->trans("DocumentModelOdt");
66  $this->scandir = 'STOCK_ADDON_PDF_ODT_PATH'; // Name of constant that is used to save list of directories to scan
67 
68  // Page size for A4 format
69  $this->type = 'odt';
70  $this->page_largeur = 0;
71  $this->page_hauteur = 0;
72  $this->format = array($this->page_largeur, $this->page_hauteur);
73  $this->marge_gauche = 0;
74  $this->marge_droite = 0;
75  $this->marge_haute = 0;
76  $this->marge_basse = 0;
77 
78  $this->option_logo = 1; // Display logo
79  $this->option_tva = 0; // Manage the vat option STOCK_TVAOPTION
80  $this->option_modereg = 0; // Display payment mode
81  $this->option_condreg = 0; // Display payment terms
82  $this->option_multilang = 1; // Available in several languages
83  $this->option_escompte = 0; // Displays if there has been a discount
84  $this->option_credit_note = 0; // Support credit notes
85  $this->option_freetext = 1; // Support add of a personalised text
86  $this->option_draft_watermark = 0; // Support add of a watermark on drafts
87 
88  // Get source company
89  $this->emetteur = $mysoc;
90  if (!$this->emetteur->country_code) {
91  $this->emetteur->country_code = substr($langs->defaultlang, -2); // By default if not defined
92  }
93  }
94 
95 
102  public function info($langs)
103  {
104  global $conf, $langs;
105 
106  // Load translation files required by the page
107  $langs->loadLangs(array("errors", "companies"));
108 
109  $form = new Form($this->db);
110 
111  $texte = $this->description.".<br>\n";
112  $texte .= '<form action="'.$_SERVER["PHP_SELF"].'" method="POST" enctype="multipart/form-data">';
113  $texte .= '<input type="hidden" name="token" value="'.newToken().'">';
114  $texte .= '<input type="hidden" name="page_y" value="">';
115  $texte .= '<input type="hidden" name="action" value="setModuleOptions">';
116  $texte .= '<input type="hidden" name="param1" value="STOCK_ADDON_PDF_ODT_PATH">';
117  $texte .= '<table class="nobordernopadding" width="100%">';
118 
119  // List of directories area
120  $texte .= '<tr><td>';
121  $texttitle = $langs->trans("ListOfDirectories");
122  $listofdir = explode(',', preg_replace('/[\r\n]+/', ',', trim($conf->global->STOCK_ADDON_PDF_ODT_PATH)));
123  $listoffiles = array();
124  foreach ($listofdir as $key => $tmpdir) {
125  $tmpdir = trim($tmpdir);
126  $tmpdir = preg_replace('/DOL_DATA_ROOT/', DOL_DATA_ROOT, $tmpdir);
127  if (!$tmpdir) {
128  unset($listofdir[$key]);
129  continue;
130  }
131  if (!is_dir($tmpdir)) {
132  $texttitle .= img_warning($langs->trans("ErrorDirNotFound", $tmpdir), 0);
133  } else {
134  $tmpfiles = dol_dir_list($tmpdir, 'files', 0, '\.(ods|odt)');
135  if (count($tmpfiles)) {
136  $listoffiles = array_merge($listoffiles, $tmpfiles);
137  }
138  }
139  }
140  $texthelp = $langs->trans("ListOfDirectoriesForModelGenODT");
141  // Add list of substitution keys
142  $texthelp .= '<br>'.$langs->trans("FollowingSubstitutionKeysCanBeUsed").'<br>';
143  $texthelp .= $langs->transnoentitiesnoconv("FullListOnOnlineDocumentation"); // This contains an url, we don't modify it
144 
145  $texte .= $form->textwithpicto($texttitle, $texthelp, 1, 'help', '', 1);
146  $texte .= '<div><div style="display: inline-block; min-width: 100px; vertical-align: middle;">';
147  $texte .= '<textarea class="flat" cols="60" name="value1">';
148  $texte .= $conf->global->STOCK_ADDON_PDF_ODT_PATH;
149  $texte .= '</textarea>';
150  $texte .= '</div><div style="display: inline-block; vertical-align: middle;">';
151  $texte .= '<input type="submit" class="button small reposition" name="modify" value="'.$langs->trans("Modify").'">';
152  $texte .= '<br></div></div>';
153 
154  // Scan directories
155  $nbofiles = count($listoffiles);
156  if (!empty($conf->global->STOCK_ADDON_PDF_ODT_PATH)) {
157  $texte .= $langs->trans("NumberOfModelFilesFound").': <b>';
158  //$texte.=$nbofiles?'<a id="a_'.get_class($this).'" href="#">':'';
159  $texte .= count($listoffiles);
160  //$texte.=$nbofiles?'</a>':'';
161  $texte .= '</b>';
162  }
163 
164  if ($nbofiles) {
165  $texte .= '<div id="div_'.get_class($this).'" class="hiddenx">';
166  // Show list of found files
167  foreach ($listoffiles as $file) {
168  $texte .= '- '.$file['name'].' <a href="'.DOL_URL_ROOT.'/document.php?modulepart=doctemplates&file=stocks/'.urlencode(basename($file['name'])).'">'.img_picto('', 'listlight').'</a>';
169  $texte .= ' &nbsp; <a class="reposition" href="'.$_SERVER["PHP_SELF"].'?modulepart=doctemplates&keyforuploaddir=STOCK_ADDON_PDF_ODT_PATH&action=deletefile&token='.newToken().'&file='.urlencode(basename($file['name'])).'">'.img_picto('', 'delete').'</a>';
170  $texte .= '<br>';
171  }
172  $texte .= '</div>';
173  }
174  // Add input to upload a new template file.
175  $texte .= '<div>'.$langs->trans("UploadNewTemplate");
176  $maxfilesizearray = getMaxFileSizeArray();
177  $maxmin = $maxfilesizearray['maxmin'];
178  if ($maxmin > 0) {
179  $texte .= '<input type="hidden" name="MAX_FILE_SIZE" value="'.($maxmin * 1024).'">'; // MAX_FILE_SIZE must precede the field type=file
180  }
181  $texte .= ' <input type="file" name="uploadfile">';
182  $texte .= '<input type="hidden" value="STOCK_ADDON_PDF_ODT_PATH" name="keyforuploaddir">';
183  $texte .= '<input type="submit" class="button small reposition" value="'.dol_escape_htmltag($langs->trans("Upload")).'" name="upload">';
184  $texte .= '</div>';
185 
186  $texte .= '</td>';
187 
188  $texte .= '<td rowspan="2" class="tdtop hideonsmartphone">';
189  $texte .= '<span class="opacitymedium">';
190  $texte .= $langs->trans("ExampleOfDirectoriesForModelGen");
191  $texte .= '</span>';
192  $texte .= '</td>';
193  $texte .= '</tr>';
194 
195  $texte .= '</table>';
196  $texte .= '</form>';
197 
198  return $texte;
199  }
200 
201  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
213  public function write_file($object, $outputlangs, $srctemplatepath, $hidedetails = 0, $hidedesc = 0, $hideref = 0)
214  {
215  // phpcs:enable
216  global $stock, $langs, $conf, $mysoc, $hookmanager, $user;
217 
218  if (empty($srctemplatepath)) {
219  dol_syslog("doc_generic_odt::write_file parameter srctemplatepath empty", LOG_WARNING);
220  return -1;
221  }
222 
223  // Add odtgeneration hook
224  if (!is_object($hookmanager)) {
225  include_once DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php';
226  $hookmanager = new HookManager($this->db);
227  }
228  $hookmanager->initHooks(array('odtgeneration'));
229  global $action;
230 
231  if (!is_object($outputlangs)) {
232  $outputlangs = $langs;
233  }
234  $sav_charset_output = $outputlangs->charset_output;
235  $outputlangs->charset_output = 'UTF-8';
236 
237  // Load translation files required by the page
238  $outputlangs->loadLangs(array("main", "dict", "companies", "bills"));
239 
240  if ($conf->product->dir_output) {
241  // If $object is id instead of object
242  if (!is_object($object)) {
243  $id = $object;
244  $object = new Entrepot($this->db);
245  $result = $object->fetch($id);
246  if ($result < 0) {
247  dol_print_error($this->db, $object->error);
248  return -1;
249  }
250  }
251 
252  $stockFournisseur = new ProductFournisseur($this->db);
253  $supplierprices = $stockFournisseur->list_stock_fournisseur_price($object->id);
254  $object->supplierprices = $supplierprices;
255 
256  $dir = $conf->product->dir_output;
257  $objectref = dol_sanitizeFileName($object->ref);
258  if (!preg_match('/specimen/i', $objectref)) {
259  $dir .= "/".$objectref;
260  }
261  $file = $dir."/".$objectref.".odt";
262 
263  if (!file_exists($dir)) {
264  if (dol_mkdir($dir) < 0) {
265  $this->error = $langs->transnoentities("ErrorCanNotCreateDir", $dir);
266  return -1;
267  }
268  }
269 
270  if (file_exists($dir)) {
271  //print "srctemplatepath=".$srctemplatepath; // Src filename
272  $newfile = basename($srctemplatepath);
273  $newfiletmp = preg_replace('/\.od[ts]/i', '', $newfile);
274  $newfiletmp = preg_replace('/template_/i', '', $newfiletmp);
275  $newfiletmp = preg_replace('/modele_/i', '', $newfiletmp);
276 
277  $newfiletmp = $objectref . '_' . $newfiletmp;
278 
279  // Get extension (ods or odt)
280  $newfileformat = substr($newfile, strrpos($newfile, '.') + 1);
281  if (getDolGlobalInt('MAIN_DOC_USE_TIMING')) {
282  $format = getDolGlobalInt('MAIN_DOC_USE_TIMING');
283  if ($format == '1') {
284  $format = '%Y%m%d%H%M%S';
285  }
286  $filename = $newfiletmp . '-' . dol_print_date(dol_now(), $format) . '.' . $newfileformat;
287  } else {
288  $filename = $newfiletmp . '.' . $newfileformat;
289  }
290  $file = $dir . '/' . $filename;
291  //print "newdir=".$dir;
292  //print "newfile=".$newfile;
293  //print "file=".$file;
294  //print "conf->product->dir_temp=".$conf->product->dir_temp;
295 
296  dol_mkdir($conf->product->dir_temp);
297  if (!is_writable($conf->product->dir_temp)) {
298  $this->error = $langs->transnoentities("ErrorFailedToWriteInTempDirectory", $conf->product->dir_temp);
299  dol_syslog('Error in write_file: ' . $this->error, LOG_ERR);
300  return -1;
301  }
302 
303  // If CUSTOMER contact defined on stock, we use it
304  $usecontact = false;
305  $arrayidcontact = $object->getIdContact('external', 'CUSTOMER');
306  if (count($arrayidcontact) > 0) {
307  $usecontact = true;
308  $result = $object->fetch_contact($arrayidcontact[0]);
309  }
310 
311  // Recipient name
312  $contactobject = null;
313  if (!empty($usecontact)) {
314  // We can use the company of contact instead of thirdparty company
315  if ($object->contact->socid != $object->thirdparty->id && (!isset($conf->global->MAIN_USE_COMPANY_NAME_OF_CONTACT) || !empty($conf->global->MAIN_USE_COMPANY_NAME_OF_CONTACT))) {
316  $object->contact->fetch_thirdparty();
317  $socobject = $object->contact->thirdparty;
318  $contactobject = $object->contact;
319  } else {
320  $socobject = $object->thirdparty;
321  // if we have a CUSTOMER contact and we dont use it as thirdparty recipient we store the contact object for later use
322  $contactobject = $object->contact;
323  }
324  } else {
325  $socobject = $object->thirdparty;
326  }
327  // Make substitution
328  $substitutionarray = array(
329  '__FROM_NAME__' => $this->emetteur->name,
330  '__FROM_EMAIL__' => $this->emetteur->email,
331  '__TOTAL_TTC__' => $object->total_ttc,
332  '__TOTAL_HT__' => $object->total_ht,
333  '__TOTAL_VAT__' => $object->total_tva
334  );
335  complete_substitutions_array($substitutionarray, $langs, $object);
336  // Call the ODTSubstitution hook
337  $parameters = array('file'=>$file, 'object'=>$object, 'outputlangs'=>$outputlangs, 'substitutionarray'=>&$substitutionarray);
338  $reshook = $hookmanager->executeHooks('ODTSubstitution', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
339 
340  // Line of free text
341  $newfreetext = '';
342  $paramfreetext = 'stock_FREE_TEXT';
343  if (!empty($conf->global->$paramfreetext)) {
344  $newfreetext = make_substitutions($conf->global->$paramfreetext, $substitutionarray);
345  }
346 
347  // Open and load template
348  require_once ODTPHP_PATH.'odf.php';
349  try {
350  $odfHandler = new Odf(
351  $srctemplatepath,
352  array(
353  'PATH_TO_TMP' => $conf->product->dir_temp,
354  'ZIP_PROXY' => 'PclZipProxy', // PhpZipProxy or PclZipProxy. Got "bad compression method" error when using PhpZipProxy.
355  'DELIMITER_LEFT' => '{',
356  'DELIMITER_RIGHT' => '}'
357  )
358  );
359  } catch (Exception $e) {
360  $this->error = $e->getMessage();
361  dol_syslog($e->getMessage(), LOG_INFO);
362  return -1;
363  }
364  // After construction $odfHandler->contentXml contains content and
365  // [!-- BEGIN row.lines --]*[!-- END row.lines --] has been replaced by
366  // [!-- BEGIN lines --]*[!-- END lines --]
367  //print html_entity_decode($odfHandler->__toString());
368  //print exit;
369 
370  $object->fetch_optionals();
371 
372  // Make substitutions into odt of freetext
373  try {
374  $odfHandler->setVars('free_text', $newfreetext, true, 'UTF-8');
375  } catch (OdfException $e) {
376  dol_syslog($e->getMessage(), LOG_INFO);
377  }
378 
379  // Define substitution array
380  $substitutionarray = getCommonSubstitutionArray($outputlangs, 0, null, $object);
381  $array_object_from_properties = $this->get_substitutionarray_each_var_object($object, $outputlangs);
382  //$array_objet=$this->get_substitutionarray_object($object,$outputlangs);
383  $array_user = $this->get_substitutionarray_user($user, $outputlangs);
384  $array_soc = $this->get_substitutionarray_mysoc($mysoc, $outputlangs);
385  $array_thirdparty = $this->get_substitutionarray_thirdparty($socobject, $outputlangs);
386  $array_other = $this->get_substitutionarray_other($outputlangs);
387  // retrieve contact information for use in stock as contact_xxx tags
388  $array_thirdparty_contact = array();
389  if ($usecontact && is_object($contactobject)) {
390  $array_thirdparty_contact = $this->get_substitutionarray_contact($contactobject, $outputlangs, 'contact');
391  }
392 
393  $tmparray = array_merge($substitutionarray, $array_object_from_properties, $array_user, $array_soc, $array_thirdparty, $array_other, $array_thirdparty_contact);
394  complete_substitutions_array($tmparray, $outputlangs, $object);
395 
396  // Call the ODTSubstitution hook
397  $parameters = array('file'=>$file, 'object'=>$object, 'outputlangs'=>$outputlangs, 'substitutionarray'=>&$tmparray);
398  $reshook = $hookmanager->executeHooks('ODTSubstitution', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
399 
400  foreach ($tmparray as $key => $value) {
401  try {
402  if (preg_match('/logo$/', $key)) { // Image
403  if (file_exists($value)) {
404  $odfHandler->setImage($key, $value);
405  } else {
406  $odfHandler->setVars($key, 'ErrorFileNotFound', true, 'UTF-8');
407  }
408  } else // Text
409  {
410  $odfHandler->setVars($key, $value, true, 'UTF-8');
411  }
412  } catch (OdfException $e) {
413  dol_syslog($e->getMessage(), LOG_INFO);
414  }
415  }
416  // Replace tags of lines
417  try {
418  $listlines = $odfHandler->setSegment('supplierprices');
419  if (!empty($object->supplierprices)) {
420  foreach ($object->supplierprices as $supplierprice) {
421  $array_lines = $this->get_substitutionarray_each_var_object($supplierprice, $outputlangs);
422  complete_substitutions_array($array_lines, $outputlangs, $object, $supplierprice, "completesubstitutionarray_lines");
423  // Call the ODTSubstitutionLine hook
424  $parameters = array('odfHandler'=>&$odfHandler, 'file'=>$file, 'object'=>$object, 'outputlangs'=>$outputlangs, 'substitutionarray'=>&$array_lines, 'line'=>$supplierprice);
425  $reshook = $hookmanager->executeHooks('ODTSubstitutionLine', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
426  foreach ($array_lines as $key => $val) {
427  try {
428  $listlines->setVars($key, $val, true, 'UTF-8');
429  } catch (OdfException $e) {
430  dol_syslog($e->getMessage(), LOG_INFO);
431  } catch (SegmentException $e) {
432  dol_syslog($e->getMessage(), LOG_INFO);
433  }
434  }
435  $listlines->merge();
436  }
437  }
438  $odfHandler->mergeSegment($listlines);
439  } catch (OdfException $e) {
440  $this->error = $e->getMessage();
441  dol_syslog($this->error, LOG_WARNING);
442  return -1;
443  }
444 
445  // Replace labels translated
446  $tmparray = $outputlangs->get_translations_for_substitutions();
447  foreach ($tmparray as $key => $value) {
448  try {
449  $odfHandler->setVars($key, $value, true, 'UTF-8');
450  } catch (OdfException $e) {
451  dol_syslog($e->getMessage(), LOG_INFO);
452  }
453  }
454 
455  // Call the beforeODTSave hook
456  $parameters = array('odfHandler'=>&$odfHandler, 'file'=>$file, 'object'=>$object, 'outputlangs'=>$outputlangs);
457  $reshook = $hookmanager->executeHooks('beforeODTSave', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
458 
459  // Write new file
460  if (!empty($conf->global->MAIN_ODT_AS_PDF)) {
461  try {
462  $odfHandler->exportAsAttachedPDF($file);
463  } catch (Exception $e) {
464  $this->error = $e->getMessage();
465  dol_syslog($e->getMessage(), LOG_INFO);
466  return -1;
467  }
468  } else {
469  try {
470  $odfHandler->saveToDisk($file);
471  } catch (Exception $e) {
472  $this->error = $e->getMessage();
473  dol_syslog($e->getMessage(), LOG_INFO);
474  return -1;
475  }
476  }
477 
478  $reshook = $hookmanager->executeHooks('afterODTCreation', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
479 
480  dolChmod($file);
481 
482  $odfHandler = null; // Destroy object
483 
484  $this->result = array('fullpath'=>$file);
485 
486  return 1; // Success
487  } else {
488  $this->error = $langs->transnoentities("ErrorCanNotCreateDir", $dir);
489  return -1;
490  }
491  }
492 
493  return -1;
494  }
495 }
get_substitutionarray_each_var_object(&$object, $outputlangs, $recursive=1)
Define array with couple substitution key => substitution value.
get_substitutionarray_mysoc($mysoc, $outputlangs)
Define array with couple substitution key => substitution value.
get_substitutionarray_contact($object, $outputlangs, $array_key='object')
Define array with couple substitution key => substitution value.
get_substitutionarray_other($outputlangs)
Define array with couple substitution key => substitution value.
get_substitutionarray_thirdparty($object, $outputlangs, $array_key='company')
Define array with couple substitution key => substitution value For example {company_name},...
get_substitutionarray_user($user, $outputlangs)
Define array with couple substitution key => substitution value.
Class to manage warehouses.
Class to manage generation of HTML components Only common components must be here.
Class to manage hooks.
Parent class for stock models of doc generators.
Class to manage predefined suppliers products.
Class to build documents using ODF templates generator.
write_file($object, $outputlangs, $srctemplatepath, $hidedetails=0, $hidedesc=0, $hideref=0)
Function to build a document on disk using the generic odt module.
info($langs)
Return description of a module.
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
Definition: card.php:143
print *****$script_file(".$version.") pid cd cd cd description as description
Only used if Module[ID]Desc translation string is not found.
dol_dir_list($path, $types="all", $recursive=0, $filter="", $excludefilter=null, $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $nohook=0, $relativename="", $donotfollowsymlinks=0, $nbsecondsold=0)
Scan a directory and return a list of files/directories.
Definition: files.lib.php:62
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dolChmod($filepath, $newmask='')
Change mod of a file.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return dolibarr global constant int value.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
newToken()
Return the value of token currently saved into session with name 'newtoken'.
complete_substitutions_array(&$substitutionarray, $outputlangs, $object=null, $parameters=null, $callfunc="completesubstitutionarray")
Complete the $substitutionarray with more entries coming from external module that had set the "subst...
make_substitutions($text, $substitutionarray, $outputlangs=null, $converttextinhtmlifnecessary=0)
Make substitution into a text string, replacing keys with vals from $substitutionarray (oldval=>newva...
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
getCommonSubstitutionArray($outputlangs, $onlykey=0, $exclude=null, $object=null, $include=null)
Return array of possible common substitutions.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dol_mkdir($dir, $dataroot='', $newmask='')
Creation of a directory (this can create recursive subdir)
if(preg_match('/crypted:/i', $dolibarr_main_db_pass)||!empty($dolibarr_main_db_encrypted_pass)) $conf db type
Definition: repair.php:120
$conf db name
Only used if Module[ID]Name translation string is not found.
Definition: repair.php:123
getMaxFileSizeArray()
Return the max allowed for file upload.