mirror of
https://github.com/silverstripe/silverstripe-reports
synced 2024-10-22 11:05:53 +02:00
ENHANCEMENT Showing all available languages in language selector above sitetree in CMS - you can now create new pages in completely new languages without any relation to an "original"
ENHANCEMENT Added CMSMain->IsTranslatableEnabled API CHANGE Removed CMSMain->switchlanguage() - createTranslation() is sufficient for new, ajax refreshing of CMS state got way too complicated for switching languages, we now just reload the entire CMS with a different ?lang GET parameter git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/cms/trunk@73345 467b73ca-7a2a-4603-9d3b-597d59a354a9
This commit is contained in:
parent
a9053b4b67
commit
15454352bb
157
code/CMSMain.php
157
code/CMSMain.php
@ -51,7 +51,6 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
|
|||||||
'rollback',
|
'rollback',
|
||||||
'sidereport',
|
'sidereport',
|
||||||
'submit',
|
'submit',
|
||||||
'switchlanguage',
|
|
||||||
'unpublish',
|
'unpublish',
|
||||||
'versions',
|
'versions',
|
||||||
'EditForm',
|
'EditForm',
|
||||||
@ -360,9 +359,9 @@ JS;
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a databsae record to be managed by the CMS
|
* Get a database record to be managed by the CMS
|
||||||
*/
|
*/
|
||||||
public function getRecord($id) {
|
public function getRecord($id) {
|
||||||
|
|
||||||
$treeClass = $this->stat('tree_class');
|
$treeClass = $this->stat('tree_class');
|
||||||
|
|
||||||
@ -486,6 +485,7 @@ JS;
|
|||||||
if(!singleton($className)->canCreate()) return Security::permissionFailure($this);
|
if(!singleton($className)->canCreate()) return Security::permissionFailure($this);
|
||||||
|
|
||||||
$p = $this->getNewItem("new-$className-$parent".$suffix, false);
|
$p = $this->getNewItem("new-$className-$parent".$suffix, false);
|
||||||
|
$p->Lang = $_REQUEST['Lang'];
|
||||||
$p->write();
|
$p->write();
|
||||||
|
|
||||||
return $this->returnItemToUser($p);
|
return $this->returnItemToUser($p);
|
||||||
@ -497,18 +497,6 @@ JS;
|
|||||||
public function getNewItem($id, $setID = true) {
|
public function getNewItem($id, $setID = true) {
|
||||||
list($dummy, $className, $parentID, $suffix) = array_pad(explode('-',$id),4,null);
|
list($dummy, $className, $parentID, $suffix) = array_pad(explode('-',$id),4,null);
|
||||||
|
|
||||||
if(Translatable::is_enabled()) {
|
|
||||||
if (Translatable::default_lang() != $this->Lang) {
|
|
||||||
Translatable::set_reading_lang(Translatable::default_lang());
|
|
||||||
$originalItem = DataObject::get_by_id($className,$suffix);
|
|
||||||
Translatable::set_reading_lang($this->Lang);
|
|
||||||
$translation = $originalItem->getTranslation($this->Lang);
|
|
||||||
if(!$translation) $translation = $originalItem->createTranslation($this->Lang);
|
|
||||||
if($setID) $translation->ID = $id;
|
|
||||||
return $translation;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$newItem = new $className();
|
$newItem = new $className();
|
||||||
|
|
||||||
if( !$suffix ) {
|
if( !$suffix ) {
|
||||||
@ -1172,14 +1160,18 @@ JS;
|
|||||||
foreach( $this->PageTypes() as $arrayData ) {
|
foreach( $this->PageTypes() as $arrayData ) {
|
||||||
$pageTypes[$arrayData->getField('ClassName')] = $arrayData->getField('AddAction');
|
$pageTypes[$arrayData->getField('ClassName')] = $arrayData->getField('AddAction');
|
||||||
}
|
}
|
||||||
|
|
||||||
return new Form($this, "AddPageOptionsForm", new FieldSet(
|
$fields = new FieldSet(
|
||||||
new HiddenField("ParentID"),
|
new HiddenField("ParentID"),
|
||||||
|
new HiddenField("Lang", 'Lang', Translatable::current_lang()),
|
||||||
new DropdownField("PageType", "", $pageTypes, 'Page')
|
new DropdownField("PageType", "", $pageTypes, 'Page')
|
||||||
),
|
);
|
||||||
new FieldSet(
|
|
||||||
|
$actions = new FieldSet(
|
||||||
new FormAction("addpage", _t('CMSMain.GO',"Go"))
|
new FormAction("addpage", _t('CMSMain.GO',"Go"))
|
||||||
));
|
);
|
||||||
|
|
||||||
|
return new Form($this, "AddPageOptionsForm", $fields, $actions);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1311,94 +1303,25 @@ JS;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Switch the cms language and reload the site tree
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
function switchlanguage($lang, $donotcreate = null) {
|
|
||||||
//is it's a clean switch (to an existing language deselect the current page)
|
|
||||||
if (is_string($lang)) $dontunloadPage = true;
|
|
||||||
$lang = (is_string($lang) ? $lang : urldecode($this->urlParams['ID']));
|
|
||||||
if ($lang != Translatable::default_lang()) {
|
|
||||||
Translatable::set_reading_lang(Translatable::default_lang());
|
|
||||||
$tree_class = $this->stat('tree_class');
|
|
||||||
$obj = new $tree_class;
|
|
||||||
$allIDs = $obj->getDescendantIDList();
|
|
||||||
$allChildren = $obj->AllChildren();
|
|
||||||
$classesMap = $allChildren->map('ID','ClassName');
|
|
||||||
$titlesMap = $allChildren->map();
|
|
||||||
Translatable::set_reading_lang($lang);
|
|
||||||
$obj = new $tree_class;
|
|
||||||
$languageIDs = $obj->getDescendantIDList();
|
|
||||||
$notcreatedlist = array_diff($allIDs,$languageIDs);
|
|
||||||
FormResponse::add("$('addpage').getElementsByTagName('button')[0].disabled=true;");
|
|
||||||
//FormResponse::add("$('Form_AddPageOptionsForm').getElementsByTagName('div')[1].getElementsByTagName('input')[0].disabled=true;");
|
|
||||||
FormResponse::add("$('Translating_Message').innerHTML = 'Translating mode - ".i18n::get_language_name($lang)."';");
|
|
||||||
FormResponse::add("Element.removeClassName('Translating_Message','nonTranslating');");
|
|
||||||
} else {
|
|
||||||
Translatable::set_reading_lang($lang);
|
|
||||||
FormResponse::add("$('addpage').getElementsByTagName('button')[0].disabled=false;");
|
|
||||||
//FormResponse::add("$('Form_AddPageOptionsForm').getElementsByTagName('div')[1].getElementsByTagName('input')[0].disabled=false;");
|
|
||||||
FormResponse::add("Element.addClassName('Translating_Message','nonTranslating');");
|
|
||||||
}
|
|
||||||
$obj = singleton($this->stat('tree_class'));
|
|
||||||
$obj->markPartialTree();
|
|
||||||
$siteTree = $obj->getChildrenAsUL("", '
|
|
||||||
"<li id=\"record-$child->ID\" class=\"" . $child->CMSTreeClasses($extraArg) . "\">" .
|
|
||||||
"<a href=\"" . Director::link(substr($extraArg->Link(),0,-1), "show", $child->ID) . "\" " . (($child->canEdit() || $child->canAddChildren()) ? "" : "class=\"disabled\"") . " title=\"' . _t('LeftAndMain.PAGETYPE') . '".$child->class."\" >" .
|
|
||||||
(Convert::raw2js($child->TreeTitle())) .
|
|
||||||
"</a>"
|
|
||||||
'
|
|
||||||
,$this, true);
|
|
||||||
|
|
||||||
$rootLink = $this->Link() . '0';
|
|
||||||
$siteTree = "<li id=\"record-0\" class=\"Root nodelete\"><a href=\"$rootLink\">" .
|
|
||||||
_t('LeftAndMain.SITECONTENT') . "</a>"
|
|
||||||
. $siteTree . "</li></ul>";
|
|
||||||
FormResponse::add("$('sitetree').innerHTML ='". ereg_replace("[\n]","\\\n",$siteTree) ."';");
|
|
||||||
FormResponse::add("SiteTree.applyTo('#sitetree');");
|
|
||||||
if (isset($notcreatedlist)) {
|
|
||||||
foreach ($notcreatedlist as $notcreated) {
|
|
||||||
if ($notcreated == $donotcreate) continue;
|
|
||||||
$id = "new-{$classesMap[$notcreated]}-0-$notcreated";
|
|
||||||
Session::set($id . '_originalLangID',$notcreated);
|
|
||||||
$treeTitle = Convert::raw2js($titlesMap[$notcreated]);
|
|
||||||
$response = <<<JS
|
|
||||||
var tree = $('sitetree');
|
|
||||||
var newNode = tree.createTreeNode("$id", "$treeTitle", "$classesMap[$notcreated] (untranslated)");
|
|
||||||
addClass(newNode, 'untranslated');
|
|
||||||
node = tree.getTreeNodeByIdx(0);
|
|
||||||
node.open();
|
|
||||||
node.appendTreeNode(newNode);
|
|
||||||
JS;
|
|
||||||
FormResponse::add($response);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!isset($dontunloadPage)) FormResponse::add("node = $('sitetree').getTreeNodeByIdx(0); node.selectTreeNode();");
|
|
||||||
return FormResponse::respond();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new translation from an existing item, switch to this language and reload the tree.
|
* Create a new translation from an existing item, switch to this language and reload the tree.
|
||||||
*/
|
*/
|
||||||
function createtranslation () {
|
function createtranslation () {
|
||||||
if(!Director::is_ajax()) {
|
$langCode = Convert::raw2sql($_REQUEST['newlang']);
|
||||||
Director::redirectBack();
|
$originalLangID = (int)$_REQUEST['ID'];
|
||||||
return;
|
|
||||||
}
|
|
||||||
$langCode = $_REQUEST['newlang'];
|
|
||||||
$originalLangID = $_REQUEST['ID'];
|
|
||||||
|
|
||||||
$record = $this->getRecord($originalLangID);
|
$record = $this->getRecord($originalLangID);
|
||||||
|
|
||||||
$this->Lang = $langCode;
|
$this->Lang = $langCode;
|
||||||
Translatable::set_reading_lang($langCode);
|
Translatable::set_reading_lang($langCode);
|
||||||
|
|
||||||
// creating a record in-memory, which means setting the $Lang property
|
// Create a new record in the database - this is different
|
||||||
// will have no effect as the record is loaded through another javascript
|
// to the usual "create page" pattern of storing the record
|
||||||
// call and CMSMain->getitem(). The CMS submits the currently selected language
|
// in-memory until a "save" is performed by the user, mainly
|
||||||
// through javascript, which will cause $Lang to be written to the database.
|
// to simplify things a bit.
|
||||||
// @todo Explicitly set $Lang property for in-memory object so we don't need javascript modifying GET-calls to save the new object
|
// @todo Allow in-memory creation of translations that don't persist in the database before the user requests it
|
||||||
$translatedRecord = $record->createTranslation($langCode);
|
$translatedRecord = $record->createTranslation($langCode);
|
||||||
|
|
||||||
$url = sprintf(
|
$url = sprintf(
|
||||||
@ -1439,16 +1362,35 @@ JS;
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return a dropdown with existing languages
|
* Returns all languages with languages already used appearing first.
|
||||||
*/
|
* Called by the SSViewer when rendering the template.
|
||||||
function LangSelector() {
|
*/
|
||||||
$langs = Translatable::get_existing_content_languages('SiteTree');
|
function LangSelector() {
|
||||||
|
$member = Member::currentUser(); //check to see if the current user can switch langs or not
|
||||||
return new DropdownField("LangSelector","Language",$langs,Translatable::current_lang());
|
if(Permission::checkMember($member, 'VIEW_LANGS')) {
|
||||||
}
|
$allKey = _t('Form.LANGAOTHER', "Other languages");
|
||||||
|
$all = i18n::get_common_languages(); //all languages
|
||||||
|
$used = Translatable::get_existing_content_languages(); //languages currently in use
|
||||||
|
if( $used && count($used) ) {
|
||||||
|
foreach($used as $index => $code) {
|
||||||
|
if(!$code) continue;
|
||||||
|
$available[$index] = $all[$index];
|
||||||
|
unset($all[$index]);
|
||||||
|
}
|
||||||
|
$langs[ _t('Form.LANGAVAIL', "Available languages") ] = (isset( $available )) ? $available : array();
|
||||||
|
}
|
||||||
|
$langs[ _t('Form.LANGAOTHER', "Other languages") ] = $all;
|
||||||
|
return new GroupedDropdownField('LangSelector', 'Language', $langs, Translatable::current_lang());
|
||||||
|
}
|
||||||
|
|
||||||
|
//user doesn't have permission to switch langs so just show a string displaying current language
|
||||||
|
return i18n::get_language_name( Translatable::current_lang() );
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determine if there are more than one languages in our site tree
|
* Determine if there are more than one languages in our site tree.
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
*/
|
*/
|
||||||
function MultipleLanguages() {
|
function MultipleLanguages() {
|
||||||
$langs = Translatable::get_existing_content_languages('SiteTree');
|
$langs = Translatable::get_existing_content_languages('SiteTree');
|
||||||
@ -1456,6 +1398,13 @@ JS;
|
|||||||
return (count($langs) > 1);
|
return (count($langs) > 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
function IsTranslatableEnabled() {
|
||||||
|
return Translatable::is_enabled();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the name of the language that we are translating in
|
* Get the name of the language that we are translating in
|
||||||
*/
|
*/
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
<div id="sitetree_holder">
|
<div id="sitetree_holder">
|
||||||
<div id="TreeTools">
|
<div id="TreeTools">
|
||||||
<ul id="TreeActions">
|
<ul id="TreeActions">
|
||||||
<li class="action" id="addpage"><button<% if EditingLang %> disabled="disabled" class="disabled"<% end_if %>><% _t('CREATE','Create',PR_HIGH) %></button></li>
|
<li class="action" id="addpage"><button><% _t('CREATE','Create',PR_HIGH) %></button></li>
|
||||||
<li class="action" id="search"><button><% _t('SEARCH','Search',PR_HIGH) %></button></li>
|
<li class="action" id="search"><button><% _t('SEARCH','Search',PR_HIGH) %></button></li>
|
||||||
<li class="action" id="batchactions"><button><% _t('BATCHACTIONS','Batch Actions',PR_HIGH) %></button></li>
|
<li class="action" id="batchactions"><button><% _t('BATCHACTIONS','Batch Actions',PR_HIGH) %></button></li>
|
||||||
</ul>
|
</ul>
|
||||||
@ -64,7 +64,7 @@
|
|||||||
<div id="SortItems">
|
<div id="SortItems">
|
||||||
<input type="checkbox" id="sortitems" /> <label for="sortitems"><% _t('ENABLEDRAGGING','Allow drag & drop reordering', PR_HIGH) %></label>
|
<input type="checkbox" id="sortitems" /> <label for="sortitems"><% _t('ENABLEDRAGGING','Allow drag & drop reordering', PR_HIGH) %></label>
|
||||||
</div>
|
</div>
|
||||||
<% if MultipleLanguages %>
|
<% if IsTranslatableEnabled %>
|
||||||
<div id="LangSelector_holder">
|
<div id="LangSelector_holder">
|
||||||
Language: $LangSelector
|
Language: $LangSelector
|
||||||
</div>
|
</div>
|
||||||
|
Loading…
Reference in New Issue
Block a user