Attached Files |
automatic_upload_folder_creation.patch [^] (3,252 bytes) 2009-12-23 03:12
[Show Content]
Index: kernel/db/db_event_handler.php
===================================================================
--- kernel/db/db_event_handler.php (revision 12948)
+++ kernel/db/db_event_handler.php (working copy)
@@ -2352,7 +2352,7 @@
$fields = $this->Application->getUnitOption($event->Prefix, 'Fields');
$upload_dir = $fields[ $this->Application->GetVar('field') ]['upload_dir'];
- if (!is_writable($tmp_path) || !is_writable(FULL_PATH . $upload_dir)) {
+ if (!is_writable($tmp_path)) {
// 500 Internal Server Error
// check both temp and live upload directory
header('HTTP/1.0 500 Write permissions not set on the server');
Index: kernel/utility/formatters/upload_formatter.php
===================================================================
--- kernel/utility/formatters/upload_formatter.php (revision 12948)
+++ kernel/utility/formatters/upload_formatter.php (working copy)
@@ -44,7 +44,8 @@
$this->DestinationPath = $options['upload_dir'];
$this->FullPath = FULL_PATH.$this->DestinationPath;
}
-
+ $this->CheckFolder();
+
// SWF Uploader
if (is_array($value) && isset($value['tmp_ids'])) {
if ($value['tmp_deleted']) {
@@ -315,6 +316,33 @@
return $new_name;
}
+ function CheckFolder($path = false)
+ {
+ if ($path === false) {
+ $path = $this->FullPath;
+ }
+
+ $result = true;
+ if (!file_exists($path) || !is_dir($path)) {
+ $parent_path = preg_replace('/\/[^\/]+\/?$/', '', $path);
+ $result = $this->CheckFolder($parent_path);
+ if ($result) {
+ $result = mkdir($path);
+ if ($result) {
+ chmod($path, 0777);
+ $cvsignore = fopen($path.'/.cvsignore', 'w');
+ fwrite($cvsignore, '*.*');
+ fclose($cvsignore);
+ chmod($path.'/.cvsignore', 0777);
+ }
+ else {
+ trigger_error('Cannot create directory <b>'.$path.'</b> for file upload', E_USER_WARNING);
+ }
+ }
+ }
+
+ return $result;
+ }
}
class kPictureFormatter extends kUploadFormatter
Index: units/helpers/image_helper.php
===================================================================
--- units/helpers/image_helper.php (revision 12948)
+++ units/helpers/image_helper.php (working copy)
@@ -101,6 +101,21 @@
if ($needs_resize || array_intersect(array_keys($params), $transform_keys)) {
// resize required OR watermarking required -> change resulting image name !
$dst_image = preg_replace('/^'.preg_quote($src_path, '/').'(.*)\.(.*)$/', $src_path . DIRECTORY_SEPARATOR . 'resized\\1_' . crc32(serialize($params)) . '.\\2', $src_image);
+
+ $dst_dir = dirname($dst_image);
+ if (!file_exists($dst_dir) || !is_dir($dst_dir)) {
+ if (!mkdir($dst_dir)) {
+ trigger_error('Cannot create <b>resized</b> directory under <b>'.$src_path.'</b>', E_USER_WARNING);
+ }
+ else {
+ chmod($dst_dir, 0777);
+ $cvsignore = fopen($dst_dir.'/.cvsignore', 'w');
+ fwrite($cvsignore, '*.*');
+ fclose($cvsignore);
+ chmod($dst_dir.'/.cvsignore', 0777);
+ }
+ }
+
if (!file_exists($dst_image) || filemtime($src_image) > filemtime($dst_image)) {
// resized image not available OR should be recreated due source image change
$params['dst_image'] = $dst_image;
folder_auto_creation_core.patch [^] (13,555 bytes) 2010-05-12 07:17
[Show Content]
Index: admin_templates/tools/backup1.tpl
===================================================================
--- admin_templates/tools/backup1.tpl (revision 13557)
+++ admin_templates/tools/backup1.tpl (working copy)
@@ -41,15 +41,12 @@
<inp2:m_inc param="tab_index" by="1"/>
<td class="text" style="width: 300px;">
<inp2:m_Phrase label="la_prompt_Backup_Path"/>
- <inp2:m_if check="conf_IsWritablePath" name="Backup_Path" inverse="1">
- <br /><span class="error"><inp2:m_Phrase label="la_Text_backup_access"/></span>
- <script type="text/javascript">
- a_toolbar.DisableButton('next');
- </script>
- </inp2:m_if>
</td>
<td valign="top" colspan="2">
- <input type="text" name="conf[<inp2:conf_GetVariableID name="Backup_Path"/>][VariableValue]" class="text" value='<inp2:conf_ConfigValue name="Backup_Path"/>' style="width:80%">
+ <inp2:m_if check="m_Get" name="error_msg">
+ <span class="error"><inp2:m_Get name="error_msg"/></span><br />
+ </inp2:m_if>
+ <input type="text" name="conf[<inp2:conf_GetVariableID name='Backup_Path'/>][VariableValue]" class="text" value="<inp2:conf_ConfigValue name='Backup_Path'/>" style="width:80%">
<input class="button" type="button" onclick="submit_event('conf', 'OnUpdate');" value="Update">
<!--##
<input type="hidden" name="section" value="in-portal:configure_general"/>
Index: install.php
===================================================================
--- install.php (revision 13557)
+++ install.php (working copy)
@@ -100,19 +100,10 @@
var $writeableFolders = Array (
'$1',
'$1/images',
- '$1/images/resized',
'$1/images/pending',
- '$1/images/pending/resized',
'$1/images/emoticons', // for "In-Bulletin"
- '$1/images/manufacturers', // for "In-Commerce"
- '$1/images/manufacturers/resized', // for "In-Commerce"
- '$1/images/polls', // for "In-Bulletin"
- '$1/images/polls/resized', // for "In-Bulletin"
- '$1/backupdata',
'$1/export',
- '$1/stylesheets',
'$1/user_files',
- '$1/user_files/submission_log',
'$1/cache',
);
Index: kernel/db/db_event_handler.php
===================================================================
--- kernel/db/db_event_handler.php (revision 13557)
+++ kernel/db/db_event_handler.php (working copy)
@@ -2618,7 +2618,7 @@
$fields = $this->Application->getUnitOption($event->Prefix, 'Fields');
$upload_dir = $fields[ $this->Application->GetVar('field') ]['upload_dir'];
- if (!is_writable($tmp_path) || !is_writable(FULL_PATH . $upload_dir)) {
+ if (!is_writable($tmp_path)) {
// 500 Internal Server Error
// check both temp and live upload directory
header('HTTP/1.0 500 Write permissions not set on the server');
Index: kernel/utility/formatters/upload_formatter.php
===================================================================
--- kernel/utility/formatters/upload_formatter.php (revision 13557)
+++ kernel/utility/formatters/upload_formatter.php (working copy)
@@ -17,16 +17,24 @@
var $DestinationPath;
var $FullPath;
+ /**
+ * File helper reference
+ *
+ * @var FileHelper
+ */
+ var $fileHelper = null;
+
function kUploadFormatter()
{
- parent::kBase();
+ parent::kFormatter();
+ $this->fileHelper =& $this->Application->recallObject('FileHelper');
+
if ($this->DestinationPath) {
$this->FullPath = FULL_PATH.$this->DestinationPath;
}
}
-
/**
* Processes file uploads from form
*
@@ -45,6 +53,8 @@
$this->FullPath = FULL_PATH.$this->DestinationPath;
}
+ $this->fileHelper->CheckFolder($this->FullPath);
+
// SWF Uploader
if (is_array($value) && isset($value['tmp_ids'])) {
if ($value['tmp_deleted']) {
@@ -314,12 +324,10 @@
return $new_name;
}
-
}
class kPictureFormatter extends kUploadFormatter
{
-
function kPictureFormatter()
{
$this->NakeLookupPath = IMAGES_PATH; // used ?
@@ -340,5 +348,4 @@
return parent::GetFormatted($value, $field_name, $object, $format);
}
-
}
\ No newline at end of file
Index: units/admin/admin_events_handler.php
===================================================================
--- units/admin/admin_events_handler.php (revision 13557)
+++ units/admin/admin_events_handler.php (working copy)
@@ -681,7 +681,18 @@
*/
function OnBackup(&$event)
{
+ $backup_path = $this->Application->ConfigValue('Backup_Path');
+ $file_helper =& $this->Application->recallObject('FileHelper');
+ /* @var $file_helper FileHelper */
+
+ if (!$file_helper->CheckFolder($backup_path) || !is_writable($backup_path)) {
+ $event->status = erFAIL;
+
+ $this->Application->SetVar('error_msg', $this->Application->Phrase('la_Text_backup_access'));
+ return ;
+ }
+
$a_tables = $this->Conn->GetCol('SHOW TABLES'); // array_keys($tables);
$TableNames = Array();
for($x=0;$x<count($a_tables);$x++)
@@ -693,15 +704,13 @@
}
}
}
-// echo "<pre>"; print_r($TableNames); echo "</pre>";
-// exit;
$backupProgress = Array (
'table_num' => 0,
'table_names' => $TableNames,
'table_count' => count($TableNames),
'record_count' => 0,
- 'file_name' => $this->Application->ConfigValue('Backup_Path')."/dump".adodb_mktime().".txt",
+ 'file_name' => $backup_path."/dump".adodb_mktime().".txt",
);
$this->Application->RemoveVar('adm.backupcomplete_filename');
$this->Application->RemoveVar('adm.backupcomplete_filesize');
Index: units/admin/admin_tag_processor.php
===================================================================
--- units/admin/admin_tag_processor.php (revision 13559)
+++ units/admin/admin_tag_processor.php (working copy)
@@ -934,7 +934,12 @@
function getDirList ($dirName)
{
- $fileinfo = array();
+ $file_helper =& $this->Application->recallObject('FileHelper');
+ /* @var $file_helper FileHelper */
+
+ $file_helper->CheckFolder($dirName);
+
+ $fileinfo = array();
$d = dir($dirName);
while($entry = $d->read())
Index: units/configuration/configuration_tag_processor.php
===================================================================
--- units/configuration/configuration_tag_processor.php (revision 13557)
+++ units/configuration/configuration_tag_processor.php (working copy)
@@ -240,10 +240,4 @@
return $cached_sections[$var_name];
}
-
- function IsWritablePath($params)
- {
- return is_writable($this->ConfigValue($params));
- }
-
}
\ No newline at end of file
Index: units/helpers/cat_dbitem_export_helper.php
===================================================================
--- units/helpers/cat_dbitem_export_helper.php (revision 13557)
+++ units/helpers/cat_dbitem_export_helper.php (working copy)
@@ -352,7 +352,7 @@
{
$extension = $this->getFileExtension();
$filename = preg_replace('/(.*)\.' . $extension . '$/', '\1', $this->exportOptions['ExportFilename']) . '.' . $extension;
-
+
return EXPORT_PATH . DIRECTORY_SEPARATOR . $filename;
}
@@ -363,6 +363,11 @@
*/
function openFile(&$event)
{
+ $file_helper =& $this->Application->recallObject('FileHelper');
+ /* @var $file_helper FileHelper */
+
+ $file_helper->CheckFolder(EXPORT_PATH);
+
if ($event->Special == 'export') {
$write_mode = ($this->exportOptions['start_from'] == 0) ? 'w' : 'a';
$this->filePointer = fopen($this->getExportFilename(), $write_mode);
@@ -1286,6 +1291,11 @@
$import_filenames = Array();
+ $file_helper =& $this->Application->recallObject('FileHelper');
+ /* @var $file_helper FileHelper */
+
+ $file_helper->CheckFolder(EXPORT_PATH);
+
if ($folder_handle = opendir(EXPORT_PATH)) {
while (false !== ($file = readdir($folder_handle))) {
if (is_dir(EXPORT_PATH.'/'.$file) || substr($file, 0, 1) == '.' || strtolower($file) == 'cvs' || strtolower($file) == 'dummy' || filesize(EXPORT_PATH.'/'.$file) == 0) continue;
Index: units/helpers/csv_helper.php
===================================================================
--- units/helpers/csv_helper.php (revision 13557)
+++ units/helpers/csv_helper.php (working copy)
@@ -58,6 +58,11 @@
$first_step = true;
}
+ $file_helper =& $this->Application->recallObject('FileHelper');
+ /* @var $file_helper FileHelper */
+
+ $file_helper->CheckFolder( dirname($export_data['file_name']) );
+
$file = fopen($export_data['file_name'], $first_step ? 'w' : 'a');
$prefix_elems = split('\.|_', $export_data['prefix']);
@@ -163,9 +168,9 @@
{
safeDefine('DBG_SKIP_REPORTING', 1);
- $export_data = unserialize($this->Application->RecallVar('export_data'));
+ $export_data = unserialize($this->Application->RecallVar('export_data'));
$filename = preg_replace('/(.*)\.csv$/', '\1', basename($export_data['file_name'])) . '.csv';
-
+
header('Content-type: text/csv');
header('Content-Disposition: attachment; filename="' . $filename . '"');
readfile($export_data['file_name']);
Index: units/helpers/file_helper.php
===================================================================
--- units/helpers/file_helper.php (revision 13557)
+++ units/helpers/file_helper.php (working copy)
@@ -52,6 +52,8 @@
$table_name = $this->Application->getUnitOption('#file', 'TableName');
$max_file_count = $this->Application->getUnitOption($object->Prefix, 'FileCount'); // $this->Application->ConfigValue($object->Prefix.'_MaxImageCount');
+ $this->CheckFolder(FULL_PATH . ITEM_FILES_PATH);
+
$i = 0;
while ($i < $max_file_count) {
$field = 'File'.($i + 1);
@@ -230,4 +232,42 @@
readfile($filename);
flush();
}
+
+ /**
+ * Creates folder with given $path
+ *
+ * @param string $path
+ * @return bool
+ */
+ function CheckFolder($path)
+ {
+ $result = true;
+
+ if (!file_exists($path) || !is_dir($path)) {
+ $parent_path = preg_replace('#/[^/]+/?$#', '', $path);
+ $result = $this->CheckFolder($parent_path);
+
+ if ($result) {
+ $result = mkdir($path);
+
+ if ($result) {
+ chmod($path, 0777);
+
+ // don't commit any files from created folder
+ if (file_exists(FULL_PATH . '/CVS')) {
+ $cvsignore = fopen($path . '/.cvsignore', 'w');
+ fwrite($cvsignore, '*.*');
+ fclose($cvsignore);
+ chmod($path . '/.cvsignore', 0777);
+ }
+ }
+ else {
+ trigger_error('Cannot create directory "<strong>' . $path . '</strong>"', E_USER_WARNING);
+ return false;
+ }
+ }
+ }
+
+ return $result;
+ }
}
\ No newline at end of file
Index: units/helpers/image_helper.php
===================================================================
--- units/helpers/image_helper.php (revision 13557)
+++ units/helpers/image_helper.php (working copy)
@@ -17,6 +17,20 @@
class ImageHelper extends kHelper {
/**
+ * File helper reference
+ *
+ * @var FileHelper
+ */
+ var $fileHelper = null;
+
+ function ImageHelper()
+ {
+ parent::kHelper();
+
+ $this->fileHelper =& $this->Application->recallObject('FileHelper');
+ }
+
+ /**
* Parses format string into array
*
* @param string $format sample format: "resize:300x500;wm:inc/wm.png|c|-20"
@@ -101,6 +115,9 @@
if ($needs_resize || array_intersect(array_keys($params), $transform_keys)) {
// resize required OR watermarking required -> change resulting image name !
$dst_image = preg_replace('/^'.preg_quote($src_path, '/').'(.*)\.(.*)$/', $src_path . DIRECTORY_SEPARATOR . 'resized\\1_' . crc32(serialize($params)) . '.\\2', $src_image);
+
+ $this->fileHelper->CheckFolder( dirname($dst_image) );
+
if (!file_exists($dst_image) || filemtime($src_image) > filemtime($dst_image)) {
// resized image not available OR should be recreated due source image change
$params['dst_image'] = $dst_image;
Index: units/languages/languages_event_handler.php
===================================================================
--- units/languages/languages_event_handler.php (revision 13559)
+++ units/languages/languages_event_handler.php (working copy)
@@ -424,6 +424,11 @@
return ;
}
+ $file_helper =& $this->Application->recallObject('FileHelper');
+ /* @var $file_helper FileHelper */
+
+ $file_helper->CheckFolder(EXPORT_PATH);
+
if (!is_writable(EXPORT_PATH)) {
$event->status = erFAIL;
$object->SetError('LangFile', 'write_error', 'la_ExportFolderNotWritable');
@@ -504,10 +509,10 @@
'l' . $object->GetID() . '_Body' => NULL,
);
$this->Conn->doUpdate($fields_hash, $this->Application->getUnitOption('emailevents', 'TableName'), 1);
-
+
// clean Phrases table
$fields_hash = Array (
- 'l' . $object->GetID() . '_Translation' => NULL,
+ 'l' . $object->GetID() . '_Translation' => NULL,
);
$this->Conn->doUpdate($fields_hash, $this->Application->getUnitOption('phrases', 'TableName'), 1);
}
Index: units/stylesheets/stylesheets_item.php
===================================================================
--- units/stylesheets/stylesheets_item.php (revision 13557)
+++ units/stylesheets/stylesheets_item.php (working copy)
@@ -38,6 +38,11 @@
$compile_ts = adodb_mktime();
$css_path = WRITEABLE . '/stylesheets/';
+ $file_helper =& $this->Application->recallObject('FileHelper');
+ /* @var $file_helper FileHelper */
+
+ $file_helper->CheckFolder($css_path);
+
$css_file = $css_path.mb_strtolower($this->GetDBField('Name')).'-'.$compile_ts.'.css';
$fp = fopen($css_file,'w');
folder_auto_creation_modules.patch [^] (6,164 bytes) 2010-05-12 07:17
[Show Content]
Index: in-commerce/units/orders/orders_event_handler.php
===================================================================
--- in-commerce/units/orders/orders_event_handler.php (revision 13558)
+++ in-commerce/units/orders/orders_event_handler.php (working copy)
@@ -3772,6 +3772,12 @@
$this->Application->InitParser();
$o = $this->Application->ParseBlock(array('name'=>'in-commerce/orders/orders_pdf'));
+
+ $file_helper =& $this->Application->recallObject('FileHelper');
+ /* @var $file_helper FileHelper */
+
+ $file_helper->CheckFolder(EXPORT_PATH);
+
$htmlFile = EXPORT_PATH . '/tmp.html';
$fh = fopen($htmlFile, 'w');
fwrite($fh, $o);
Index: in-commerce/units/products/products_config.php
===================================================================
--- in-commerce/units/products/products_config.php (revision 13557)
+++ in-commerce/units/products/products_config.php (working copy)
@@ -593,7 +593,7 @@
// import related fields: begin
'FieldTitles' => Array ('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'la_Automatic', 2 => 'la_Manual'), 'use_phrases' => 1, 'default' => 1),
'ImportSource' => Array ('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'la_Upload', 2 => 'la_Local'), 'use_phrases' => 1, 'default' => 2),
- 'ImportFilename' => Array ('type' => 'string', 'formatter' => 'kUploadFormatter', 'max_size' => MAX_UPLOAD_SIZE, 'upload_dir' => (defined('EXPORT_BASE_PATH') ? EXPORT_BASE_PATH : '/admin/export') . '/'),
+ 'ImportFilename' => Array ('type' => 'string', 'formatter' => 'kUploadFormatter', 'max_size' => MAX_UPLOAD_SIZE, 'upload_dir' => EXPORT_BASE_PATH . '/'),
'ImportLocalFilename' => Array ('type' => 'string', 'formatter' => 'kOptionsFormatter', 'default' => ''),
'CheckDuplicatesMethod' => Array ('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'la_IDField', 2 => 'la_OtherFields'), 'use_phrases' => 1, 'default' => 1),
'ReplaceDuplicates' => Array ('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array (0 => 'la_No', 1 => 'la_Yes'), 'use_phrases' => 1, 'default' => 0),
Index: in-commerce/units/shipping_quote_engines/usps.php
===================================================================
--- in-commerce/units/shipping_quote_engines/usps.php (revision 13557)
+++ in-commerce/units/shipping_quote_engines/usps.php (working copy)
@@ -671,7 +671,7 @@
$res = preg_replace('/[(]|[)]|[\-]|[ ]|[#]|[\.]|[a-z](.*)|[A-Z](.*)/g', '', $phone);
if ( strlen($res) > 10 ) {
$res = substr($res, 0, 10);
- }
+ }
return $res != '' ? $res : $phone;
}
@@ -991,6 +991,11 @@
}
if ( $label_file != '' ) {
+ $file_helper =& $this->Application->recallObject('FileHelper');
+ /* @var $file_helper FileHelper */
+
+ $file_helper->CheckFolder(USPS_LABEL_FOLDER);
+
if (!$handle = fopen($label_file, 'a')) echo "Cannot open file ($label_file)";
if ( @fwrite($handle, $DeliveryConfirmationLabel) === FALSE) echo "Cannot write to file ($label_file)";
}
Index: in-link/units/links/links_config.php
===================================================================
--- in-link/units/links/links_config.php (revision 13557)
+++ in-link/units/links/links_config.php (working copy)
@@ -545,7 +545,7 @@
// import related fields: begin
'FieldTitles' => Array ('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'la_Automatic', 2 => 'la_Manual'), 'use_phrases' => 1, 'default' => 1),
'ImportSource' => Array ('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'la_Upload', 2 => 'la_Local'), 'use_phrases' => 1, 'default' => 2),
- 'ImportFilename' => Array ('type' => 'string', 'formatter' => 'kUploadFormatter', 'max_size' => MAX_UPLOAD_SIZE, 'upload_dir' => (defined('EXPORT_BASE_PATH') ? EXPORT_BASE_PATH : '/system/export') . '/'),
+ 'ImportFilename' => Array ('type' => 'string', 'formatter' => 'kUploadFormatter', 'max_size' => MAX_UPLOAD_SIZE, 'upload_dir' => EXPORT_BASE_PATH . '/'),
'ImportLocalFilename' => Array ('type' => 'string', 'formatter' => 'kOptionsFormatter', 'default' => ''),
'CheckDuplicatesMethod' => Array ('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'la_IDField', 2 => 'la_OtherFields'), 'use_phrases' => 1, 'default' => 1),
'ReplaceDuplicates' => Array ('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array (0 => 'la_No', 1 => 'la_Yes'), 'use_phrases' => 1, 'default' => 0),
Index: in-news/units/articles/articles_config.php
===================================================================
--- in-news/units/articles/articles_config.php (revision 13557)
+++ in-news/units/articles/articles_config.php (working copy)
@@ -501,7 +501,7 @@
// import related fields: begin
'FieldTitles' => Array ('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'la_Automatic', 2 => 'la_Manual'), 'use_phrases' => 1, 'default' => 1),
'ImportSource' => Array ('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'la_Upload', 2 => 'la_Local'), 'use_phrases' => 1, 'default' => 2),
- 'ImportFilename' => Array ('type' => 'string', 'formatter' => 'kUploadFormatter', 'max_size' => MAX_UPLOAD_SIZE, 'upload_dir' => (defined('EXPORT_BASE_PATH') ? EXPORT_BASE_PATH : '/admin/export') . '/'),
+ 'ImportFilename' => Array ('type' => 'string', 'formatter' => 'kUploadFormatter', 'max_size' => MAX_UPLOAD_SIZE, 'upload_dir' => EXPORT_BASE_PATH . '/'),
'ImportLocalFilename' => Array ('type' => 'string', 'formatter' => 'kOptionsFormatter', 'default' => ''),
'CheckDuplicatesMethod' => Array ('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'la_IDField', 2 => 'la_OtherFields'), 'use_phrases' => 1, 'default' => 1),
'ReplaceDuplicates' => Array ('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array (0 => 'la_No', 1 => 'la_Yes'), 'use_phrases' => 1, 'default' => 0),
system.rar [^] (62,925 bytes) 2010-05-12 07:17 |