Merge remote-tracking branch 'origin/3.0' into 3.1

Conflicts:
	javascript/DateField.js
	model/DataQuery.php
	model/Versioned.php
	tests/forms/RequirementsTest.php
	tests/model/DataObjectLazyLoadingTest.php
	view/Requirements.php
This commit is contained in:
Ingo Schommer 2013-04-09 14:02:16 +02:00
commit 9856fcef21
14 changed files with 45 additions and 164 deletions

View File

@ -94,7 +94,6 @@ $locales = array(
'it_IT' => 'Italian (Italy)', 'it_IT' => 'Italian (Italy)',
'ja_JP' => 'Japanese (Japan)', 'ja_JP' => 'Japanese (Japan)',
'km_KH' => 'Khmer (Cambodia)', 'km_KH' => 'Khmer (Cambodia)',
'lc_XX' => 'LOLCAT',
'lv_LV' => 'Latvian (Latvia)', 'lv_LV' => 'Latvian (Latvia)',
'lt_LT' => 'Lithuanian (Lithuania)', 'lt_LT' => 'Lithuanian (Lithuania)',
'ms_MY' => 'Malay (Malaysia)', 'ms_MY' => 'Malay (Malaysia)',
@ -1316,7 +1315,14 @@ TEXT;
<requestFiltering> <requestFiltering>
<hiddenSegments applyToWebDAV="false"> <hiddenSegments applyToWebDAV="false">
<add segment="silverstripe-cache" /> <add segment="silverstripe-cache" />
<add segment="vendor" />
<add segment="composer.json" />
<add segment="composer.lock" />
</hiddenSegments> </hiddenSegments>
<fileExtensions allowUnlisted="true" >
<add fileExtension=".ss" allowed="false"/>
<add fileExtension=".yml" allowed="false"/>
</fileExtensions>
</requestFiltering> </requestFiltering>
</security> </security>
<rewrite> <rewrite>

View File

@ -14,6 +14,11 @@ We provide a GUI for translations through [getlocalization.com](http://getlocali
For all modules listed there, we automatically import new master strings as they get committed to the various codebases, so you're always translating on the latest and greatest version. For all modules listed there, we automatically import new master strings as they get committed to the various codebases, so you're always translating on the latest and greatest version.
Since getlocalization doesn't allow you to download your own work,
we've created a simple downloader for this purpose at [http://translate.silverstripe.org/download.php](http://translate.silverstripe.org/download.php)
([sample download of de.yml](http://translate.silverstripe.org/download.php?project=silverstripe_cms&locale=de)).
Requests count against our own API user on getlocalization.com, so please use the script responsibly.
## FAQ ## FAQ
### How do I translate a module not listed on getlocalization? ### How do I translate a module not listed on getlocalization?

View File

@ -25,7 +25,7 @@ when the form is submitted.
new RequiredFields(array('MyRequiredField')) new RequiredFields(array('MyRequiredField'))
); );
// Optional: Add a CSS class for custom styling // Optional: Add a CSS class for custom styling
$form->dataFieldByName('MyRequiredField)->addExtraClass('required'); $form->dataFieldByName('MyRequiredField')->addExtraClass('required');
return $form; return $form;
} }

View File

@ -92,13 +92,13 @@ class GridFieldFilterHeader implements GridField_HTMLProvider, GridField_DataMan
} }
$filterArguments = $state->Columns->toArray(); $filterArguments = $state->Columns->toArray();
$dataListClone = null; $dataListClone = clone($dataList);
foreach($filterArguments as $columnName => $value ) { foreach($filterArguments as $columnName => $value ) {
if($dataList->canFilterBy($columnName) && $value) { if($dataList->canFilterBy($columnName) && $value) {
$dataListClone = $dataList->filter($columnName.':PartialMatch', $value); $dataListClone = $dataListClone->filter($columnName.':PartialMatch', $value);
} }
} }
return ($dataListClone) ? $dataListClone : $dataList; return $dataListClone;
} }
public function getHTMLFragments($gridField) { public function getHTMLFragments($gridField) {

View File

@ -170,7 +170,7 @@ class i18nTextCollector extends Object {
$fileList = $this->getFilesRecursive("$this->basePath/$module/code"); $fileList = $this->getFilesRecursive("$this->basePath/$module/code");
} else if($module == FRAMEWORK_DIR || substr($module, 0, 7) == 'themes/') { } else if($module == FRAMEWORK_DIR || substr($module, 0, 7) == 'themes/') {
// framework doesn't have the usual module structure, so we'll scan all subfolders // framework doesn't have the usual module structure, so we'll scan all subfolders
$fileList = $this->getFilesRecursive("$this->basePath/$module"); $fileList = $this->getFilesRecursive("$this->basePath/$module", null, null, '/\/(tests|dev)$/');
} }
foreach($fileList as $filePath) { foreach($fileList as $filePath) {
// exclude ss-templates, they're scanned separately // exclude ss-templates, they're scanned separately
@ -183,8 +183,7 @@ class i18nTextCollector extends Object {
// Search for calls in template files if these exists // Search for calls in template files if these exists
if(is_dir("$this->basePath/$module/")) { if(is_dir("$this->basePath/$module/")) {
$dummy = array(); $fileList = $this->getFilesRecursive("$this->basePath/$module/", null, 'ss');
$fileList = $this->getFilesRecursive("$this->basePath/$module/", $dummy, 'ss');
foreach($fileList as $index => $filePath) { foreach($fileList as $index => $filePath) {
$content = file_get_contents($filePath); $content = file_get_contents($filePath);
// templates use their filename as a namespace // templates use their filename as a namespace
@ -401,25 +400,30 @@ class i18nTextCollector extends Object {
* @param string $folder base directory to scan (will scan recursively) * @param string $folder base directory to scan (will scan recursively)
* @param array $fileList Array to which potential files will be appended * @param array $fileList Array to which potential files will be appended
* @param string $type Optional, "php" or "ss" * @param string $type Optional, "php" or "ss"
* @param string $folderExclude Regular expression matching folder names to exclude
* @return array $fileList An array of files * @return array $fileList An array of files
*/ */
protected function getFilesRecursive($folder, &$fileList = null, $type = null) { protected function getFilesRecursive($folder, $fileList = null, $type = null, $folderExclude = null) {
if(!$folderExclude) $folderExclude = '/\/(tests)$/';
if(!$fileList) $fileList = array(); if(!$fileList) $fileList = array();
$items = scandir($folder); $items = scandir($folder);
$isValidFolder = ( $isValidFolder = (
!in_array('_manifest_exclude', $items) !in_array('_manifest_exclude', $items)
&& !preg_match('/\/tests$/', $folder) && !preg_match($folderExclude, $folder)
); );
if($items && $isValidFolder) foreach($items as $item) { if($items && $isValidFolder) foreach($items as $item) {
if(substr($item,0,1) == '.') continue; if(substr($item,0,1) == '.') continue;
if(substr($item,-4) == '.php' && (!$type || $type == 'php')) { if(substr($item,-4) == '.php' && (!$type || $type == 'php')) {
$fileList[substr($item,0,-4)] = "$folder/$item"; $fileList[substr($item,0,-4)] = "$folder/$item";
} } else if(substr($item,-3) == '.ss' && (!$type || $type == 'ss')) {
else if(substr($item,-3) == '.ss' && (!$type || $type == 'ss')) {
$fileList[$item] = "$folder/$item"; $fileList[$item] = "$folder/$item";
} else if(is_dir("$folder/$item")) {
$fileList = array_merge(
$fileList,
$this->getFilesRecursive("$folder/$item", $fileList, $type, $folderExclude)
);
} }
else if(is_dir("$folder/$item")) $this->getFilesRecursive("$folder/$item", $fileList, $type);
} }
return $fileList; return $fileList;
} }

View File

@ -26,7 +26,7 @@
} }
}); });
$('.field.date input.text,.fieldholder-small input.text.date').live('click', function() { $(document).on("click", "field.date input.text,.fieldholder-small input.text.date", function() {
$(this).ssDatepicker(); $(this).ssDatepicker();
if($(this).data('datepicker')) { if($(this).data('datepicker')) {

View File

@ -488,7 +488,8 @@ ss.editorWrappers['default'] = ss.editorWrappers.tinyMCE;
/* NOP */ /* NOP */
}, },
resetFields: function() { resetFields: function() {
/* NOP */ // Flush the tree drop down fields, as their content might get changed in other parts of the CMS, ie in Files and images
this.find('.tree-holder').empty();
} }
}); });

View File

@ -1,134 +0,0 @@
lc_XX:
BasicAuth:
ENTERINFO: "PLZ ENTR UR USERNAYM N A PASWORD."
ERRORNOTADMIN: "DAT USR IZ NOT AN ADMINISTRATOR."
ERRORNOTREC: "DAT USERNAYM / PASWORD ISNT RECOGNISD SUZ 2 HEAR"
ChangePasswordEmail.ss:
CHANGEPASSWORDTEXT1: "U CHANGD UR PASWORD 4"
CHANGEPASSWORDTEXT2: "U CAN NAO USE TEH FOLLOWIN CREDENSHALS 2 LOG IN:"
HELLO: "OHI! HOWRU2DAI?"
ComplexTableField.ss:
ADDITEM: "ADD"
SORTASC: "SORT ASCENDIN"
SORTDESC: "SORT DESCENDIN"
ComplexTableField_popup.ss:
NEXT: "NEXT (GOGOGO)"
PREVIOUS: "PREVIOUZ"
Date:
DAY: "DAI"
DAYS: "DAIZ"
HOUR: "HOUR"
HOURS: "HOURZ"
MIN: "MIN"
MINS: "MINZ"
MONTH: "MONTH"
MONTHS: "MONTHX"
SEC: "SEC"
SECS: "SECZ"
YEAR: "YEAR"
YEARS: "YEARZ"
DateField:
DropdownField:
CHOOSE: "(pik)"
EmailField:
VALIDATION: "PLZ ENTR AN EMAIL ADDRES."
ForgotPasswordEmail.ss:
HELLO: "OHI! HOWRU2DAI?"
Form:
FIELDISREQUIRED: "%s IS REQUIRED"
VALIDATIONCREDITNUMBER: "PLZ ENSURE U HAS ENTERD TEH %s CREDIT CARD NUMBR RITE CUZ WE NEED UR MONEY RITE NOW."
VALIDATIONFAILED: "VALIDASHUN FAILD1!!1!!!!!!1 WAT NOW?"
VALIDATIONNOTUNIQUE: "TEH VALUE ENTERD R NOT UNIQUE"
VALIDATIONPASSWORDSDONTMATCH: "SRY BOSS, PASWORDZ DOAN MATCH"
VALIDATIONPASSWORDSNOTEMPTY: "PASWORDZ CANT BE EMPTY DOOD"
VALIDATIONSTRONGPASSWORD: "PASWORDZ MUST HAS AT LEAST WAN DIGIT AN WAN ALFANUMERIC CHARACTR."
VALIDCURRENCY: "PLZ ENTR VALID CURRENCY. CUD U?"
HtmlEditorField:
BUTTONINSERTLINK: "INSERT LINK"
BUTTONREMOVELINK: "REMOOV LINK"
CSSCLASS: "ALIGNMENT / STYLE"
CSSCLASSCENTER: "SENTERD, ON ITZ OWN."
CSSCLASSLEFT: "ON TEH LEFT, WIF TEXT WRAPPIN AROUND."
CSSCLASSRIGHT: "ON TEH RITE, WIF TEXT WRAPPIN AROUND."
EMAIL: "EMAIL ADDRESZ"
FILE: "FIEL"
FOLDER: "TEH FOLDER"
IMAGE: "INSERT PIKSHUR"
IMAGEDIMENSIONS: "DIMENSHUNZ"
IMAGEHEIGHTPX: "HEIGHT"
IMAGEWIDTHPX: "WIDTH"
LINK: "INSERT/EDIT LINK 4 HIGHLIGHTD TEXT"
LINKDESCR: "LINK DESCRIPSHUN"
LINKEMAIL: "EMAIL ADDRESZ"
LINKEXTERNAL: "ANODER WEBSIET"
LINKFILE: "DOWNLOAD FIEL"
LINKINTERNAL: "PAEG ON DIS SIET"
LINKOPENNEWWIN: "OPEN LINK IN NEW WINDOW?"
LINKTO: "LINK 2"
PAGE: "PAEG"
URL: "URL N STUFF"
Image_iframe.ss:
TITLE: "PIKSHUR UPLOADIN IFRAME"
Member:
ADDRESS: "ADDRESZ"
BUTTONCHANGEPASSWORD: "CHANGE PASWORD"
BUTTONLOGIN: "LOG IN"
BUTTONLOGINOTHER: "LOG IN AS SOMEONE ELSE"
BUTTONLOSTPASSWORD: "I HAS LOST MAH PASWORD"
CONFIRMNEWPASSWORD: "CUD U CONFIRM NEW PASWORD PLZ"
CONFIRMPASSWORD: "CONFIRM PASWORD"
CONTACTINFO: "SUM CONTACT STUFF"
EMAIL: "EMAIL"
EMAILSIGNUPINTRO1: "TEH LOLCAT SEZ OMG BIGTHX 2 U N U R A NEW MEMBR 4 NOW N UR DETAILZ R LISTD BELOW FOR THAT IF U WANTZ THEM IN SUM TIME"
EMAILSIGNUPINTRO2: "U CAN LOGIN TO TEH WEBSITE USINS TEH CREDENTIALZ LISTED BELOW"
EMAILSIGNUPSUBJECT: "TEH LOLCAT TANX U 4 SIGNINS UP"
ERRORNEWPASSWORD: "UR HAS ENTERD UR NEW PASWORD DIFFERENTLY, PLZ TRY AGAIN, K?"
ERRORPASSWORDNOTMATCH: "UR CURRENT PASWORD DOEZ NOT MATCH, PLZ TRY AGAIN, K?"
ERRORWRONGCRED: "DAT IS NOT SEEMZ 2 BE TEH RITE E-MAIL ADDRES OR PASWORD. PLZ TRY AGAIN, K?"
FIRSTNAME: "FURST NAYM"
GREETING: "WELKUM"
INTERFACELANG: "INTRFACELANGUEEG"
LOGGEDINAS: "URE LOGGD IN AS %s."
MOBILE: "MOBAIL"
NAME: "NAYM"
NEWPASSWORD: "NEW PASWORD"
PASSWORD: "PASWORD"
PHONE: "FONE"
REMEMBERME: "REMEMBR ME NEXT TIME, K?"
SUBJECTPASSWORDCHANGED: "UR PASWORD HAS BEEN CHANGD"
SUBJECTPASSWORDRESET: "YORE PASWORD RESET LINK"
SURNAME: "SHURNAYM"
VALIDATIONMEMBEREXISTS: "THAR ALREADY EXISTZ MEMBR WIF DIS EMAILZ"
WELCOMEBACK: "WELCUM BACK, %s"
YOUROLDPASSWORD: "UR OLD PASWORD"
MemberAuthenticator:
TITLE: "E-MAIL N PASWORD"
NumericField:
VALIDATION: "'%s' IZ NOT NUMBR, ONLY NUMBERS CAN BE ACCEPTD 4 DIS FIELD"
PhoneNumberField:
VALIDATION: "PLZ ENTR VALID FONE NUMBR WE WUNT DISTURB 2 MUCH JUS A BIT"
Security:
ALREADYLOGGEDIN: "U SHALL NOT PASS!! IF U HAS ANOTHR AKOWNT DAT CAN ACCES DAT PAEG, U CAN LOG IN BELOW."
BUTTONSEND: "SEND ME TEH PASWORD RESETZ LINK"
CHANGEPASSWORDBELOW: "U CAN CHANGE UR PASWORD BELOW"
CHANGEPASSWORDHEADER: "CHANGE UR PASWORD"
ENTERNEWPASSWORD: "PLEEZ ENTR NEW PASSWORD. KTHX."
ERRORPASSWORDPERMISSION: "U MUST BE LOGGD IN IN ORDR 2 CHANGE UR PASWORD!"
LOGGEDOUT: "U HAS BEEN LOGGD OUT. IF U WUD LIEK 2 LOG IN AGAIN, ENTR UR CREDENTIALS BELOW."
NOTEPAGESECURED: "TEH PAGE IZ SECURD. ENTR UR CREDENSHALS BELOW AN WE WILL SEND U RITE ALONG."
NOTERESETPASSWORD: "ENTR UR E-MAIL ADDRES AN WE R GONA SEND U LINK WIF WHICH U CAN RESET UR PASWORD"
PASSWORDSENTHEADER: "I R SENT TEH PASWORD RESET LINK TO '%s'"
PASSWORDSENTTEXT: "THXALOT! I R SENT TEH PASWORD RESET LINK TO '%s'"
SimpleImageField:
NOUPLOAD: "DEREZ NO PIKSHUR UPLOADED"
SiteTree:
TABMAIN: "MAIN"
TableField:
ISREQUIRED: "IN %s '%s' IS KINDA REQUIRED"
TableField.ss:
ToggleCompositeField.ss:
HIDE: "HAYD"
SHOW: "SHOW"
ToggleField:
LESS: "lesz"
MORE: "mur"

View File

@ -1244,7 +1244,7 @@ class Versioned_Version extends ViewableData {
else $component = $component->relation($relation); else $component = $component->relation($relation);
} else { } else {
$component = $component->$relation(); $component = $component->$relation();
} }
} }
} }

