From 17ce867a5c88b2f4181a0bbc9119afdf161a2c58 Mon Sep 17 00:00:00 2001 From: Nicolas Leuenberger Date: Mon, 19 Dec 2011 18:50:16 +0100 Subject: [PATCH 01/33] ENHANCEMENT: Export DataObjects to CSV --- code/DataObjectManager.php | 4 ++++ css/dataobject_manager.css | 3 +++ lang/de_DE.php | 1 + lang/en_US.php | 1 + templates/DataObjectManager.ss | 9 ++++++--- 5 files changed, 15 insertions(+), 3 deletions(-) diff --git a/code/DataObjectManager.php b/code/DataObjectManager.php index c877d02..109b8fd 100644 --- a/code/DataObjectManager.php +++ b/code/DataObjectManager.php @@ -480,6 +480,10 @@ public function AddLink() { return Controller::join_links($this->BaseLink(), 'add'); } + public function ExportLink() { + return Controller::join_links($this->BaseLink(), 'export'); + } + public function ShowAll() { return $this->showAll == "1"; diff --git a/css/dataobject_manager.css b/css/dataobject_manager.css index 4e1ae57..a919069 100644 --- a/css/dataobject_manager.css +++ b/css/dataobject_manager.css @@ -68,6 +68,9 @@ .dataobjectmanager-search .sbox input {background: white url('../images/srch_bg.gif') repeat-x top left;float: left;border: 0;height: 13px; width: 112px;padding: 3px;font: 11px/13px arial;color: #666;} .dataobjectmanager-search .srch_clear {background: white url('../images/srch_r_f2.gif') no-repeat top left;} +.dataobjectmanager-button {position: absolute; top: 5px; left: 5px; padding: 2px 0px; background-color: #eee; border-color: #CCCCCC #999999 #999999 #CCCCCC; border-style: double; border-width: 2px;} +.dataobjectmanager-button a {padding: 5px 5px; font-size: 1.1em; color: #333; text-decoration: none;} +.dataobjectmanager-button a:hover {background-color: #f4f4f4;} .dataobjectmanager-filter {position:relative;width:30%;float:right;text-align:right;} .dataobjectmanager-filter select {width:100%;max-width:250px;} diff --git a/lang/de_DE.php b/lang/de_DE.php index 8d86a1c..9f8c050 100644 --- a/lang/de_DE.php +++ b/lang/de_DE.php @@ -11,6 +11,7 @@ $lang['de_DE']['DataObjectManager']['DISPLAYING'] = 'Zeige'; $lang['de_DE']['DataObjectManager']['DRAGDROP'] = 'Drag & Drop neuordnen'; $lang['de_DE']['DataObjectManager']['ERROR'] = 'Fehler'; +$lang['de_DE']['DataObjectManager']['EXPORT'] = '%s exportieren'; $lang['de_DE']['DataObjectManager']['IMPORTFROMFOLDER'] = 'Importieren aus einem existierenden Ordner'; $lang['de_DE']['DataObjectManager']['NOFILTER'] = 'Kein Filter'; $lang['de_DE']['DataObjectManager']['NOITEMSFOUND'] = 'Keine %s gefunden'; diff --git a/lang/en_US.php b/lang/en_US.php index 68ff085..151194d 100644 --- a/lang/en_US.php +++ b/lang/en_US.php @@ -14,6 +14,7 @@ $lang['en_US']['DataObjectManager']['DISPLAYING'] = 'Displaying'; $lang['en_US']['DataObjectManager']['DRAGDROP'] = 'Allow drag & drop reordering'; $lang['en_US']['DataObjectManager']['ERROR'] = 'Error'; +$lang['en_US']['DataObjectManager']['EXPORT'] = 'Export %s'; $lang['en_US']['DataObjectManager']['IMPORTFROMFOLDER'] = 'Import from an existing folder'; $lang['en_US']['DataObjectManager']['NOFILTER'] = 'No filter'; $lang['en_US']['DataObjectManager']['NOITEMSFOUND'] = 'No %s found'; diff --git a/templates/DataObjectManager.ss b/templates/DataObjectManager.ss index f5fa6ed..941eef6 100644 --- a/templates/DataObjectManager.ss +++ b/templates/DataObjectManager.ss @@ -87,10 +87,13 @@
-
- <% if Sortable %> + <% if Sortable %> +
checked="checked"<% end_if %> value="<% if Paginated %>$ShowAllLink<% else %>$PaginatedLink<% end_if %>" /> - <% end_if %> +
+ <% end_if %> +
<% if ShowAll %><% else %>$PerPageDropdown<% end_if %> From ff34bbf23e754a2950c93d3b10efeeca38fe92fa Mon Sep 17 00:00:00 2001 From: Juan Molina Date: Sat, 7 Jan 2012 17:16:53 +0100 Subject: [PATCH 02/33] Added French_France translation --- lang/fr_FR.php | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 lang/fr_FR.php diff --git a/lang/fr_FR.php b/lang/fr_FR.php new file mode 100644 index 0000000..5a04b65 --- /dev/null +++ b/lang/fr_FR.php @@ -0,0 +1,82 @@ + \ No newline at end of file From 63971147b99e37cbda22ca83cff8331e561cba53 Mon Sep 17 00:00:00 2001 From: miiihi Date: Tue, 10 Jan 2012 15:20:32 +0100 Subject: [PATCH 03/33] BUGFIX 'Having' must be 'where' and ANSI compatibility --- code/HasManyDataObjectManager.php | 2 +- code/ManyManyDataObjectManager.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/HasManyDataObjectManager.php b/code/HasManyDataObjectManager.php index 07af4e2..a2dafbe 100644 --- a/code/HasManyDataObjectManager.php +++ b/code/HasManyDataObjectManager.php @@ -151,7 +151,7 @@ function ExtraData() { function getSelectedIDs() { $ids = array(); $dataQuery = $this->getQuery(); - $dataQuery->having("{$this->joinField} = '{$this->controller->ID}'"); + $dataQuery->where("\"{$this->joinField}\" = '{$this->controller->ID}'"); $records = $dataQuery->execute(); $class = $this->sourceClass; foreach($records as $record) { diff --git a/code/ManyManyDataObjectManager.php b/code/ManyManyDataObjectManager.php index 17eba2d..37d604c 100644 --- a/code/ManyManyDataObjectManager.php +++ b/code/ManyManyDataObjectManager.php @@ -202,7 +202,7 @@ function ExtraData() { function getSelectedIDs() { $ids = array(); $dataQuery = $this->getQuery(); - $dataQuery->having("Checked = '1'"); + $dataQuery->where("Checked = '1'"); $records = $dataQuery->execute(); $class = $this->sourceClass; foreach($records as $record) { From d4fc6d4101e05072a0181adacffc68826a6fe682 Mon Sep 17 00:00:00 2001 From: miiihi Date: Tue, 10 Jan 2012 15:53:03 +0100 Subject: [PATCH 04/33] LANGUAGE fixes and additions. --- lang/sl_SI.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lang/sl_SI.php b/lang/sl_SI.php index ebcee67..b4ef49e 100644 --- a/lang/sl_SI.php +++ b/lang/sl_SI.php @@ -3,6 +3,7 @@ global $lang; $lang['sl_SI']['DataObjectManager']['ADD'] = 'Dodaj'; +$lang['sl_SI']['DataObjectManager']['ADDAFTERSAVE'] = 'Najprej shranite, potem boste lahko dodali %s.'; $lang['sl_SI']['DataObjectManager']['ADDEDNEW'] = 'Uspešno dodan nov %s'; $lang['sl_SI']['DataObjectManager']['ADDITEM'] = 'Dodaj %s'; $lang['sl_SI']['DataObjectManager']['ALLOWEDFILETYPES'] = 'Dovoljene so samo datoteke tipa %s'; @@ -12,7 +13,7 @@ $lang['sl_SI']['DataObjectManager']['ERROR'] = 'Napaka'; $lang['sl_SI']['DataObjectManager']['IMPORTFROMFOLDER'] = 'Uvozi iz mape'; $lang['sl_SI']['DataObjectManager']['NOFILTER'] = 'Brez filtra'; -$lang['sl_SI']['DataObjectManager']['NOITEMSFOUND'] = 'Ne najdem %s'; +$lang['sl_SI']['DataObjectManager']['NOITEMSFOUND'] = 'Ne najdem objektov.'; $lang['sl_SI']['DataObjectManager']['OF'] = 'od'; $lang['sl_SI']['DataObjectManager']['PERPAGERESULTS'] = 'zadetkov na stran'; $lang['sl_SI']['DataObjectManager']['PERPAGESHOW'] = 'Prikaži'; From 0f8cf53dd58ddf1f5246d47918a1bbf7c9bda858 Mon Sep 17 00:00:00 2001 From: miiihi Date: Thu, 12 Jan 2012 15:42:36 +0100 Subject: [PATCH 05/33] BUGFIX ANSI Compatibility done right --- code/ManyManyDataObjectManager.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/ManyManyDataObjectManager.php b/code/ManyManyDataObjectManager.php index 37d604c..b13e729 100644 --- a/code/ManyManyDataObjectManager.php +++ b/code/ManyManyDataObjectManager.php @@ -202,7 +202,7 @@ function ExtraData() { function getSelectedIDs() { $ids = array(); $dataQuery = $this->getQuery(); - $dataQuery->where("Checked = '1'"); + $dataQuery->where("(\"$this->manyManyTable\".\"{$this->manyManyParentClass}ID\" IS NOT NULL)"); $records = $dataQuery->execute(); $class = $this->sourceClass; foreach($records as $record) { From 4883f5f70f10a6582f40de15382aec18cb7590a3 Mon Sep 17 00:00:00 2001 From: pelse Date: Mon, 23 Jan 2012 15:50:24 +0100 Subject: [PATCH 06/33] Update code/ManyManyDataObjectManager.php --- code/ManyManyDataObjectManager.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/ManyManyDataObjectManager.php b/code/ManyManyDataObjectManager.php index b13e729..fecf73e 100644 --- a/code/ManyManyDataObjectManager.php +++ b/code/ManyManyDataObjectManager.php @@ -60,7 +60,7 @@ function __construct($controller, $name, $sourceClass, $fieldList = null, $detai $sourceField = 'Child'; $parentID = $this->controller->ID; - $this->sourceJoin .= " LEFT JOIN \"$manyManyTable\" ON (\"$source\".\"ID\" = \"{$sourceField}ID\" AND \"$manyManyTable\".\"{$this->manyManyParentClass}ID\" = '$parentID')"; + $this->sourceJoin .= " LEFT JOIN \"$manyManyTable\" ON (\"$source\".\"ID\" = \"$manyManyTable\".\"{$sourceField}ID\" AND \"$manyManyTable\".\"{$this->manyManyParentClass}ID\" = '$parentID')"; $this->joinField = 'Checked'; if(isset($_REQUEST['ctf'][$this->Name()]['only_related'])) From 9152987f0d0e996e7acd1312de148312be27d5d5 Mon Sep 17 00:00:00 2001 From: UndefinedOffset Date: Mon, 30 Jan 2012 10:31:25 -0400 Subject: [PATCH 07/33] Fixed issue causing ManyMany DOM to re-check unchecked items when moving through pages --- code/HasManyDataObjectManager.php | 1 + code/ManyManyDataObjectManager.php | 1 + javascript/dataobject_manager.js | 15 +++++++++++++-- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/code/HasManyDataObjectManager.php b/code/HasManyDataObjectManager.php index a2dafbe..3cf4f1c 100644 --- a/code/HasManyDataObjectManager.php +++ b/code/HasManyDataObjectManager.php @@ -140,6 +140,7 @@ function ExtraData() { $inputId = $this->id() . '_' . $this->htmlListEndName; return << + HTML; } diff --git a/code/ManyManyDataObjectManager.php b/code/ManyManyDataObjectManager.php index b13e729..8dd5b12 100644 --- a/code/ManyManyDataObjectManager.php +++ b/code/ManyManyDataObjectManager.php @@ -191,6 +191,7 @@ function ExtraData() { return << + HTML; } diff --git a/javascript/dataobject_manager.js b/javascript/dataobject_manager.js index 21ec09b..ba929df 100644 --- a/javascript/dataobject_manager.js +++ b/javascript/dataobject_manager.js @@ -293,6 +293,11 @@ $.fn.DataObjectManager.init = function(obj) { $(this).parents('li').toggleClass('selected'); val = ($(this).attr('checked')) ? $checkedList.val() + $(this).val()+"," : $checkedList.val().replace(","+$(this).val()+",",","); $checkedList.attr('value', val); + + + $uCheckedList=$(container_id+'_CheckedList_UnChecked'); + uVal = ($(this).attr('checked')==false ? $uCheckedList.val() + $(this).val()+"," : $uCheckedList.val().replace(","+$(this).val()+",",",")); + $(container_id+'_CheckedList_UnChecked').val(uVal); } e.stopPropagation(); }); @@ -395,6 +400,7 @@ function refresh($div, link, focus) { // Kind of a hack. Pass the list of ids to the next refresh var listValue = ($div.hasClass('RelationDataObjectManager')) ? jQuery('#'+$div.attr('id')+'_CheckedList').val() : false; + var uncheckedListValue = ($div.hasClass('RelationDataObjectManager')) ? jQuery('#'+$div.attr('id')+'_CheckedList_UnChecked').val() : false; // Make a list of all ids so we can detect newly created ones var all = ','; @@ -414,6 +420,7 @@ function refresh($div, link, focus) if(listValue) { jQuery('#'+$div.attr('id')+'_CheckedList').attr('value',listValue); } + // Add newly created items in if checked jQuery(html).find('li.data input:checkbox') .each( @@ -421,7 +428,7 @@ function refresh($div, link, focus) el = jQuery(el); if (el.attr('checked') && jQuery.inArray(el.val(), all - .split(',')) == -1) { + .split(',')) == -1 && jQuery.inArray(el.val(), listValue.split(',')) == -1 && jQuery.inArray(el.val(), uncheckedListValue.split(',')) == -1) { jQuery( '#' + $div.attr('id') + '_CheckedList').val( @@ -432,6 +439,10 @@ function refresh($div, link, focus) + el.val() + ','); } }); + + //Migrate unchecked + jQuery('#'+$div.attr('id')+'_CheckedList_UnChecked').val(uncheckedListValue); + var $container = jQuery('#'+$div.attr('id')); $container.DataObjectManager(); @@ -446,4 +457,4 @@ function refresh($div, link, focus) DragFileItem.applyTo('#Form_EditForm_Files tr td.dragfile'); } }); -} +} \ No newline at end of file From fa1545175cfb7f135b16f33f4f7359dbbccf6d5d Mon Sep 17 00:00:00 2001 From: jim2mullered Date: Tue, 7 Feb 2012 11:55:50 +0000 Subject: [PATCH 08/33] Update code/FileDataObjectManager.php --- code/FileDataObjectManager.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/FileDataObjectManager.php b/code/FileDataObjectManager.php index de1c08f..c6f6cc5 100644 --- a/code/FileDataObjectManager.php +++ b/code/FileDataObjectManager.php @@ -18,6 +18,7 @@ class FileDataObjectManager extends DataObjectManager protected $limitFileTypes; protected $uploadLimit; protected $allowUploadFolderSelection = true; + protected $isDraggable = true; protected $enableUploadDebugging = false; public $hasDataObject = true; public $importClass = "File"; @@ -215,6 +216,11 @@ public function allowUploadFolderSelection() $this->allowUploadFolderSelection = true; } + public function isDraggable() + { + return $this->isDraggable ? true : false; + } + public function enableUploadDebugging() { $this->enableUploadDebugging = true; From 714edb49724ffaf13f5b17fe9fe384752f8e4328 Mon Sep 17 00:00:00 2001 From: jim2mullered Date: Tue, 7 Feb 2012 11:57:21 +0000 Subject: [PATCH 09/33] Update templates/FileDataObjectManager.ss --- templates/FileDataObjectManager.ss | 2 ++ 1 file changed, 2 insertions(+) diff --git a/templates/FileDataObjectManager.ss b/templates/FileDataObjectManager.ss index 090ade1..150f2c3 100644 --- a/templates/FileDataObjectManager.ss +++ b/templates/FileDataObjectManager.ss @@ -73,6 +73,7 @@ <% control Items %>
  • + <% if Top.isDraggable %>
    @@ -80,6 +81,7 @@
    + <% end_if %> <% if Top.ListView %> From 56e3cab03701ea144676e49c9d5bd1edc99feb66 Mon Sep 17 00:00:00 2001 From: jim2mullered Date: Tue, 7 Feb 2012 11:57:53 +0000 Subject: [PATCH 10/33] Update templates/FileDataObjectManager.ss --- templates/FileDataObjectManager.ss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/FileDataObjectManager.ss b/templates/FileDataObjectManager.ss index 150f2c3..149fc36 100644 --- a/templates/FileDataObjectManager.ss +++ b/templates/FileDataObjectManager.ss @@ -73,7 +73,7 @@ <% control Items %>
  • - <% if Top.isDraggable %> + <% if Top.isDragable %>
    From 737d31e386ecdf36795d71fd972900a12bda5f35 Mon Sep 17 00:00:00 2001 From: jim2mullered Date: Tue, 7 Feb 2012 11:58:53 +0000 Subject: [PATCH 11/33] Update code/FileDataObjectManager.php --- code/FileDataObjectManager.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/FileDataObjectManager.php b/code/FileDataObjectManager.php index c6f6cc5..e3fe7cc 100644 --- a/code/FileDataObjectManager.php +++ b/code/FileDataObjectManager.php @@ -18,7 +18,7 @@ class FileDataObjectManager extends DataObjectManager protected $limitFileTypes; protected $uploadLimit; protected $allowUploadFolderSelection = true; - protected $isDraggable = true; + protected $isDragable = true; protected $enableUploadDebugging = false; public $hasDataObject = true; public $importClass = "File"; @@ -216,7 +216,7 @@ public function allowUploadFolderSelection() $this->allowUploadFolderSelection = true; } - public function isDraggable() + public function isDragable() { return $this->isDraggable ? true : false; } From 3326cb5114de86c5958936d64dc0f352e4bd313d Mon Sep 17 00:00:00 2001 From: jim2mullered Date: Tue, 7 Feb 2012 12:00:58 +0000 Subject: [PATCH 12/33] Update code/FileDataObjectManager.php --- code/FileDataObjectManager.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/FileDataObjectManager.php b/code/FileDataObjectManager.php index e3fe7cc..4338b90 100644 --- a/code/FileDataObjectManager.php +++ b/code/FileDataObjectManager.php @@ -18,7 +18,7 @@ class FileDataObjectManager extends DataObjectManager protected $limitFileTypes; protected $uploadLimit; protected $allowUploadFolderSelection = true; - protected $isDragable = true; + protected $allowDragDrop = true; protected $enableUploadDebugging = false; public $hasDataObject = true; public $importClass = "File"; @@ -216,9 +216,9 @@ public function allowUploadFolderSelection() $this->allowUploadFolderSelection = true; } - public function isDragable() + public function allowDragDrop() { - return $this->isDraggable ? true : false; + return $this->allowDragDrop ? true : false; } public function enableUploadDebugging() From 3a79ef3e212e2a030ab2d35e6dbdf3c2679a4cfc Mon Sep 17 00:00:00 2001 From: jim2mullered Date: Tue, 7 Feb 2012 12:02:14 +0000 Subject: [PATCH 13/33] Update templates/FileDataObjectManager.ss --- templates/FileDataObjectManager.ss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/FileDataObjectManager.ss b/templates/FileDataObjectManager.ss index 149fc36..44a5f4c 100644 --- a/templates/FileDataObjectManager.ss +++ b/templates/FileDataObjectManager.ss @@ -73,7 +73,7 @@ <% control Items %>
  • - <% if Top.isDragable %> + <% if Top.allowDragDrop %>
    From f7171fe98c3662402d6c95c77df992c4a188f450 Mon Sep 17 00:00:00 2001 From: Zauberfisch Date: Thu, 1 Mar 2012 16:00:57 +0100 Subject: [PATCH 14/33] BUGFIX: use $sort_field for query (bug in many_many sortable: in a many many relation from eg Page to Image it would try to select Image.SortOrder instead of Page_ImageRelation.SortOrder) --- code/SortableDataObject.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/SortableDataObject.php b/code/SortableDataObject.php index 3e3cab1..8ef6dd4 100644 --- a/code/SortableDataObject.php +++ b/code/SortableDataObject.php @@ -101,7 +101,7 @@ public function augmentSQL(SQLQuery &$query) if(stristr($from,$join_table)) { $sort_field = "\"$join_table\".\"SortOrder\""; if(isset($query->select['SortOrder'])) { - $query->select['SortOrder'] = "\"{$this->owner->class}\".SortOrder AS LocalSort"; + $query->select['SortOrder'] = "$sort_field AS LocalSort"; } break; } From 4ba313d447eaebfe9d724e39b44458da1289a668 Mon Sep 17 00:00:00 2001 From: jonom Date: Fri, 9 Mar 2012 15:20:57 -0700 Subject: [PATCH 15/33] Changed getSetting() so it returns object setting if not null, rather than if not false (so valid setting of 'false' can be retrieved) --- code/DataObjectManager.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/DataObjectManager.php b/code/DataObjectManager.php index c877d02..64014f9 100644 --- a/code/DataObjectManager.php +++ b/code/DataObjectManager.php @@ -268,8 +268,8 @@ public function getQueryString($params = array()) } public function getSetting($setting) - { - if($this->$setting) { + { + if($this->$setting !== null) { return $this->$setting; } return Object::get_static($this->class,DOMUtil::to_underscore($setting)); From 595a76680dafc8a18ab43e7177627ae4d696547d Mon Sep 17 00:00:00 2001 From: jonom Date: Fri, 9 Mar 2012 15:28:18 -0700 Subject: [PATCH 16/33] Enhancement: Allow for global setting of $copy_on_import in _config.php. i.e. FileDataObjectManager::$copy_on_import = false; Backwards compatible i.e. $manager->copyOnImport = true; will still work and override global setting. Kept default value of copyOnImport as true for backwards compatibility although I think false would be a better default. --- code/FileDataObjectManager.php | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/code/FileDataObjectManager.php b/code/FileDataObjectManager.php index de1c08f..7b40f44 100644 --- a/code/FileDataObjectManager.php +++ b/code/FileDataObjectManager.php @@ -10,6 +10,7 @@ class FileDataObjectManager extends DataObjectManager public static $upgrade_video = true; public static $upgrade_image = true; public static $upload_limit = "40"; + public static $copy_on_import = true; public $view; public $default_view = "grid"; @@ -43,7 +44,7 @@ class FileDataObjectManager extends DataObjectManager public $uploadifyField = "MultipleFileUploadField"; - public $copyOnImport = true; + public $copyOnImport; public function __construct($controller, $name = null, $sourceClass = null, $fileFieldName = null, $fieldList = null, $detailFormFields = null, $sourceFilter = "", $sourceSort = "", $sourceJoin = "") { @@ -195,6 +196,16 @@ public function getUploadLimit() return $this->getSetting('uploadLimit'); } + public function setCopyOnImport($bool) + { + $this->copyOnImport = $bool; + } + + public function getCopyOnImport() + { + return $this->getSetting('copyOnImport'); + } + public function setBrowseButtonText($text) { $this->browseButtonText = $text; @@ -427,7 +438,7 @@ public function saveUploadifyForm($data, $form) if($file = DataObject::get_by_id("File", (int) $id)) { $upload_folder = $form->Fields()->fieldByName('UploadedFiles')->uploadFolder; $folder_id = Folder::findOrMake($upload_folder)->ID; - if($this->copyOnImport && ($file->ParentID != $folder_id)) { + if($this->getCopyOnImport() && ($file->ParentID != $folder_id)) { $new_file_path = $upload_folder.'/'.$file->Name; copy($file->getFullPath(), BASE_PATH.'/'.ASSETS_DIR.'/'.$new_file_path); $clone = new $file_class(); From 34ecc6e62fa1473e4ff0761b6b8a7b3d77c5bbd4 Mon Sep 17 00:00:00 2001 From: Simon Elvery Date: Fri, 23 Mar 2012 19:17:53 +1000 Subject: [PATCH 17/33] BUGFIX: Pay better attention to the locale on sites with Translatable enabled. This fixes a bug with DOMs related translated SiteConfigs. --- code/DataObjectManager.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/code/DataObjectManager.php b/code/DataObjectManager.php index c877d02..b3af833 100644 --- a/code/DataObjectManager.php +++ b/code/DataObjectManager.php @@ -264,7 +264,11 @@ public function getQueryString($params = array()) $sort_dir = isset($params['sort_dir'])? $params['sort_dir'] : $this->sort_dir; $filter = isset($params['filter'])? $params['filter'] : $this->filter; $search = isset($params['search'])? $params['search'] : $this->search; - return "ctf[{$this->Name()}][start]={$start}&ctf[{$this->Name()}][per_page]={$per_page}&ctf[{$this->Name()}][showall]={$show_all}&ctf[{$this->Name()}][sort]={$sort}&ctf[{$this->Name()}][sort_dir]={$sort_dir}&ctf[{$this->Name()}][search]={$search}&ctf[{$this->Name()}][filter]={$filter}"; + + // Restrict to the current locale if the DataObject is Translatable + $locale = (Translatable::is_enabled()) ? 'locale=' . Translatable::get_current_locale() . '&' : ''; + + return "{$locale}ctf[{$this->Name()}][start]={$start}&ctf[{$this->Name()}][per_page]={$per_page}&ctf[{$this->Name()}][showall]={$show_all}&ctf[{$this->Name()}][sort]={$sort}&ctf[{$this->Name()}][sort_dir]={$sort_dir}&ctf[{$this->Name()}][search]={$search}&ctf[{$this->Name()}][filter]={$filter}"; } public function getSetting($setting) @@ -477,7 +481,7 @@ public function PaginatedLink() } public function AddLink() { - return Controller::join_links($this->BaseLink(), 'add'); + return Controller::join_links($this->BaseLink(), 'add', ((Translatable::is_enabled()) ? '?locale=' . Translatable::get_current_locale() : '')); } public function ShowAll() From 25ff952cb16fb90c7074d06eeb98694f1f2904fc Mon Sep 17 00:00:00 2001 From: jmwohl Date: Sun, 25 Mar 2012 09:31:01 -0300 Subject: [PATCH 18/33] I'm running into an issue where I have multiple DOM instances in the same CMS interface, housing the same DataObjects, and I need them both to update when one changes. Aside from the minor performance hit, is there any reason not to refresh all present DOMs on the close.facebox event? --- javascript/dataobject_manager.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/javascript/dataobject_manager.js b/javascript/dataobject_manager.js index ba929df..31aec81 100644 --- a/javascript/dataobject_manager.js +++ b/javascript/dataobject_manager.js @@ -20,7 +20,9 @@ $.fn.DataObjectManager.init = function(obj) { $('#facebox .content').removeClass().addClass('content'); $('#facebox_overlay').remove(); $('#facebox .loading').remove(); - refresh($container, $container.attr('href')); + $(".DataObjectManager").each(function() { + refresh($(this), $(this).attr('href')); + }); }) }; From dff7dc92b5791c58b28142f96bf69e187207c2ef Mon Sep 17 00:00:00 2001 From: Simon Elvery Date: Wed, 28 Mar 2012 11:56:18 +1000 Subject: [PATCH 19/33] BUGFIX: Fix a clash between the export button and the drag & drop sort switch. --- css/dataobject_manager.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/css/dataobject_manager.css b/css/dataobject_manager.css index a919069..b4b0a5d 100644 --- a/css/dataobject_manager.css +++ b/css/dataobject_manager.css @@ -68,7 +68,7 @@ .dataobjectmanager-search .sbox input {background: white url('../images/srch_bg.gif') repeat-x top left;float: left;border: 0;height: 13px; width: 112px;padding: 3px;font: 11px/13px arial;color: #666;} .dataobjectmanager-search .srch_clear {background: white url('../images/srch_r_f2.gif') no-repeat top left;} -.dataobjectmanager-button {position: absolute; top: 5px; left: 5px; padding: 2px 0px; background-color: #eee; border-color: #CCCCCC #999999 #999999 #CCCCCC; border-style: double; border-width: 2px;} +.dataobjectmanager-button {float: left; margin-top: 5px; left: 5px; padding: 2px 0px; background-color: #eee; border-color: #CCCCCC #999999 #999999 #CCCCCC; border-style: double; border-width: 2px;} .dataobjectmanager-button a {padding: 5px 5px; font-size: 1.1em; color: #333; text-decoration: none;} .dataobjectmanager-button a:hover {background-color: #f4f4f4;} From aab754f8d9d1d9a92922c2b23928ea7530368cea Mon Sep 17 00:00:00 2001 From: "Jonas A." Date: Thu, 24 May 2012 20:27:12 +0300 Subject: [PATCH 20/33] FIXED: onBeforeWrite, setting SortOrder performance/memory usage issue --- code/SortableDataObject.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/SortableDataObject.php b/code/SortableDataObject.php index 8ef6dd4..d6f77a6 100644 --- a/code/SortableDataObject.php +++ b/code/SortableDataObject.php @@ -118,8 +118,9 @@ public function augmentSQL(SQLQuery &$query) public function onBeforeWrite() { if(!$this->owner->ID) { - if($peers = DataObject::get($this->owner->class)) - $this->owner->SortOrder = $peers->Count()+1; + $sql = new SQLQuery("count(ID)", array_shift(ClassInfo::dataClassesFor($this->owner->class))); + $val = $sql->execute()->value(); + $this->owner->SortOrder = is_numeric($val)?$val+1:1; } } From dc6dd6203c7d5f0457a501ddc95308037ec04313 Mon Sep 17 00:00:00 2001 From: Daniel Hensby Date: Thu, 26 Jul 2012 19:13:51 +0200 Subject: [PATCH 21/33] Changing JS for click to toggle Moving the class 'click to toggle' to the parent of the UL, so JS change reflects that --- javascript/dataobject_manager.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/javascript/dataobject_manager.js b/javascript/dataobject_manager.js index 31aec81..33571f5 100644 --- a/javascript/dataobject_manager.js +++ b/javascript/dataobject_manager.js @@ -172,7 +172,7 @@ $.fn.DataObjectManager.init = function(obj) { // Click function for the LI $container.find('ul:not(.ui-sortable) li.data').unbind('click').click(function(e) { var $this = $(this); - if ($this.parent().hasClass('toggleSelect')) { + if ($this.parent().parent().hasClass('toggleSelect')) { var $input = $this.find('input'), checker = !$input.attr('checked'); //don't ask me wtf is going on here! From 6f4a124e3ae7d35db0bc2d1e6166dd3277f6aefa Mon Sep 17 00:00:00 2001 From: Daniel Hensby Date: Thu, 26 Jul 2012 18:16:15 +0100 Subject: [PATCH 22/33] Fixing sortable dataobjects when using click to toggle At the moment, ClickToToggle being enabled breaks the drag and drop reordoring due to some JS assumptions being made. I've moved the class set on the ul up to the parent to solve this problem --- templates/DataObjectManager.ss | 15 ++++++--------- templates/RelationDataObjectManager.ss | 8 ++++---- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/templates/DataObjectManager.ss b/templates/DataObjectManager.ss index 941eef6..81472fb 100644 --- a/templates/DataObjectManager.ss +++ b/templates/DataObjectManager.ss @@ -4,7 +4,7 @@ <% if Can(add) %> <% sprintf(_t('DataObjectManager.ADDITEM','Add %s',PR_MEDIUM,'Add [name]'),$AddTitle) %> - + <% else %>

    $PluralTitle

    <% end_if %> @@ -39,8 +39,8 @@
    -
    -
      +
      +
      • <% control Headings %> @@ -87,13 +87,10 @@
        - <% if Sortable %> -
        +
        + <% if Sortable %> checked="checked"<% end_if %> value="<% if Paginated %>$ShowAllLink<% else %>$PaginatedLink<% end_if %>" /> -
        - <% end_if %> -
        <% if ShowAll %><% else %>$PerPageDropdown<% end_if %> diff --git a/templates/RelationDataObjectManager.ss b/templates/RelationDataObjectManager.ss index 32855b8..6cb16f7 100644 --- a/templates/RelationDataObjectManager.ss +++ b/templates/RelationDataObjectManager.ss @@ -39,8 +39,8 @@
        -
        -
          +
          +
          • <% control Headings %> @@ -100,7 +100,7 @@ checked="checked"<% end_if %> value="<% if OnlyRelated %>$AllRecordsLink<% else %>$OnlyRelatedLink<% end_if %>" />
            <% end_if %> - <% end_if %> + <% end_if %>
            <% if ShowAll %><% else %>$PerPageDropdown<% end_if %>
            @@ -108,5 +108,5 @@
        - $ExtraData + $ExtraData
        From 52ff3d8b0f3d748d189e2672514d79140e2eb73d Mon Sep 17 00:00:00 2001 From: Will Morgan Date: Wed, 5 Dec 2012 12:05:50 +0000 Subject: [PATCH 23/33] FIXED: Column names when updating SortOrder The SortOrder update query was using arbitrary fields to update, which caused a bug with Page-Page self referencing many many relationships. The query has been changed to use the Sapphire ORM-reported column names, which stops the erroneous query logic like WHERE PageID = 1 AND PageID = 2 and now uses WHERE PageID = 1 AND ChildID = 2, where ChildID is reported as the correct field by Sapphire. --- code/DataObjectManager.php | 362 ++++++++++++++++++------------------- 1 file changed, 177 insertions(+), 185 deletions(-) diff --git a/code/DataObjectManager.php b/code/DataObjectManager.php index 264d30f..69fcf58 100644 --- a/code/DataObjectManager.php +++ b/code/DataObjectManager.php @@ -2,12 +2,12 @@ class DataObjectManager extends ComplexTableField { - + protected static $allow_assets_override = true; protected static $allow_css_override = false; public static $popup_width = 640; protected static $confirm_delete = true; - + protected $template = "DataObjectManager"; protected $start = "0"; protected $per_page = "10"; @@ -32,8 +32,8 @@ class DataObjectManager extends ComplexTableField public $singleTitle; public $hasNested = false; public $isNested = false; - - + + public $actions = array( @@ -52,11 +52,11 @@ class DataObjectManager extends ComplexTableField static $url_handlers = array( 'duplicate/$ID' => 'handleDuplicate' ); - - + + public $popupClass = "DataObjectManager_Popup"; public $templatePopup = "DataObjectManager_popup"; - + public static function allow_assets_override($bool) { if($bool) { @@ -66,27 +66,27 @@ public static function allow_assets_override($bool) else DataObject::remove_extension("Folder","AssetManagerFolder"); } - + public static function allow_css_override($bool) { self::$allow_css_override = $bool; } - + public static function set_popup_width($width) { self::$popup_width = $width; } - + public static function set_confirm_delete($bool) { self::$confirm_delete = $bool; } - - function __construct($controller, $name = null, $sourceClass = null, $fieldList = null, $detailFormFields = null, $sourceFilter = "", $sourceSort = null, $sourceJoin = "") + + function __construct($controller, $name = null, $sourceClass = null, $fieldList = null, $detailFormFields = null, $sourceFilter = "", $sourceSort = null, $sourceJoin = "") { if(!class_exists("ComplexTableField_ItemRequest")) die(""._t('DataObjectManager.ERROR','Error').": "._t('DataObjectManager.SILVERSTRIPEVERSION','DataObjectManager requires Silverstripe version 2.3 or higher.')); - + // If no name is given, search the has_many for the first relation. if($name === null && $sourceClass === null) { if($has_manys = $controller->stat('has_many')) { @@ -98,7 +98,7 @@ function __construct($controller, $name = null, $sourceClass = null, $fieldList } } $SNG = singleton($sourceClass); - + if($fieldList === null) { $diff = array_diff($SNG->summaryFields(),singleton('DataObject')->summaryFields()); @@ -119,11 +119,11 @@ function __construct($controller, $name = null, $sourceClass = null, $fieldList if(self::$allow_css_override) Requirements::css('dataobject_manager/css/dataobjectmanager_override.css'); Requirements::javascript(THIRDPARTY_DIR.'/jquery-livequery/jquery.livequery.js'); - Requirements::javascript('dataobject_manager/javascript/facebox.js'); + Requirements::javascript('dataobject_manager/javascript/facebox.js'); Requirements::javascript('dataobject_manager/javascript/dom_jquery_ui.js'); Requirements::javascript('dataobject_manager/javascript/tooltip.js'); Requirements::javascript('dataobject_manager/javascript/dataobject_manager.js'); - + $this->filter_empty_string = '-- '._t('DataObjectManager.NOFILTER','No filter').' --'; if($this->sourceSort) { @@ -144,12 +144,12 @@ function __construct($controller, $name = null, $sourceClass = null, $fieldList $this->per_page = $_REQUEST['ctf'][$this->Name()]['per_page']; $this->showAll = $_REQUEST['ctf'][$this->Name()]['showall']; $this->search = $_REQUEST['ctf'][$this->Name()]['search']; - $this->filter = $_REQUEST['ctf'][$this->Name()]['filter']; + $this->filter = $_REQUEST['ctf'][$this->Name()]['filter']; $this->sort = $_REQUEST['ctf'][$this->Name()]['sort']; $this->sort_dir = $_REQUEST['ctf'][$this->Name()]['sort_dir']; } - - + + $this->setPageSize($this->per_page); $this->loadSort(); $this->loadSourceFilter(); @@ -170,27 +170,27 @@ function __construct($controller, $name = null, $sourceClass = null, $fieldList public function setClickToToggle($bool) { $this->clickToToggle = $bool; } - + public function setSourceFilter($filter) { $this->sourceFilter = $filter; } - + public function setUseViewAll($bool) { $this->use_view_all = $bool; } - + public function setPerPageMap($values) { $this->per_page_map = $values; } - + public function setPluralTitle($title) { $this->pluralTitle = $title; } - + public function setWideMode($bool) { $this->hasNested = $bool; @@ -200,13 +200,13 @@ public function PluralTitle() { return $this->pluralTitle ? $this->pluralTitle : $this->AddTitle()."s"; } - - + + protected function loadSort() { - if($this->ShowAll()) + if($this->ShowAll()) $this->setPageSize(999); - + if($this->Sortable() && (!isset($_REQUEST['ctf'][$this->Name()]['sort']) || $_REQUEST['ctf'][$this->Name()]['sort'] == "SortOrder")) { $this->sort = "SortOrder"; $this->sourceSort = "\"SortOrder\" ASC"; @@ -222,7 +222,7 @@ protected function loadSort() } } - + protected function loadSourceFilter() { $filter_string = ""; @@ -231,14 +231,14 @@ protected function loadSourceFilter() $field = substr($this->filter, 0, $break); $value = substr($this->filter, $break+1, strlen($this->filter) - strlen($field)); $filter_string = $field . "='$value'"; - } + } $search_string = ""; if(!empty($this->search)) { $search = array(); - $SNG = singleton($this->sourceClass); + $SNG = singleton($this->sourceClass); foreach(parent::Headings() as $field) { - if($SNG->hasDatabaseField($field->Name)) + if($SNG->hasDatabaseField($field->Name)) $search[] = "UPPER({$this->sourceClass}.$field->Name) LIKE '%".Convert::raw2sql(strtoupper($this->search))."%'"; } if(!empty($search)) { @@ -248,15 +248,15 @@ protected function loadSourceFilter() $and = (!empty($this->filter) && !empty($this->search)) ? " AND " : ""; $source_filter = $filter_string.$and.$search_string; if(!$this->sourceFilter) $this->sourceFilter = $source_filter; - else if($this->sourceFilter && !empty($source_filter)) $this->sourceFilter .= " AND " . $source_filter; + else if($this->sourceFilter && !empty($source_filter)) $this->sourceFilter .= " AND " . $source_filter; } - + public function handleItem($request) { return new DataObjectManager_ItemRequest($this, $request->param('ID')); } public function getQueryString($params = array()) - { + { $start = isset($params['start'])? $params['start'] : $this->start; $per_page = isset($params['per_page'])? $params['per_page'] : $this->per_page; $show_all = isset($params['show_all'])? $params['show_all'] : $this->showAll; @@ -264,21 +264,17 @@ public function getQueryString($params = array()) $sort_dir = isset($params['sort_dir'])? $params['sort_dir'] : $this->sort_dir; $filter = isset($params['filter'])? $params['filter'] : $this->filter; $search = isset($params['search'])? $params['search'] : $this->search; - - // Restrict to the current locale if the DataObject is Translatable - $locale = (Translatable::is_enabled()) ? 'locale=' . Translatable::get_current_locale() . '&' : ''; - - return "{$locale}ctf[{$this->Name()}][start]={$start}&ctf[{$this->Name()}][per_page]={$per_page}&ctf[{$this->Name()}][showall]={$show_all}&ctf[{$this->Name()}][sort]={$sort}&ctf[{$this->Name()}][sort_dir]={$sort_dir}&ctf[{$this->Name()}][search]={$search}&ctf[{$this->Name()}][filter]={$filter}"; + return "ctf[{$this->Name()}][start]={$start}&ctf[{$this->Name()}][per_page]={$per_page}&ctf[{$this->Name()}][showall]={$show_all}&ctf[{$this->Name()}][sort]={$sort}&ctf[{$this->Name()}][sort_dir]={$sort_dir}&ctf[{$this->Name()}][search]={$search}&ctf[{$this->Name()}][filter]={$filter}"; } - + public function getSetting($setting) - { - if($this->$setting !== null) { + { + if($this->$setting) { return $this->$setting; } return Object::get_static($this->class,DOMUtil::to_underscore($setting)); } - + function FieldHolder() { if(!$this->controller->ID && $this->isNested) @@ -286,7 +282,7 @@ function FieldHolder() return parent::FieldHolder(); } - + public function HasSearch() { $SNG = singleton($this->sourceClass); foreach(parent::Headings() as $field) { @@ -296,17 +292,17 @@ public function HasSearch() { } return false; } - + public function Headings() { $headings = array(); foreach($this->fieldList as $fieldName => $fieldTitle) { - if(isset($_REQUEST['ctf'][$this->Name()]['sort_dir'])) + if(isset($_REQUEST['ctf'][$this->Name()]['sort_dir'])) $dir = $_REQUEST['ctf'][$this->Name()]['sort_dir'] == "ASC" ? "DESC" : "ASC"; - else - $dir = "ASC"; + else + $dir = "ASC"; $headings[] = new ArrayData(array( - "Name" => $fieldName, + "Name" => $fieldName, "Title" => ($this->sourceClass) ? singleton($this->sourceClass)->fieldLabel($fieldTitle) : $fieldTitle, "IsSortable" => singleton($this->sourceClass)->hasDatabaseField($fieldName), "SortLink" => $this->RelativeLink(array( @@ -320,66 +316,66 @@ public function Headings() } return new DataObjectSet($headings); } - + function saveComplexTableField($data, $form, $params) { $className = $this->sourceClass(); $childData = new $className(); $form->saveInto($childData); try { $childData->write(); - } + } catch(ValidationException $e) { $form->sessionMessage($e->getResult()->message(), 'bad'); return Director::redirectBack(); - } + } if($childData->many_many()) { $form->saveInto($childData); $childData->write(); - } + } $form->sessionMessage(sprintf(_t('DataObjectManager.ADDEDNEW','Added new %s successfully'),$this->SingleTitle()), 'good'); if($form->getFileFields() || $form->getNestedDOMs()) { $form->clearMessage(); - Director::redirect(Controller::join_links($this->BaseLink(),'item', $childData->ID, 'edit')); + Director::redirect(Controller::join_links($this->BaseLink(),'item', $childData->ID, 'edit')); } else Director::redirectBack(); } - - function setSourceID($val) { - if (is_numeric($val)) { - $this->sourceID = $val; + + function setSourceID($val) { + if (is_numeric($val)) { + $this->sourceID = $val; $this->hasCustomSourceID = true; - } - } - + } + } + function sourceID() { if ($this->hasCustomSourceID) { return $this->sourceID; } - + if($this->isNested) - return $this->controller->ID; - $idField = $this->form->dataFieldByName('ID'); - return ($idField && is_numeric($idField->Value())) ? $idField->Value() : (isset($_REQUEST['ctf']['ID']) ? $_REQUEST['ctf']['ID'] : null); - } - - + return $this->controller->ID; + $idField = $this->form->dataFieldByName('ID'); + return ($idField && is_numeric($idField->Value())) ? $idField->Value() : (isset($_REQUEST['ctf']['ID']) ? $_REQUEST['ctf']['ID'] : null); + } + + protected function getRawDetailFields($childData) { - if(is_a($this->detailFormFields,"Fieldset")) + if(is_a($this->detailFormFields,"Fieldset")) $fields = $this->detailFormFields; else { if(!is_string($this->detailFormFields)) $this->detailFormFields = "getCMSFields"; $functioncall = $this->detailFormFields; if(!$childData->hasMethod($functioncall)) $functioncall = "getCMSFields"; - + $fields = $childData->{$functioncall}($this); } - return $fields; + return $fields; } - + public function getCustomFieldsFor($childData) { $fields = $this->getRawDetailFields($childData); foreach($fields as $field) { @@ -388,17 +384,17 @@ public function getCustomFieldsFor($childData) { } return $fields; } - + function AddForm($childID = null) { $form = parent::AddForm($childID); - $actions = new FieldSet(); + $actions = new FieldSet(); $titles = array(); if($files = $form->getFileFields()) { foreach($files as $field) $titles[] = DOMUtil::readable_class($field->Title()); } if($doms = $form->getNestedDOMs()) - foreach($doms as $field) $titles[] = $field->PluralTitle(); + foreach($doms as $field) $titles[] = $field->PluralTitle(); if(empty($titles)) $text = _t('DataObjectManager.SAVE','Save'); elseif(sizeof($titles) > 3) { @@ -412,7 +408,7 @@ function AddForm($childID = null) $actions->push( $saveAction = new FormAction("saveComplexTableField", $text) - ); + ); $saveAction->addExtraClass('save'); $form->setActions($actions); $form->Fields()->insertFirst(new LiteralField('open','
        ')); @@ -425,84 +421,80 @@ function AddForm($childID = null) public function ClickToToggle() { return $this->clickToToggle; } - + public function Link($action = null) { return Controller::join_links(parent::Link($action),'?'.$this->getQueryString()); } - + public function BaseLink() { return parent::Link(); } - + public function CurrentLink() { return $this->Link(); - } - + } + public function RelativeLink($params = array()) { return Controller::join_links(parent::Link(),'?'.$this->getQueryString($params)); - } + } public function FirstLink() { return parent::FirstLink() ? $this->RelativeLink(array('start' => '0')) : false; } - + public function PrevLink() { $start = ($this->start - $this->pageSize < 0) ? 0 : $this->start - $this->pageSize; return parent::PrevLink() ? $this->RelativeLink(array('start' => $start)) : false; } - + public function NextLink() { $currentStart = isset($_REQUEST['ctf'][$this->Name()]['start']) ? $_REQUEST['ctf'][$this->Name()]['start'] : 0; $start = ($currentStart + $this->pageSize < $this->TotalCount()) ? $currentStart + $this->pageSize : $this->TotalCount() % $this->pageSize > 0; return parent::NextLink() ? $this->RelativeLink(array('start' => $start)) : false; } - + public function LastLink() { $pageSize = ($this->TotalCount() % $this->pageSize > 0) ? $this->TotalCount() % $this->pageSize : $this->pageSize; $start = $this->TotalCount() - $pageSize; return parent::LastLink() ? $this->RelativeLink(array('start' => $start)) : false; } - + public function ShowAllLink() { return $this->RelativeLink(array('show_all' => '1')); } - + public function PaginatedLink() { return $this->RelativeLink(array('show_all' => '0')); } public function AddLink() { - return Controller::join_links($this->BaseLink(), 'add', ((Translatable::is_enabled()) ? '?locale=' . Translatable::get_current_locale() : '')); - } - - public function ExportLink() { - return Controller::join_links($this->BaseLink(), 'export'); + return Controller::join_links($this->BaseLink(), 'add'); } - + public function ShowAll() { return $this->showAll == "1"; } - + public function Paginated() { return $this->showAll == "0"; } - + public function Sortable() { return DataObject::has_extension($this->sourceClass(), 'SortableDataObject'); } - + public function setFilter($field, $label, $map, $default = null) { if(is_array($map)) { @@ -520,7 +512,7 @@ public function HasFilter() { return !empty($this->filter_map); } - + public function FilterDropdown() { $map = $this->filter_empty_string ? array($this->RelativeLink(array('filter' => '')) => $this->filter_empty_string) : array(); @@ -531,7 +523,7 @@ public function FilterDropdown() $dropdown = new DropdownField('Filter',$this->filter_label . " ("._t('DataObjectManager.REFRESH','refresh').")", $map, $value); return $dropdown->FieldHolder(); } - + public function PerPageDropdown() { $map = array(); @@ -550,62 +542,62 @@ public function SearchValue() { return !empty($this->search) ? $this->search : false; } - + public function AddTitle() { return $this->addTitle ? $this->addTitle : DOMUtil::readable_class($this->Title()); } - + public function SingleTitle() { return $this->singleTitle ? $this->singleTitle : DOMUtil::readable_class($this->AddTitle()); } - + public function setAddTitle($title) { $this->addTitle = $title; } - + public function setSingleTitle($title) { $this->singleTitle = $title; } - + public function getColumnWidths() { return $this->column_widths; } - + public function setColumnWidths($widths) { if(is_array($widths)) { $total = 0; foreach($widths as $name => $value) $total += $value; - if($total != 100) + if($total != 100) die('DataObjectManager::setColumnWidths():' . sprintf(_t('DataObjectManager.TOTALNOT100','Column widths must total 100 and not %s'), $total)); else $this->column_widths = $widths; } } - + public function setFilterEmptyString($str) { $this->filter_empty_string = $str; } - + public function addPermission($perm) { if(!in_array($perm,$this->permissions)) $this->permissions[] = $perm; } - + public function removePermission($perm) { $key = array_search($perm,$this->permissions); if($key !== false) unset($this->permissions[$key]); } - + public function NestedType() { if($this->hasNested) @@ -615,46 +607,46 @@ public function NestedType() else return ""; } - + public function handleDuplicate($request) { return new DataObjectManager_ItemRequest($this,$request->param('ID')); } - + public function setPopupWidth($val) { $this->popupWidth = $val; } - + public function setConfirmDelete($bool) { $this->confirmDelete = $bool; } - + public function PopupWidth() { return $this->popupWidth ? $this->popupWidth : self::$popup_width; } - + public function ConfirmDelete() { return $this->getSetting('confirmDelete'); } - - + + } class DataObjectManager_Item extends ComplexTableField_Item { - function __construct(DataObject $item, DataObjectManager $parent) + function __construct(DataObject $item, DataObjectManager $parent) { parent::__construct($item, $parent); } - + function Link() { return Controller::join_links($this->parent->BaseLink(), 'item', $this->item->ID); } - + function Fields() { $fields = parent::Fields(); $widths = $this->parent->getColumnWidths(); @@ -663,21 +655,21 @@ function Fields() { $field->ColumnWidthCSS = sprintf("style='width:%f%%;'",($widths[$field->Name] - 0.1)); } } - return $fields; + return $fields; } - + public function CanViewOrEdit() { return $this->parent->Can('view') || $this->parent->Can('edit'); } - + public function ViewOrEdit() { if($this->CanViewOrEdit()) return $this->parent->Can('edit') ? "edit" : "view"; return false; } - + public function ViewOrEdit_i18n() { if($res = $this->ViewOrEdit()) { @@ -685,7 +677,7 @@ public function ViewOrEdit_i18n() } return null; } - + public function EditLink() { return Controller::join_links($this->Link(), "edit","?".$this->parent->getQueryString()); @@ -703,12 +695,12 @@ public function CustomActions() } return false; } - + public function PopupWidth() { return $this->parent->PopupWidth(); } - + public function Actions() { $actions = new DataObjectSet(); @@ -723,10 +715,10 @@ public function Actions() "popup", "dataobject_manager/images/page_white_{$this->ViewOrEdit()}.png", "editlink" , - $this->parent->PopupWidth() + $this->parent->PopupWidth() )); break; - + case "delete": $actions->push(new DataObjectManagerAction( _t('DataObjectManager.DELETE','Delete'), @@ -737,7 +729,7 @@ public function Actions() $this->parent->getSetting('confirmDelete') ? "confirm" : null )); break; - + case "duplicate": $actions->push(new DataObjectManagerAction( _t('DataObjectManager.DUPLICATE','Duplicate'), @@ -770,10 +762,10 @@ public function dosort() list($ownerClass, $className) = explode("-",$className); } $many_many = ((is_numeric($this->urlParams['OtherID'])) && SortableDataObject::is_sortable_many_many($className)); - foreach($_POST as $group => $map) { + foreach($_POST as $group => $map) { if(substr($group, 0, 7) == "record-") { if($many_many) { - $controllerID = $this->urlParams['OtherID']; + $controllerID = $this->urlParams['OtherID']; $candidates = singleton($ownerClass)->many_many(); if(is_array($candidates)) { foreach($candidates as $name => $class) @@ -783,16 +775,18 @@ public function dosort() } } if(!isset($relationName)) return false; - list($parentClass, $componentClass, $parentField, $componentField, $table) = singleton($ownerClass)->many_many($relationName); + list($parentClass, $componentClass, $componentField, $parentField, $table) = singleton($ownerClass)->many_many($relationName); + Debug::dump(singleton($ownerClass)->many_many($relationName)); foreach($map as $sort => $id) - DB::query("UPDATE \"$table\" SET \"SortOrder\" = $sort WHERE \"{$className}ID\" = $id AND \"{$ownerClass}ID\" = $controllerID"); + DB::query("UPDATE \"$table\" SET \"SortOrder\" = $sort WHERE \"{$componentField}\" = $id AND \"{$parentField}\" = $controllerID"); + Debug::dump("UPDATE \"$table\" SET \"SortOrder\" = $sort WHERE \"{$componentField}\" = $id AND \"{$parentField}\" = $controllerID"); } else { foreach($map as $sort => $id) { $obj = DataObject::get_by_id($className, $id); $obj->SortOrder = $sort; $obj->write(); - } + } } break; } @@ -821,7 +815,7 @@ function __construct($controller, $name, $fields, $validator, $readonly, $dataOb // added prototype.js to provide support for TreeDropdownField Requirements::javascript(THIRDPARTY_DIR.'/prototype/prototype.js'); Requirements::javascript(THIRDPARTY_DIR.'/jquery/jquery.js'); - Requirements::javascript(THIRDPARTY_DIR.'/jquery-livequery/jquery.livequery.js'); + Requirements::javascript(THIRDPARTY_DIR.'/jquery-livequery/jquery.livequery.js'); Requirements::block(THIRDPARTY_DIR.'/behaviour.js'); Requirements::block(SAPPHIRE_DIR.'/javascript/Validator.js'); Requirements::clear(THIRDPARTY_DIR.'/behavior.js'); @@ -845,30 +839,30 @@ function __construct($controller, $name, $fields, $validator, $readonly, $dataOb $this->dataObject->getRequirementsForPopup(); } Requirements::javascript('dataobject_manager/javascript/dataobjectmanager_popup.js'); - - - $actions = new FieldSet(); + + + $actions = new FieldSet(); if(!$readonly) { $actions->push( $saveAction = new FormAction("saveComplexTableField", _t('DataObjectManager.SAVE','Save')) - ); + ); $saveAction->addExtraClass('save'); } - + parent::__construct($controller, $name, $fields, $actions, $validator); if ($this->validator instanceof Validator) { $this->validator->setJavascriptValidationHandler('none'); - } + } else { $this->unsetValidator(); } - + if($this->getNestedDOMs()) { Requirements::javascript(THIRDPARTY_DIR.'/jquery-livequery/jquery.livequery.js'); Requirements::javascript('dataobject_manager/javascript/dom_jquery_ui.js'); - Requirements::javascript('dataobject_manager/javascript/tooltip.js'); + Requirements::javascript('dataobject_manager/javascript/tooltip.js'); Requirements::javascript('dataobject_manager/javascript/dataobject_manager.js'); } $this->NestedController = $this->controller->isNested; @@ -877,7 +871,7 @@ function __construct($controller, $name, $fields, $validator, $readonly, $dataOb function FieldHolder() { return $this->renderWith('ComplexTableField_Form'); } - + public function getFileFields() { $file_fields = array(); @@ -885,9 +879,9 @@ public function getFileFields() if($field instanceof FileIFrameField || $field instanceof ImageField) $file_fields[] = $field; } - return !empty($file_fields)? $file_fields : false; + return !empty($file_fields)? $file_fields : false; } - + public function getNestedDOMs() { $dom_fields = array(); @@ -907,21 +901,21 @@ public function getNestedDOMs() } } } - return !empty($dom_fields)? $dom_fields : false; + return !empty($dom_fields)? $dom_fields : false; } - - + + } -class DataObjectManager_ItemRequest extends ComplexTableField_ItemRequest +class DataObjectManager_ItemRequest extends ComplexTableField_ItemRequest { public $isNested = false; protected $itemList; protected $currentIndex; - - function __construct($ctf, $itemID) + + function __construct($ctf, $itemID) { parent::__construct($ctf, $itemID); $this->isNested = $this->ctf->isNested; @@ -931,9 +925,9 @@ function __construct($ctf, $itemID) } } - function Link() + function Link() { - return Controller::join_links($this->ctf->BaseLink() , 'item', $this->itemID); + return Controller::join_links($this->ctf->BaseLink() , 'item', $this->itemID); } function saveComplexTableField($data, $form, $request) { @@ -941,7 +935,7 @@ function saveComplexTableField($data, $form, $request) { $form->saveInto($dataObject); try { $dataObject->write(); - } + } catch(ValidationException $e) { $form->sessionMessage($e->getResult()->message(), 'bad'); return Director::redirectBack(); @@ -954,12 +948,12 @@ function saveComplexTableField($data, $form, $request) { $componentSet = $parentRecord->getManyManyComponents($relationName); $componentSet->add($dataObject); } - + $form->sessionMessage(sprintf(_t('DataObjectManager.SAVED','Saved %s successfully'),$this->ctf->SingleTitle()), 'good'); Director::redirectBack(); } - + function DetailForm($childID = null) { $form = parent::DetailForm($childID); @@ -972,7 +966,7 @@ function DetailForm($childID = null) } return $form; } - + function edit() { if(!$this->ctf->Can('view') && !$this->ctf->Can('edit')) return false; @@ -981,16 +975,16 @@ function edit() { echo $this->renderWith($this->ctf->templatePopup); } - + public function duplicate() { if(!$this->ctf->Can('duplicate')) return false; $this->methodName = "duplicate"; - + echo $this->renderWith(array('DataObjectManager_duplicate')); } - + public function DuplicateForm() { return new Form( @@ -1009,7 +1003,7 @@ public function DuplicateForm() ) ); } - + public function doDuplicate($data,$form) { if($obj = $this->dataObj()) { @@ -1025,7 +1019,7 @@ public function doDuplicate($data,$form) if($related_objects = $obj->$name()) { foreach($related_objects as $related_obj) { $o = $related_obj->duplicate(false); - $o->$ownerID = $new->ID; + $o->$ownerID = $new->ID; $o->write(); } } @@ -1045,7 +1039,7 @@ public function doDuplicate($data,$form) } $new->write(); } - } + } } $ret = "$i " . _t('DataObjectManager.DUPLICATESCREATED','duplicate(s) created'); if(isset($data['Relations']) && $data['Relations'] == "1") $ret .= ", " . _t('DataObjectManager.WITHRELATIONS','with relations included'); @@ -1055,13 +1049,13 @@ public function doDuplicate($data,$form) $form->sessionMessage(_t('DataObjectManager.ERRORDUPLICATING','There was an error duplicating the object.'),'bad'); Director::redirectBack(); } - - + + protected function getPrevID() { return $this->itemList[$this->currentIndex - 1]; } - + protected function getNextID() { return $this->itemList[$this->currentIndex + 1]; @@ -1073,40 +1067,40 @@ function NextRecordLink() if(!$this->itemList || $this->currentIndex == sizeof($this->itemList)-1) return false; return Controller::join_links($this->ctf->BaseLink() , 'item/' . $this->getNextID().'/edit',"?".$this->ctf->getQueryString()); } - + function PrevRecordLink() { if(!$this->itemList || $this->currentIndex == 0) return false; return Controller::join_links($this->ctf->BaseLink() , 'item/' . $this->getPrevID().'/edit',"?".$this->ctf->getQueryString()); } - - + + function HasPagination() { return $this->NextRecordLink() || $this->PrevRecordLink(); } - + function HasDuplicate() { return $this->ctf->Can('duplicate'); } - + function SingleTitle() { return $this->ctf->SingleTitle(); } - + function DuplicateLink() { return Controller::join_links($this->ctf->BaseLink(),'duplicate'.$this->itemID); } - + function HasRelated() { $has_many = singleton($this->ctf->SourceClass())->has_many(); return is_array($has_many) && !empty($has_many); } - + } class DataObjectManagerAction extends ViewableData @@ -1117,13 +1111,13 @@ class DataObjectManagerAction extends ViewableData 'refresh' => 'refresh-button', 'window' => 'window-link' ); - + public $Title; public $Behaviour; public $ActionClass; public $Link; public $IconURL; - + public function __construct($title, $link, $behaviour = "popup", $icon = null, $class = null, $rel = null) { parent::__construct(); $this->Title = $title; @@ -1156,12 +1150,12 @@ public static function readable_list($array) return implode(', ', $array).", $and $last"; } } - + public static function readable_class($string) { - return ucwords(trim(strtolower(ereg_replace('([A-Z])',' \\1',$string)))); + return ucwords(trim(strtolower(ereg_replace('([A-Z])',' \\1',$string)))); } - + /** * Translates a camel case string into a string with underscores (e.g. firstName -> first_name) * @param string $str String in camel case format @@ -1172,7 +1166,7 @@ public static function to_underscore($str) { $func = create_function('$c', 'return "_" . strtolower($c[1]);'); return preg_replace_callback('/([A-Z])/', $func, $str); } - + /** * Translates a string with underscores into camel case (e.g. first_name -> firstName) * @param string $str String in underscore format @@ -1186,7 +1180,5 @@ public static function to_camel_case($str, $capitalise_first_char = false) { $func = create_function('$c', 'return strtoupper($c[1]);'); return preg_replace_callback('/_([a-z])/', $func, $str); } - -} - +} From 1115e6d374454965c096fc5d652e403d72e6a51b Mon Sep 17 00:00:00 2001 From: Will Morgan Date: Wed, 5 Dec 2012 12:08:52 +0000 Subject: [PATCH 24/33] IMSTUPID: Removing debug, oops. --- code/DataObjectManager.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/DataObjectManager.php b/code/DataObjectManager.php index 69fcf58..9e14149 100644 --- a/code/DataObjectManager.php +++ b/code/DataObjectManager.php @@ -776,10 +776,8 @@ public function dosort() } if(!isset($relationName)) return false; list($parentClass, $componentClass, $componentField, $parentField, $table) = singleton($ownerClass)->many_many($relationName); - Debug::dump(singleton($ownerClass)->many_many($relationName)); foreach($map as $sort => $id) DB::query("UPDATE \"$table\" SET \"SortOrder\" = $sort WHERE \"{$componentField}\" = $id AND \"{$parentField}\" = $controllerID"); - Debug::dump("UPDATE \"$table\" SET \"SortOrder\" = $sort WHERE \"{$componentField}\" = $id AND \"{$parentField}\" = $controllerID"); } else { foreach($map as $sort => $id) { From b5da9e5261ab71c2504892d1653a10d7e26f4839 Mon Sep 17 00:00:00 2001 From: Will Morgan Date: Tue, 11 Dec 2012 17:00:00 +0000 Subject: [PATCH 25/33] FIXED: Search SQL error If the heading field does not originate from the source class, traverse up the ancestry until it is found. Before this, SQL query errors were appearing when your source class was Page and it searched for Page.Title, when it should have been looking on SiteTree instead. --- code/DataObjectManager.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/code/DataObjectManager.php b/code/DataObjectManager.php index 9e14149..9623b22 100644 --- a/code/DataObjectManager.php +++ b/code/DataObjectManager.php @@ -238,8 +238,12 @@ protected function loadSourceFilter() $search = array(); $SNG = singleton($this->sourceClass); foreach(parent::Headings() as $field) { + // If the source class doesn't own this field, then its parent might. + while(!$SNG->hasOwnTableDatabaseField($field->Name) && $parentKls = get_parent_class($SNG->class)) { + $SNG = singleton($parentKls); + } if($SNG->hasDatabaseField($field->Name)) - $search[] = "UPPER({$this->sourceClass}.$field->Name) LIKE '%".Convert::raw2sql(strtoupper($this->search))."%'"; + $search[] = "UPPER({$SNG->class}.$field->Name) LIKE '%".Convert::raw2sql(strtoupper($this->search))."%'"; } if(!empty($search)) { $search_string = "(".implode(" OR ", $search).")"; From 0979a4735f1aa2e17fe554d6724e4d1f33d65a7d Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 7 Jan 2013 13:54:29 +0200 Subject: [PATCH 26/33] - Fixed many_many sortable issues: table field wrong order in code, added an ability to maintain multiple relations to the same class. + Ukrainian localisation added. + Main Russian localisation added. --- code/DataObjectManager.php | 7 +- code/SortableDataObject.php | 55 ++++--- code/flv/shadowbox/languages/shadowbox-uk.js | 1 + .../javascript/tiny_mce/langs/uk.js | 154 ++++++++++++++++++ .../tiny_mce/plugins/advhr/langs/uk_dlg.js | 5 + .../tiny_mce/plugins/advimage/langs/uk_dlg.js | 43 +++++ .../tiny_mce/plugins/advlink/langs/uk_dlg.js | 52 ++++++ .../tiny_mce/plugins/emotions/langs/uk_dlg.js | 20 +++ .../tiny_mce/plugins/example/langs/uk.js | 3 + .../tiny_mce/plugins/example/langs/uk_dlg.js | 3 + .../tiny_mce/plugins/fullpage/langs/uk_dlg.js | 85 ++++++++++ .../tiny_mce/plugins/media/langs/uk_dlg.js | 103 ++++++++++++ .../tiny_mce/plugins/paste/langs/uk_dlg.js | 5 + .../plugins/searchreplace/langs/uk_dlg.js | 16 ++ .../tiny_mce/plugins/style/langs/uk_dlg.js | 63 +++++++ .../tiny_mce/plugins/table/langs/uk_dlg.js | 74 +++++++++ .../tiny_mce/plugins/template/langs/uk_dlg.js | 15 ++ .../plugins/xhtmlxtras/langs/uk_dlg.js | 32 ++++ .../tiny_mce/themes/advanced/langs/uk.js | 62 +++++++ .../tiny_mce/themes/advanced/langs/uk_dlg.js | 51 ++++++ .../tiny_mce/themes/simple/langs/uk.js | 11 ++ lang/ru_RU.php | 43 +++++ lang/uk_UA.php | 68 ++++++++ 23 files changed, 945 insertions(+), 26 deletions(-) create mode 100644 code/flv/shadowbox/languages/shadowbox-uk.js create mode 100644 code/simple_tinymce_field/javascript/tiny_mce/langs/uk.js create mode 100644 code/simple_tinymce_field/javascript/tiny_mce/plugins/advhr/langs/uk_dlg.js create mode 100644 code/simple_tinymce_field/javascript/tiny_mce/plugins/advimage/langs/uk_dlg.js create mode 100644 code/simple_tinymce_field/javascript/tiny_mce/plugins/advlink/langs/uk_dlg.js create mode 100644 code/simple_tinymce_field/javascript/tiny_mce/plugins/emotions/langs/uk_dlg.js create mode 100644 code/simple_tinymce_field/javascript/tiny_mce/plugins/example/langs/uk.js create mode 100644 code/simple_tinymce_field/javascript/tiny_mce/plugins/example/langs/uk_dlg.js create mode 100644 code/simple_tinymce_field/javascript/tiny_mce/plugins/fullpage/langs/uk_dlg.js create mode 100644 code/simple_tinymce_field/javascript/tiny_mce/plugins/media/langs/uk_dlg.js create mode 100644 code/simple_tinymce_field/javascript/tiny_mce/plugins/paste/langs/uk_dlg.js create mode 100644 code/simple_tinymce_field/javascript/tiny_mce/plugins/searchreplace/langs/uk_dlg.js create mode 100644 code/simple_tinymce_field/javascript/tiny_mce/plugins/style/langs/uk_dlg.js create mode 100644 code/simple_tinymce_field/javascript/tiny_mce/plugins/table/langs/uk_dlg.js create mode 100644 code/simple_tinymce_field/javascript/tiny_mce/plugins/template/langs/uk_dlg.js create mode 100644 code/simple_tinymce_field/javascript/tiny_mce/plugins/xhtmlxtras/langs/uk_dlg.js create mode 100644 code/simple_tinymce_field/javascript/tiny_mce/themes/advanced/langs/uk.js create mode 100644 code/simple_tinymce_field/javascript/tiny_mce/themes/advanced/langs/uk_dlg.js create mode 100644 code/simple_tinymce_field/javascript/tiny_mce/themes/simple/langs/uk.js create mode 100644 lang/ru_RU.php create mode 100644 lang/uk_UA.php diff --git a/code/DataObjectManager.php b/code/DataObjectManager.php index 9623b22..21fdb49 100644 --- a/code/DataObjectManager.php +++ b/code/DataObjectManager.php @@ -773,15 +773,16 @@ public function dosort() $candidates = singleton($ownerClass)->many_many(); if(is_array($candidates)) { foreach($candidates as $name => $class) - if($class == $className) { + if($class == $className and substr($group, -strlen($name)-1) == '_'.$name) { $relationName = $name; break; } } if(!isset($relationName)) return false; - list($parentClass, $componentClass, $componentField, $parentField, $table) = singleton($ownerClass)->many_many($relationName); - foreach($map as $sort => $id) + list($parentClass, $componentClass, $parentField, $componentField, $table) = singleton($ownerClass)->many_many($relationName); + foreach($map as $sort => $id) { DB::query("UPDATE \"$table\" SET \"SortOrder\" = $sort WHERE \"{$componentField}\" = $id AND \"{$parentField}\" = $controllerID"); + } } else { foreach($map as $sort => $id) { diff --git a/code/SortableDataObject.php b/code/SortableDataObject.php index d6f77a6..9a50bfc 100644 --- a/code/SortableDataObject.php +++ b/code/SortableDataObject.php @@ -48,7 +48,7 @@ public static function add_sortable_many_many_relation($ownerClass,$componentNam if(!isset(self::$many_many_sortable_relations[$componentClass])) self::$many_many_sortable_relations[$componentClass] = array(); - self::$many_many_sortable_relations[$componentClass][$parentClass] = $table; + self::$many_many_sortable_relations[$componentClass][$parentClass][] = $table; self::add_sortable_class($componentClass); } @@ -90,28 +90,37 @@ public static function get_join_tables($classname) } - public function augmentSQL(SQLQuery &$query) - { - if(empty($query->select) || $query->delete || in_array("COUNT(*)",$query->select) || in_array("count(*)",$query->select)) return; - $sort_field = false; - if($join_tables = self::get_join_tables($this->owner->class)) { - foreach($query->from as $from) { - if($sort_field) break; - foreach($join_tables as $join_table) { - if(stristr($from,$join_table)) { - $sort_field = "\"$join_table\".\"SortOrder\""; - if(isset($query->select['SortOrder'])) { - $query->select['SortOrder'] = "$sort_field AS LocalSort"; - } - break; - } - } - } - } - if(!$sort_field) $sort_field = "\"SortOrder\""; - - if(!$query->orderby || ($query->orderby == $this->owner->stat('default_sort'))) - $query->orderby = "$sort_field " . self::$sort_dir; + public function augmentSQL(SQLQuery &$query) { + if(empty($query->select) || $query->delete || in_array("COUNT(*)",$query->select) || in_array("count(*)",$query->select)) + return; + + $sort_field = false; + if($join_classes = self::get_join_tables($this->owner->class)) { + foreach($query->from as $from) { + if($sort_field) + break; + foreach($join_classes as $join_tables) { + if($sort_field) + break; + foreach ($join_tables as $join_table) { + if(stristr($from,$join_table)) { + $sort_field = "\"$join_table\".\"SortOrder\""; + if(isset($query->select['SortOrder'])) { + $query->select['SortOrder'] = "$sort_field AS LocalSort"; + } + break; + } + } + } + } + } + + if(!$sort_field) + $sort_field = "\"SortOrder\""; + + if(!$query->orderby or $query->orderby == $this->owner->stat('default_sort')) { + $query->orderby = "$sort_field " . self::$sort_dir; + } } diff --git a/code/flv/shadowbox/languages/shadowbox-uk.js b/code/flv/shadowbox/languages/shadowbox-uk.js new file mode 100644 index 0000000..f76304f --- /dev/null +++ b/code/flv/shadowbox/languages/shadowbox-uk.js @@ -0,0 +1 @@ +if(typeof Shadowbox=="undefined"){throw"Unable to load Shadowbox language file, Shadowbox not found."}Shadowbox.lang={code:"uk",of:"з",loading:"завантаження",cancel:"Скасувати",next:"Наступна",previous:"Попередня",play:"Почати",pause:"Пауза",close:"Закрити",errors:{single:'Вам необхідно встановити для браузера плагін {1} щоб мати змогу переглядати цей вміст.',shared:'Щоб переглядати цей вміст необхідно встановити такі плагіни {1} та {3}.',either:'Вам необхідно встановити один з плагінів: {1} або {3} щоб мати змогу переглядати цей вміст.'}}; \ No newline at end of file diff --git a/code/simple_tinymce_field/javascript/tiny_mce/langs/uk.js b/code/simple_tinymce_field/javascript/tiny_mce/langs/uk.js new file mode 100644 index 0000000..8400c65 --- /dev/null +++ b/code/simple_tinymce_field/javascript/tiny_mce/langs/uk.js @@ -0,0 +1,154 @@ +tinyMCE.addI18n({uk:{ +common:{ +edit_confirm:"Чи бажаэте ви використати WYSIWYG-редактор для цього поля?", +apply:"Застосувати", +insert:"Вставити", +update:"Поновити", +cancel:"Відмінити", +close:"Зактити", +browse:"Обрати", +class_name:"Клас", +not_set:"-- не встановлено --", +clipboard_msg:"Копіювання/Вирізка/Вставка не доступні в Mozilla та Firefox.\nЧи бажаєте узнати більше про цю проблему?", +clipboard_no_support:"Наразі не підтримується вашим браузером. Використовуйте клавіатурні комбінації для цієї дії.", +popup_blocked:"Прикро, але ваш блокувальник popup-вікон заблокував вікно, яке реалізує функціонал редактора. Вам необхідно відключити блокування для цього сайту, щоб мати змогу користуватися цим інструментом.", +invalid_data:"Помилка: Введено некоретні дані. Такі поля позначені червоним.", +more_colors:"Ще кольори" +}, +contextmenu:{ +align:"Вирівнювання", +left:"По лівому краю", +center:"По центру", +right:"По правому краю", +full:"По ширині" +}, +insertdatetime:{ +date_fmt:"%Y-%m-%d", +time_fmt:"%H:%M:%S", +insertdate_desc:"Вставити дату", +inserttime_desc:"Вставити час", +months_long:"Січень,Лютий,Березень,Квітень,Травень,Червень,Липень,Серпень,Вересень,Жовтень,Листопад,Грудень", +months_short:"Січ,Лют,Бер,Квт,Трв,Чрв,Лип,Сер,Вер,Жов,Лис,Грд", +day_long:"Неділя,Понеділок,Вівторок,Середа,Червер,П'ятниця,Субота,Неділя", +day_short:"Нд,Пн,Вт,Ср,Чт,Пт,Сб,Нд" +}, +print:{ +print_desc:"Друкувати" +}, +preview:{ +preview_desc:"Попередній перегляд" +}, +directionality:{ +ltr_desc:"Напрям зліва направо", +rtl_desc:"Напрям зправа наліво" +}, +layer:{ +insertlayer_desc:"Додати новий шар", +forward_desc:"Вперед", +backward_desc:"Назад", +absolute_desc:"Перемкнути абсолютне позиціювання", +content:"Новий шар..." +}, +save:{ +save_desc:"Зберегти", +cancel_desc:"Відмінити всі зміни" +}, +nonbreaking:{ +nonbreaking_desc:"Вставити нерозривний пробіл" +}, +iespell:{ +iespell_desc:"Перевірити орфографію", +download:"ieSpell не знайдено. Чи бажаєте встановити?" +}, +advhr:{ +advhr_desc:"Horizontal rule" +}, +emotions:{ +emotions_desc:"Смайлики" +}, +searchreplace:{ +search_desc:"Шукати", +replace_desc:"Пошук/Заміна" +}, +advimage:{ +image_desc:"Вставити/редагувати зображення" +}, +advlink:{ +link_desc:"Вставити/редагувати посилання" +}, +xhtmlxtras:{ +cite_desc:"Цитування", +abbr_desc:"Абревіатура", +acronym_desc:"Акронім", +del_desc:"Видалити", +ins_desc:"Вставити", +attribs_desc:"Вставити/редагувати атрибути" +}, +style:{ +desc:"Редагувати CSS Стиль" +}, +paste:{ +paste_text_desc:"Вставити як текст", +paste_word_desc:"Вставити з Word", +selectall_desc:"Виділити все" +}, +paste_dlg:{ +text_title:"Користуйтесь CTRL+V на клавіатурі щоб вставити текст у вікно.", +text_linebreaks:"Зберігати переноси рядків", +word_title:"Користуйтесь CTRL+V на клавіатурі щоб вставити текст у вікно." +}, +table:{ +desc:"Вставити нову таблицю", +row_before_desc:"Додати рядок перед", +row_after_desc:"Додати рядок після", +delete_row_desc:"Видалити рядок", +col_before_desc:"Додати стовбчик перед", +col_after_desc:"Додати стовбчик після", +delete_col_desc:"Видалити стовбчик", +split_cells_desc:"Розділити об'єднані комірки таблиці", +merge_cells_desc:"Об'єднати комірки", +row_desc:"Властивості рядка таблиці", +cell_desc:"Властивості комірки таблиці", +props_desc:"Властивості таблиці", +paste_row_before_desc:"Вставити рядок перед", +paste_row_after_desc:"Вставити рядок після", +cut_row_desc:"Вирізати рядок", +copy_row_desc:"Копіювати рядок", +del:"Видалити таблицю", +row:"Рядок", +col:"Стовбчик", +cell:"Комірка" +}, +autosave:{ +unload_msg:"Якщо ви залишите сторінку, ві зміни, що ви не зберегли, буде втрачено." +}, +fullscreen:{ +desc:"Перемкнути повноекранний режим" +}, +media:{ +desc:"Встатити/редагувати embedded media", +edit:"Редагувати embedded media" +}, +fullpage:{ +desc:"Властивості документу" +}, +template:{ +desc:"Вставити predefined template content" +}, +visualchars:{ +desc:"Показувати/ні службові символи." +}, +spellchecker:{ +desc:"Увімкнути/вимкнути перевірку орфографії", +menu:"Налаштування перевірки орфографії", +ignore_word:"Ігнорувати слово", +ignore_words:"Ігнорувати все", +langs:"Мови", +wait:"Будь ласка, зачекайте...", +sug:"Підказки", +no_sug:"Немає підказок", +no_mpell:"Помилок не знайдено." +}, +pagebreak:{ +desc:"Вставити розрив сторінки." +}}}); \ No newline at end of file diff --git a/code/simple_tinymce_field/javascript/tiny_mce/plugins/advhr/langs/uk_dlg.js b/code/simple_tinymce_field/javascript/tiny_mce/plugins/advhr/langs/uk_dlg.js new file mode 100644 index 0000000..8303634 --- /dev/null +++ b/code/simple_tinymce_field/javascript/tiny_mce/plugins/advhr/langs/uk_dlg.js @@ -0,0 +1,5 @@ +tinyMCE.addI18n('uk.advhr_dlg',{ +width:"\u0428\u0438\u0440\u0438\u043D\u0430", +size:"\u0412\u0438\u0441\u043E\u0442\u0430", +noshade:"\u0411\u0435\u0437 \u0442\u0456\u043D\u0456" +}); \ No newline at end of file diff --git a/code/simple_tinymce_field/javascript/tiny_mce/plugins/advimage/langs/uk_dlg.js b/code/simple_tinymce_field/javascript/tiny_mce/plugins/advimage/langs/uk_dlg.js new file mode 100644 index 0000000..a27068b --- /dev/null +++ b/code/simple_tinymce_field/javascript/tiny_mce/plugins/advimage/langs/uk_dlg.js @@ -0,0 +1,43 @@ +tinyMCE.addI18n('uk.advimage_dlg',{ +tab_general:"Загальне", +tab_appearance:"Вигляд", +tab_advanced:"Додатково", +general:"Загальне", +title:"Заголовок", +preview:"Попередній перегляд", +constrain_proportions:"Зберігати пропорції", +langdir:"Напрямок письма", +langcode:"Код мови", +long_desc:"Long description link", +style:"Стиль", +classes:"Класи", +ltr:"Зліва направо", +rtl:"Зправа наліво", +id:"Атрибут Id", +map:"Атрибут map", +swap_image:"Swap image", +alt_image:"Альтернативне зображення", +mouseover:"при навеленні миші", +mouseout:"при відведенні миші", +misc:"Різне", +example_img:"Попередній перегляд", +missing_alt:"Ви певні, що бажаєте продовжити, не заповнюючи опис зображення? Без зображення буде недоступне користувачам з деякими вадами, а також користувачам текстових браузерів та тим, хто вимкнув зображення.", +dialog_title:"Вставити/редагувати зображення", +src:"URL зображення", +alt:"Атрибут Alt (відображається, якщо зображення не завантажене)", +list:"Image list", +border:"Рамка", +dimensions:"Розміри", +vspace:"Вертикальний відступ", +hspace:"Горизонтальний відступ", +align:"Вирівнювання", +align_baseline:"Baseline", +align_top:"Top", +align_middle:"Middle", +align_bottom:"Bottom", +align_texttop:"Text top", +align_textbottom:"Text bottom", +align_left:"По лівому краю", +align_right:"По правому краю", +image_list:"Image list" +}); \ No newline at end of file diff --git a/code/simple_tinymce_field/javascript/tiny_mce/plugins/advlink/langs/uk_dlg.js b/code/simple_tinymce_field/javascript/tiny_mce/plugins/advlink/langs/uk_dlg.js new file mode 100644 index 0000000..fb26187 --- /dev/null +++ b/code/simple_tinymce_field/javascript/tiny_mce/plugins/advlink/langs/uk_dlg.js @@ -0,0 +1,52 @@ +tinyMCE.addI18n('uk.advlink_dlg',{ +title:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438/\u0437\u043C\u0456\u043D\u0438\u0442\u0438 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F", +url:"\u0410\u0434\u0440\u0435\u0441\u0430", +target:"\u0412\u0456\u0434\u043A\u0440\u0438\u0442\u0438 \u0432...", +titlefield:"\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A", +is_email:"\u0412\u0432\u0435\u0434\u0435\u043D\u0438\u0439 URL \u0441\u0445\u043E\u0436\u0438\u0439 \u043D\u0430 email \u0430\u0434\u0440\u0435\u0441\u0443, \u0432\u0438 \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0434\u043E\u0434\u0430\u0442\u0438 \u043D\u0435\u043E\u0431\u0445\u0456\u0434\u043D\u0438\u0439 \u043F\u0440\u0435\u0444\u0456\u043A\u0441 mailto?", +is_external:"\u0412\u0432\u0435\u0434\u0435\u043D\u0438\u0439 URL \u0441\u0445\u043E\u0436\u0438\u0439 \u043D\u0430 \u0437\u043E\u0432\u043D\u0456\u0448\u043D\u0454 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F, \u0432\u0438 \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0434\u043E\u0434\u0430\u0442\u0438 \u043D\u0435\u043E\u0431\u0445\u0456\u0434\u043D\u0438\u0439 \u043F\u0440\u0435\u0444\u0456\u043A\u0441 http://?", +list:"\u0421\u043F\u0438\u0441\u043E\u043A \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u044C", +general_tab:"\u0417\u0430\u0433\u0430\u043B\u044C\u043D\u0435", +popup_tab:"Popup", +events_tab:"\u041F\u043E\u0434\u0456\u0457", +advanced_tab:"\u0414\u043E\u0434\u0430\u0442\u043A\u043E\u0432\u043E", +general_props:"\u0417\u0430\u0433\u0430\u043B\u044C\u043D\u0456 \u0432\u043B\u0430\u0441\u0442\u0438\u0432\u043E\u0441\u0442\u0456", +popup_props:"\u0412\u043B\u0430\u0441\u0442\u0438\u0432\u043E\u0441\u0442\u0456 Popup", +event_props:"\u041F\u043E\u0434\u0456\u0457", +advanced_props:"\u0420\u043E\u0437\u0448\u0438\u0440\u0435\u043D\u043D\u0456 \u0432\u043B\u0430\u0441\u0442\u0438\u0432\u043E\u0441\u0442\u0456", +popup_opts:"\u0412\u043B\u0430\u0441\u0442\u0438\u0432\u043E\u0441\u0442\u0456", +anchor_names:"\u042F\u043A\u043E\u0440\u0456", +target_same:"\u0412\u0456\u0434\u043A\u0440\u0438\u0442\u0438 \u0432 \u0446\u044C\u043E\u043C\u0443 \u0436 \u0432\u0456\u043A\u043D\u0456 / \u0444\u0440\u0435\u0439\u043C\u0456", +target_parent:"\u0412\u0456\u0434\u043A\u0440\u0438\u0442\u0438 \u0432 \u0431\u0430\u0442\u044C\u043A\u0456\u0432\u0441\u044C\u043A\u043E\u043C\u0443 \u0432\u0456\u043A\u043D\u0456 / \u0444\u0440\u0435\u0439\u043C\u0456", +target_top:"\u0412\u0456\u0434\u043A\u0440\u0438\u0442\u0438 \u0443 \u0432\u0435\u0440\u0445\u043D\u044C\u043E\u043C\u0443 \u0444\u0440\u0435\u0439\u043C\u0456 (\u0437\u0430\u043C\u0456\u043D\u0438\u0442\u0438 \u0432\u0441\u0456 \u0444\u0440\u0435\u0439\u043C\u0438)", +target_blank:"\u0412\u0456\u0434\u043A\u0440\u0438\u0442\u0438 \u0432 \u043D\u043E\u0432\u043E\u043C\u0443 \u0432\u0456\u043A\u043D\u0456", +popup:"Javascript popup", +popup_url:"Popup URL", +popup_name:"\u041D\u0430\u0437\u0432\u0430 \u0432\u0456\u043A\u043D\u0430", +popup_return:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 'return false'", +popup_scrollbars:"\u041F\u043E\u043A\u0430\u0437\u0443\u0432\u0430\u0442\u0438 \u0441\u043A\u0440\u043E\u043B\u0435\u0440\u0438", +popup_statusbar:"\u041F\u043E\u043A\u0430\u0437\u0443\u0432\u0430\u0442\u0438 \u0441\u0442\u0430\u0442\u0443\u0441", +popup_toolbar:"\u041F\u043E\u043A\u0430\u0437\u0443\u0432\u0430\u0442\u0438 \u043F\u0430\u043D\u0435\u043B\u0456 \u0456\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u0456\u0432", +popup_menubar:"\u041F\u043E\u043A\u0430\u0437\u0443\u0432\u0430\u0442\u0438 \u043C\u0435\u043D\u044E", +popup_location:"\u041F\u043E\u043A\u0430\u0437\u0443\u0432\u0430\u0442\u0438 \u043F\u0430\u043D\u0435\u043B\u044C location", +popup_resizable:"\u0414\u043E\u0437\u0432\u043E\u043B\u044F\u0442\u0438 \u0437\u043C\u0456\u043D\u044E\u0432\u0430\u0442\u0438 \u0440\u043E\u0437\u043C\u0456\u0440", +popup_dependent:"Dependent (\u043B\u0438\u0448\u0435 \u0434\u043B\u044F Mozilla/Firefox)", +popup_size:"\u0420\u043E\u0437\u043C\u0456\u0440", +popup_position:"\u041F\u043E\u0437\u0438\u0446\u0456\u044F (X/Y)", +id:"Id", +style:"\u0421\u0442\u0438\u043B\u044C", +classes:"\u041A\u043B\u0430\u0441\u0438", +target_name:"Target name", +langdir:"\u041D\u0430\u043F\u0440\u044F\u043C \u043C\u043E\u0432\u0438", +target_langcode:"Target language", +langcode:"\u041A\u043E\u0434 \u043C\u043E\u0432\u0438", +encoding:"Target character encoding", +mime:"Target MIME type", +rel:"Relationship page to target", +rev:"Relationship target to page", +tabindex:"Tabindex", +accesskey:"Accesskey", +ltr:"\u0417\u043B\u0456\u0432\u0430 \u043F\u0440\u0430\u0432\u043E\u0440\u0443\u0447", +rtl:"\u0421\u043F\u0440\u0430\u0432\u0430 \u043B\u0456\u0432\u043E\u0440\u0443\u0447", +link_list:"\u0421\u043F\u0438\u0441\u043E\u043A \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u044C" +}); \ No newline at end of file diff --git a/code/simple_tinymce_field/javascript/tiny_mce/plugins/emotions/langs/uk_dlg.js b/code/simple_tinymce_field/javascript/tiny_mce/plugins/emotions/langs/uk_dlg.js new file mode 100644 index 0000000..bedb694 --- /dev/null +++ b/code/simple_tinymce_field/javascript/tiny_mce/plugins/emotions/langs/uk_dlg.js @@ -0,0 +1,20 @@ +tinyMCE.addI18n('uk.emotions_dlg',{ +title:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u0441\u043C\u0430\u0439\u043B", +desc:"\u0421\u043C\u0430\u0439\u043B\u0438", +cool:"Cool", +cry:"Cry", +embarassed:"Embarassed", +foot_in_mouth:"Foot in mouth", +frown:"Frown", +innocent:"Innocent", +kiss:"Kiss", +laughing:"Laughing", +money_mouth:"Money mouth", +sealed:"Sealed", +smile:"Smile", +surprised:"Surprised", +tongue_out:"Tongue out", +undecided:"Undecided", +wink:"Wink", +yell:"Yell" +}); \ No newline at end of file diff --git a/code/simple_tinymce_field/javascript/tiny_mce/plugins/example/langs/uk.js b/code/simple_tinymce_field/javascript/tiny_mce/plugins/example/langs/uk.js new file mode 100644 index 0000000..20d356f --- /dev/null +++ b/code/simple_tinymce_field/javascript/tiny_mce/plugins/example/langs/uk.js @@ -0,0 +1,3 @@ +tinyMCE.addI18n('uk.example',{ + desc : 'Це лише кнопка шаблону' +}); diff --git a/code/simple_tinymce_field/javascript/tiny_mce/plugins/example/langs/uk_dlg.js b/code/simple_tinymce_field/javascript/tiny_mce/plugins/example/langs/uk_dlg.js new file mode 100644 index 0000000..5a729d4 --- /dev/null +++ b/code/simple_tinymce_field/javascript/tiny_mce/plugins/example/langs/uk_dlg.js @@ -0,0 +1,3 @@ +tinyMCE.addI18n('uk.example_dlg',{ + title : 'Це лише заголовок прикладу' +}); diff --git a/code/simple_tinymce_field/javascript/tiny_mce/plugins/fullpage/langs/uk_dlg.js b/code/simple_tinymce_field/javascript/tiny_mce/plugins/fullpage/langs/uk_dlg.js new file mode 100644 index 0000000..909936b --- /dev/null +++ b/code/simple_tinymce_field/javascript/tiny_mce/plugins/fullpage/langs/uk_dlg.js @@ -0,0 +1,85 @@ +tinyMCE.addI18n('uk.fullpage_dlg',{ +title:"\u0412\u043B\u0430\u0441\u0442\u0438\u0432\u043E\u0441\u0442\u0456 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0443", +meta_tab:"\u0417\u0430\u0433\u0430\u043B\u044C\u043D\u0435", +appearance_tab:"\u0412\u0438\u0433\u043B\u044F\u0434", +advanced_tab:"\u0414\u043E\u0434\u0430\u0442\u043A\u043E\u0432\u043E", +meta_props:"\u041C\u0435\u0442\u0430 \u0456\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u044F", +langprops:"\u041C\u043E\u0432\u0430 \u0442\u0430 \u043A\u043E\u0434\u0443\u0432\u0430\u043D\u043D\u044F", +meta_title:"\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A", +meta_keywords:"\u041A\u043B\u044E\u0447\u043E\u0432\u0456 \u0441\u043B\u043E\u0432\u0430", +meta_description:"\u041E\u043F\u0438\u0441", +meta_robots:"\u0420\u043E\u0431\u043E\u0442\u0438", +doctypes:"Doctype", +langcode:"\u041A\u043E\u0434 \u043C\u043E\u0432\u0438", +langdir:"\u041D\u0430\u043F\u0440\u044F\u043C \u043C\u043E\u0432\u0438", +ltr:"\u0417\u043B\u0456\u0432\u0430 \u043F\u0440\u0430\u0432\u043E\u0440\u0443\u0447", +rtl:"\u0421\u043F\u0440\u0430\u0432\u0430 \u043B\u0456\u0432\u043E\u0440\u0443\u0447", +xml_pi:"XML declaration", +encoding:"\u041A\u043E\u0434\u0443\u0432\u0430\u043D\u043D\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u0456\u0432", +appearance_bgprops:"\u0412\u043B\u0430\u0441\u0442\u0438\u0432\u043E\u0441\u0442\u0456 \u0444\u043E\u043D\u0443", +appearance_marginprops:"\u0412\u0456\u0434\u0441\u0442\u0443\u043F\u0438", +appearance_linkprops:"\u041A\u043E\u043B\u0456\u0440 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u044C", +appearance_textprops:"\u0412\u043B\u0430\u0441\u0442\u0438\u0432\u043E\u0441\u0442\u0456 \u0442\u0435\u043A\u0441\u0442\u0443", +bgcolor:"\u041A\u043E\u043B\u0456\u0440 \u0444\u043E\u043D\u0443", +bgimage:"\u0424\u043E\u043D\u043E\u0432\u0435 \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F", +left_margin:"\u0412\u0456\u0434\u0441\u0442\u0443\u043F \u043B\u0456\u0432\u043E\u0440\u0443\u0447", +right_margin:"\u0412\u0456\u0434\u0441\u0442\u0443\u043F \u043F\u0440\u0430\u0432\u043E\u0440\u0443\u0447", +top_margin:"\u0412\u0456\u0434\u0441\u0442\u0443\u043F \u0437\u0432\u0435\u0440\u0445\u0443", +bottom_margin:"\u0412\u0456\u0434\u0441\u0442\u0443\u043F \u0437\u043D\u0438\u0437\u0443", +text_color:"\u041A\u043E\u043B\u0456\u0440 \u0442\u0435\u043A\u0441\u0442\u0443", +font_size:"\u0420\u043E\u0437\u043C\u0456\u0440 \u0448\u0440\u0438\u0444\u0442\u0430", +font_face:"\u0428\u0440\u0438\u0444\u0442", +link_color:"\u041A\u043E\u043B\u0456\u0440 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F", +hover_color:"\u041A\u043E\u043B\u0456\u0440 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u043D\u0456", +visited_color:"\u041A\u043E\u043B\u0456\u0440 \u043D\u0430\u0442\u0438\u0441\u043D\u0443\u0442\u043E\u0433\u043E \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F", +active_color:"\u041A\u043E\u043B\u0456\u0440 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0433\u043E \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F", +textcolor:"\u041A\u043E\u043B\u0456\u0440", +fontsize:"\u0420\u043E\u0437\u043C\u0456\u0440 \u0448\u0440\u0438\u0444\u0442\u0430", +fontface:"\u0421\u0456\u043C\u0435\u0439\u0441\u0442\u0432\u043E \u0448\u0440\u0438\u0444\u0442\u0430", +meta_index_follow:"Index and follow the links", +meta_index_nofollow:"Index and don't follow the links", +meta_noindex_follow:"Do not index but follow the links", +meta_noindex_nofollow:"Do not index and don\'t follow the links", +appearance_style:"Stylesheet and style properties", +stylesheet:"Stylesheet", +style:"\u0421\u0442\u0438\u043B\u044C", +author:"\u0410\u0432\u0442\u043E\u0440", +copyright:"\u041A\u043E\u043F\u0456\u0440\u0430\u0439\u0442", +add:"\u0414\u043E\u0434\u0430\u0442\u0438 \u043D\u043E\u0432\u0438\u0439 \u0435\u043B\u0435\u043C\u0435\u043D\u0442", +remove:"\u0412\u0438\u0434\u0430\u043B\u0438\u0442\u0438 \u0432\u0438\u0434\u0456\u043B\u0435\u043D\u0438\u0439 \u0435\u043B\u0435\u043C\u0435\u043D\u0442", +moveup:"\u041F\u0435\u0440\u0435\u043C\u0456\u0441\u0442\u0438\u0442\u0438 \u0435\u043B\u0435\u043C\u0435\u043D\u0442 \u0432\u0433\u043E\u0440\u0443", +movedown:"\u041F\u0435\u0440\u0435\u043C\u0456\u0441\u0442\u0438\u0442\u0438 \u0435\u043B\u0435\u043C\u0435\u043D\u0442 \u0432\u043D\u0438\u0437\u0443", +head_elements:"Head elements", +info:"\u0406\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u044F", +add_title:"Title element", +add_meta:"Meta element", +add_script:"Script element", +add_style:"Style element", +add_link:"Link element", +add_base:"Base element", +add_comment:"Comment node", +title_element:"Title element", +script_element:"Script element", +style_element:"Style element", +base_element:"Base element", +link_element:"Link element", +meta_element:"Meta \u0435\u043B\u0435\u043C\u0435\u043D\u0442", +comment_element:"\u041A\u043E\u043C\u0435\u043D\u0442\u0430\u0440", +src:"Src", +language:"\u041C\u043E\u0432\u0430", +href:"Href", +target:"Target", +type:"Type", +charset:"Charset", +defer:"Defer", +media:"Media", +properties:"Properties", +name:"\u041D\u0430\u0437\u0432\u0430", +value:"\u0417\u043D\u0430\u0447\u0435\u043D\u043D\u044F", +content:"\u0417\u043C\u0456\u0441\u0442", +rel:"Rel", +rev:"Rev", +hreflang:"Href lang", +general_props:"\u0417\u0430\u0433\u0430\u043B\u044C\u043D\u0435", +advanced_props:"\u0414\u043E\u0434\u0430\u0442\u043A\u043E\u0432\u043E" +}); \ No newline at end of file diff --git a/code/simple_tinymce_field/javascript/tiny_mce/plugins/media/langs/uk_dlg.js b/code/simple_tinymce_field/javascript/tiny_mce/plugins/media/langs/uk_dlg.js new file mode 100644 index 0000000..8187e35 --- /dev/null +++ b/code/simple_tinymce_field/javascript/tiny_mce/plugins/media/langs/uk_dlg.js @@ -0,0 +1,103 @@ +tinyMCE.addI18n('uk.media_dlg',{ +title:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 / \u0440\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u0442\u0438 embedded media", +general:"\u0417\u0430\u0433\u0430\u043B\u044C\u043D\u0435", +advanced:"\u0414\u043E\u0434\u0430\u0442\u043A\u043E\u0432\u043E", +file:"\u0424\u0430\u0439\u043B/URL", +list:"\u0421\u043F\u0438\u0441\u043E\u043A", +size:"\u0420\u043E\u0437\u043C\u0456\u0440\u0438", +preview:"\u041F\u0435\u0440\u0435\u0433\u043B\u044F\u0434", +constrain_proportions:"\u0417\u0431\u0435\u0440\u0456\u0433\u0430\u0442\u0438 \u043F\u0440\u043E\u043F\u043E\u0440\u0446\u0456\u0457", +type:"\u0422\u0438\u043F", +id:"Id", +name:"\u041D\u0430\u0437\u0432\u0430", +class_name:"\u041A\u043B\u0430\u0441", +vspace:"\u0432\u0435\u0440\u0442.\u0432\u0456\u0434\u0441\u0442\u0443\u043F", +hspace:"\u0433\u043E\u0440.\u0432\u0456\u0434\u0441\u0442\u0443\u043F", +play:"\u0410\u0432\u0442\u043E\u043F\u043B\u0435\u0439", +loop:"\u041B\u0443\u043F", +menu:"\u041F\u043E\u043A\u0430\u0437\u0443\u0432\u0430\u0442\u0438 \u043C\u0435\u043D\u044E", +quality:"\u042F\u043A\u0456\u0441\u0442\u044C", +scale:"Scale", +align:"Align", +salign:"SAlign", +wmode:"WMode", +bgcolor:"\u0424\u043E\u043D", +base:"Base", +flashvars:"Flashvars", +liveconnect:"SWLiveConnect", +autohref:"AutoHREF", +cache:"\u041A\u0435\u0448", +hidden:"Hidden", +controller:"Controller", +kioskmode:"Kiosk mode", +playeveryframe:"Play every frame", +targetcache:"Target cache", +correction:"No correction", +enablejavascript:"Enable JavaScript", +starttime:"Start time", +endtime:"End time", +href:"Href", +qtsrcchokespeed:"Choke speed", +target:"Target", +volume:"\u0413\u0443\u0447\u043D\u0456\u0441\u0442\u044C", +autostart:"\u0410\u0432\u0442\u043E\u0441\u0442\u0430\u0440\u0442", +enabled:"Enabled", +fullscreen:"Fullscreen", +invokeurls:"Invoke URLs", +mute:"Mute", +stretchtofit:"Stretch to fit", +windowlessvideo:"Windowless video", +balance:"\u0411\u0430\u043B\u0430\u043D\u0441", +baseurl:"Base URL", +captioningid:"Captioning id", +currentmarker:"Current marker", +currentposition:"Current position", +defaultframe:"Default frame", +playcount:"Play count", +rate:"Rate", +uimode:"UI Mode", +flash_options:"Flash options", +qt_options:"Quicktime options", +wmp_options:"Windows media player options", +rmp_options:"Real media player options", +shockwave_options:"Shockwave options", +autogotourl:"Auto goto URL", +center:"Center", +imagestatus:"Image status", +maintainaspect:"Maintain aspect", +nojava:"No java", +prefetch:"Prefetch", +shuffle:"Shuffle", +console:"Console", +numloop:"Num loops", +controls:"Controls", +scriptcallbacks:"Script callbacks", +swstretchstyle:"Stretch style", +swstretchhalign:"Stretch H-Align", +swstretchvalign:"Stretch V-Align", +sound:"Sound", +progress:"Progress", +qtsrc:"QT Src", +qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\nYou should also add a non streamed version to the Src field..", +align_top:"Top", +align_right:"Right", +align_bottom:"Bottom", +align_left:"Left", +align_center:"Center", +align_top_left:"Top left", +align_top_right:"Top right", +align_bottom_left:"Bottom left", +align_bottom_right:"Bottom right", +flv_options:"Flash video options", +flv_scalemode:"Scale mode", +flv_buffer:"Buffer", +flv_startimage:"Start image", +flv_starttime:"Start time", +flv_defaultvolume:"Default volumne", +flv_hiddengui:"Hidden GUI", +flv_autostart:"Auto start", +flv_loop:"Loop", +flv_showscalemodes:"Show scale modes", +flv_smoothvideo:"Smooth video", +flv_jscallback:"JS Callback" +}); \ No newline at end of file diff --git a/code/simple_tinymce_field/javascript/tiny_mce/plugins/paste/langs/uk_dlg.js b/code/simple_tinymce_field/javascript/tiny_mce/plugins/paste/langs/uk_dlg.js new file mode 100644 index 0000000..1bead77 --- /dev/null +++ b/code/simple_tinymce_field/javascript/tiny_mce/plugins/paste/langs/uk_dlg.js @@ -0,0 +1,5 @@ +tinyMCE.addI18n('uk.paste_dlg',{ +text_title:"\u0412\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0439\u0442\u0435 CTRL+V \u0434\u043B\u044F \u0432\u0441\u0442\u0430\u0432\u043A\u0438 \u0442\u0435\u043A\u0441\u0442\u0443 \u0443 \u0432\u0456\u043A\u043D\u043E.", +text_linebreaks:"\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u044B \u0441\u0442\u0440\u043E\u043A", +word_title:"\u0412\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0439\u0442\u0435 CTRL+V \u0434\u043B\u044F \u0432\u0441\u0442\u0430\u0432\u043A\u0438 \u0442\u0435\u043A\u0441\u0442\u0443 \u0443 \u0432\u0456\u043A\u043D\u043E." +}); \ No newline at end of file diff --git a/code/simple_tinymce_field/javascript/tiny_mce/plugins/searchreplace/langs/uk_dlg.js b/code/simple_tinymce_field/javascript/tiny_mce/plugins/searchreplace/langs/uk_dlg.js new file mode 100644 index 0000000..8719842 --- /dev/null +++ b/code/simple_tinymce_field/javascript/tiny_mce/plugins/searchreplace/langs/uk_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('uk.searchreplace_dlg',{ +searchnext_desc:"\u0417\u043D\u0430\u0439\u0442\u0438 \u0449\u0435", +notfound:"\u041F\u043E\u0448\u0443\u043A \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u043E. \u041F\u043E\u0448\u0443\u043A\u043E\u0432\u0438\u0439 \u0440\u044F\u0434\u043E \u043D\u0435 \u0437\u043D\u0430\u0439\u0434\u0435\u043D\u043E.", +search_title:"\u0417\u043D\u0430\u0439\u0442\u0438", +replace_title:"\u0417\u043D\u0430\u0439\u0442\u0438/\u0417\u0430\u043C\u0456\u043D\u0438\u0442\u0438", +allreplaced:"\u0412\u0441\u0456 \u0432\u0445\u043E\u0434\u0436\u0435\u043D\u043D\u044F \u0440\u044F\u0434\u043A\u0430 \u0431\u0443\u043B\u0438 \u0437\u0430\u043C\u0456\u043D\u0435\u043D\u0456.", +findwhat:"\u0417\u043D\u0430\u0439\u0442\u0438", +replacewith:"\u0417\u0430\u043C\u0456\u043D\u0438\u0442\u0438 \u043D\u0430", +direction:"\u041D\u0430\u043F\u0440\u044F\u043C", +up:"\u0412\u0433\u043E\u0440\u0443", +down:"\u0412\u043D\u0438\u0437", +mcase:"\u0412\u0440\u0430\u0445\u043E\u0432\u0443\u0432\u0430\u0442\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440", +findnext:"\u0417\u043D\u0430\u0439\u0442\u0438 \u043D\u0430\u0441\u0442\u0443\u043F\u043D\u0435", +replace:"\u0417\u0430\u043C\u0456\u043D\u0438\u0442\u0438", +replaceall:"\u0417\u0430\u043C\u0456\u043D\u0438\u0442\u0438 \u0432\u0441\u0435" +}); \ No newline at end of file diff --git a/code/simple_tinymce_field/javascript/tiny_mce/plugins/style/langs/uk_dlg.js b/code/simple_tinymce_field/javascript/tiny_mce/plugins/style/langs/uk_dlg.js new file mode 100644 index 0000000..273479d --- /dev/null +++ b/code/simple_tinymce_field/javascript/tiny_mce/plugins/style/langs/uk_dlg.js @@ -0,0 +1,63 @@ +tinyMCE.addI18n('uk.style_dlg',{ +title:"\u0420\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u043D\u043D\u044F CSS \u0441\u0442\u0438\u043B\u044E", +apply:"\u0417\u0430\u0441\u0442\u043E\u0441\u0443\u0432\u0430\u0442\u0438", +text_tab:"\u0422\u0435\u043A\u0441\u0442", +background_tab:"\u0424\u043E\u043D", +block_tab:"\u0411\u043B\u043E\u043A", +box_tab:"Box", +border_tab:"\u0413\u0440\u0430\u043D\u0438\u0446\u044F", +list_tab:"\u0421\u043F\u0438\u0441\u043E\u043A", +positioning_tab:"\u041F\u043E\u0437\u0438\u0446\u0456\u043E\u043D\u0443\u0432\u0430\u043D\u043D\u044F", +text_props:"\u0422\u0435\u043A\u0441\u0442", +text_font:"\u0428\u0440\u0438\u0444\u0442", +text_size:"\u0420\u043E\u0437\u043C\u0456\u0440", +text_weight:"\u0422\u043E\u0432\u0449\u0438\u043D\u0430", +text_style:"\u0421\u0442\u0438\u043B\u044C", +text_variant:"Variant", +text_lineheight:"\u0412\u0438\u0441\u043E\u0442\u0430 \u0440\u044F\u0434\u043A\u0443", +text_case:"Case", +text_color:"\u041A\u043E\u043B\u0456\u0440", +text_decoration:"\u041E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u043D\u044F", +text_overline:"\u0432\u0435\u0440\u0445\u043D\u044F \u0440\u0438\u0441\u043A\u0430", +text_underline:"\u043D\u0438\u0436\u043D\u044F \u0440\u0438\u0441\u043A\u0430", +text_striketrough:"\u0437\u0430\u043A\u0440\u0435\u0441\u043B\u0435\u043D\u0438\u0439", +text_blink:"\u043C\u0435\u0440\u0435\u0445\u0442\u0456\u043D\u043D\u044F", +text_none:"\u043D\u0456\u0447\u043E\u0433\u043E", +background_color:"\u041A\u043E\u043B\u0456\u0440 \u0444\u043E\u043D\u0443", +background_image:"\u0424\u043E\u043D\u043E\u0432\u0435 \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F", +background_repeat:"\u041F\u043E\u0432\u0442\u043E\u0440", +background_attachment:"Attachment", +background_hpos:"\u0413\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u044C\u043D\u0430 \u043F\u043E\u0437\u0438\u0446\u0456\u044F", +background_vpos:"\u0412\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u0430 \u043F\u043E\u0437\u0438\u0446\u0456\u044F", +block_wordspacing:"\u0412\u0456\u0434\u0441\u0442\u0443\u043F\u0438 \u043C\u0456\u0436 \u0441\u043B\u043E\u0432\u0430\u043C\u0438", +block_letterspacing:"\u0412\u0456\u0434\u0441\u0442\u0443\u043F\u0438 \u043C\u0456\u0436 \u043B\u0456\u0442\u0435\u0440\u0430\u043C\u0438", +block_vertical_alignment:"\u0412\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u0435 \u0432\u0438\u0440\u0456\u0432\u043D\u044E\u0432\u0430\u043D\u043D\u044F", +block_text_align:"\u0412\u0438\u0440\u0456\u0432\u043D\u044E\u0432\u0430\u043D\u043D\u044F \u0442\u0435\u043A\u0441\u0442\u0443", +block_text_indent:"Text indent", +block_whitespace:"Whitespace", +block_display:"Display", +box_width:"\u0428\u0438\u0440\u0438\u043D\u0430", +box_height:"\u0412\u0438\u0441\u043E\u0442\u0430", +box_float:"Float", +box_clear:"Clear", +padding:"Padding", +same:"\u041E\u0434\u043D\u0430\u043A\u043E\u0435 \u0434\u043B\u044F \u0432\u0441\u0456\u0445", +top:"\u0412\u0433\u043E\u0440\u0443", +right:"\u041F\u0440\u0430\u0432\u043E\u0440\u0443\u0447", +bottom:"\u0417\u043D\u0438\u0437\u0443", +left:"\u041B\u0456\u0432\u043E\u0440\u0443\u0447", +margin:"Margin", +style:"\u0421\u0442\u0438\u043B\u044C", +width:"\u0428\u0438\u0440\u0438\u043D\u0430", +height:"\u0412\u0438\u0441\u043E\u0442\u0430", +color:"\u041A\u043E\u043B\u0456\u0440", +list_type:"\u0422\u0438\u043F", +bullet_image:"Bullet image", +position:"\u041F\u043E\u0437\u0438\u0446\u0456\u044F", +positioning_type:"\u0422\u0438\u043F", +visibility:"\u0412\u0438\u0434\u0438\u043C\u0456\u0441\u0442\u044C", +zindex:"Z-index", +overflow:"Overflow", +placement:"Placement", +clip:"Clip" +}); \ No newline at end of file diff --git a/code/simple_tinymce_field/javascript/tiny_mce/plugins/table/langs/uk_dlg.js b/code/simple_tinymce_field/javascript/tiny_mce/plugins/table/langs/uk_dlg.js new file mode 100644 index 0000000..b8e3ad4 --- /dev/null +++ b/code/simple_tinymce_field/javascript/tiny_mce/plugins/table/langs/uk_dlg.js @@ -0,0 +1,74 @@ +tinyMCE.addI18n('uk.table_dlg',{ +general_tab:"\u0417\u0430\u0433\u0430\u043B\u044C\u043D\u0435", +advanced_tab:"\u0414\u043E\u0434\u0430\u0442\u043A\u043E\u0432\u043E", +general_props:"\u0417\u0430\u0433\u0430\u043B\u044C\u043D\u0456 \u0432\u043B\u0430\u0441\u0442\u0438\u0432\u043E\u0441\u0442\u0456", +advanced_props:"\u0420\u043E\u0437\u0448\u0438\u0440\u0435\u043D\u0456 \u0432\u043B\u0430\u0441\u0442\u0438\u0432\u043E\u0441\u0442\u0456", +rowtype:"Row in table part", +title:"\u0414\u043E\u0434\u0430\u0432\u0430\u043D\u043D\u044F/\u0417\u043C\u0456\u043D\u0430 \u0442\u0430\u0431\u043B\u0438\u0446\u0456", +width:"\u0428\u0438\u0440\u0438\u043D\u0430", +height:"\u0412\u0438\u0441\u043E\u0442\u0430", +cols:"\u0421\u0442\u043E\u043B\u0431\u0446\u044B", +rows:"\u0421\u0442\u0440\u043E\u043A\u0438", +cellspacing:"\u0412\u0456\u0434\u0441\u0442\u0430\u043D\u044C \u043C\u0456\u0436 \u043A\u043E\u043C\u0456\u0440\u043A\u0430\u043C\u0438", +cellpadding:"\u0412\u0456\u0434\u0441\u0442\u0443\u043F\u0438 \u0443 \u043A\u043E\u043C\u0456\u0440\u043A\u0430\u0445", +border:"\u0413\u0440\u0430\u043D\u0438\u0446\u044F", +align:"\u0412\u0438\u0440\u0456\u0432\u043D\u044E\u0432\u0430\u043D\u043D\u044F", +align_default:"\u0417\u0430 \u0437\u0430\u043C\u043E\u0432\u0447\u0430\u043D\u043D\u044F\u043C", +align_left:"\u041F\u043E \u043B\u0456\u0432\u043E\u043C\u0443 \u043A\u0440\u0430\u044E", +align_right:"\u041F\u043E \u043F\u0440\u0430\u0432\u043E\u043C\u0443 \u043A\u0440\u0430\u044E", +align_middle:"\u041F\u043E \u0446\u0435\u043D\u0442\u0440\u0443", +row_title:"\u0412\u043B\u0430\u0441\u0442\u0438\u0432\u043E\u0441\u0442\u0456 \u0440\u044F\u0434\u043A\u0443 \u0442\u0430\u0431\u043B\u0438\u0446\u0456", +cell_title:"\u0412\u043B\u0430\u0441\u0442\u0438\u0432\u043E\u0441\u0442\u0456 \u043A\u043E\u043C\u0456\u0440\u043A\u0438 \u0442\u0430\u0431\u043B\u0438\u0446\u0456", +cell_type:"\u0422\u0438\u043F \u043A\u043E\u043C\u0456\u0440\u043A\u0438", +valign:"\u0412\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u043E\u0435 \u0432\u044B\u0440\u0430\u0432\u043D\u0438\u0432\u0430\u043D\u0438\u0435", +align_top:"\u041F\u043E \u0432\u0435\u0440\u0445\u043D\u0435\u043C\u0443 \u043A\u0440\u0430\u044E", +align_bottom:"\u041F\u043E \u043D\u0438\u0436\u043D\u044C\u043E\u043C\u0443 \u043A\u0440\u0430\u044E", +bordercolor:"\u043A\u043E\u043B\u0456\u0440 \u0433\u0440\u0430\u043D\u0438\u0446\u044B", +bgcolor:"\u043A\u043E\u043B\u0456\u0440 \u0444\u043E\u043D\u0443", +merge_cells_title:"\u041E\u0431'\u0454\u0434\u043D\u0430\u0442\u0438 \u043A\u043E\u043C\u0456\u0440\u043A\u0438", +id:"Id", +style:"\u0421\u0442\u0438\u043B\u044C", +langdir:"\u041D\u0430\u043F\u0440\u044F\u043C \u043C\u043E\u0432\u0438", +langcode:"\u041A\u043E\u0434 \u043C\u043E\u0432\u0438", +mime:"Target MIME-\u0442\u0438\u043F", +ltr:"\u0417\u043B\u0456\u0432\u0430 \u043F\u0440\u0430\u0432\u043E\u0440\u0443\u0447", +rtl:"\u0421\u043F\u0440\u0430\u0432\u0430 \u043B\u0456\u0432\u043E\u0440\u0443\u0447", +bgimage:"\u0424\u043E\u043D\u043E\u0432\u0435 \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F", +summary:"\u0417\u0430\u0433\u0430\u043B\u044C\u043D\u0435", +td:"\u0414\u0430\u043D\u043D\u0456", +th:"\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A", +cell_cell:"\u041E\u043D\u043E\u0432\u0438\u0442\u0438 \u043F\u043E\u0442\u043E\u0447\u043D\u0443 \u043A\u043E\u043C\u0456\u0440\u043A\u0443", +cell_row:"\u041E\u043D\u043E\u0432\u0438\u0442\u0438 \u0432\u0441\u0456 \u043A\u043E\u043C\u0456\u0440\u043A\u0438 \u0432 \u0440\u044F\u0434\u043A\u0443", +cell_all:"\u041E\u043D\u043E\u0432\u0438\u0442\u0438 \u0432\u0441\u0456 \u043A\u043E\u043C\u0456\u0440\u043A\u0438 \u0432 \u0442\u0430\u0431\u043B\u0438\u0446\u0456", +row_row:"\u041E\u043D\u043E\u0432\u0438\u0442\u0438 \u043F\u043E\u0442\u043E\u0447\u043D\u0438\u0439 \u0440\u044F\u0434\u043E\u043A", +row_odd:"\u041E\u043D\u043E\u0432\u0438\u0442\u0438 \u043D\u0435\u043F\u0430\u0440\u043D\u0456 \u0440\u044F\u0434\u043A\u0438 \u0432 \u0442\u0430\u0431\u043B\u0438\u0446", +row_even:"\u041E\u043D\u043E\u0432\u0438\u0442\u0438 \u043F\u0430\u0440\u043D\u0456 \u0440\u044F\u0434\u043A\u0438 \u0432 \u0442\u0430\u0431\u043B\u0438\u0446\u0456", +row_all:"\u043D\u043E\u0432\u0438\u0442\u0438 \u0432\u0441\u0456 \u0440\u044F\u0434\u043A\u0438 \u0432 \u0442\u0430\u0431\u043B\u0438\u0446\u0456", +thead:"\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A \u0442\u0430\u0431\u043B\u0438\u0446\u0456", +tbody:"\u0422\u0456\u043B\u043E \u0442\u0430\u0431\u043B\u0438\u0446\u0456", +tfoot:"\u041D\u0438\u0436\u043D\u044F \u0447\u0430\u0441\u0442\u0441\u0438\u043D\u0430", +scope:"Scope", +rowgroup:"Row Group", +colgroup:"Col Group", +col_limit:"You've exceeded the maximum number of columns of {$cols}.", +row_limit:"You've exceeded the maximum number of rows of {$rows}.", +cell_limit:"You've exceeded the maximum number of cells of {$cells}.", +missing_scope:"Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.", +caption:"Table caption", +frame:"\u0424\u0440\u0435\u0439\u043C", +frame_none:"none", +frame_groups:"groups", +frame_rows:"rows", +frame_cols:"cols", +frame_all:"all", +rules:"Rules", +rules_void:"void", +rules_above:"above", +rules_below:"below", +rules_hsides:"hsides", +rules_lhs:"lhs", +rules_rhs:"rhs", +rules_vsides:"vsides", +rules_box:"box", +rules_border:"border" +}); \ No newline at end of file diff --git a/code/simple_tinymce_field/javascript/tiny_mce/plugins/template/langs/uk_dlg.js b/code/simple_tinymce_field/javascript/tiny_mce/plugins/template/langs/uk_dlg.js new file mode 100644 index 0000000..86cee42 --- /dev/null +++ b/code/simple_tinymce_field/javascript/tiny_mce/plugins/template/langs/uk_dlg.js @@ -0,0 +1,15 @@ +tinyMCE.addI18n('uk.template_dlg',{ +title:"\u0428\u0430\u0431\u043B\u043E\u043D\u0438", +label:"\u0428\u0430\u0431\u043B\u043E\u043D", +desc_label:"\u041E\u043F\u0438\u0441", +desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u0448\u0430\u0431\u043B\u043E\u043D\u043D\u0438\u0439 \u043A\u043E\u043D\u0442\u0435\u043D\u0442", +select:"\u0412\u0438\u0431\u0435\u0440\u0456\u0442\u044C \u0448\u0430\u0431\u043B\u043E\u043D", +preview:"\u041F\u0435\u0440\u0435\u0433\u043B\u044F\u0434", +warning:"\u0423\u0432\u0430\u0433\u0430: \u043E\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044F \u0448\u0430\u0431\u043B\u043E\u043D\u0430 \u043D\u0430 \u0456\u043D\u0448\u0438\u0439 \u043C\u043E\u0436\u0435 \u043F\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u0434\u043E \u0432\u0442\u0440\u0430\u0442 \u0434\u0430\u043D\u0438\u0445.", +mdate_format:"%Y-%m-%d %H:%M:%S", +cdate_format:"%Y-%m-%d %H:%M:%S", +months_long:"\u0421\u0456\u0447\u0435\u043D\u044C,\u041B\u044E\u0442\u0438\u0439,\u0411\u0435\u0440\u0435\u0437\u0435\u043D\u044C,\u041A\u0432\u0456\u0442\u0435\u043D\u044C,\u0422\u0440\u0430\u0432\u0435\u043D\u044C,\u0427\u0435\u0440\u0432\u0435\u043D\u044C,\u041B\u0438\u043F\u0435\u043D\u044C,\u0421\u0435\u0440\u043F\u0435\u043D\u044C,\u0412\u0435\u0440\u0435\u0441\u0435\u043D\u044C,\u0416\u043E\u0432\u0442\u0435\u043D\u044C,\u041B\u0438\u0441\u0442\u043E\u043F\u0430\u0434,\u0413\u0440\u0443\u0434\u0435\u043D\u044C", +months_short:"\u0421\u0456\u0447,\u041B\u044E\u0442,\u0411\u0435\u0440,\u041A\u0432\u0456,\u0422\u0440\u0430,\u0427\u0435\u0440,\u041B\u0438\u043F,\u0421\u0435\u0440,\u0412\u0435\u0440,\u0416\u043E\u0432,\u041B\u0438\u0441,\u0413\u0440\u0443", +day_long:"\u041D\u0435\u0434\u0456\u043B\u044F,\u041F\u043E\u043D\u0435\u0434\u0456\u043B\u043E\u043A,\u0412\u0456\u0432\u0442\u043E\u0440\u043E\u043A,\u0421\u0435\u0440\u0435\u0434\u0430,\u0427\u0435\u0442\u0432\u0435\u0440,\u041F'\u044F\u0442\u043D\u0438\u0446\u044F,\u0421\u0443\u0431\u043E\u0442\u0430,\u041D\u0435\u0434\u0456\u043B\u044F", +day_short:"\u041D\u0434,\u041F\u043D,\u0412\u0442,\u0421\u0440,\u0427\u0442,\u041F\u0442,\u0421\u0431,\u041D\u0434" +}); \ No newline at end of file diff --git a/code/simple_tinymce_field/javascript/tiny_mce/plugins/xhtmlxtras/langs/uk_dlg.js b/code/simple_tinymce_field/javascript/tiny_mce/plugins/xhtmlxtras/langs/uk_dlg.js new file mode 100644 index 0000000..255285a --- /dev/null +++ b/code/simple_tinymce_field/javascript/tiny_mce/plugins/xhtmlxtras/langs/uk_dlg.js @@ -0,0 +1,32 @@ +tinyMCE.addI18n('uk.xhtmlxtras_dlg',{ +attribute_label_title:"\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A", +attribute_label_id:"ID", +attribute_label_class:"\u041A\u043B\u0430\u0441", +attribute_label_style:"\u0421\u0442\u0438\u043B\u044C", +attribute_label_cite:"\u0426\u0438\u0442\u0430\u0442\u0430", +attribute_label_datetime:"\u0414\u0430\u0442\u0430/\u0427\u0430\u0441", +attribute_label_langdir:"\u041D\u0430\u043F\u0440\u044F\u043C \u0442\u0435\u043A\u0441\u0442\u0443", +attribute_option_ltr:"\u0417\u043B\u0456\u0432\u0430 \u043F\u0440\u0430\u0432\u043E\u0440\u0443\u0447", +attribute_option_rtl:"\u0421\u043F\u0440\u0430\u0432\u0430 \u043B\u0456\u0432\u043E\u0440\u0443\u0447", +attribute_label_langcode:"\u041C\u043E\u0432\u0430", +attribute_label_tabindex:"TabIndex", +attribute_label_accesskey:"AccessKey", +attribute_events_tab:"\u041F\u043E\u0434\u0456\u0457", +attribute_attrib_tab:"\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u0438", +general_tab:"\u0417\u0430\u0433\u0430\u043B\u044C\u043D\u0435", +attrib_tab:"\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u0438", +events_tab:"\u041F\u043E\u0434\u0456\u0457", +fieldset_general_tab:"\u0417\u0430\u0433\u0430\u043B\u044C\u043D\u0456 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438", +fieldset_attrib_tab:"Element Attributes", +fieldset_events_tab:"Element Events", +title_ins_element:"Insertion Element", +title_del_element:"Deletion Element", +title_acronym_element:"Acronym Element", +title_abbr_element:"Abbreviation Element", +title_cite_element:"Citation Element", +remove:"\u0412\u0438\u0434\u0430\u043B\u0438\u0442\u0438", +insert_date:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u043F\u043E\u0442\u043E\u0447\u043D\u0456 \u0434\u0430\u0442\u0443/\u0447\u0430\u0441", +option_ltr:"\u0417\u043B\u0456\u0432\u0430 \u043F\u0440\u0430\u0432\u043E\u0440\u0443\u0447", +option_rtl:"\u0421\u043F\u0440\u0430\u0432\u0430 \u043B\u0456\u0432\u043E\u0440\u0443\u0447", +attribs_title:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438/\u0437\u043C\u0456\u043D\u0438\u0442\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0438" +}); \ No newline at end of file diff --git a/code/simple_tinymce_field/javascript/tiny_mce/themes/advanced/langs/uk.js b/code/simple_tinymce_field/javascript/tiny_mce/themes/advanced/langs/uk.js new file mode 100644 index 0000000..680f9b2 --- /dev/null +++ b/code/simple_tinymce_field/javascript/tiny_mce/themes/advanced/langs/uk.js @@ -0,0 +1,62 @@ +tinyMCE.addI18n('uk.advanced',{ +style_select:"Стилі", +font_size:"Розмір шрифту", +fontdefault:"Шрифт", +block:"Форматувати", +paragraph:"Параграф (p)", +div:"Div", +address:"Адресa", +pre:"Преформатований (pre)", +h1:"Заголовок 1", +h2:"Заголовок 2", +h3:"Заголовок 3", +h4:"Заголовок 4", +h5:"Заголовок 5", +h6:"Заголовок 6", +blockquote:"Цитування (blockquote)", +code:"Програмний текст (code)", +samp:"Зразок коду (samp)", +dt:"Термін (dt)", +dd:"Опис терміну (dd)", +bold_desc:"Жирний (Ctrl+B)", +italic_desc:"Курсив (Ctrl+I)", +underline_desc:"Підкреслений (Ctrl+U)", +striketrough_desc:"Закреслений", +justifyleft_desc:"По лівому крію", +justifycenter_desc:"По центру", +justifyright_desc:"По правому краю", +justifyfull_desc:"По ширині", +bullist_desc:"Невпорядкований список", +numlist_desc:"Впорядкований список", +outdent_desc:"Зменшити відступ", +indent_desc:"Збільшити відступ", +undo_desc:"Відмінити (Ctrl+Z)", +redo_desc:"Застосувати (Ctrl+Y)", +link_desc:"Вставити/редагувати посилання", +unlink_desc:"Розірвати посилання", +image_desc:"Вставити/редагувати зображення", +cleanup_desc:"Cleanup messy code", +code_desc:"Редагувати HTML", +sub_desc:"Верхній індекс", +sup_desc:"Нижній індекс", +hr_desc:"Вставити горизонтальну лінію (hr)", +removeformat_desc:"Прибрати форматування", +custom1_desc:"Вставте сюди опис", +forecolor_desc:"Оберіть колір тексту", +backcolor_desc:"Оберіть колір тла", +charmap_desc:"Вставити довільний символ", +visualaid_desc:"Перемкнути напрямні/невидимі елементи", +anchor_desc:"Вставити/редагувати якір", +cut_desc:"Вирізати", +copy_desc:"Копіювати", +paste_desc:"Вставити", +image_props_desc:"Властивості зображення", +newdocument_desc:"Новий документ", +help_desc:"Допомога", +blockquote_desc:"Цитування", +clipboard_msg:"Копіювання/Вирізання/Вставка не доступні в Mozilla та Firefox.\r\nЧи бажаєте дізнатися більше про цю проблему?", +path:"Шлях", +newdocument:"Ви впевнені, що бажаєте зтерти весь вміст?", +toolbar_focus:"Перейти до іструментів - Alt+Q, Перейти до редактора - Alt-Z, Перейти до елементів шляху - Alt-X", +more_colors:"Ще кольори" +}); \ No newline at end of file diff --git a/code/simple_tinymce_field/javascript/tiny_mce/themes/advanced/langs/uk_dlg.js b/code/simple_tinymce_field/javascript/tiny_mce/themes/advanced/langs/uk_dlg.js new file mode 100644 index 0000000..29d0d5d --- /dev/null +++ b/code/simple_tinymce_field/javascript/tiny_mce/themes/advanced/langs/uk_dlg.js @@ -0,0 +1,51 @@ +tinyMCE.addI18n('гл.advanced_dlg',{ +about_title:"Про TinyMCE", +about_general:"Про", +about_help:"Допомога", +about_license:"Ліцензія", +about_plugins:"Плагіни", +about_plugin:"Плагін", +about_author:"Автор", +about_version:"Версія", +about_loaded:"Завантажені плагіни", +anchor_title:"Вставити/редагувати якір", +anchor_name:"Ім'я якору", +code_title:"Редактор HTML", +code_wordwrap:"Перенос слів", +colorpicker_title:"Оберіть колір", +colorpicker_picker_tab:"Вибір кольору", +colorpicker_picker_title:"Вибір кольору", +colorpicker_palette_tab:"Палітра", +colorpicker_palette_title:"Кольори палітри", +colorpicker_named_tab:"Кольори з назвами", +colorpicker_named_title:"Кольори з назвами", +colorpicker_color:"Колір:", +colorpicker_name:"Назва:", +charmap_title:"Виберіть символ", +image_title:"Вставити/редагувати зображення", +image_src:"URL зображення", +image_alt:"Опис зображення", +image_list:"Список зображень", +image_border:"Рамка", +image_dimensions:"Розміри", +image_vspace:"Вертикальний відступ", +image_hspace:"Горизонтальний відступ", +image_align:"Вирівнювання", +image_align_baseline:"Baseline", +image_align_top:"Top", +image_align_middle:"Middle", +image_align_bottom:"Bottom", +image_align_texttop:"Text top", +image_align_textbottom:"Text-bottom", +image_align_left:"По лівому краю", +image_align_right:"По правому краю", +link_title:"Вставити/редагувати посилання", +link_url:"URL посилання", +link_target:"Атрибут Target", +link_target_same:"Відкривати послання в тому ж вікні", +link_target_blank:"Відкривати посилання в новому вікні", +link_titlefield:"Атрибут Title", +link_is_email:"URL, що ви ввели, ймовірно е поштовою адресою. Чи бажаєте додати необхідний префікс mailto: ?", +link_is_external:"URL, що ви ввели, ймовірно є посиланням на інший сайт. Чи бажаєте додати необхідний префікс http:// ?", +link_list:"Link list" +}); \ No newline at end of file diff --git a/code/simple_tinymce_field/javascript/tiny_mce/themes/simple/langs/uk.js b/code/simple_tinymce_field/javascript/tiny_mce/themes/simple/langs/uk.js new file mode 100644 index 0000000..289b2af --- /dev/null +++ b/code/simple_tinymce_field/javascript/tiny_mce/themes/simple/langs/uk.js @@ -0,0 +1,11 @@ +tinyMCE.addI18n('uk.simple',{ +bold_desc:"Жирний (Ctrl+B)", +italic_desc:"Курсив (Ctrl+I)", +underline_desc:"Підкреслений (Ctrl+U)", +striketrough_desc:"Закреслений", +bullist_desc:"Список", +numlist_desc:"Нумерований список", +undo_desc:"Відмінити (Ctrl+Z)", +redo_desc:"Застосувати (Ctrl+Y)", +cleanup_desc:"Прибрати безлад" +}); \ No newline at end of file diff --git a/lang/ru_RU.php b/lang/ru_RU.php new file mode 100644 index 0000000..b259cce --- /dev/null +++ b/lang/ru_RU.php @@ -0,0 +1,43 @@ + Date: Tue, 12 Mar 2013 19:29:19 +0100 Subject: [PATCH 27/33] Update LiveDropdownField.php it will show (ex.) result "FC Gradina" no mather if you write "Gradina FC" or "FC Gradina". I think this is better when you trying to find "multi word title" --- code/dropdown_fields/LiveDropdownField.php | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/code/dropdown_fields/LiveDropdownField.php b/code/dropdown_fields/LiveDropdownField.php index 2ff95cf..e69efef 100755 --- a/code/dropdown_fields/LiveDropdownField.php +++ b/code/dropdown_fields/LiveDropdownField.php @@ -16,7 +16,16 @@ public function __construct($name, $title, $className = "SiteTree", $label = "Ti public function getresults(SS_HTTPRequest $r) { $q = Convert::raw2sql($r->requestVar('q')); - $results = DataObject::get($this->sourceClass,$this->labelField . " LIKE '%{$q}%'"); + $qArray = explode(" ", $q); + if (is_array($qArray) && count($qArray) > 1) { + $where = $this->labelField . "!='' "; + foreach ($qArray as $value) { + $where .= "AND ". $this->labelField . " LIKE '%{$value}%' "; + } + } else { + $where = $this->labelField . " LIKE '%{$q}%'"; + } + $results = DataObject::get($this->sourceClass, $where); if($results) { $set = new DataObjectSet(); foreach($results->toDropdownMap('ID', $this->labelField) as $key => $val) { @@ -59,4 +68,4 @@ public function Field() { } -} \ No newline at end of file +} From abd6f9b259c913da0b1c885fae3cfaaedff4ef46 Mon Sep 17 00:00:00 2001 From: Damian Mooyman Date: Wed, 8 May 2013 10:57:06 +1200 Subject: [PATCH 28/33] BUG Fixed issue with incorrect parsing of sort order from front end ajax requests. This was generating broken SQL such as ORDER BY "" --- code/DataObjectManager.php | 20 ++++++++++---------- code/ManyManyDataObjectManager.php | 11 +++++++---- code/ManyManyFileDataObjectManager.php | 13 +++++++------ 3 files changed, 24 insertions(+), 20 deletions(-) diff --git a/code/DataObjectManager.php b/code/DataObjectManager.php index 21fdb49..90d0f2d 100644 --- a/code/DataObjectManager.php +++ b/code/DataObjectManager.php @@ -207,17 +207,17 @@ protected function loadSort() if($this->ShowAll()) $this->setPageSize(999); - if($this->Sortable() && (!isset($_REQUEST['ctf'][$this->Name()]['sort']) || $_REQUEST['ctf'][$this->Name()]['sort'] == "SortOrder")) { + $frontendSort = empty($_REQUEST['ctf'][$this->Name()]['sort']) + ? null + : $_REQUEST['ctf'][$this->Name()]['sort']; + if($this->Sortable() && (empty($frontendSort) || $frontendSort == "SortOrder")) { $this->sort = "SortOrder"; $this->sourceSort = "\"SortOrder\" ASC"; - } - elseif(isset($_REQUEST['ctf'][$this->Name()]['sort']) && !empty($_REQUEST['ctf'][$this->Name()]['sort'])) { - $this->sourceSort = "\"" . $_REQUEST['ctf'][$this->Name()]['sort'] . "\" " . $this->sort_dir; - } - elseif($sort = singleton($this->sourceClass())->stat('default_sort')) { + } elseif($frontendSort) { + $this->sourceSort = "\"$frontendSort\" {$this->sort_dir}"; + } elseif($sort = singleton($this->sourceClass())->stat('default_sort')) { $this->sourceSort = $sort; - } - else { + } else { $this->sourceSort = "Created DESC"; } @@ -301,7 +301,7 @@ public function Headings() { $headings = array(); foreach($this->fieldList as $fieldName => $fieldTitle) { - if(isset($_REQUEST['ctf'][$this->Name()]['sort_dir'])) + if(!empty($_REQUEST['ctf'][$this->Name()]['sort_dir'])) $dir = $_REQUEST['ctf'][$this->Name()]['sort_dir'] == "ASC" ? "DESC" : "ASC"; else $dir = "ASC"; @@ -314,7 +314,7 @@ public function Headings() 'sort' => $fieldName )), "SortDirection" => $dir, - "IsSorted" => (isset($_REQUEST['ctf'][$this->Name()]['sort'])) && ($_REQUEST['ctf'][$this->Name()]['sort'] == $fieldName), + "IsSorted" => (!empty($_REQUEST['ctf'][$this->Name()]['sort'])) && ($_REQUEST['ctf'][$this->Name()]['sort'] == $fieldName), "ColumnWidthCSS" => !empty($this->column_widths) ? sprintf("style='width:%f%%;'",($this->column_widths[$fieldName] - 0.1)) : "" )); } diff --git a/code/ManyManyDataObjectManager.php b/code/ManyManyDataObjectManager.php index e19cff5..8eb4cea 100644 --- a/code/ManyManyDataObjectManager.php +++ b/code/ManyManyDataObjectManager.php @@ -86,20 +86,23 @@ protected function loadSort() { $this->setPageSize(999); $original_sort = $this->sourceSort; + $frontendSort = empty($_REQUEST['ctf'][$this->Name()]['sort']) + ? null + : $_REQUEST['ctf'][$this->Name()]['sort']; if(SortableDataObject::is_sortable_many_many($this->sourceClass(), $this->manyManyParentClass)) { list($parentClass, $componentClass, $parentField, $componentField, $table) = singleton($this->controllerClass())->many_many($this->Name()); $sort_column = "MMSort"; - if(!isset($_REQUEST['ctf'][$this->Name()]['sort']) || $_REQUEST['ctf'][$this->Name()]['sort'] == $sort_column) { + if(empty($frontendSort) || $frontendSort == $sort_column) { $this->sort = $sort_column; $this->sourceSort = "\"$sort_column\" " . SortableDataObject::$sort_dir; $this->sourceSort .= ", \"Checked\" DESC"; } - } elseif($this->Sortable() && (!isset($_REQUEST['ctf'][$this->Name()]['sort']) || $_REQUEST['ctf'][$this->Name()]['sort'] == "SortOrder")) { + } elseif($this->Sortable() && (empty($frontendSort) || $frontendSort == "SortOrder")) { $this->sort = "SortOrder"; $this->sourceSort = "\"SortOrder\" " . SortableDataObject::$sort_dir; $this->sourceSort .= ", \"Checked\" DESC"; - } elseif(isset($_REQUEST['ctf'][$this->Name()]['sort']) && !empty($_REQUEST['ctf'][$this->Name()]['sort'])) { - $this->sourceSort = "\"".$_REQUEST['ctf'][$this->Name()]['sort'] . "\" " . $this->sort_dir; + } elseif($frontendSort) { + $this->sourceSort = "\"{$frontendSort}\" {$this->sort_dir}"; } elseif (empty($original_sort)) { $this->sourceSort = singleton($this->sourceClass())->stat('default_sort'); } diff --git a/code/ManyManyFileDataObjectManager.php b/code/ManyManyFileDataObjectManager.php index 411bc8e..5ea7429 100644 --- a/code/ManyManyFileDataObjectManager.php +++ b/code/ManyManyFileDataObjectManager.php @@ -83,20 +83,21 @@ protected function loadSort() { $this->setPageSize(999); $original_sort = $this->sourceSort; + $frontendSort = empty($_REQUEST['ctf'][$this->Name()]['sort']) + ? null + : $_REQUEST['ctf'][$this->Name()]['sort']; if (SortableDataObject::is_sortable_many_many($this->sourceClass(), $this->manyManyParentClass)) { list($parentClass, $componentClass, $parentField, $componentField, $table) = singleton($this->controllerClass())->many_many($this->Name()); $sort_column = "$table.SortOrder"; - if (!isset($_REQUEST['ctf'][$this->Name()]['sort']) || $_REQUEST['ctf'][$this->Name()]['sort'] == $sort_column) { + if (empty($frontendSort) || $frontendSort == $sort_column) { $this->sort = $sort_column; $this->sourceSort = "\"$table\".\"SortOrder\" " . SortableDataObject::$sort_dir; } - } elseif ($this->Sortable() && (!isset($_REQUEST['ctf'][$this->Name()]['sort']) || $_REQUEST['ctf'][$this->Name()]['sort'] == "SortOrder")) { + } elseif ($this->Sortable() && (empty($frontendSort) || $frontendSort == "SortOrder")) { $this->sort = "SortOrder"; $this->sourceSort = "\"SortOrder\" " . SortableDataObject::$sort_dir; - } elseif (isset($_REQUEST['ctf'][$this->Name()]['sort'])) { - $this->sourceSort = "\"" . $_REQUEST['ctf'][$this->Name()]['sort'] . "\" " . $this->sort_dir; - } elseif(isset($_REQUEST['ctf'][$this->Name()]['sort']) && !empty($_REQUEST['ctf'][$this->Name()]['sort'])) { - $this->sourceSort = $_REQUEST['ctf'][$this->Name()]['sort'] . " " . $this->sort_dir; + } elseif ($frontendSort) { + $this->sourceSort = "\"{$frontendSort}\" {$this->sort_dir}"; } elseif (empty($original_sort)) { $this->sourceSort = singleton($this->sourceClass())->stat('default_sort'); } From 8e5bd466a7fe1eaa3f3da92125948a8c7adc24c9 Mon Sep 17 00:00:00 2001 From: Andrew Lowther Date: Thu, 1 Aug 2013 10:57:41 +0100 Subject: [PATCH 29/33] Adding a cachebuster onto the DataObjectManager#AddLink method Signed-off-by: Andrew Lowther --- code/DataObjectManager.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/DataObjectManager.php b/code/DataObjectManager.php index 21fdb49..34e978f 100644 --- a/code/DataObjectManager.php +++ b/code/DataObjectManager.php @@ -481,7 +481,7 @@ public function PaginatedLink() } public function AddLink() { - return Controller::join_links($this->BaseLink(), 'add'); + return Controller::join_links($this->BaseLink(), 'add?cacheb=' . time()); } public function ShowAll() From c5cfe21dc336a50f6fc63e8444c70630c30a12d0 Mon Sep 17 00:00:00 2001 From: Cam Spiers Date: Fri, 13 Sep 2013 15:18:14 +1200 Subject: [PATCH 30/33] FIX When you can't edit or view in ManyMany grid view, the popup should not be trigged on click This change removes the classes so the event isn't bound that makes the popup open --- templates/RelationFileDataObjectManager.ss | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/templates/RelationFileDataObjectManager.ss b/templates/RelationFileDataObjectManager.ss index f72cbb4..d43063a 100644 --- a/templates/RelationFileDataObjectManager.ss +++ b/templates/RelationFileDataObjectManager.ss @@ -89,8 +89,8 @@ <% else %>
        <% if Top.ShowAll %><% end_if %> -
        -
        $FileLabel
        $MarkingCheckbox
        +
        +
        $FileLabel
        $MarkingCheckbox
        <% if Can(delete) %>
        delete
        <% end_if %>
        $ExtraData -
        \ No newline at end of file +
        From 215597795e2e95455a5f25ad01a903fa47d0c4e9 Mon Sep 17 00:00:00 2001 From: hdrlab Date: Thu, 20 Feb 2014 16:46:21 +1300 Subject: [PATCH 31/33] Hide edit/delete links based on canEdit(), etc. This is a quick-n'-dirty patch to make DOM hide "action" links such as edit and delete based on per-item permissions (i.e., addresses issue #75). While a more complete solution is needed (there are other points in the code that should be updated), it does only show the action links when those actions are allowed. --- code/DataObjectManager.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/DataObjectManager.php b/code/DataObjectManager.php index 927498a..1f6cc67 100644 --- a/code/DataObjectManager.php +++ b/code/DataObjectManager.php @@ -712,7 +712,9 @@ public function Actions() $action = false; switch($perm) { case "edit": + if(!$this->item->canEdit()) continue; case "view": + if(!$this->item->canView()) continue; $actions->push(new DataObjectManagerAction( $this->ViewOrEdit_i18n(), $this->EditLink(), @@ -724,6 +726,7 @@ public function Actions() break; case "delete": + if(!$this->item->canDelete()) continue; $actions->push(new DataObjectManagerAction( _t('DataObjectManager.DELETE','Delete'), $this->DeleteLink(), @@ -735,6 +738,7 @@ public function Actions() break; case "duplicate": + if(!$this->item->canCreate()) continue; $actions->push(new DataObjectManagerAction( _t('DataObjectManager.DUPLICATE','Duplicate'), $this->DuplicateLink(), From dd327792a84ab2f820d2d76a64b820c08d1ddfcc Mon Sep 17 00:00:00 2001 From: Fred Condo Date: Tue, 6 May 2014 11:24:28 -0700 Subject: [PATCH 32/33] Add composer.json for composer support --- composer.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 composer.json diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..037b848 --- /dev/null +++ b/composer.json @@ -0,0 +1,13 @@ +{ + "name": "silverstripe/dataobject_manager", + "description": "Enhanced dataobjct editing for SilverStripe 2.x.", + "type": "silverstripe-module", + "keywords": ["silverstripe", "cms"], + "authors": [{ + "name": "unclecheese" + }], + "require": { + "silverstripe/framework": "~2.4", + "silverstripe/cms": "~2.4" + } +} From d60ea1843e9e2d04369b08ced1758693c21ec7b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Br=C3=BCchner?= Date: Wed, 23 Sep 2015 11:16:40 +0200 Subject: [PATCH 33/33] Optimize image size --- images/move_icon.jpg | Bin 17271 -> 443 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/images/move_icon.jpg b/images/move_icon.jpg index fe916458fa12763720271ba616eaf3bda1b3d2c6..01fe452cb07ec3fd0ae86518554d9ffc80a99fd0 100644 GIT binary patch literal 443 zcmex=N zJ$ZZH6CU^bF*An0lnIT7>&yhc+Cwe+QtNUEN?6q?4F0Y?#$I@+g zaLn)9Vbo#wATw&0-&CFLh4C`ik9_;~U0ERgI#Uqy1-|_t*9syz0PGh9u-#0IK)dDf KC}4&txCsDAuU#qt literal 17271 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