Merge branch '4.1' into 4.2

This commit is contained in:
Robbie Averill 2019-02-19 08:37:07 +07:00
commit 79e44b42fa
25 changed files with 522 additions and 88 deletions

View File

@ -1368,3 +1368,130 @@ warnings:
'THIRDPARTY_DIR':
message: 'Path constants have been deprecated. Use the Requirements and ModuleResourceLoader APIs'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#module-paths'
visibilities:
'SilverStripe\ORM\DataObject::db':
visibility: private
'SilverStripe\ORM\DataObject::singular_name':
visibility: private
'SilverStripe\ORM\DataObject::plural_name':
visibility: private
'SilverStripe\ORM\DataObject::api_access':
visibility: private
'SilverStripe\ORM\DataObject::default_classname':
visibility: private
'SilverStripe\ORM\DataObject->destroyed':
visibility: public
'SilverStripe\ORM\DataObject->record':
visibility: protected
'SilverStripe\ORM\DataObject->joinRecord':
visibility: protected
'SilverStripe\ORM\DataObject->changed':
visibility: private
'SilverStripe\ORM\DataObject->changeForced':
visibility: private
'SilverStripe\ORM\DataObject->original':
visibility: protected
'SilverStripe\ORM\DataObject->brokenOnDelete':
visibility: protected
'SilverStripe\ORM\DataObject->brokenOnWrite':
visibility: protected
'SilverStripe\ORM\DataObject::validation_enabled':
visibility: private
'SilverStripe\ORM\DataObject::_cache_get_one':
visibility: protected
'SilverStripe\ORM\DataObject::_cache_field_labels':
visibility: protected
'SilverStripe\ORM\DataObject::fixed_fields':
visibility: private
'SilverStripe\ORM\DataObject::table_name':
visibility: private
'SilverStripe\ORM\DataObject->components':
visibility: protected
'SilverStripe\ORM\DataObject->unsavedRelations':
visibility: protected
'SilverStripe\ORM\DataObject::cascade_deletes':
visibility: private
'SilverStripe\ORM\DataObject::cascade_duplicates':
visibility: private
'SilverStripe\ORM\DataObject::sourceQueryParams':
visibility: private
'SilverStripe\ORM\DataObject::subclass_access':
visibility: private
'SilverStripe\ORM\DataObject::casting':
visibility: private
'SilverStripe\ORM\DataObject::create_table_options':
visibility: private
'SilverStripe\ORM\DataObject::indexes':
visibility: private
'SilverStripe\ORM\DataObject::defaults':
visibility: private
'SilverStripe\ORM\DataObject::default_records':
visibility: private
'SilverStripe\ORM\DataObject::has_one':
visibility: private
'SilverStripe\ORM\DataObject::belongs_to':
visibility: private
'SilverStripe\ORM\DataObject::has_many':
visibility: private
'SilverStripe\ORM\DataObject::many_many':
visibility: private
'SilverStripe\ORM\DataObject::many_many_extraFields':
visibility: private
'SilverStripe\ORM\DataObject::belongs_many_many':
visibility: private
'SilverStripe\ORM\DataObject::default_sort':
visibility: private
'SilverStripe\ORM\DataObject::searchable_fields':
visibility: private
'SilverStripe\ORM\DataObject::field_labels':
visibility: private
'SilverStripe\ORM\DataObject::summary_fields':
visibility: private
'SilverStripe\Control\Director::rules':
visibility: private
'SilverStripe\Control\Director::current_page':
visibility: private
'SilverStripe\Control\Director::alternate_base_folder':
visibility: private
'SilverStripe\Control\Director::alternate_public_dir':
visibility: private
'SilverStripe\Control\Director::default_base_url':
visibility: private
'SilverStripe\Forms\GridField\GridFieldPaginator::default_items_per_page':
visibility: private
'SilverStripe\View\SSViewer::themes':
visibility: private
'SilverStripe\View\SSViewer::current_themes':
visibility: protected
'SilverStripe\View\SSViewer::theme':
visibility: private
'SilverStripe\View\SSViewer::theme_enabled':
visibility: private
'SilverStripe\View\SSViewer::global_key':
visibility: private
'SilverStripe\View\SSViewer::source_file_comments':
visibility: private
'SilverStripe\View\SSViewer::rewrite_hash_links':
visibility: private
'SilverStripe\View\SSViewer::current_rewrite_hash_links':
visibility: protected
'SilverStripe\View\SSViewer::rewriteHashlinks':
visibility: protected
'SilverStripe\View\SSViewer::template_cache_flushed':
visibility: private
'SilverStripe\View\SSViewer::cacheblock_cache_flushed':
visibility: private
'SilverStripe\View\SSViewer::topLevel':
visibility: protected
'SilverStripe\View\SSViewer::templates':
visibility: protected
'SilverStripe\View\SSViewer::chosen':
visibility: protected
'SilverStripe\View\SSViewer::subTemplates':
visibility: protected
'SilverStripe\View\SSViewer::includeRequirements':
visibility: protected
'SilverStripe\View\SSViewer::parser':
visibility: protected
'SilverStripe\View\SSViewer::partialCacheStore':
visibility: protected

View File