View File

@ -148,8 +148,7 @@ class Date extends DBField {
*/ */
public function FormatI18N($formattingString) { public function FormatI18N($formattingString) {
if($this->value) { if($this->value) {
$fecfrm = strftime($formattingString, strtotime($this->value)); return strftime($formattingString, strtotime($this->value));
return utf8_encode($fecfrm);
} }
} }

View File

@ -163,7 +163,7 @@ class HTMLText extends Text {
} }
// If it's got a content tag // If it's got a content tag
if(preg_match('/<(img|embed|object|iframe)[^>]*>/i', $this->value)) { if(preg_match('/<(img|embed|object|iframe|meta|source)[^>]*>/i', $this->value)) {
return true; return true;
} }

View File

@ -243,7 +243,7 @@ class DirectorTest extends SapphireTest {
} }
public function testForceSSLAlternateDomain() { public function testForceSSLAlternateDomain() {
Director::setBaseURL('/'); Config::inst()->update('Director', 'alternate_base_url', '/');
$_SERVER['REQUEST_URI'] = Director::baseURL() . 'admin'; $_SERVER['REQUEST_URI'] = Director::baseURL() . 'admin';
$output = Director::forceSSL(array('/^admin/'), 'secure.mysite.com'); $output = Director::forceSSL(array('/^admin/'), 'secure.mysite.com');
$this->assertEquals($output, 'https://secure.mysite.com/admin'); $this->assertEquals($output, 'https://secure.mysite.com/admin');