@ -2,24 +2,27 @@ title: Lessons
introduction: The lessons take a step by step look at how to build a SilverStripe application.
* [How to set up a local development environment in SilverStripe](https://vimeo.com/108861537)
* [Lesson 1: Creating your first theme](http://www.silverstripe.org/learn/lessons/creating-your-first-theme)
* [Lesson 2: Migrating static templates into your theme](http://www.silverstripe.org/learn/lessons/migrating-static-templates-into-your-theme)
* [Lesson 3: Adding dynamic content](http://www.silverstripe.org/learn/lessons/adding-dynamic-content)
* [Lesson 4: Working with multiple templates](http://www.silverstripe.org/learn/lessons/working-with-multiple-templates)
* [Lesson 5: The holder/page pattern](http://www.silverstripe.org/learn/lessons/the-holderpage-pattern)
* [Lesson 6: Adding Custom Fields to a Page](http://www.silverstripe.org/learn/lessons/adding-custom-fields-to-a-page)
* [Lesson 7: Working with Files and Images](http://www.silverstripe.org/learn/lessons/working-with-files-and-images)
* [Lesson 8: Introduction to the ORM](http://www.silverstripe.org/learn/lessons/introduction-to-the-orm)
* [Lesson 9: Data Relationships - $has_many](http://www.silverstripe.org/learn/lessons/working-with-data-relationships-has-many)
* [Lesson 10: Introduction to the ORM](http://www.silverstripe.org/learn/lessons/working-with-data-relationships-many-many)
* [Lesson 11: Introduction to frontend forms](http://www.silverstripe.org/learn/lessons/introduction-to-frontend-forms)
* [Lesson 12: Data Extensions and SiteConfig](http://www.silverstripe.org/learn/lessons/data-extensions-and-siteconfig)
* [Lesson 13: Introduction to ModelAdmin](http://www.silverstripe.org/learn/lessons/introduction-to-modeladmin)
* [Lesson 14: Controller Actions/DataObjects as Pages](http://www.silverstripe.org/learn/lessons/controller-actions-dataobjects-as-pages)
* [Lesson 15: Building a Search Form](http://www.silverstripe.org/learn/lessons/building-a-search-form)
* [Lesson 16: Lists and Pagination](http://www.silverstripe.org/learn/lessons/lists-and-pagination)
* [Lesson 17: Ajax Behaviour and Viewable Data](http://www.silverstripe.org/learn/lessons/ajax-behaviour-and-viewabledata)
* [Lesson 18: Dealing with Arbitrary Template Data](http://www.silverstripe.org/learn/lessons/dealing-with-arbitrary-template-data)
* [Lesson 1: Creating your first project](https://www.silverstripe.org/learn/lessons/v4/creating-your-first-project)
* [Lesson 2: Migrating static templates into your theme](https://www.silverstripe.org/learn/lessons/v4/migrating-static-templates-into-your-theme-1)
* [Lesson 3: Adding dynamic content](https://www.silverstripe.org/learn/lessons/v4/adding-dynamic-content-1)
* [Lesson 4: Working with multiple templates](https://www.silverstripe.org/learn/lessons/v4/working-with-multiple-templates-1)
* [Lesson 5: The holder/page pattern](https://www.silverstripe.org/learn/lessons/v4/the-holderpage-pattern-1)
* [Lesson 6: Adding Custom Fields to a Page](https://www.silverstripe.org/learn/lessons/v4/adding-custom-fields-to-a-page-1)
* [Lesson 7: Working with Files and Images](https://www.silverstripe.org/learn/lessons/v4/working-with-files-and-images-1)
* [Lesson 8: Introduction to the ORM](https://www.silverstripe.org/learn/lessons/v4/introduction-to-the-orm-1)
* [Lesson 9: Data Relationships - $has_many](https://www.silverstripe.org/learn/lessons/v4/working-with-data-relationships-has-many-1)
* [Lesson 10: Data Relationships - $many_many](https://www.silverstripe.org/learn/lessons/v4/working-with-data-relationships-many-many-1)
* [Lesson 11: Introduction to frontend forms](https://www.silverstripe.org/learn/lessons/v4/introduction-to-frontend-forms-1)
* [Lesson 12: Data Extensions and SiteConfig](https://www.silverstripe.org/learn/lessons/v4/data-extensions-and-siteconfig-1)
* [Lesson 13: Introduction to ModelAdmin](https://www.silverstripe.org/learn/lessons/v4/introduction-to-modeladmin-1)
* [Lesson 14: Controller Actions/DataObjects as Pages](https://www.silverstripe.org/learn/lessons/v4/controller-actions-dataobjects-as-pages-1)
* [Lesson 15: Building a Search Form](https://www.silverstripe.org/learn/lessons/v4/building-a-search-form-1)
* [Lesson 16: Lists and Pagination](https://www.silverstripe.org/learn/lessons/v4/lists-and-pagination-1)
* [Lesson 17: Ajax Behaviour and Viewable Data](https://www.silverstripe.org/learn/lessons/v4/ajax-behaviour-and-viewabledata-1)
* [Lesson 18: Dealing with Arbitrary Template Data](https://www.silverstripe.org/learn/lessons/v4/dealing-with-arbitrary-template-data-1)
* [Lesson 19: Creating Filtered Views](https://www.silverstripe.org/learn/lessons/v4/creating-filtered-views-1)
* [Lesson 20: Beyond the ORM: Building Custom SQL](https://www.silverstripe.org/learn/lessons/v4/beyond-the-orm-building-custom-sql-1)
* [Lesson 21: Advanced Environment Configuration](https://www.silverstripe.org/learn/lessons/v4/advanced-environment-configuration-1)
## Help: If you get stuck

View File

@ -0,0 +1,21 @@
# 3.6.7
<!--- Changes below this line will be automatically regenerated -->
## Change Log
### Security
* 2019-01-10 [c44f06cdf](https://github.com/silverstripe/silverstripe-framework/commit/c44f06cdf10387a987e4efb096ff06b3bb4495ef) Patch SQL Injection vulnerability when arrays are assigned to DataObject Fields (Aaron Carlino) - See [ss-2018-021](https://www.silverstripe.org/download/security-releases/ss-2018-021)
* 2018-09-26 [598edd913](https://github.com/silverstripe/silverstripe-framework/commit/598edd91341f389d7b919ec1201e03d2aba4d284) Add confirmation token to dev/build (Loz Calver) - See [ss-2018-019](https://www.silverstripe.org/download/security-releases/ss-2018-019)
### Bugfixes
* 2019-01-23 [746c0679a](https://github.com/silverstripe/silverstripe-framework/commit/746c0679ad1d6ceac03d2adf167367f0ca2259cd) Injector may instantiate prototypes as if they're singletons (fixes #8567) (Loz Calver)
* 2018-11-15 [86701b8cd](https://github.com/silverstripe/silverstripe-framework/commit/86701b8cd0cd5f8de813a7c9347e7c8055d878f4) Redirect loop with multiple URL tokens (fixes #8607) (Loz Calver)
* 2018-06-04 [41e601a03](https://github.com/silverstripe/silverstripe-framework/commit/41e601a036307065d9ea2ba8862f67be738d402f) Regression from #8009 (Daniel Hensby)
* 2018-05-29 [1cbf27e0f](https://github.com/silverstripe/silverstripe-framework/commit/1cbf27e0f47c3547914b03193d0f5f77c87ff8d5) PHP 5.3 compat for referencing $this in closure, and make method public for same reason (Robbie Averill)
* 2018-04-17 [af3a9f3ec](https://github.com/silverstripe/silverstripe-framework/commit/af3a9f3ec8a5465f841c5aa8ee1faf40c1b76bf4) Duplicating many_many relationships looses the extra fields (fixes #7973) (UndefinedOffset)
* 2018-03-15 [d17d93f7](https://github.com/silverstripe/silverstripe-cms/commit/d17d93f784a6e01f3d396c55adc623d69a90261a) Remove SearchForm results() function from allowed_actions (Steve Dixon)
* 2018-02-16 [86addea1d](https://github.com/silverstripe/silverstripe-framework/commit/86addea1d2a7b2e28ae8115279ae358bcb46648a) Split HTML manipulation to onadd, so elements are not accidentally duplicated (Christopher Joe)
* 2018-02-13 [c767e472d](https://github.com/silverstripe/silverstripe-framework/commit/c767e472dc494408460ef47c27b8d34475da4ac6) DataObject singleton creation (Jonathon Menz)

View File

@ -0,0 +1,16 @@
# 3.7.3
<!--- Changes below this line will be automatically regenerated -->
## Change Log
### Security
* 2019-01-10 [6bf9542d6](https://github.com/silverstripe/silverstripe-framework/commit/6bf9542d664ac7935691c8055505b7ad8ea26e9a) Patch SQL Injection vulnerability when arrays are assigned to DataObject Fields (Maxime Rainville) - See [ss-2018-021](https://www.silverstripe.org/download/security-releases/ss-2018-021)
### Bugfixes
* 2019-01-30 [8e6e70335](https://github.com/silverstripe/silverstripe-framework/commit/8e6e70335895063c6e6cfd99cfcfb50c6f9c2ad9) Block Manifest of the compatibility class Object and lean on model/fieldtypes/compat/autoload.php (UndefinedOffset)
* 2019-01-23 [746c0679a](https://github.com/silverstripe/silverstripe-framework/commit/746c0679ad1d6ceac03d2adf167367f0ca2259cd) Injector may instantiate prototypes as if they're singletons (fixes #8567) (Loz Calver)
* 2019-01-11 [16a837d6a](https://github.com/silverstripe/silverstripe-framework/commit/16a837d6a093115755cd821c63be1e3be088645b) fix [Warning] on count() with PHP &gt;= 7.2 (lerni)
* 2018-11-15 [86701b8cd](https://github.com/silverstripe/silverstripe-framework/commit/86701b8cd0cd5f8de813a7c9347e7c8055d878f4) Redirect loop with multiple URL tokens (fixes #8607) (Loz Calver)

View File

@ -0,0 +1,24 @@
# 4.0.7
<!--- Changes below this line will be automatically regenerated -->
## Change Log
### Security
* 2018-12-18 [95505db7d](https://github.com/silverstripe/silverstripe-framework/commit/95505db7d666a75f249f65cb1af74dca01d39add) Fix potential SQL vulnerability in non-scalar value hyrdation (Maxime Rainville) - See [ss-2018-021](https://www.silverstripe.org/download/security-releases/ss-2018-021)
### Features and Enhancements
* 2018-11-27 [a8f4f23c6](https://github.com/silverstripe/silverstripe-framework/commit/a8f4f23c660474e965b510ba1bb04bf7a145d5b0) Add visibility updates to `upgrade.yml`. (bergice)
### Bugfixes
* 2019-01-31 [cda9eef](https://github.com/silverstripe/silverstripe-assets/commit/cda9eef992b70fd46377be6d4459260d31ea2215) Fix for issue #212 (Joe Madden)
* 2019-01-29 [f918dcd36](https://github.com/silverstripe/silverstripe-framework/commit/f918dcd36a177adb8abee751d27a809f25a0afab) Escape wildcard characters when matching database name in databaseExists (Guy Marriott)
* 2019-01-28 [dc9d1b9cc](https://github.com/silverstripe/silverstripe-framework/commit/dc9d1b9cc0d3b14929fe2675282980a2750fb4cf) GridFieldPrintButton no longer assumes that children of GridField would implement their own print template (Robbie Averill)
* 2019-01-25 [0797ab7](https://github.com/silverstripe/silverstripe-asset-admin/commit/0797ab7762a4a64f2dc89c754a6bb04216b96fe1) Fix GraphQL FolderTypeCreator::resolveChildrenConnection on PostgreSQL (#901) (Serge Latyntcev)
* 2019-01-24 [d530bc2fb](https://github.com/silverstripe/silverstripe-framework/commit/d530bc2fb6c8c290f1f75f39bc4ec898cc326cf1) fix user feedback when jquery could not be loaded (Benedikt Seidl)
* 2019-01-13 [5c3b95ac](https://github.com/silverstripe/silverstripe-cms/commit/5c3b95ac8977f77e7d95d4da6333ca12b5ef465f) Multibyte URL routing (Ingo Schommer)
* 2019-01-11 [2cb49ea](https://github.com/silverstripe/silverstripe-versioned/commit/2cb49ea79d6babb80289f170dc6102c82f5b0d69) [Warning] on count() with PHP &gt;= 7.2 (Lukas)
* 2018-12-12 [0491ca03c](https://github.com/silverstripe/silverstripe-framework/commit/0491ca03cfcbd81690c54cc00f6234675978ef39) prevent death on urls with querystrings & anchors (mikeyc7m)

View File

@ -0,0 +1,18 @@
# 4.1.5
<!--- Changes below this line will be automatically regenerated -->
## Change Log
### Security
* 2018-12-18 [fd90cf6ce](https://github.com/silverstripe/silverstripe-framework/commit/fd90cf6ceb346142eee6ba620599ab36c2d18cbb) Fix potential SQL vulnerability in non-scalar value hyrdation (Maxime Rainville) - See [ss-2018-021](https://www.silverstripe.org/download/security-releases/ss-2018-021)
s
### Bugfixes
* 2019-01-31 [cda9eef](https://github.com/silverstripe/silverstripe-assets/commit/cda9eef992b70fd46377be6d4459260d31ea2215) Fix for issue #212 (Joe Madden)
* 2019-01-25 [0797ab7](https://github.com/silverstripe/silverstripe-asset-admin/commit/0797ab7762a4a64f2dc89c754a6bb04216b96fe1) Fix GraphQL FolderTypeCreator::resolveChildrenConnection on PostgreSQL (#901) (Serge Latyntcev)
* 2019-01-13 [5c3b95ac](https://github.com/silverstripe/silverstripe-cms/commit/5c3b95ac8977f77e7d95d4da6333ca12b5ef465f) Multibyte URL routing (Ingo Schommer)
* 2019-01-11 [2cb49ea](https://github.com/silverstripe/silverstripe-versioned/commit/2cb49ea79d6babb80289f170dc6102c82f5b0d69) [Warning] on count() with PHP &gt;= 7.2 (Lukas)
* 2018-12-18 [3d841a4](https://github.com/silverstripe/silverstripe-installer/commit/3d841a409c43752a8192afea5ebc48327e2ac3d3) / Behat tests (Serge Latyntcev)
* 2018-12-13 [c4a0d5f0](https://github.com/silverstripe/silverstripe-cms/commit/c4a0d5f0831f0f27022905700a0ffb86cc56aceb) Publish button text merge regression (Aaron Carlino)

View File

@ -84,7 +84,6 @@ da:
RelationSearch: Relationssøgning
ResetFilter: Nulstil
SilverStripe\Forms\GridField\GridFieldDeleteAction:
DELETE_DESCRIPTION: Slet
Delete: Slet
DeletePermissionsFailure: 'Ingen slette rettigheder'
EditPermissionsFailure: 'Ingen rettighed til at fjerne emnet'
@ -96,23 +95,12 @@ da:
DeletePermissionsFailure: 'Ingen slette rettigheder'
Deleted: 'Slet {type} {name}'
Save: Gem
SilverStripe\Forms\GridField\GridFieldEditButton_ss:
EDIT: Rediger
SilverStripe\Forms\GridField\GridFieldGroupDeleteAction:
UnlinkSelfFailure: 'Kan ikke fjerne dig selv fra denne gruppe, du vil miste administrator rettigheder'
SilverStripe\Forms\GridField\GridFieldPaginator:
OF: af
Page: Side
View: Vis
SilverStripe\Forms\GridField\GridFieldVersionedState:
ADDEDTODRAFTHELP: 'Elementet er endnu ikke udgivet'
ADDEDTODRAFTSHORT: Kladde
ARCHIVEDPAGEHELP: 'Elementet er fjernet fra kladde og udgivet version'
ARCHIVEDPAGESHORT: Arkiveret
MODIFIEDONDRAFTHELP: 'Elementet har ikke udgivne ændringer'
MODIFIEDONDRAFTSHORT: Ændret
ONLIVEONLYSHORT: 'Kun på udgivet version'
ONLIVEONLYSHORTHELP: 'Elementet er udgivet, men er slette fra kladde'
SilverStripe\Forms\MoneyField:
FIELDLABELAMOUNT: Beløb
FIELDLABELCURRENCY: Valuta
@ -331,7 +319,4 @@ da:
LOGOUT: 'Log ud'
LOSTPASSWORDHEADER: 'Glemt kodeord'
NOTEPAGESECURED: 'Denne side er beskyttet. Indtast dine loginoplysninger herunder for at få adgang.'
NOTERESETLINKINVALID: '<p>Kodeordets nulstillingslink er ugyldigt eller udløbet.</p><p>Du kan anmode om et nyt link <a href="{link1}">her</a> eller skifte dit kodeord efter du er <a href="{link2}">logget ind</a>.</p>'
NOTERESETPASSWORD: 'Indtast din email adresse, så sender vi dig et link som du kan nulstille dit kodeord med'
PASSWORDSENTHEADER: 'Link til nulstilling af kodeord er sendt til ''{email}'''
PASSWORDSENTTEXT: 'Tak for det! Et link til at nulstille kodeordet er sendt til ''{email}'', forudsat at en konto eksisterer med denne email adresse.'

View File

@ -1,10 +1,35 @@
de:
SilverStripe\Admin\LeftAndMain:
VersionUnknown: unbekannt
SilverStripe\AssetAdmin\Forms\UploadField:
Dimensions: Dimensionen
EDIT: Bearbeiten
EDITINFO: 'Diese Datei bearbeiten'
REMOVE: Entfernen
SilverStripe\Control\ChangePasswordEmail_ss:
CHANGEPASSWORDTEXT1: 'Sie haben Ihr Passwort geändert für'
CHANGEPASSWORDTEXT3: 'Passwort ändern'
HELLO: Hallo
SilverStripe\Control\Email\ForgotPasswordEmail_ss:
HELLO: Hallo
TEXT1: 'Hier ist Ihr'
TEXT2: 'Link zum Zurücksetzen des Passworts'
TEXT3: für
SilverStripe\Control\RequestProcessor:
INVALID_REQUEST: 'Ungültige Anfrage'
REQUEST_ABORTED: 'Anfrage abgebrochen'
SilverStripe\Core\Manifest\VersionProvider:
VERSIONUNKNOWN: Unbekannt
SilverStripe\Forms\CheckboxField:
NOANSWER: Nein
YESANSWER: Ja
SilverStripe\Forms\CheckboxSetField_ss:
NOOPTIONSAVAILABLE: 'Keine Optionen verfügbar'
SilverStripe\Forms\ConfirmedPasswordField:
ATLEAST: 'Passwörter müssen mindestens {min} Zeichen lang sein.'
BETWEEN: 'Passwörter müssen zwischen {min} und {max} Zeichen lang sein.'
CURRENT_PASSWORD_ERROR: 'Das derzeitige Passwort ist nicht richtig.'
CURRENT_PASSWORD_MISSING: 'Bitte geben Sie Ihr derzeitiges Passwort ein.'
LOGGED_IN_ERROR: 'Sie müssen eingeloggt sein, um Ihr Passwort ändern zu können!'
MAXIMUM: 'Passwörter dürfen maximal {max} Zeichen lang sein.'
SHOWONCLICKTITLE: 'Passwort ändern'
@ -14,12 +39,18 @@ de:
VALIDDATEFORMAT2: 'Bitte geben sie das Datum im korrekten Format ein ({format})'
VALIDDATEMAXDATE: 'Ihr Datum muss vor dem erlaubtem Datum ({date}) liegen oder gleich sein'
VALIDDATEMINDATE: 'Ihr Datum muss nach dem erlaubtem Datum ({date}) liegen oder gleich sein'
SilverStripe\Forms\DatetimeField:
VALIDDATEMAXDATETIME: 'Ihr Datum muss vor dem erlaubtem Datum ({datetime}) liegen oder gleich sein'
VALIDDATETIMEFORMAT: 'Bitte geben Sie ein gültiges Datums- und Zeitformat ein ({format})'
VALIDDATETIMEMINDATE: 'Ihr Datum muss nach dem erlaubtem Datum ({datetime}) liegen oder gleich sein'
SilverStripe\Forms\DropdownField:
CHOOSE: (Auswahl)
CHOOSE_MODEL: '({name} auswählen)'
SOURCE_VALIDATION: 'Bitte wählen Sie aus der Liste. {value} ist kein gültiger Wert'
SilverStripe\Forms\EmailField:
VALIDATION: 'Bitte geben Sie eine E-Mail-Adresse ein'
SilverStripe\Forms\FileUploadReceiver:
FIELDNOTSET: 'Dateiinformation nicht gefunden'
SilverStripe\Forms\Form:
CSRF_EXPIRED_MESSAGE: 'Ihre Sitzung ist abgelaufen. Bitte schicken Sie das Formular erneut ab.'
CSRF_FAILED_MESSAGE: 'Es gab ein technisches Problem. Bitte versuchen Sie es erneut, nachdem sie die vorherige Seite neu geladen haben.'
@ -29,10 +60,14 @@ de:
VALIDATOR: Prüfer
VALIDCURRENCY: 'Bitte geben Sie einen korrekten Betrag ein'
SilverStripe\Forms\FormField:
EXAMPLE: 'z.B. {format}'
NONE: keine
SilverStripe\Forms\FormScaffolder:
TABMAIN: Hauptteil
SilverStripe\Forms\GridField\GridField:
Add: '{name} hinzufügen'
CSVEXPORT: 'Als CSV-Datei exportieren'
CSVIMPORT: 'CSV importieren'
Filter: Filter
FilterBy: 'Filtern nach'
Find: Suchen
@ -58,9 +93,18 @@ de:
DeletePermissionsFailure: 'Keine Berechtigungen zum löschen'
Deleted: 'Gelöscht {type} {name}'
Save: Speichern
SilverStripe\Forms\GridField\GridFieldEditButton:
EDIT: Bearbeiten
SilverStripe\Forms\GridField\GridFieldPaginator:
OF: von
Page: Seite
View: Anzeigen
SilverStripe\Forms\MoneyField:
FIELDLABELAMOUNT: Betrag
FIELDLABELCURRENCY: Währung
INVALID_CURRENCY: 'Währung {currency} ist nicht in der Liste der erlaubten Währungen'
SilverStripe\Forms\MultiSelectField:
SOURCE_VALIDATION: 'Bitte wählen Sie aus der Liste. {value} ist ungültig.'
SilverStripe\Forms\NullableField:
IsNullLabel: 'ist NULL'
SilverStripe\Forms\NumericField:
@ -69,19 +113,45 @@ de:
VALIDATEFORMAT: 'Bitte geben Sie die Uhrzeit im korrekten Format ein ({format})'
SilverStripe\ORM\DataObject:
PLURALNAME: DatenObjekte
PLURALS:
one: 'Ein DatenObjekt'
other: '{count} DatenObjekte'
SINGULARNAME: DatenObjekt
SilverStripe\ORM\FieldType\DBBoolean:
ANY: alle
NOANSWER: Nein
YESANSWER: Ja
SilverStripe\ORM\FieldType\DBDate:
DAYS_SHORT_PLURALS:
one: '{count} Tag'
other: '{count} Tage'
HOURS_SHORT_PLURALS:
one: '{count} Stunde'
other: '{count} Stunden'
LessThanMinuteAgo: 'weniger als eine Minute'
MINUTES_SHORT_PLURALS:
one: '{count} Minute'
other: '{count} Minuten'
MONTHS_SHORT_PLURALS:
one: '{count} Monat'
other: '{count} Monate'
SECONDS_SHORT_PLURALS:
one: '{count} Sekunde'
other: '{count} Sekunden'
TIMEDIFFAGO: 'vor {difference}'
TIMEDIFFIN: 'in {difference}'
YEARS_SHORT_PLURALS:
one: '{count} Jahr'
other: '{count} Jahre'
SilverStripe\ORM\FieldType\DBEnum:
ANY: alle
SilverStripe\ORM\Hierarchy:
LIMITED_TITLE: 'Zu viele Kindelemente ({count})'
SilverStripe\ORM\Hierarchy\Hierarchy:
InfiniteLoopNotAllowed: 'Es wurde eine Endlosschleife innerhalb der "{type}"-Hierarchie gefunden. Bitte ändern Sie die übergeordnete Seite, um den Fehler zu beheben'
LIMITED_TITLE: 'Zu viele Kindelemente ({count})'
SilverStripe\ORM\ValidationException:
DEFAULT_ERROR: Validierungsfehler
SilverStripe\Security\BasicAuth:
ENTERINFO: 'Bitte geben Sie einen Nutzernamen und ein Passwort ein'
ERRORNOTADMIN: 'Dieser Nutzer ist kein Administrator'
@ -90,28 +160,46 @@ de:
PASSWORDEXPIRED: '<p>Ihr Passwort ist abgelaufen. <a target="_top" href="{link}">Bitte wählen Sie ein neues Passwort.</a></p>'
SilverStripe\Security\CMSSecurity:
INVALIDUSER: '<p>Ungültiger Benutzer. <a target="_top" href="{link}">Bitte melden Sie sich hier an</a> um fortzufahren.</p>'
LOGIN_MESSAGE: '<p>Ihre Sitzung ist wegen Inaktivität abgelaufen.</p>'
SUCCESS: Erfolg
SUCCESSCONTENT: '<p>Login erfolgreich. Falls Sie nicht automatisch weitergeleitet werden, bitte <a target="_top" href="{link}">hier klicken</a></p>'
SUCCESS_TITLE: 'Login erfolgreich'
SilverStripe\Security\DefaultAdminService:
DefaultAdminFirstname: Standardadmin
SilverStripe\Security\Group:
AddRole: 'Rolle zur Gruppe hinzufügen'
Code: 'Gruppen Code'
DefaultGroupTitleAdministrators: Administratoren
DefaultGroupTitleContentAuthors: Inhaltsautoren
Description: Beschreibung
GROUPNAME: Gruppenname
GroupReminder: 'Diese Gruppe übernimmt automatisch die Rollen der Elterngruppe'
HierarchyPermsError: 'Kann Berechtigungen der Eltern-Gruppe "{group}" nicht hinzufügen (erfordert Administratorrechte)'
Locked: 'Gesperrt?'
MEMBERS: Mitglieder
NEWGROUP: 'Neue Gruppe'
NoRoles: 'Keine Rollen gefunden'
PERMISSIONS: Berechtigungen
PLURALNAME: Gruppen
PLURALS:
one: 'Eine Gruppe'
other: '{count} Gruppen'
Parent: Elterngruppe
ROLES: Rollen
ROLESDESCRIPTION: 'Hier können Sie der Gruppe Rollen zuweisen.<br />Rollen sind logische Gruppierungen von Berechtigungen.'
RolesAddEditLink: 'Rollen hinzufügen/editieren'
SINGULARNAME: Gruppe
Sort: Sortierreihenfolge
has_many_Permissions: Berechtigungen
many_many_Members: Mitglieder
SilverStripe\Security\LoginAttempt:
Email: E-Mail-Adresse
EmailHashed: 'E-Mail-Adresse (gehashed)'
IP: IP-Adresse
PLURALNAME: Loginversuche
PLURALS:
one: 'Ein Loginversuch'
other: '{count} Loginversuche'
SINGULARNAME: Loginversuch
Status: Status
SilverStripe\Security\Member:
@ -119,6 +207,7 @@ de:
BUTTONCHANGEPASSWORD: 'Passwort ändern'
BUTTONLOGIN: Einloggen
BUTTONLOGINOTHER: 'Als jemand anderes einloggen'
BUTTONLOGOUT: Abmelden
BUTTONLOSTPASSWORD: 'Ich habe mein Passwort vergessen'
CONFIRMNEWPASSWORD: 'Neues Passwort bestätigen'
CONFIRMPASSWORD: 'Passwort bestätigen'
@ -139,6 +228,10 @@ de:
PASSWORD: Passwort
PASSWORDEXPIRED: 'Ihr Passwort ist abgelaufen. Bitte wählen Sie ein neues Passwort.'
PLURALNAME: Benutzer
PLURALS:
one: 'Ein Mitglied'
other: '{count} Mitglieder'
REMEMBERME: 'Für das nächste Mal merken? (für {count} Tage auf diesem Gerät)'
SINGULARNAME: Benutzer
SUBJECTPASSWORDCHANGED: 'Ihr Passwort wurde geändert'
SUBJECTPASSWORDRESET: 'Ihr Link zur Passwortrücksetzung'
@ -151,8 +244,21 @@ de:
db_LockedOutUntil: 'Gesperrt bis'
db_Password: Passwort
db_PasswordExpiry: 'Ablaufdatum des Passworts'
SilverStripe\Security\MemberAuthenticator\CMSMemberLoginForm:
AUTHENTICATORNAME: 'CMS Benutzer Login Formular'
BUTTONFORGOTPASSWORD: 'Passwort vergessen'
BUTTONLOGIN: 'Wieder einloggen'
BUTTONLOGOUT: Abmelden
SilverStripe\Security\MemberAuthenticator\MemberAuthenticator:
ERRORWRONGCRED: 'Ihre Eingaben scheinen nicht richtig zu sein. Bitte versuchen Sie es erneut.'
NoPassword: 'Dieser Benutzer hat kein Passwort.'
SilverStripe\Security\MemberAuthenticator\MemberLoginForm:
AUTHENTICATORNAME: 'E-Mail & Passwort'
SilverStripe\Security\MemberPassword:
PLURALNAME: Benutzerpasswörter
PLURALS:
one: 'Ein Benutzerpasswort'
other: '{count} Benutzerpasswörter'
SINGULARNAME: Benutzerpasswort
SilverStripe\Security\PasswordValidator:
LOWCHARSTRENGTH: 'Bitte erhöhen Sie die Sicherheit des Passworts, indem Sie auch einige der folgenden Zeichen verwenden: {chars}'
@ -160,10 +266,15 @@ de:
TOOSHORT: 'Das Passwort ist zu kurz, es muss mindestens {minimum} Zeichen lang sein'
SilverStripe\Security\Permission:
AdminGroup: Administrator
CMS_ACCESS_CATEGORY: 'CMS Zugriff'
CONTENT_CATEGORY: Inhaltsberechtigungen
FULLADMINRIGHTS: 'Unbeschränkte Administratorenrechte'
FULLADMINRIGHTS_HELP: 'Schließt alle anderen verfügbaren Berechtigungen ein'
PERMISSIONS_CATEGORY: 'Rollen und Zugriffsberechtigungen'
PLURALNAME: Berechtigungen
PLURALS:
one: 'Eine Berechtigung'
other: '{count} Berechtigungen'
SINGULARNAME: Zugriffsberechtigung
UserPermissionsIntro: 'Durch das Hinzufügen von Benutzern zu Gruppen, werden dessen Rechte angepasst. Mehr Informationen über die Berechtigungen der einzelnen Gruppen erhältst Du im Abschnitt Gruppen.'
SilverStripe\Security\PermissionCheckboxSetField:
@ -174,12 +285,24 @@ de:
SilverStripe\Security\PermissionRole:
OnlyAdminCanApply: 'Nur Adminstratoren können beitreten'
PLURALNAME: Rollen
PLURALS:
one: 'Eine Rolle'
other: '{count} Rollen'
SINGULARNAME: Rolle
Title: Titel
SilverStripe\Security\PermissionRoleCode:
PLURALNAME: Berechtigungsrollencodes
PLURALS:
one: 'Ein Berechtigungsrollencode'
other: '{count} Berechtigungsrollencodes'
PermsError: 'Kann Berechtigungen dem Code "{code}" nicht hinzufügen (erfordert Administratorrechte)'
SINGULARNAME: Berechtigungsrollencode
SilverStripe\Security\RememberLoginHash:
PLURALNAME: 'Login Hashes'
PLURALS:
one: 'Ein Login Hash'
other: '{count} Login Hashes'
SINGULARNAME: 'Login Hash'
SilverStripe\Security\Security:
ALREADYLOGGEDIN: 'Sie haben keinen Zugriff auf diese Seite. Wenn Sie ein anderes Konto besitzen, mit dem Sie auf diese Seite zugreifen können, melden Sie sich bitte unten an.'
BUTTONSEND: 'Senden Sie mir den Link zur Passwortrücksetzung'
@ -188,6 +311,10 @@ de:
ENTERNEWPASSWORD: 'Bitte geben Sie ein neues Passwort ein'
ERRORPASSWORDPERMISSION: 'Sie müssen eingeloggt sein, um Ihr Passwort ändern zu können!'
LOGIN: Anmelden
LOGOUT: Abmelden
LOSTPASSWORDHEADER: 'Passwort vergessen'
NOTEPAGESECURED: 'Diese Seite ist geschützt. Bitte melden Sie sich an und Sie werden sofort weitergeleitet.'
NOTERESETLINKINVALID: '<p>Der Link zum Zurücksetzen des Passworts ist entweder nicht korrekt oder abgelaufen</p><p>Sie können <a href="{link1}">einen neuen Link anfordern</a> oder Ihr Passwort nach dem <a href="{link2}">einloggen</a> ändern.</p>'
NOTERESETPASSWORD: 'Geben Sie Ihre E-Mail-Adresse ein und wir werden Ihnen einen Link zuschicken, mit dem Sie Ihr Passwort zurücksetzen können.'
PASSWORDRESETSENTHEADER: 'Der Link zum Zurücksetzen des Passworts wurde gesendet'
PASSWORDRESETSENTTEXT: 'Vielen Dank! Wenn ein Account zu der E-Mail Adresse existiert, wurde eine E-Mail mit dem Link zum Zurücksetzen des Passworts verschickt.'

View File

@ -104,15 +104,6 @@ en:
OF: of
Page: Page
View: View
SilverStripe\Forms\GridField\GridFieldVersionedState:
ADDEDTODRAFTHELP: 'Item has not been published yet'
ADDEDTODRAFTSHORT: Draft
ARCHIVEDPAGEHELP: 'Item is removed from draft and live'
ARCHIVEDPAGESHORT: Archived
MODIFIEDONDRAFTHELP: 'Item has unpublished changes'
MODIFIEDONDRAFTSHORT: Modified
ONLIVEONLYSHORT: 'On live only'
ONLIVEONLYSHORTHELP: 'Item is published, but has been deleted from draft'
SilverStripe\Forms\MoneyField:
FIELDLABELAMOUNT: Amount
FIELDLABELCURRENCY: Currency

View File

@ -84,7 +84,6 @@ eo:
RelationSearch: 'Serĉi rilatojn'
ResetFilter: Restartigi
SilverStripe\Forms\GridField\GridFieldDeleteAction:
DELETE_DESCRIPTION: Forigi
Delete: Forigi
DeletePermissionsFailure: 'Mankas permeso forigi'
EditPermissionsFailure: 'Mankas permeso malligi rikordon'
@ -96,23 +95,12 @@ eo:
DeletePermissionsFailure: 'Mankas permeso forigi'
Deleted: 'Forigita {type} {name}'
Save: Konservi
SilverStripe\Forms\GridField\GridFieldEditButton_ss:
EDIT: Redakti
SilverStripe\Forms\GridField\GridFieldGroupDeleteAction:
UnlinkSelfFailure: 'Ne povas forigi vin el ĉi tiu grupo; vi perdus administrajn rajtojn'
SilverStripe\Forms\GridField\GridFieldPaginator:
OF: de
Page: Paĝo
View: Vido
SilverStripe\Forms\GridField\GridFieldVersionedState:
ADDEDTODRAFTHELP: 'Ero ankoraŭ estas ne publikigita'
ADDEDTODRAFTSHORT: Malneto
ARCHIVEDPAGEHELP: 'Ero estas forigita el malneta kaj publika'
ARCHIVEDPAGESHORT: Enarkivigita
MODIFIEDONDRAFTHELP: 'Ero enhavas nepublikigitajn ŝanĝojn'
MODIFIEDONDRAFTSHORT: Ŝanĝita
ONLIVEONLYSHORT: 'Nur ĉe publika'
ONLIVEONLYSHORTHELP: 'Ero estas publikigita, sed ĝi estas forigita el malneto'
SilverStripe\Forms\MoneyField:
FIELDLABELAMOUNT: Kvanto
FIELDLABELCURRENCY: Kurzo
@ -331,7 +319,4 @@ eo:
LOGOUT: Elsaluti
LOSTPASSWORDHEADER: 'Perdis pasvorton'
NOTEPAGESECURED: 'Tiu paĝo estas sekurigita. Enigu viajn akreditaĵojn sube kaj vi aliros pluen.'
NOTERESETLINKINVALID: '<p>La pasvorta reagorda ligilo estas malvalida aŭ finiĝis.</p><p>Vi povas peti novan <a href="{link1}">ĉi tie</a> aŭ ŝanĝi vian pasvorton post <a href="{link2}">vi ensalutis</a>.</p>'
NOTERESETPASSWORD: 'Enigu vian retpoŝtan adreson kaj ni sendos al vi ligilon per kiu vi povas reagordi vian pasvorton'
PASSWORDSENTHEADER: 'Pasvorta reagorda ligilo sendiĝis al ''{email}'''
PASSWORDSENTTEXT: 'Dankon! Reagordita ligilo sendiĝis al ''{email}'', kondiĉe ke konto ekzistas por tiu retadreso.'

View File

@ -84,7 +84,6 @@ nl:
RelationSearch: 'Zoek relatie'
ResetFilter: Resetten
SilverStripe\Forms\GridField\GridFieldDeleteAction:
DELETE_DESCRIPTION: Verwijder
Delete: Verwijder
DeletePermissionsFailure: 'Onvoldoende rechten om te verwijderen'
EditPermissionsFailure: 'Geen toelating om te ontkoppelen'
@ -96,23 +95,12 @@ nl:
DeletePermissionsFailure: 'Onvoldoende rechten om te verwijderen'
Deleted: '{type} {name} verwijderd'
Save: Opslaan
SilverStripe\Forms\GridField\GridFieldEditButton_ss:
EDIT: Edit
SilverStripe\Forms\GridField\GridFieldGroupDeleteAction:
UnlinkSelfFailure: 'U kunt uzelf niet verwijderen van deze groep, omdat u dan geen admin-rechten meer heeft.'
SilverStripe\Forms\GridField\GridFieldPaginator:
OF: van
Page: Pagina
View: Bekijk
SilverStripe\Forms\GridField\GridFieldVersionedState:
ADDEDTODRAFTHELP: 'Item is nog niet gepubliceerd'
ADDEDTODRAFTSHORT: Concept
ARCHIVEDPAGEHELP: 'Het item is verwijderd van de concept- en de live site'
ARCHIVEDPAGESHORT: Gearchiveerd
MODIFIEDONDRAFTHELP: 'Item heeft wijzigingen die nog niet gepubliceerd zijn'
MODIFIEDONDRAFTSHORT: Aangepast
ONLIVEONLYSHORT: 'Alleen op de live site'
ONLIVEONLYSHORTHELP: 'Item is gepubliceerd, maar verwijderd van de concept site'
SilverStripe\Forms\MoneyField:
FIELDLABELAMOUNT: Aantal
FIELDLABELCURRENCY: Munteenheid
@ -174,8 +162,8 @@ nl:
PASSWORDEXPIRED: '<p>Uw wachtwoord is verlopen. <a target="_top" href="{link}">Kies een nieuw wachtwoord.</a></p>'
SilverStripe\Security\CMSSecurity:
INVALIDUSER: '<p>Ongeldige gebruiker <a target="_top" href="{link}">Log hier opnieuw in</a> om verder te gaan.</p>'
LOGIN_MESSAGE: 'Sessie is verlopen'
LOGIN_TITLE: '<p>U kunt verder met wat u aan het doen was, door opnieuw in te loggen.</p>'
LOGIN_MESSAGE: '<p>De browsersessie is verlopen wegens inactiviteit</p>'
LOGIN_TITLE: 'Log opnieuw in om verder te gaan.'
SUCCESS: Succes
SUCCESSCONTENT: '<p>U bent ingelogd. <a target="_top" href="{link}">Klik hier</a> als u niet automatisch wordt doorgestuurd.</p>'
SUCCESS_TITLE: 'Inloggen is gelukt'
@ -331,7 +319,4 @@ nl:
LOGOUT: Uitloggen
LOSTPASSWORDHEADER: 'Wachtwoord vergeten'
NOTEPAGESECURED: 'Deze pagina is beveiligd. Voer uw gegevens in en u wordt automatisch doorgestuurd.'
NOTERESETLINKINVALID: '<p>De link om uw wachtwoord te kunnen wijzigen is niet meer geldig.</p><p>U kunt <a href="{link1}">een nieuwe link aanvragen</a> of uw wachtwoord aanpassen door <a href="{link2}">in te loggen</a>.</p>'
NOTERESETPASSWORD: 'Voer uw e-mailadres in en we sturen een link waarmee u een nieuw wachtwoord kunt instellen.'
PASSWORDSENTHEADER: 'Wachtwoord herstel link verzonden naar {email}'
PASSWORDSENTTEXT: 'Bedankt! Er is een link verstuurd naar {email} om uw wachtwoord opnieuw in te stellen, in de veronderstelling dat er een account bestaat voor dit e-mailadres.'

View File

@ -611,7 +611,7 @@ TEXT;
<li id="ModRewriteResult">Testing...</li>
<script>
if (typeof $ == 'undefined') {
document.getElemenyById('ModeRewriteResult').innerHTML = "I can't run jQuery ajax to set rewriting; I will redirect you to the homepage to see if everything is working.";
document.getElementById('ModeRewriteResult').innerHTML = "I can't run jQuery ajax to set rewriting; I will redirect you to the homepage to see if everything is working.";
setTimeout(function() {
window.location = "$destinationURL";
}, 10000);

View File

@ -133,7 +133,10 @@ class GridFieldPrintButton implements GridField_HTMLProvider, GridField_ActionPr
$this->extend('updatePrintData', $data);
if ($data) {
return $data->renderWith(get_class($gridField) . "_print");
return $data->renderWith([
get_class($gridField) . '_print',
GridField::class . '_print',
]);
}
return null;

View File

@ -207,7 +207,7 @@ class MySQLSchemaManager extends DBSchemaManager
public function databaseExists($name)
{
// MySQLi doesn't like parameterised queries for some queries
$sqlName = $this->database->quoteString($name);
$sqlName = addcslashes($this->database->quoteString($name), '%_');
return !!($this->query("SHOW DATABASES LIKE $sqlName")->value());
}

View File

@ -1447,6 +1447,7 @@ class DataObject extends ViewableData implements DataObjectInterface, i18nEntity
* @param string $baseTable Base table
* @param string $now Timestamp to use for the current time
* @param bool $isNewRecord If this is a new record
* @throws InvalidArgumentException
*/
protected function writeManipulation($baseTable, $now, $isNewRecord)
{
@ -1465,6 +1466,20 @@ class DataObject extends ViewableData implements DataObjectInterface, i18nEntity
$manipulation[$baseTable]['command'] = 'update';
}
// Make sure none of our field assignment are arrays
foreach ($manipulation as $tableManipulation) {
if (!isset($tableManipulation['fields'])) {
continue;
}
foreach ($tableManipulation['fields'] as $fieldValue) {
if (is_array($fieldValue)) {
throw new InvalidArgumentException(
'DataObject::writeManipulation: parameterised field assignments are disallowed'
);
}
}
}
// Perform the manipulation
DB::manipulate($manipulation);
}
@ -2618,6 +2633,18 @@ class DataObject extends ViewableData implements DataObjectInterface, i18nEntity
throw new InvalidArgumentException('DataObject::setField: passed an object that is not a DBField');
}
if (!empty($val) && !is_scalar($val)) {
$dbField = $this->dbObject($fieldName);
if ($dbField && $dbField->scalarValueOnly()) {
throw new InvalidArgumentException(
sprintf(
'DataObject::setField: %s only accepts scalars',
$fieldName
)
);
}
}
// if a field is not existing or has strictly changed
if (!isset($this->record[$fieldName]) || $this->record[$fieldName] !== $val) {
// TODO Add check for php-level defaults which are not set in the db

View File

@ -329,4 +329,9 @@ abstract class DBComposite extends DBField
];
}
}
public function scalarValueOnly()
{
return false;
}
}

View File

@ -335,18 +335,16 @@ abstract class DBField extends ViewableData implements DBIndexable
* will be escaped automatically by the prepared query processor, so it
* should not be escaped or quoted at all.
*
* The field values could also be in paramaterised format, such as
* array('MAX(?,?)' => array(42, 69)), allowing the use of raw SQL values such as
* array('NOW()' => array()).
*
* @see SQLWriteExpression::addAssignments for syntax examples
*
* @param $value mixed The value to check
* @return mixed The raw value, or escaped parameterised details
*/
public function prepValueForDB($value)
{
if ($value === null || $value === "" || $value === false) {
if ($value === null ||
$value === "" ||
$value === false ||
($this->scalarValueOnly() && !is_scalar($value))
) {
return null;
} else {
return $value;
@ -653,4 +651,15 @@ DBG;
}
return null;
}
/**
* Whether or not this DBField only accepts scalar values.
*
* Composite DBFields can override this method and return `false` so they can accept arrays of values.
* @return boolean
*/
public function scalarValueOnly()
{
return true;
}
}

View File

@ -94,7 +94,7 @@ abstract class DBString extends DBField
public function prepValueForDB($value)
{
// Cast non-empty value
if (strlen($value)) {
if (is_scalar($value) && strlen($value)) {
return (string)$value;
}

View File

@ -299,6 +299,20 @@ class ManyManyList extends RelationList
$manipulation[$this->joinTable]['fields'][$this->localKey] = $itemID;
$manipulation[$this->joinTable]['fields'][$this->foreignKey] = $foreignID;
// Make sure none of our field assignments are arrays
foreach ($manipulation as $tableManipulation) {
if (!isset($tableManipulation['fields'])) {
continue;
}
foreach ($tableManipulation['fields'] as $fieldValue) {
if (is_array($fieldValue)) {
throw new InvalidArgumentException(
'ManyManyList::add: parameterised field assignments are disallowed'
);
}
}
}
DB::manipulate($manipulation);
}
}

View File

@ -476,7 +476,7 @@ class ShortcodeParser
if ($tags) {
$node->nodeValue = $this->replaceTagsWithText(
$node->nodeValue,
htmlspecialchars($node->nodeValue),
$tags,
function ($idx, $tag) use ($parser, $extra) {
return $parser->getShortcodeReplacementText($tag, $extra, false);

View File

@ -2,17 +2,32 @@
namespace SilverStripe\ORM\Tests;
use SilverStripe\Assets\Image;
use SilverStripe\ORM\FieldType\DBBigInt;
use SilverStripe\ORM\FieldType\DBBoolean;
use SilverStripe\ORM\FieldType\DBCurrency;
use SilverStripe\ORM\FieldType\DBDate;
use SilverStripe\ORM\FieldType\DBDatetime;
use SilverStripe\ORM\FieldType\DBDecimal;
use SilverStripe\ORM\FieldType\DBDouble;
use SilverStripe\ORM\FieldType\DBEnum;
use SilverStripe\ORM\FieldType\DBFloat;
use SilverStripe\ORM\FieldType\DBForeignKey;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\FieldType\DBHTMLVarchar;
use SilverStripe\ORM\FieldType\DBInt;
use SilverStripe\ORM\FieldType\DBLocale;
use SilverStripe\ORM\FieldType\DBMoney;
use SilverStripe\ORM\FieldType\DBMultiEnum;
use SilverStripe\ORM\FieldType\DBPercentage;
use SilverStripe\ORM\FieldType\DBPolymorphicForeignKey;
use SilverStripe\ORM\FieldType\DBPrimaryKey;
use SilverStripe\ORM\FieldType\DBString;
use SilverStripe\ORM\FieldType\DBTime;
use SilverStripe\ORM\FieldType\DBVarchar;
use SilverStripe\ORM\FieldType\DBText;
use SilverStripe\Dev\SapphireTest;
use SilverStripe\ORM\FieldType\DBYear;
/**
* Tests for DBField objects.
@ -189,6 +204,54 @@ class DBFieldTest extends SapphireTest
$this->assertEquals(PHP_INT_MAX, $bigInt->getValue());
}
/**
* @dataProvider dataProviderPrepValueForDBArrayValue
*/
public function testPrepValueForDBArrayValue($dbFieldName, $scalarValueOnly, $extraArgs = [])
{
$reflection = new \ReflectionClass($dbFieldName);
/**
* @var DBField
*/
$dbField = $reflection->newInstanceArgs($extraArgs);
$dbField->setName('SomeField');
$payload = ['GREATEST(0,?)' => '2'];
$preparedValue = $dbField->prepValueForDB($payload);
$this->assertTrue(
!$scalarValueOnly || !is_array($preparedValue),
'`prepValueForDB` can not return an array if scalarValueOnly is true'
);
$this->assertEquals($scalarValueOnly, $dbField->scalarValueOnly());
}
public function dataProviderPrepValueForDBArrayValue()
{
return [
[DBBigInt::class, true],
[DBBoolean::class, true],
[DBCurrency::class, true],
[DBDate::class, true],
[DBDatetime::class, true],
[DBDecimal::class, true],
[DBDouble::class, true],
[DBEnum::class, true],
[DBFloat::class, true],
[DBForeignKey::class, true, ['SomeField']],
[DBHTMLText::class, true],
[DBHTMLVarchar::class, true],
[DBInt::class, true],
[DBLocale::class, true],
[DBMoney::class, false],
[DBMultiEnum::class, true, ['SomeField', ['One', 'Two', 'Three']]],
[DBPercentage::class, true],
[DBPolymorphicForeignKey::class, false, ['SomeField']],
[DBText::class, true],
[DBTime::class, true],
[DBVarchar::class, true],
[DBYear::class, true],
];
}
public function testExists()
{
$varcharField = new DBVarchar("testfield");

View File

@ -17,7 +17,9 @@ use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\ORM\FieldType\DBPolymorphicForeignKey;
use SilverStripe\ORM\FieldType\DBVarchar;
use SilverStripe\ORM\ManyManyList;
use SilverStripe\ORM\Tests\DataObjectTest\Company;
use SilverStripe\ORM\Tests\DataObjectTest\Player;
use SilverStripe\ORM\Tests\DataObjectTest\Team;
use SilverStripe\View\ViewableData;
use stdClass;
@ -2235,4 +2237,20 @@ class DataObjectTest extends SapphireTest
['"DataObjectTest_TeamComment"."Name"' => 'does not exists']
));
}
public function testSetFieldWithArrayOnScalarOnlyField()
{
$this->expectException(InvalidArgumentException::class);
$do = Company::singleton();
$do->FoundationYear = '1984';
$do->FoundationYear = array('Amount' => 123, 'Currency' => 'CAD');
$this->assertEmpty($do->FoundationYear);
}
public function testSetFieldWithArrayOnCompositeField()
{
$do = Company::singleton();
$do->SalaryCap = array('Amount' => 123456, 'Currency' => 'CAD');
$this->assertNotEmpty($do->SalaryCap);
}
}

View File

@ -10,7 +10,9 @@ class Company extends DataObject implements TestOnly
private static $table_name = 'DataObjectTest_Company';
private static $db = [
'Name' => 'Varchar'
'Name' => 'Varchar',
'MarketValue' => 'Money',
'FoundationYear' => 'Year'
];
private static $has_one = [

View File

@ -10,6 +10,8 @@ use SilverStripe\ORM\ManyManyList;
/**
* @property string Title
* @property string DatabaseField
* @property array SalaryCap
* @property string FoundationYear
* @method Player Captain()
* @method Player Founder()
* @method Player HasOneRelationship()
@ -27,7 +29,7 @@ class Team extends DataObject implements TestOnly
private static $db = array(
'Title' => 'Varchar',
'DatabaseField' => 'HTMLVarchar'
'DatabaseField' => 'HTMLVarchar',
);
private static $has_one = array(

View File

@ -311,6 +311,15 @@ class ShortcodeParserTest extends SapphireTest
$this->assertEquals($this->extra['element']->tagName, 'a');
}
public function testShortcodeWithAnchorAndQuerystring()
{
$result = $this->parser->parse('<a href="[test_shortcode]?my-string=this&thing=2#my-anchor">Link</a>');
$this->assertContains('my-string=this', $result);
$this->assertContains('thing=2', $result);
$this->assertContains('my-anchor', $result);
}
public function testNoParseAttemptIfNoCode()
{
$stub = $this->getMockBuilder(ShortcodeParser::class)->setMethods(array('replaceElementTagsWithMarkers'))