Merge 3.1.20 into 3.1

This commit is contained in:
Damian Mooyman 2016-08-15 18:33:45 +12:00
commit 439753a61b
19 changed files with 746 additions and 116 deletions

View File

@ -0,0 +1,30 @@
// This file was generated by silverstripe/cow from admin/javascript/lang/src/hr.js.
// See https://github.com/tractorcow/cow for details
if (typeof(ss) === 'undefined' || typeof(ss.i18n) === 'undefined') {
if (typeof(console) !== 'undefined') { // eslint-disable-line no-console
console.error('Class ss.i18n not defined'); // eslint-disable-line no-console
}
} else {
ss.i18n.addDictionary('hr', {
"CMSMAIN.BATCH_ARCHIVE_PROMPT": "You have {num} page(s) selected.\n\nAre you sure you want to archive these pages?\n\nThese pages and all of their children pages will be unpublished and sent to the archive.",
"CMSMAIN.BATCH_DELETELIVE_PROMPT": "You have {num} page(s) selected.\n\nDo you really want to delete these pages from live?",
"CMSMAIN.BATCH_DELETE_PROMPT": "You have {num} page(s) selected.\n\nDo you really want to delete?",
"CMSMAIN.BATCH_PUBLISH_PROMPT": "You have {num} page(s) selected.\n\nDo you really want to publish?",
"CMSMAIN.BATCH_RESTORE_PROMPT": "You have {num} page(s) selected.\n\nDo you really want to restore to stage?\n\nChildren of archived pages will be restored to the root level, unless those pages are also being restored.",
"CMSMAIN.BATCH_UNPUBLISH_PROMPT": "Označili ste {num} stranicu(a).\n\nJeste li sigurni da želite odjaviti?",
"CMSMAIN.SELECTONEPAGE": "Molimo odaberite bar jednu stranicu",
"Campaigns.ADDCAMPAIGN": "Dodaj kampanju",
"Campaigns.ITEM_SUMMARY_PLURAL": "%s stavki",
"Campaigns.ITEM_SUMMARY_SINGULAR": "%s stavka",
"Campaigns.PUBLISHCAMPAIGN": "Objavi kampanju",
"Campaigns.REVERTCAMPAIGN": "Vrati",
"LeftAndMain.CONFIRMUNSAVED": "Jeste li sigurni da želite otići s ove stranice?\n\nUPOZORENJE: Vaše promjene nisu spremljene.\n\nPritisnike OK za nastavka, ili Odustani za ostati na trenutnoj stranici.",
"LeftAndMain.CONFIRMUNSAVEDSHORT": "UPOZORENJE: Vaše promjene nisu spremljene.",
"LeftAndMain.PAGEWASDELETED": "Ova stranica je obrisana. Za uređivanje stranice, odaberite je s lijeve stranice.",
"ModelAdmin.DELETED": "Obrisano",
"ModelAdmin.REALLYDELETE": "Jeste li sigurni da želite obrisati?",
"ModelAdmin.SAVED": "Spremljeno",
"ModelAdmin.VALIDATIONERROR": "Greška validacije",
"SecurityAdmin.BATCHACTIONSDELETECONFIRM": "Jeste li sigurni da želite obrisati %s grupe?"
});
}

View File

@ -6,18 +6,18 @@ if (typeof(ss) === 'undefined' || typeof(ss.i18n) === 'undefined') {
}
} else {
ss.i18n.addDictionary('ru', {
"CMSMAIN.BATCH_ARCHIVE_PROMPT": "You have {num} page(s) selected.\n\nAre you sure you want to archive these pages?\n\nThese pages and all of their children pages will be unpublished and sent to the archive.",
"CMSMAIN.BATCH_DELETELIVE_PROMPT": "You have {num} page(s) selected.\n\nDo you really want to delete these pages from live?",
"CMSMAIN.BATCH_DELETE_PROMPT": "You have {num} page(s) selected.\n\nDo you really want to delete?",
"CMSMAIN.BATCH_PUBLISH_PROMPT": "You have {num} page(s) selected.\n\nDo you really want to publish?",
"CMSMAIN.BATCH_RESTORE_PROMPT": "You have {num} page(s) selected.\n\nDo you really want to restore to stage?\n\nChildren of archived pages will be restored to the root level, unless those pages are also being restored.",
"CMSMAIN.BATCH_UNPUBLISH_PROMPT": "You have {num} page(s) selected.\n\nDo you really want to unpublish",
"CMSMAIN.SELECTONEPAGE": "Please select at least one page",
"Campaigns.ADDCAMPAIGN": "Add campaign",
"Campaigns.ITEM_SUMMARY_PLURAL": "%s items",
"Campaigns.ITEM_SUMMARY_SINGULAR": "%s item",
"Campaigns.PUBLISHCAMPAIGN": "Publish campaign",
"Campaigns.REVERTCAMPAIGN": "Revert",
"CMSMAIN.BATCH_ARCHIVE_PROMPT": "Вы выбрали {num} страниц(у)\nВы уверены что хотите отправить их в архив?\n\nПубликации этих страниц и их под-страниц будут отменены и отправлены в архив. ",
"CMSMAIN.BATCH_DELETELIVE_PROMPT": "Вы выбрали {num} страниц(у)\n\nВы уверены что хотите отменить публикацию этих страниц?",
"CMSMAIN.BATCH_DELETE_PROMPT": "Вы выбрали {num} страниц(у)\n\nВы уверены что хотите их удалить?",
"CMSMAIN.BATCH_PUBLISH_PROMPT": "Вы выбрали {num} страниц(у)\n\nВы уверены что хотите их опубликовать?",
"CMSMAIN.BATCH_RESTORE_PROMPT": "Вы выбрали {num} страниц(у)\n\nВы уверены что хотите восстановить эти страницы в черновик?\n\nПод-страницы архивных страниц будут восстановлены в корень если эти страницы также не отмечены для восстановления.",
"CMSMAIN.BATCH_UNPUBLISH_PROMPT": "Вы выбрали {num} страниц(у)\n\nВы уверены что хотите отменить их публикацию?",
"CMSMAIN.SELECTONEPAGE": "Пожалуйста, выберите хотя бы одну страницу.",
"Campaigns.ADDCAMPAIGN": "Добавить кампанию",
"Campaigns.ITEM_SUMMARY_PLURAL": "%s элементов",
"Campaigns.ITEM_SUMMARY_SINGULAR": "%s элемент",
"Campaigns.PUBLISHCAMPAIGN": "Опубликовать кампанию",
"Campaigns.REVERTCAMPAIGN": "Отменить",
"LeftAndMain.CONFIRMUNSAVED": "Вы действительно хотите покинуть эту страницу?\n\nВНИМАНИЕ: Ваши изменения не были сохранены.\n\nНажмите ОК, чтобы продолжить или Отмена, чтобы остаться на текущей странице.",
"LeftAndMain.CONFIRMUNSAVEDSHORT": "ВНИМАНИЕ: Ваши изменения не были сохранены",
"LeftAndMain.PAGEWASDELETED": "Эта страница была удалена. Чтобы изменить страницу, выберите её из списка слева.",

View File

@ -0,0 +1,22 @@
{
"CMSMAIN.BATCH_ARCHIVE_PROMPT": "You have {num} page(s) selected.\n\nAre you sure you want to archive these pages?\n\nThese pages and all of their children pages will be unpublished and sent to the archive.",
"CMSMAIN.BATCH_DELETELIVE_PROMPT": "You have {num} page(s) selected.\n\nDo you really want to delete these pages from live?",
"CMSMAIN.BATCH_DELETE_PROMPT": "You have {num} page(s) selected.\n\nDo you really want to delete?",
"CMSMAIN.BATCH_PUBLISH_PROMPT": "You have {num} page(s) selected.\n\nDo you really want to publish?",
"CMSMAIN.BATCH_RESTORE_PROMPT": "You have {num} page(s) selected.\n\nDo you really want to restore to stage?\n\nChildren of archived pages will be restored to the root level, unless those pages are also being restored.",
"CMSMAIN.BATCH_UNPUBLISH_PROMPT": "Označili ste {num} stranicu(a).\n\nJeste li sigurni da želite odjaviti?",
"CMSMAIN.SELECTONEPAGE": "Molimo odaberite bar jednu stranicu",
"Campaigns.ADDCAMPAIGN": "Dodaj kampanju",
"Campaigns.ITEM_SUMMARY_PLURAL": "%s stavki",
"Campaigns.ITEM_SUMMARY_SINGULAR": "%s stavka",
"Campaigns.PUBLISHCAMPAIGN": "Objavi kampanju",
"Campaigns.REVERTCAMPAIGN": "Vrati",
"LeftAndMain.CONFIRMUNSAVED": "Jeste li sigurni da želite otići s ove stranice?\n\nUPOZORENJE: Vaše promjene nisu spremljene.\n\nPritisnike OK za nastavka, ili Odustani za ostati na trenutnoj stranici.",
"LeftAndMain.CONFIRMUNSAVEDSHORT": "UPOZORENJE: Vaše promjene nisu spremljene.",
"LeftAndMain.PAGEWASDELETED": "Ova stranica je obrisana. Za uređivanje stranice, odaberite je s lijeve stranice.",
"ModelAdmin.DELETED": "Obrisano",
"ModelAdmin.REALLYDELETE": "Jeste li sigurni da želite obrisati?",
"ModelAdmin.SAVED": "Spremljeno",
"ModelAdmin.VALIDATIONERROR": "Greška validacije",
"SecurityAdmin.BATCHACTIONSDELETECONFIRM": "Jeste li sigurni da želite obrisati %s grupe?"
}

View File

@ -1,16 +1,16 @@
{
"CMSMAIN.BATCH_ARCHIVE_PROMPT": "You have {num} page(s) selected.\n\nAre you sure you want to archive these pages?\n\nThese pages and all of their children pages will be unpublished and sent to the archive.",
"CMSMAIN.BATCH_DELETELIVE_PROMPT": "You have {num} page(s) selected.\n\nDo you really want to delete these pages from live?",
"CMSMAIN.BATCH_DELETE_PROMPT": "You have {num} page(s) selected.\n\nDo you really want to delete?",
"CMSMAIN.BATCH_PUBLISH_PROMPT": "You have {num} page(s) selected.\n\nDo you really want to publish?",
"CMSMAIN.BATCH_RESTORE_PROMPT": "You have {num} page(s) selected.\n\nDo you really want to restore to stage?\n\nChildren of archived pages will be restored to the root level, unless those pages are also being restored.",
"CMSMAIN.BATCH_UNPUBLISH_PROMPT": "You have {num} page(s) selected.\n\nDo you really want to unpublish",
"CMSMAIN.SELECTONEPAGE": "Please select at least one page",
"Campaigns.ADDCAMPAIGN": "Add campaign",
"Campaigns.ITEM_SUMMARY_PLURAL": "%s items",
"Campaigns.ITEM_SUMMARY_SINGULAR": "%s item",
"Campaigns.PUBLISHCAMPAIGN": "Publish campaign",
"Campaigns.REVERTCAMPAIGN": "Revert",
"CMSMAIN.BATCH_ARCHIVE_PROMPT": "Вы выбрали {num} страниц(у)\nВы уверены что хотите отправить их в архив?\n\nПубликации этих страниц и их под-страниц будут отменены и отправлены в архив. ",
"CMSMAIN.BATCH_DELETELIVE_PROMPT": "Вы выбрали {num} страниц(у)\n\nВы уверены что хотите отменить публикацию этих страниц?",
"CMSMAIN.BATCH_DELETE_PROMPT": "Вы выбрали {num} страниц(у)\n\nВы уверены что хотите их удалить?",
"CMSMAIN.BATCH_PUBLISH_PROMPT": "Вы выбрали {num} страниц(у)\n\nВы уверены что хотите их опубликовать?",
"CMSMAIN.BATCH_RESTORE_PROMPT": "Вы выбрали {num} страниц(у)\n\nВы уверены что хотите восстановить эти страницы в черновик?\n\nПод-страницы архивных страниц будут восстановлены в корень если эти страницы также не отмечены для восстановления.",
"CMSMAIN.BATCH_UNPUBLISH_PROMPT": "Вы выбрали {num} страниц(у)\n\nВы уверены что хотите отменить их публикацию?",
"CMSMAIN.SELECTONEPAGE": "Пожалуйста, выберите хотя бы одну страницу.",
"Campaigns.ADDCAMPAIGN": "Добавить кампанию",
"Campaigns.ITEM_SUMMARY_PLURAL": "%s элементов",
"Campaigns.ITEM_SUMMARY_SINGULAR": "%s элемент",
"Campaigns.PUBLISHCAMPAIGN": "Опубликовать кампанию",
"Campaigns.REVERTCAMPAIGN": "Отменить",
"LeftAndMain.CONFIRMUNSAVED": "Вы действительно хотите покинуть эту страницу?\n\nВНИМАНИЕ: Ваши изменения не были сохранены.\n\nНажмите ОК, чтобы продолжить или Отмена, чтобы остаться на текущей странице.",
"LeftAndMain.CONFIRMUNSAVEDSHORT": "ВНИМАНИЕ: Ваши изменения не были сохранены",
"LeftAndMain.PAGEWASDELETED": "Эта страница была удалена. Чтобы изменить страницу, выберите её из списка слева.",

View File

@ -0,0 +1,23 @@
# 3.1.20
<!--- Changes below this line will be automatically regenerated -->
## Change Log
### Security
* 2016-08-02 [62a2421](https://github.com/silverstripe/silverstripe-framework/commit/62a242154ec3508fe9b174a40713c8520ac1684c) Fix value / title escaping in CheckboxSetField and OptionsetField (Damian Mooyman) - See [ss-2016-015](http://www.silverstripe.org/download/security-releases/ss-2016-015)
* 2016-07-25 [1c7d5de](https://github.com/silverstripe/silverstripe-framework/commit/1c7d5de51bcdf16ebb21c5a0ebe5fe9e31f9a822) Autologin cookies are ignored if autologin is disabled (Daniel Hensby) - See [ss-2016-014](http://www.silverstripe.org/download/security-releases/ss-2016-014)
* 2016-07-22 [6817c57](https://github.com/silverstripe/silverstripe-framework/commit/6817c57f64b9eb2b271b81662cd83b074a3daee4) Uncasted member name (Daniel Hensby) - See [ss-2016-013](http://www.silverstripe.org/download/security-releases/ss-2016-013)
* 2016-07-15 [298f615](https://github.com/silverstripe/silverstripe-framework/commit/298f61521c55b07e5c898a92264dbe111735a87a) Reset `Member::Salt` on password change (Daniel Hensby) - See [ss-2016-008](http://www.silverstripe.org/download/security-releases/ss-2016-008)
* 2016-07-14 [6606d98](https://github.com/silverstripe/silverstripe-framework/commit/6606d986634f5b5dec16462acaa8d9a513c29fec) ChangePasswordForm does not check $member-&gt;canLogin before login (Daniel Hensby) - See [ss-2016-011](http://www.silverstripe.org/download/security-releases/ss-2016-011)
* 2016-07-14 [5f73d34](https://github.com/silverstripe/silverstripe-cms/commit/5f73d3454ecbc4850e91a0a3007102f6d4d9b853) Missing ACL check on ReportAdmin (Daniel Hensby) - See [ss-2016-012](http://www.silverstripe.org/download/security-releases/ss-2016-012)
### Bugfixes
* 2016-08-15 [95c640a](https://github.com/silverstripe/silverstripe-cms/commit/95c640ae6b5620be83d38e8060317554bc0820ed) Fix regression in FormField casting (Damian Mooyman)
* 2016-05-20 [8382685](https://github.com/silverstripe/silverstripe-framework/commit/83826850346bc486bc4599dca56067897961cbfa) #5557 Tests with no DB requirements wont create test DB (Daniel Hensby)
* 2016-05-18 [62bd26d](https://github.com/silverstripe/silverstripe-framework/commit/62bd26d11ab9c9bf5b91ba8abb776ab3a4813a18) Fix suppression of display_errors in ErrorControlChain (Damian Mooyman)
* 2016-05-10 [3738d88](https://github.com/silverstripe/silverstripe-framework/commit/3738d888e0fbce48e0d88735edd3455a116937b5) Empty FROM clause (Daniel Hensby)
* 2016-05-05 [cc7a2ae](https://github.com/silverstripe/silverstripe-installer/commit/cc7a2aeb1e03f3f8db67a1ca547280b05dd9372a) Add framework/admin tests (#118) (Daniel Hensby)
* 2015-04-21 [a7100e9](https://github.com/silverstripe/silverstripe-framework/commit/a7100e9006b27e7885eb2ce851d9bc0839ca4468) Object::parse_class_spec failed to parse associative arrays (Loz Calver)

View File

@ -0,0 +1,14 @@
# 3.1.20-rc2
<!--- Changes below this line will be automatically regenerated -->
## Change Log
### Security
* 2016-08-02 [62a2421](https://github.com/silverstripe/silverstripe-framework/commit/62a242154ec3508fe9b174a40713c8520ac1684c) Fix value / title escaping in CheckboxSetField and OptionsetField (Damian Mooyman) - See [ss-2016-015](http://www.silverstripe.org/download/security-releases/ss-2016-015)
* 2016-07-25 [1c7d5de](https://github.com/silverstripe/silverstripe-framework/commit/1c7d5de51bcdf16ebb21c5a0ebe5fe9e31f9a822) Autologin cookies are ignored if autologin is disabled (Daniel Hensby) - See [ss-2016-014](http://www.silverstripe.org/download/security-releases/ss-2016-014)
* 2016-07-22 [6817c57](https://github.com/silverstripe/silverstripe-framework/commit/6817c57f64b9eb2b271b81662cd83b074a3daee4) Uncasted member name (Daniel Hensby) - See [ss-2016-013](http://www.silverstripe.org/download/security-releases/ss-2016-013)
* 2016-07-15 [298f615](https://github.com/silverstripe/silverstripe-framework/commit/298f61521c55b07e5c898a92264dbe111735a87a) Reset `Member::Salt` on password change (Daniel Hensby) - See [ss-2016-008](http://www.silverstripe.org/download/security-releases/ss-2016-008)
* 2016-07-14 [6606d98](https://github.com/silverstripe/silverstripe-framework/commit/6606d986634f5b5dec16462acaa8d9a513c29fec) ChangePasswordForm does not check $member-&gt;canLogin before login (Daniel Hensby) - See [ss-2016-011](http://www.silverstripe.org/download/security-releases/ss-2016-011)
* 2016-07-14 [5f73d34](https://github.com/silverstripe/silverstripe-cms/commit/5f73d3454ecbc4850e91a0a3007102f6d4d9b853) Missing ACL check on ReportAdmin (Daniel Hensby) - See [ss-2016-012](http://www.silverstripe.org/download/security-releases/ss-2016-012)

View File

@ -4,7 +4,7 @@
*
* ASSUMPTION -> IF you pass your source as an array, you pass values as an array too. Likewise objects are handled
* the same.
*
*
* Example:
* <code>
* new CheckboxSetField(
@ -19,7 +19,7 @@
* $value = "1"
* );
* </code>
*
*
* <b>Saving</b>
* The checkbox set field will save its data in one of ways:
* - If the field name matches a many-many join on the object being edited, that many-many join will be updated to
@ -27,17 +27,17 @@
* the database records.
* - If the field name matches a database field, a comma-separated list of values will be saved to that field. The
* keys can be text or numbers.
*
*
* @todo Document the different source data that can be used
* with this form field - e.g ComponentSet, ArrayList,
* array. Is it also appropriate to accept so many different
* types of data when just using an array would be appropriate?
*
*
* @package forms
* @subpackage fields-basic
*/
class CheckboxSetField extends OptionsetField {
/**
* @var array
*/
@ -82,7 +82,7 @@ class CheckboxSetField extends OptionsetField {
}
}
}
// Source is not an array
if(!is_array($source) && !is_a($source, 'SQLMap')) {
if(is_array($values)) {
@ -126,19 +126,22 @@ class CheckboxSetField extends OptionsetField {
if(is_array($source)) {
unset($source['']);
}
$options = array();
if ($source == null) {
$source = array();
}
foreach($source as $value => $item) {
if($item instanceof DataObject) {
// Ensure $title is cast for template
if ($item instanceof DataObject) {
$value = $item->ID;
$title = $item->Title;
} else {
$title = $item->obj('Title');
} elseif ($item instanceof DBField) {
$title = $item;
} else {
$title = DBField::create_field('Text', $item);
}
$itemID = $this->ID() . '_' . preg_replace('/[^a-zA-Z0-9]/', '', $value);
@ -168,21 +171,21 @@ class CheckboxSetField extends OptionsetField {
* Default selections, regardless of the {@link setValue()} settings.
* Note: Items marked as disabled through {@link setDisabledItems()} can still be
* selected by default through this method.
*
*
* @param Array $items Collection of array keys, as defined in the $source array
*/
public function setDefaultItems($items) {
$this->defaultItems = $items;
return $this;
}
/**
* @return Array
*/
public function getDefaultItems() {
return $this->defaultItems;
}
/**
* Load a value into this CheckboxSetField
*/
@ -198,7 +201,7 @@ class CheckboxSetField extends OptionsetField {
return $this;
}
/**
* Save the current value of this CheckboxSetField into a DataObject.
* If the field it is saving to is a has_many or many_many relationship,
@ -228,11 +231,11 @@ class CheckboxSetField extends OptionsetField {
}
}
}
/**
* Return the CheckboxSetField value as a string
* Return the CheckboxSetField value as a string
* selected item keys.
*
*
* @return string
*/
public function dataValue() {
@ -243,30 +246,30 @@ class CheckboxSetField extends OptionsetField {
$filtered[] = str_replace(",", "{comma}", $item);
}
}
return implode(',', $filtered);
}
return '';
}
public function performDisabledTransformation() {
$clone = clone $this;
$clone->setDisabled(true);
return $clone;
}
/**
* Transforms the source data for this CheckboxSetField
* into a comma separated list of values.
*
*
* @return ReadonlyField
*/
public function performReadonlyTransformation() {
$values = '';
$data = array();
$items = $this->value;
if($this->source) {
foreach($this->source as $source) {
@ -275,7 +278,7 @@ class CheckboxSetField extends OptionsetField {
}
}
}
if($items) {
// Items is a DO Set
if($items instanceof SS_List) {
@ -283,13 +286,13 @@ class CheckboxSetField extends OptionsetField {
$data[] = $item->Title;
}
if($data) $values = implode(', ', $data);
// Items is an array or single piece of string (including comma seperated string)
} else {
if(!is_array($items)) {
$items = preg_split('/ *, */', trim($items));
}
foreach($items as $item) {
if(is_array($item)) {
$data[] = $item['Title'];
@ -301,23 +304,23 @@ class CheckboxSetField extends OptionsetField {
$data[] = $item;
}
}
$values = implode(', ', $data);
}
}
$field = $this->castedCopy('ReadonlyField');
$field->setValue($values);
return $field;
}
public function Type() {
return 'optionset checkboxset';
}
public function ExtraOptions() {
return FormField::ExtraOptions();
}
}

View File

@ -1,13 +1,13 @@
<?php
/**
* Set of radio buttons designed to emulate a dropdown.
*
* This field allows you to ensure that a form element is submitted is not optional and is part of a fixed set of
* data. This field uses the input type of radio. It's a direct subclass of {@link DropdownField},
*
* This field allows you to ensure that a form element is submitted is not optional and is part of a fixed set of
* data. This field uses the input type of radio. It's a direct subclass of {@link DropdownField},
* so the constructor and arguments are in the same format.
*
*
* <b>Usage</b>
*
*
* <code>
* new OptionsetField(
* $name = "Foobar",
@ -22,15 +22,15 @@
* $value = "1"
* );
* </code>
*
* You can use the helper functions on data object set to create the source array. eg:
*
*
* You can use the helper functions on data object set to create the source array. eg:
*
* <code>
* //Database request for the object
* $map = FooBar::get()->map();
* // returns an SS_Map object containing an array of ID => Title
*
* // Instantiate the OptionsetField
* // Instantiate the OptionsetField
* $FieldList = new FieldList(
* new OptionsetField(
* $name = "Foobar",
@ -42,16 +42,16 @@
*
* // Pass the fields to the form constructor. etc
* </code>
*
*
* @see CheckboxSetField for multiple selections through checkboxes instead.
* @see DropdownField for a simple <select> field with a single element.
* @see TreeDropdownField for a rich and customizeable UI that can visualize a tree of selectable elements
*
*
* @package forms
* @subpackage fields-basic
*/
class OptionsetField extends DropdownField {
/**
* @var Array
*/
@ -61,14 +61,19 @@ class OptionsetField extends DropdownField {
$source = $this->getSource();
$odd = 0;
$options = array();
if($source) {
foreach($source as $value => $title) {
// Ensure $title is safely cast
if ( !($title instanceof DBField) ) {
$title = DBField::create_field('Text', $title);
}
$itemID = $this->ID() . '_' . preg_replace('/[^a-zA-Z0-9]/', '', $value);
$odd = ($odd + 1) % 2;
$extraClass = $odd ? 'odd' : 'even';
$extraClass .= ' val' . preg_replace('/[^a-zA-Z0-9\-\_]/', '_', $value);
$options[] = new ArrayData(array(
'ID' => $itemID,
'Class' => $extraClass,
@ -95,28 +100,28 @@ class OptionsetField extends DropdownField {
$field = $this->castedCopy('LookupField');
$field->setSource($this->getSource());
$field->setReadonly(true);
return $field;
}
/**
* Mark certain elements as disabled,
* regardless of the {@link setDisabled()} settings.
*
*
* @param array $items Collection of array keys, as defined in the $source array
*/
public function setDisabledItems($items) {
$this->disabledItems = $items;
return $this;
}
/**
* @return Array
*/
public function getDisabledItems() {
return $this->disabledItems;
}
public function ExtraOptions() {
return new ArrayList();
}

49
javascript/lang/hr.js Normal file
View File

@ -0,0 +1,49 @@
// This file was generated by silverstripe/cow from javascript/lang/src/hr.js.
// See https://github.com/tractorcow/cow for details
if (typeof(ss) === 'undefined' || typeof(ss.i18n) === 'undefined') {
if (typeof(console) !== 'undefined') { // eslint-disable-line no-console
console.error('Class ss.i18n not defined'); // eslint-disable-line no-console
}
} else {
ss.i18n.addDictionary('hr', {
"FILEIFRAMEFIELD.CONFIRMDELETE": "Jeste li sigurni da želite obrisati ovu datoteku?",
"FILEIFRAMEFIELD.DELETEFILE": "Obriši datoteku",
"FILEIFRAMEFIELD.DELETEIMAGE": "Obriši sliku",
"FILEIFRAMEFIELD.UNATTACHFILE": "Un-Attach File",
"GRIDFIELD.ERRORINTRANSACTION": "An error occured while fetching data from the server\n Please try again later.",
"HASMANYFILEFIELD.UPLOADING": "Prebacujem... %s",
"HtmlEditorField.SelectAnchor": "Odaberite sidro",
"LOADING": "učitavam...",
"LeftAndMain.IncompatBrowserWarning": "Vaš browser nije kompatibilan s CMS sučeljem. Molimo koristite Internet Explorer 7+, Google Chrome 10+ ili Mozilla Firefox 3.5+.",
"RESTRICTEDTEXTFIELD.CHARCANTBEUSED": "The character '%s' cannot be used in this field",
"TABLEFIELD.DELETECONFIRMMESSAGE": "Are you sure you want to delete this record?",
"TreeDropdownField.ENTERTOSEARCH": "Press enter to search",
"TreeDropdownField.FieldTitle": "Odaberi",
"TreeDropdownField.OpenLink": "Otvori",
"TreeDropdownField.SearchFieldTitle": "Odaberi ili traži",
"UNIQUEFIELD.CANNOTLEAVEEMPTY": "Ovo polje ne može biti prazno",
"UNIQUEFIELD.ENTERNEWVALUE": "Morate unesti novu vrijednost za ovo polje",
"UNIQUEFIELD.SUGGESTED": "Promjenjene vrijednosti u '%s' : %s",
"UPDATEURL.CONFIRM": "Would you like me to change the URL to:\n\n%s/\n\nClick Ok to change the URL, click Cancel to leave it as:\n\n%s",
"UPDATEURL.CONFIRMURLCHANGED": "The URL has been changed to\n'%s'",
"UploadField.ConfirmDelete": "Are you sure you want to remove this file from the server filesystem?",
"UploadField.EMPTYRESULT": "Empty file upload result",
"UploadField.Editing": "Uređujem...",
"UploadField.HTML_MAXFILESIZE": "File exceeds MAX_FILE_SIZE (HTML form directive)",
"UploadField.INVALIDEXTENSION": "Extension is not allowed",
"UploadField.LOADING": "Učitavam ...",
"UploadField.MAXNUMBEROFFILESSIMPLE": "Maksimalan broj datoteka premašen",
"UploadField.NOFILEUPLOADED": "Datoteka nije uploadana",
"UploadField.NOTMPFOLDER": "Nedostaje privremeni direktorij",
"UploadField.ONLYPARTIALUPLOADED": "Datoteka je djelimično uploadana",
"UploadField.OVERWRITEWARNING": "File with the same name already exists",
"UploadField.PHP_MAXFILESIZE": "File exceeds upload_max_filesize (php.ini directive)",
"UploadField.STOPEDBYEXTENSION": "File upload stopped by extension",
"UploadField.TOOLARGE": "Veličina datoteke je prevelika",
"UploadField.TOOSMALL": "Veličina datoteke je premala",
"UploadField.UPLOADEDBYTES": "Uploaded bytes exceed file size",
"UploadField.Uploaded": "Prenešeno",
"UploadField.WRITEFAILED": "Failed to write file to disk",
"VALIDATOR.FIELDREQUIRED": "Please fill out \"%s\", it is required."
});
}

41
javascript/lang/src/hr.js Normal file
View File

@ -0,0 +1,41 @@
{
"FILEIFRAMEFIELD.CONFIRMDELETE": "Jeste li sigurni da želite obrisati ovu datoteku?",
"FILEIFRAMEFIELD.DELETEFILE": "Obriši datoteku",
"FILEIFRAMEFIELD.DELETEIMAGE": "Obriši sliku",
"FILEIFRAMEFIELD.UNATTACHFILE": "Un-Attach File",
"GRIDFIELD.ERRORINTRANSACTION": "An error occured while fetching data from the server\n Please try again later.",
"HASMANYFILEFIELD.UPLOADING": "Prebacujem... %s",
"HtmlEditorField.SelectAnchor": "Odaberite sidro",
"LOADING": "učitavam...",
"LeftAndMain.IncompatBrowserWarning": "Vaš browser nije kompatibilan s CMS sučeljem. Molimo koristite Internet Explorer 7+, Google Chrome 10+ ili Mozilla Firefox 3.5+.",
"RESTRICTEDTEXTFIELD.CHARCANTBEUSED": "The character '%s' cannot be used in this field",
"TABLEFIELD.DELETECONFIRMMESSAGE": "Are you sure you want to delete this record?",
"TreeDropdownField.ENTERTOSEARCH": "Press enter to search",
"TreeDropdownField.FieldTitle": "Odaberi",
"TreeDropdownField.OpenLink": "Otvori",
"TreeDropdownField.SearchFieldTitle": "Odaberi ili traži",
"UNIQUEFIELD.CANNOTLEAVEEMPTY": "Ovo polje ne može biti prazno",
"UNIQUEFIELD.ENTERNEWVALUE": "Morate unesti novu vrijednost za ovo polje",
"UNIQUEFIELD.SUGGESTED": "Promjenjene vrijednosti u '%s' : %s",
"UPDATEURL.CONFIRM": "Would you like me to change the URL to:\n\n%s/\n\nClick Ok to change the URL, click Cancel to leave it as:\n\n%s",
"UPDATEURL.CONFIRMURLCHANGED": "The URL has been changed to\n'%s'",
"UploadField.ConfirmDelete": "Are you sure you want to remove this file from the server filesystem?",
"UploadField.EMPTYRESULT": "Empty file upload result",
"UploadField.Editing": "Uređujem...",
"UploadField.HTML_MAXFILESIZE": "File exceeds MAX_FILE_SIZE (HTML form directive)",
"UploadField.INVALIDEXTENSION": "Extension is not allowed",
"UploadField.LOADING": "Učitavam ...",
"UploadField.MAXNUMBEROFFILESSIMPLE": "Maksimalan broj datoteka premašen",
"UploadField.NOFILEUPLOADED": "Datoteka nije uploadana",
"UploadField.NOTMPFOLDER": "Nedostaje privremeni direktorij",
"UploadField.ONLYPARTIALUPLOADED": "Datoteka je djelimično uploadana",
"UploadField.OVERWRITEWARNING": "File with the same name already exists",
"UploadField.PHP_MAXFILESIZE": "File exceeds upload_max_filesize (php.ini directive)",
"UploadField.STOPEDBYEXTENSION": "File upload stopped by extension",
"UploadField.TOOLARGE": "Veličina datoteke je prevelika",
"UploadField.TOOSMALL": "Veličina datoteke je premala",
"UploadField.UPLOADEDBYTES": "Uploaded bytes exceed file size",
"UploadField.Uploaded": "Prenešeno",
"UploadField.WRITEFAILED": "Failed to write file to disk",
"VALIDATOR.FIELDREQUIRED": "Please fill out \"%s\", it is required."
}

View File

@ -7,38 +7,96 @@ hr:
DIM: Dimenzije
FILENAME: Naziv datoteke
FOLDER: Direktorij
HEIGHT: Visina
LASTEDIT: 'Zadnja promjena'
OWNER: Vlasnik
SIZE: 'Veličina datoteke'
TITLE: Naslov
TYPE: 'Tip datoteke'
URL: Link
WIDTH: Širina
AssetUploadField:
ChooseFiles: 'Odaberite datoteke'
DRAGFILESHERE: 'Povucite datoteke ovdje'
DROPAREA: 'Područje ubacivanja'
EDITALL: 'Uredi sve'
EDITANDORGANIZE: 'Uredi i organiziraj'
EDITINFO: 'Uredi datoteke'
FILES: Datoteke
FROMCOMPUTER: 'Odaberite datoteke sa svog računala'
FROMCOMPUTERINFO: 'Uploadajte sa svog računala'
INSERTURL: 'Ubaci sa linka'
REMOVEINFO: 'Izbrišite ovu datoteku s ovog polja'
TOTAL: Ukupno
TOUPLOAD: 'Odaberite datoteke za upload...'
UPLOADINPROGRESS: 'Molim pričekajte... upload u tijeku'
UPLOADOR: ILI
BBCodeParser:
ALIGNEMENT: Poravnanje
BOLD: 'Bold Text'
BOLDEXAMPLE: Bold
BackLink_Button_ss:
Back: Nazad
BasicAuth:
ENTERINFO: 'Unesite korisničko ime i lozinu'
ERRORNOTADMIN: 'Korisnik nije administrator'
ERRORNOTREC: 'Korisničko ime / lozinka nije prepoznata'
Boolean:
ANY: Bilo koji
NOANSWER: 'Ne'
YESANSWER: 'Da'
CAMPAIGNS:
ADDTOCAMPAIGN: 'Dodaj kampanji'
CMSLoadingScreen_ss:
LOADING: učitavam...
CMSMain:
SAVE: Snimi
CMSMemberLoginForm:
BUTTONFORGOTPASSWORD: 'Zaboravljena lozinka?'
CMSPagesController_Tools_ss:
FILTER: Filter
CMSProfileController:
MENUTITLE: 'Moj profil'
CMSSecurity:
SUCCESS: Uspjeh
TimedOutTitleAnonymous: 'Vaša sesija je istekla.'
TimedOutTitleMember: 'Bok {name}!<br />Vaša sesija je istekla.'
CampaignAdmin:
MENUTITLE: Kampanje
Campaigns:
AddToCampaign: 'Dodaj kampanji'
ChangePasswordEmail_ss:
CHANGEPASSWORDTEXT1: 'Promjenili ste lozinku za '
CHANGEPASSWORDTEXT2: 'Za prijavu koristite slijedeće podatke'
CHANGEPASSWORDTEXT3: 'Promjeni lozinku'
EMAIL: Email
HELLO: Pozdrav
PASSWORD: Lozinka
ChangeSet:
DESCRIPTION_AND: '{first} i {second}'
DESCRIPTION_ITEM: stavka
DESCRIPTION_ITEMS: stavke
DESCRIPTION_LIST_FIRST: '{item}'
DESCRIPTION_LIST_LAST: '{list}, i {item}'
DESCRIPTION_LIST_MID: '{list}, {item}'
DESCRIPTION_OTHER_ITEM: 'ostala stavka'
DESCRIPTION_OTHER_ITEMS: 'ostale stavke'
NAME: Naziv
PLURALNAME: Kampanje
SINGULARNAME: Kampanja
STATE: Stanje
CheckboxField:
NOANSWER: 'Ne'
YESANSWER: 'Da'
ConfirmedPasswordField:
SHOWONCLICKTITLE: 'Promjenite lozinku'
CreditCardField:
FIRST: prvi
FOURTH: četvrti
SECOND: drugi
THIRD: treći
CurrencyField:
CURRENCYSYMBOL: $
DataObject:
PLURALNAME: 'Podatkovni objekti'
SINGULARNAME: 'Podatkovni objekt'
@ -70,9 +128,37 @@ hr:
CHOOSE: (Odaberite)
EmailField:
VALIDATION: 'Molimo unesite email adresu'
Enum:
ANY: bilo koji
File:
AviType: 'AVI video datoteka'
Content: Sadržaj
CssType: 'CSS datoteka'
DocType: 'Word dokument'
Filename: Naziv datoteke
GifType: 'GIF slika - dobra za dijagrame'
GzType: 'GZIP komprimirana datoteka'
HtlType: 'HTML datoteka'
HtmlType: 'HTML datoteka'
INVALIDEXTENSION: 'Ekstenzija nije dozvoljena (valjane: {extensions}) '
INVALIDEXTENSIONSHORT: 'Ekstenzija nije dozvoljena'
IcoType: 'Slika ikone'
JpgType: 'JPEG slika - dobra za fotografije'
JsType: 'Javascript datoteka'
Mp3Type: 'MP3 zvuk datoteka'
MpgType: 'MPEG video datoteka'
NOVALIDUPLOAD: 'Datoteka nije valjan upload'
Name: Naziv
PLURALNAME: Datoteke
PngType: 'PNG slika - dobar generalan format'
SINGULARNAME: Datoteka
Title: Naslov
WavType: 'WAV zvuk datoteka'
XlsType: 'Excel tablica'
ZipType: 'ZIP komprimirana datoteka'
Folder:
PLURALNAME: Direktoriji
SINGULARNAME: Direktorij
ForgotPasswordEmail_ss:
HELLO: Pozdrav
TEXT1: 'Ovdje je Vaš'
@ -83,22 +169,72 @@ hr:
VALIDATIONNOTUNIQUE: 'Unešena vrijednost nije unikatna'
VALIDATIONPASSWORDSDONTMATCH: 'Lozinke se ne slažu'
VALIDATIONPASSWORDSNOTEMPTY: 'Lozinke moraju imati najmanje jedan broj i jedan alfanumerički znak'
FormField:
NONE: nijedan
GridAction:
DELETE_DESCRIPTION: Obriši
Delete: Obriši
GridField:
Add: 'Dodaj {name}'
Filter: Filter
FilterBy: 'Filtriraj po'
Find: Pronađi
GridFieldDetailForm:
CancelBtn: Odustani
Create: Kreiraj
Delete: Obriši
DeletePermissionsFailure: 'Nema dozvole brisanja'
Deleted: 'Obrisano %s %s'
Save: Spremi
Saved: 'Spremljeno {name} {link}'
GridFieldEditButton_ss:
EDIT: Uredi
GridFieldItemEditView:
Go_back: 'Idi nazad'
Group:
Code: 'Krupni kod'
DefaultGroupTitleAdministrators: Administratori
DefaultGroupTitleContentAuthors: 'Autori sadržaja'
Description: Opis
Locked: 'Zaključano?'
PLURALNAME: Grupe
Parent: 'Roditeljska grupa'
SINGULARNAME: Grupa
has_many_Permissions: Dozvole
many_many_Members: Članovi
HTMLEditorField:
ANCHORVALUE: Sidro
FILE: Datoteka
FOLDER: Direktorij
IMAGEDIMENSIONS: Dimenzije
IMAGEHEIGHTPX: Visina
IMAGEWIDTHPX: Širina
LINK: 'Ubaci vezu'
LINKFILE: 'Preuzmi datoteku'
LINKINTERNAL: 'Stranica na ovom webu'
LINKOPENNEWWIN: 'Otvori link u novom prozoru?'
LINKTO: 'Poveži na'
PAGE: Stranica
URL: Link
HtmlEditorField:
ANCHORVALUE: Sidro
BUTTONADDURL: 'Dodaj link'
BUTTONINSERT: Ubaci
BUTTONINSERTLINK: 'Ubaci vezu'
BUTTONREMOVELINK: 'Obriši vezu'
BUTTONUpdate: Ažuriraj
CSSCLASS: 'Poravnanje / Stil'
CSSCLASSCENTER: 'Centralno'
CSSCLASSLEFT: 'Lijevo, sa okruženjem teksta.'
CSSCLASSRIGHT: 'Desno, sa okruženjem teksta'
DETAILS: Detalji
EMAIL: 'Email adresa'
FILE: Datoteka
FOLDER: Direktorij
FROMCOMPUTER: 'Sa računala'
FROMWEB: 'Sa weba'
FindInFolder: 'Pronađi u direktoriju'
IMAGEALT: 'Alternativni tekst (alt)'
IMAGEDIMENSIONS: Dimenzije
IMAGEHEIGHTPX: Visina
IMAGEWIDTHPX: Širina
@ -111,18 +247,45 @@ hr:
LINKOPENNEWWIN: 'Otvori vezu (link) u novom prozoru?'
LINKTO: 'Poveži na'
PAGE: Stranica
Image:
PLURALNAME: Datoteke
SINGULARNAME: Datoteka
Image_Cached:
PLURALNAME: Datoteke
SINGULARNAME: Datoteka
Image_iframe_ss:
TITLE: 'Iframe za upload slike'
LeftAndMain:
CANCEL: Odustani
DELETED: Obrisano.
HELP: Pomoć
PERMAGAIN: 'Odjavili ste se sa sustava. Želite li se ponovno prijaviti upišite korisničko ime i lozinku.'
PreviewButton: Pregled
SAVEDUP: Spremljeno
ValidationError: 'Greška validacije'
VersionUnknown: nepoznato
LeftAndMain_Menu_ss:
Hello: Pozdrav
LOGOUT: 'Odjava'
LoginAttempt:
Email: 'Email adresa'
IP: 'IP adresa'
Status: Status
Member:
ADDGROUP: 'Dodaj grupu'
BUTTONCHANGEPASSWORD: 'Promjeni lozinku'
BUTTONLOGIN: 'Prijava'
BUTTONLOGINOTHER: 'Prijavite se kao netko drugi'
BUTTONLOSTPASSWORD: 'Zaboravljena lozinka?'
CANTEDIT: 'Nema prava za to'
CONFIRMNEWPASSWORD: 'Potvrdite novu lozinku'
CONFIRMPASSWORD: 'Potvrdi lozinku'
CURRENT_PASSWORD: 'Trenutna lozinka'
DATEFORMAT: 'Format datuma'
DefaultAdminFirstname: 'Zadani administrator'
DefaultDateTime: zadano
EDIT_PASSWORD: 'Nova lozinka'
EMAIL: Email
ERRORNEWPASSWORD: 'Pogrešno ste upisali novu lozinku, pokušajte ponovno.'
ERRORPASSWORDNOTMATCH: 'Vaša trenutna lozinka se ne podudara, probajte ponovno'
FIRSTNAME: 'Ime'
@ -136,10 +299,43 @@ hr:
SURNAME: Prezime
YOUROLDPASSWORD: 'Stara lozinka'
belongs_many_many_Groups: Grupe
db_LastVisited: 'Datum zadnje posjete'
db_LockedOutUntil: 'Zaključano do'
db_Password: Lozinka
db_PasswordExpiry: 'Lozinka ističe'
MemberAuthenticator:
TITLE: 'E-mail &amp; Lozinka'
MemberDatetimeOptionsetField:
Preview: Pregled
ModelAdmin:
IMPORT: 'Uvezi iz CSV'
IMPORTEDRECORDS: 'Uveženo {count} zapisa.'
NOCSVFILE: 'Molimo pretražite CSV datoteku za uvoz'
NOIMPORT: 'Ništa za uvoz'
RESET: Resetiraj
Title: 'Klasa podataka'
UPDATEDRECORDS: 'Osvježeno {count} zapisa.'
ModelAdmin_Tools_ss:
FILTER: Filter
IMPORT: Uvoz
ModelSidebar_ss:
IMPORT_TAB_HEADER: Uvoz
SEARCHLISTINGS: Traži
MoneyField:
FIELDLABELCURRENCY: Valuta
Pagination:
Page: Stranica
View: Pregled
Permission:
AdminGroup: Administrator
CMS_ACCESS_CATEGORY: 'CMS pristup'
FULLADMINRIGHTS: 'Puna administrativna prava'
PLURALNAME: Dozvole
SINGULARNAME: Dozvola
PermissionRole:
PLURALNAME: Uloge
SINGULARNAME: Uloga
Title: Naslov
PhoneNumberField:
VALIDATION: 'Molim unesite ispravan telefonski broj'
Security:
@ -154,11 +350,37 @@ hr:
NOTEPAGESECURED: 'Ova stranica je zaštićena. Prijavite se na sustav sa svojim pristupnim podatcima i odmah ćemo vas preusmjeriti.'
NOTERESETPASSWORD: 'Unesite svoju e-mail adresu, a mi ćemo Vam poslati link putem kojega možete resetirati Vašu lozinku.'
SecurityAdmin:
MEMBERS: Članovi
MENUTITLE: Sigurnost
NEWGROUP: 'Nova Grupa'
PERMISSIONS: Dozvole
ROLES: Uloge
TABROLES: Uloge
Users: Korisnici
SilverStripeNavigator:
Auto: Aut
Edit: Uredi
EditView: 'Mod uređivanja'
Width: širina
SiteTree:
TABMAIN: Osnovno
TableListField:
Print: Ispiši
TableListField_PageControls_ss:
OF: od
ToggleField:
LESS: manje
MORE: više
UploadField:
ATTACHFILE: 'Dodaj datoteku'
ATTACHFILES: 'Dodaj datoteke'
AttachFile: 'Dodaj datoteku(e)'
CHOOSEANOTHERFILE: 'Odaberi drugu datoteku'
DELETE: 'Obriši iz datoteka'
DOEDIT: Snimi
EDIT: Uredi
EDITINFO: 'Uredi ovu datoteku'
FROMCOMPUTER: 'Sa računala'
REMOVE: Ukloni
Versioned:
has_many_Versions: Verzije

View File

@ -1,5 +1,12 @@
id_ID:
AddToCampaign:
ErrorCampaignPermissionDenied: 'Sepertinya Anda tidak memiliki ijin yang diperlukan untuk menambahkan {ObjectTitle} ke {CampaignTitle}'
ErrorGeneral: 'Mohon maaf, ada kesalahan'
ErrorNotFound: '{Type} tidak ditemukan'
Success: 'Berhasil menambahkan {ObjectTitle} ke {CampaignTitle}'
AssetAdmin:
ALLOWEDEXTS: 'Ekstensi berkas yang diperbolehkan'
HIDEALLOWEDEXTS: 'Sembunyikan ekstensi berkas yang diperbolehkan'
NEWFOLDER: FolderBaru
SHOWALLOWEDEXTS: 'Tampilkan ekstensi yang dibolehkan'
AssetTableField:
@ -13,6 +20,7 @@ id_ID:
TITLE: Judul
TYPE: 'Jenis berkas'
URL: URL
WIDTH: Lebar
AssetUploadField:
ChooseFiles: 'Pilih berkas'
DRAGFILESHERE: 'Tarik berkas ke sini'
@ -564,3 +572,6 @@ id_ID:
UPLOADSINTO: 'disimpan ke /{path}'
Versioned:
has_many_Versions: Versi
VersionedGridFieldItemRequest:
ARCHIVE: Arsip
Archived: '%s %s diarsipkan'

View File

@ -1,5 +1,13 @@
ru:
AddToCampaign:
ErrorCampaignPermissionDenied: 'У вас не достаточно прав доступа для добавления {ObjectTitle} в {CampaignTitle}'
ErrorGeneral: 'Произошла ошибка'
ErrorItemPermissionDenied: 'У вас не достаточно прав доступа для добавления {ObjectTitle} к кампании'
ErrorNotFound: '{Type} не обнаружен'
Success: '{ObjectTitle} добавлен в {CampaignTitle}'
AssetAdmin:
ALLOWEDEXTS: 'Разрешённые расширения файлов для загрузки'
HIDEALLOWEDEXTS: 'Скрыть разрешенные расширения'
NEWFOLDER: Новая папка
SHOWALLOWEDEXTS: 'Показать допустимые расширения'
AssetTableField:
@ -7,12 +15,14 @@ ru:
DIM: Размеры
FILENAME: Имя файла
FOLDER: Папка
HEIGHT: Высота
LASTEDIT: 'Последнее изменение'
OWNER: Владелец
SIZE: 'Размер'
TITLE: Название
TYPE: 'Тип'
URL: URL
WIDTH: Ширина
AssetUploadField:
ChooseFiles: 'Выберите файлы'
DRAGFILESHERE: 'Перетащите файлы сюда'
@ -23,7 +33,10 @@ ru:
FILES: Файлы
FROMCOMPUTER: 'Выберите файлы с диска вашего компьютера'
FROMCOMPUTERINFO: 'Загрузить с диска вашего компьютера'
INSERTURL: 'Вставить ссылку'
REMOVEINFO: 'Удалить этот файл из поля'
TOTAL: Всего
TOUPLOAD: 'Выберите файлы для загрузки ...'
UPLOADINPROGRESS: 'Идет загрузка... Пожалуйста, подождите'
UPLOADOR: ИЛИ
BBCodeParser:
@ -59,6 +72,10 @@ ru:
ERRORNOTREC: 'Такое имя пользователя или пароль не существует'
Boolean:
ANY: Все
NOANSWER: 'Нет'
YESANSWER: 'Да'
CAMPAIGNS:
ADDTOCAMPAIGN: 'Добавить в кампанию'
CMSLoadingScreen_ss:
LOADING: Идет загрузка...
REQUIREJS: 'Для работы с CMS у вас должен быть включен JavaScript.'
@ -67,22 +84,69 @@ ru:
ACCESSALLINTERFACES: 'Доступ ко всему интерфейсу CMS'
ACCESSALLINTERFACESHELP: 'Отменяет индивидуальные настройки прав доступа.'
SAVE: Сохранить
CMSMemberLoginForm:
BUTTONFORGOTPASSWORD: 'Забыли пароль?'
BUTTONLOGIN: 'Вход'
BUTTONLOGOUT: 'Выход'
PASSWORDEXPIRED: '<p>Время действия вашего пароля истекло. <a target="_top" href="{link}">Установите новый пароль.</a></p>'
CMSPageHistoryController_versions_ss:
PREVIEW: 'Предварительный просмотр сайта'
CMSPagesController_Tools_ss:
FILTER: Фильтр
CMSProfileController:
MENUTITLE: 'Мой профиль'
CMSSecurity:
INVALIDUSER: '<p>Неправильный пользователь. <a target="_top" href="{link}">Войдите заново в систему</a> чтобы продолжить.</p>'
LoginMessage: '<p>Если у вас есть что-либо несохраненное вы можете вернуться к этому войдя в систему заново с помощью формы ниже.</p>'
SUCCESS: Готово
SUCCESSCONTENT: '<p>Вы вошли в систему. Если вы не были автоматически перенаправлены <a target="_top" href="{link}">нажмите здесь</a></p>'
TimedOutTitleAnonymous: 'Время вашего сеанса истекло.'
TimedOutTitleMember: '{name}!<br />Время вашего сеанса истекло.'
CampaignAdmin:
MENUTITLE: Кампании
Campaigns:
AddToCampaign: 'Добавить в кампанию'
ChangePasswordEmail_ss:
CHANGEPASSWORDFOREMAIL: 'Пароль для регистрации с Email адресом {email} был изменён. Если вы его не меняли установите новый перейдя по ссылке ниже'
CHANGEPASSWORDTEXT1: 'Вы изменили свой пароль на'
CHANGEPASSWORDTEXT2: 'Для того, чтобы войти, используйте сейчас следующие учетные данные:'
CHANGEPASSWORDTEXT3: 'Изменить пароль'
EMAIL: Email
HELLO: Здравствуйте
PASSWORD: Пароль
ChangeSet:
DESCRIPTION_AND: '{first} и {second}'
DESCRIPTION_ITEM: элемент
DESCRIPTION_ITEMS: элементы
DESCRIPTION_LIST_FIRST: '{item}'
DESCRIPTION_LIST_LAST: '{list}, и {item}'
DESCRIPTION_LIST_MID: '{list}, {item}'
DESCRIPTION_OTHER_ITEM: 'другой элемент'
DESCRIPTION_OTHER_ITEMS: 'другие элементы'
NAME: Название
PLURALNAME: Кампании
SINGULARNAME: Кампания
STATE: Статус
ChangeSetItem:
PLURALNAME: 'Изменить набор элементов'
SINGULARNAME: 'Изменить элемент'
CheckboxField:
NOANSWER: 'Нет'
YESANSWER: 'Да'
CheckboxFieldSetField:
SOURCE_VALIDATION: 'Выберите значение из списка. Ошибочно указано значение: {value}'
CheckboxSetField:
SOURCE_VALIDATION: 'Выберите значение из списка. Ошибочно указано значение: ''{value}'''
ConfirmedPasswordField:
ATLEAST: 'Пароль должен быть не короче {min} символов.'
BETWEEN: 'Пароль должен иметь длину от {min} до {max} символов.'
CURRENT_PASSWORD_ERROR: 'Неправильно введён текущий пароль.'
CURRENT_PASSWORD_MISSING: 'Вы должны указать Ваш текущий пароль.'
LOGGED_IN_ERROR: 'Вы должны войти в систему, чтобы изменить Ваш пароль.'
MAXIMUM: 'Пароль должен быть не длиннее {max} символов.'
SHOWONCLICKTITLE: 'Изменить пароль'
ContentController:
DRAFT_SITE_ACCESS_RESTRICTION: 'Для просмотра чернового или архивного содержимого вам необходимо войти в систему со своим именем пользователя и паролем. <a href="%s">Щелкните здесь, чтобы вернуться на опубликованный сайт.</a>'
NOTLOGGEDIN: 'Не выполнен вход в систему'
CreditCardField:
FIRST: первая
@ -122,6 +186,8 @@ ru:
INVALID_REQUEST: 'Неверный запрос'
DropdownField:
CHOOSE: (Выберите)
CHOOSESEARCH: '(Выбрать или найти)'
SOURCE_VALIDATION: 'Выберите значение из списка. Ошибочно указано значение: {value}'
EmailField:
VALIDATION: 'Пожалуйста, задайте адрес email.'
Enum:
@ -167,6 +233,7 @@ ru:
TEXT3: для
Form:
CSRF_EXPIRED_MESSAGE: 'Срок действия сеанса истек. Пожалуйста, отправьте данные формы еще раз.'
CSRF_FAILED_MESSAGE: 'Произошла техническая ошибка. Нажмите кнопку "Назад", обновите страницу в браузере и повторите попытку.'
FIELDISREQUIRED: 'Поле {$name} является обязательным'
SubmitBtnLabel: Выбрать
VALIDATIONCREDITNUMBER: 'Пожалуйста, убедитесь, что номер кредитной карты {number} задан правильно'
@ -220,6 +287,7 @@ ru:
DefaultGroupTitleContentAuthors: 'Авторы содержимого'
Description: Описание
GroupReminder: 'При назначении группы верхнего уровня все роли будут переняты из нее'
HierarchyPermsError: 'У Вас недостаточно прав для назначения родительской группы "%s" (необходимы права администратора)'
Locked: 'Блокировано?'
NoRoles: 'Ролей не найдено'
PLURALNAME: Группы
@ -231,14 +299,64 @@ ru:
many_many_Members: Члены группы
GroupImportForm:
Help1: '<p>Импорт одной или нескольких групп в формате <em>CSV</em> (comma-separated values). <small><a href="#" class="toggle-advanced">Подробные сведения</a></small></p>'
Help2: "<div class=\"advanced\">\n<h4>Расширенное использование</h4>\n<ul>\n<li>Разрешенные столбцы: <em>%s</em></li>\n<li>Существующие пользователи сверяются c уникальным атрибутом <em>Code</em>, после чего в записи вносятся новые значения из \nимпортированного файла.</li>\n<li>Назначение групп производится с помощью столбца <em>Groups</em>. Группы идентифицируются по атрибуту <em>Code</em>, \nотдельные группы разделяются запятой. Если участник входит в какую-либо группу, это свойство не обнуляется.</li>\n</ul>\n</div>"
ResultCreated: 'Создано {count} групп'
ResultDeleted: 'Удалено %d групп'
ResultUpdated: 'Обновлено %d групп'
HTMLEditorField:
ANCHORSCANNOTACCESSPAGE: 'У Вас недостаточно прав для доступа к содержимому данной страницы.'
ANCHORSPAGENOTFOUND: 'Страница не найдена.'
ANCHORVALUE: Якорь
BUTTONADDURL: 'Добавить ссылку'
CAPTIONTEXT: 'Текст подписи'
CSSCLASS: 'Выравнивание/Стиль'
CSSCLASSCENTER: 'По центру без текста по бокам'
CSSCLASSLEFT: 'Слева с обтеканием текста'
CSSCLASSLEFTALONE: 'Независимо слева.'
CSSCLASSRIGHT: 'Справа с обтеканием текста'
DETAILS: Подробности
EMAIL: 'Email'
FILE: Файл
FOLDER: Папка
IMAGEALT: 'Альтернативный текст (alt)'
IMAGEALTTEXT: 'Альтернативный текст (alt) - показывается, если изображение недоступно'
IMAGEALTTEXTDESC: 'Отображается если в браузере отключены изображения или если изображение недоступно'
IMAGEDIMENSIONS: Размеры
IMAGEHEIGHTPX: Высота
IMAGETITLE: 'Текст (всплывающая подсказка) - для дополнительной информации об изображении'
IMAGETITLETEXT: 'Текст (всплывающая подсказка)'
IMAGETITLETEXTDESC: 'Для дополнительных сведений об изображении'
IMAGEWIDTHPX: Ширина
INSERTMEDIA: 'Вставить медиафайл'
LINK: 'Вставить ссылку'
LINKANCHOR: 'Якорь на этой странице'
LINKDESCR: 'Описание ссылки'
LINKEMAIL: 'Email'
LINKEXTERNAL: 'Другой сайт'
LINKFILE: 'Скачивание файла'
LINKINTERNAL: 'Страницу данного сайта'
LINKOPENNEWWIN: 'Открыть ссылку в новом окне?'
LINKTO: 'Ссылка на'
PAGE: Страница
SUBJECT: 'Тема Email письма'
URL: Ссылка
URLDESCRIPTION: 'Добавляйте видео и изображения из интернета просто введя нужный адрес. Убедитесь что у вас есть права на размещение данных файлов.<br /><br />Внимание: файлы не будут загружены на ваш сервер и если файл будет не доступен по указанному адресу то он так же будет не доступен на вашей странице.'
URLNOTANOEMBEDRESOURCE: 'Данная ссылка ''{url}'' не может быть использована для добавления медиа.'
UpdateMEDIA: 'Обновить медиа'
HTMLEditorField_Toolbar:
ERROR_ABSOLUTE: 'Только абсолютные (http://,https://) ссылки могут быть использованы'
ERROR_HOSTNAME: 'Данный адрес недоступен'
ERROR_ID: 'Необходимо указать "ID" или "FileURL" - ссылку на файл для идентификации файла'
ERROR_NOTFOUND: 'Файл не обнаружен'
ERROR_OEMBED_REMOTE: 'Доступны только файлы по ссылке'
ERROR_SCHEME: 'Данный тип файла не поддерживается'
Hierarchy:
InfiniteLoopNotAllowed: 'Обнаружен бесконечный цикл в иерархической структуре "{type}". Для исправления ошибки измените страницу, находящуюся уровнем выше'
HtmlEditorField:
ADDURL: 'Добавить URL'
ADJUSTDETAILSDIMENSIONS: 'Дополнительные сведения и размеры'
ANCHORSCANNOTACCESSPAGE: 'У Вас недостаточно прав для доступа к содержимому данной страницы.'
ANCHORSPAGENOTFOUND: 'Страница не найдена.'
ANCHORVALUE: Якорь
BUTTONADDURL: 'Добавить URL'
BUTTONINSERT: Вставить
@ -266,6 +384,7 @@ ru:
IMAGETITLETEXT: 'Текст (всплывающая подсказка)'
IMAGETITLETEXTDESC: 'Для дополнительных сведений об изображении'
IMAGEWIDTHPX: Ширина
INSERTMEDIA: 'Вставить медиафайл'
LINK: 'Ссылка'
LINKANCHOR: 'Якорь на этой странице'
LINKDESCR: 'Описание ссылки'
@ -276,8 +395,11 @@ ru:
LINKOPENNEWWIN: 'Открыть ссылку в новом окне?'
LINKTO: 'Ссылка на'
PAGE: Страница
SUBJECT: 'Тема Email письма'
URL: URL
URLDESCRIPTION: 'Добавляйте видео и изображения из интернета просто введя нужный адрес. Убедитесь что у вас есть права на размещение данных файлов.<br /><br />Внимание: файлы не будут загружены на ваш сервер и если файл будет не доступен по указанному адресу то он так же будет не доступен на вашей странице.'
URLNOTANOEMBEDRESOURCE: 'Не удалось преобразовать ссылку ''{url}'' в медиа-ресурс.'
UpdateMEDIA: 'Обновить медиафайл'
Image:
PLURALNAME: Файлы
SINGULARNAME: Файл
@ -287,19 +409,25 @@ ru:
Image_iframe_ss:
TITLE: 'Iframe загрузки изображений'
LeftAndMain:
CANCEL: Отмена
CANT_REORGANISE: 'У вас нет права редактировать страницы верхнего уровня. Изменения не были сохранены.'
DELETED: Удалено.
HELP: Помощь
PERMAGAIN: 'Вы вышли из Системы Управления Сайтом. Если Вы хотите войти снова, введите внизу имя пользователя и пароль.'
PERMALREADY: 'Извините, у вас нет доступа к этому разделу Системы Управления. Если Вы хотите войти под другой учетной записью, сделайте это ниже.'
PERMDEFAULT: 'Вы должны войти в систему для доступа к панели управления сайтом. Введите ваши данные ниже.'
PreviewButton: Просмотр
REORGANISATIONSUCCESSFUL: 'Древесная структура сайта успешно реорганизована.'
SAVEDUP: Сохранено.
ShowAsList: 'в виде списка'
TooManyPages: 'Слишком много страниц'
ValidationError: 'Ошибка проверки'
VersionUnknown: неизвестно
LeftAndMain_Menu_ss:
Hello: Здравствуйте
LOGOUT: 'Выход'
ListboxField:
SOURCE_VALIDATION: 'Выберите значение из списка. Ошибочно указано значение: %s'
LoginAttempt:
Email: 'Email'
IP: 'IP-адрес'
@ -315,9 +443,11 @@ ru:
CANTEDIT: 'У вас недостаточно прав'
CONFIRMNEWPASSWORD: 'Подтвердить новый пароль'
CONFIRMPASSWORD: 'Подтвердить пароль'
CURRENT_PASSWORD: 'Текущий пароль'
DATEFORMAT: 'Формат даты'
DefaultAdminFirstname: 'Администратор по умолчанию '
DefaultDateTime: по умолч.
EDIT_PASSWORD: 'Новый пароль'
EMAIL: Email
EMPTYNEWPASSWORD: 'Поле нового пароля не может быть пустым; пожалуйста, повторите попытку'
ENTEREMAIL: 'Введите email, чтобы получить ссылку на сброс пароля.'
@ -328,11 +458,14 @@ ru:
FIRSTNAME: 'Имя'
INTERFACELANG: 'Язык интерфейса'
INVALIDNEWPASSWORD: 'Недопустимый пароль: {password}'
KEEPMESIGNEDIN: 'Запомните меня'
LOGGEDINAS: 'Вы вошли в систему как {name}.'
NEWPASSWORD: 'Новый пароль'
NoPassword: 'Для этого пользователя не задан пароль.'
PASSWORD: Пароль
PASSWORDEXPIRED: 'Срок действия Вашего пароля истек. Пожалуйста установите новый.'
PLURALNAME: Члены группы
REMEMBERME: 'Запомнить меня?'
SINGULARNAME: Член группы
SUBJECTPASSWORDCHANGED: 'Ваш пароль изменен'
SUBJECTPASSWORDRESET: 'Ссылка для переустановки пароля'
@ -372,6 +505,7 @@ ru:
Toggle: 'Отобразить справку по форматированию'
MemberImportForm:
Help1: '<p>Импорт пользователей в формате <em>CSV</em> (comma-separated values). <small><a href="#" class="toggle-advanced">Подробные сведения</a></small></p>'
Help2: "<div class=\"advanced\">\n<h4>Расширенное использование</h4>\n<ul>\n<li>Разрешенные столбцы: <em>%s</em></li>\n<li>Существующие пользователи сверяются c уникальным атрибутом <em>Code</em>, после чего в записи вносятся новые значения из \nимпортированного файла.</li>\n<li>Назначение групп производится с помощью столбца <em>Groups</em>. Группы идентифицируются по атрибуту <em>Code</em>, \nотдельные группы разделяются запятой. Если участник входит в какую-либо группу, это свойство не обнуляется.</li>\n</ul>\n</div>"
ResultCreated: 'Создано {count} участников'
ResultDeleted: 'Удалено %d участников'
ResultNone: 'Изменений нет'
@ -406,6 +540,8 @@ ru:
MoneyField:
FIELDLABELAMOUNT: Сумма
FIELDLABELCURRENCY: Валюта
MultiSelectField:
SOURCE_VALIDATION: 'Выберите значение из списка. Ошибочно указано значение(я): {value}'
NullableField:
IsNullLabel: 'Недействительно'
NumericField:
@ -435,12 +571,17 @@ ru:
SINGULARNAME: Роль
Title: Название
PermissionRoleCode:
PLURALNAME: 'Код роли доступа'
PermsError: 'У Вас недостаточно прав для назначения родительской группы "%s" (необходимы права администратора)'
SINGULARNAME: 'Код роли доступа'
Permissions:
PERMISSIONS_CATEGORY: 'Роли и права доступа'
UserPermissionsIntro: 'При включении этого пользователя в определенную группу его права доступа будут изменены соответствующим образом. Более подробные сведения о правах доступа для отдельных групп содержатся в разделе "Группы".'
PhoneNumberField:
VALIDATION: 'Пожалуйста, введите верный номер телефона'
RememberLoginHash:
PLURALNAME: 'Сохраненные хэши входов'
SINGULARNAME: 'Сохраненный хэш входа'
Security:
ALREADYLOGGEDIN: 'У Вас нет доступа к этой странице. Если у вас имеется другая учетная запись, имеющая доступ к этой странице, введите ее данные ниже.'
BUTTONSEND: 'Отправить мне ссылку переустановки пароля'
@ -499,6 +640,8 @@ ru:
Print: Печать
TableListField_PageControls_ss:
OF: из
TextField:
VALIDATEMAXLENGTH: 'Значение для {name} не должно превышать {maxLength} символов'
TimeField:
VALIDATEFORMAT: 'Пожалуйста, задайте верный формат времени {format})'
ToggleField:
@ -531,5 +674,17 @@ ru:
REMOVEINFO: 'Удалить файл отсюда, но не удалять с сервера'
STARTALL: 'Стартовать все'
Saved: Сохранено
UPLOADSINTO: 'загрузка в /{path}'
Versioned:
has_many_Versions: Версии
VersionedGridFieldItemRequest:
ARCHIVE: Архив
Archived: 'Зархивировано %s %s'
BUTTONARCHIVEDESC: 'Отменить публикацию и отправить в архив'
BUTTONPUBLISH: Опубликовать
BUTTONUNPUBLISH: Отмена публикации
BUTTONUNPUBLISHDESC: 'Удалить эту страницу с опубликованного сайта'
Published: 'Опубликована {name} {link}'
Unpublished: 'Публикация отменена %s %s'
i18n:
PLURAL: '{number} {form}'

View File

@ -98,16 +98,19 @@ class ChangePasswordForm extends Form {
else if($data['NewPassword1'] == $data['NewPassword2']) {
$isValid = $member->changePassword($data['NewPassword1']);
if($isValid->valid()) {
$member->logIn();
// TODO Add confirmation message to login redirect
Session::clear('AutoLoginHash');
// Clear locked out status
$member->LockedOutUntil = null;
$member->FailedLoginCount = null;
$member->write();
if ($member->canLogIn()->valid()) {
$member->logIn();
}
// TODO Add confirmation message to login redirect
Session::clear('AutoLoginHash');
if (!empty($_REQUEST['BackURL'])
// absolute redirection URLs may cause spoofing
&& Director::is_site_url($_REQUEST['BackURL'])

View File

@ -98,12 +98,24 @@ class Member extends DataObject implements TemplateGlobalProvider {
'Email',
);
/**
* @config
* @var array
*/
private static $summary_fields = array(
'FirstName',
'Surname',
'Email',
);
/**
* @config
* @var array
*/
private static $casting = array(
'Name' => 'Varchar',
);
/**
* Internal-use only fields
*
@ -453,7 +465,8 @@ class Member extends DataObject implements TemplateGlobalProvider {
$this->NumVisit++;
if($remember) {
// Only set the cookie if autologin is enabled
if($remember && Security::config()->autologin_enabled) {
// Store the hash and give the client the cookie with the token.
$generator = new RandomGenerator();
$token = $generator->randomToken('sha1');
@ -524,7 +537,8 @@ class Member extends DataObject implements TemplateGlobalProvider {
// Don't bother trying this multiple times
self::$_already_tried_to_auto_log_in = true;
if(strpos(Cookie::get('alc_enc'), ':') === false
if(!Security::config()->autologin_enabled
|| strpos(Cookie::get('alc_enc'), ':') === false
|| Session::get("loggedInAs")
|| !Security::database_is_ready()
) {
@ -786,8 +800,8 @@ class Member extends DataObject implements TemplateGlobalProvider {
* @return string Returns a random password.
*/
public static function create_new_password() {
if(file_exists(Security::get_word_list())) {
$words = file(Security::get_word_list());
if(file_exists(Security::config()->word_list)) {
$words = file(Security::config()->word_list);
list($usec, $sec) = explode(' ', microtime());
srand($sec + ((float) $usec * 100000));
@ -799,7 +813,7 @@ class Member extends DataObject implements TemplateGlobalProvider {
} else {
$random = rand();
$string = md5($random);
$output = substr($string, 0, 6);
$output = substr($string, 0, 8);
return $output;
}
}
@ -858,6 +872,9 @@ class Member extends DataObject implements TemplateGlobalProvider {
// Note that this only works with cleartext passwords, as we can't rehash
// existing passwords.
if((!$this->ID && $this->Password) || $this->isChanged('Password')) {
//reset salt so that it gets regenerated - this will invalidate any persistant login cookies
// or other information encrypted with this Member's settings (see self::encryptWithUserSettings)
$this->Salt = '';
// Password was changed: encrypt the password according the settings
$encryption_details = Security::encrypt_password(
$this->Password, // this is assumed to be cleartext

View File

@ -2,9 +2,9 @@
<% if $Options.Count %>
<% loop $Options %>
<li class="$Class">
<input id="$ID" class="checkbox" name="$Name" type="checkbox" value="$Value"<% if $isChecked %> checked="checked"<% end_if %><% if $isDisabled %> disabled="disabled"<% end_if %> />
<input id="$ID" class="checkbox" name="$Name" type="checkbox" value="$Value.ATT"<% if $isChecked %> checked="checked"<% end_if %><% if $isDisabled %> disabled="disabled"<% end_if %> />
<label for="$ID">$Title</label>
</li>
</li>
<% end_loop %>
<% else %>
<li>No options available</li>

View File

@ -1,7 +1,7 @@
<ul id="$ID" class="$extraClass">
<% loop $Options %>
<li class="$Class">
<input id="$ID" class="radio" name="$Name" type="radio" value="$Value"<% if $isChecked %> checked<% end_if %><% if $isDisabled %> disabled<% end_if %> />
<input id="$ID" class="radio" name="$Name" type="radio" value="$Value.ATT"<% if $isChecked %> checked<% end_if %><% if $isDisabled %> disabled<% end_if %> />
<label for="$ID">$Title</label>
</li>
<% end_loop %>

View File

@ -5,21 +5,21 @@
* @subpackage tests
*/
class CheckboxSetFieldTest extends SapphireTest {
protected static $fixture_file = 'CheckboxSetFieldTest.yml';
protected $extraDataObjects = array(
'CheckboxSetFieldTest_Article',
'CheckboxSetFieldTest_Tag',
);
public function testSetDefaultItems() {
$f = new CheckboxSetField(
'Test',
false,
'Test',
false,
array(0 => 'Zero', 1 => 'One', 2 => 'Two', 3 => 'Three')
);
$f->setValue(array(0,1));
$f->setDefaultItems(array(2));
$p = new CSSContentParser($f->Field());
@ -48,68 +48,68 @@ class CheckboxSetFieldTest extends SapphireTest {
'Not selected by either value or default items'
);
}
public function testSaveWithNothingSelected() {
$article = $this->objFromFixture('CheckboxSetFieldTest_Article', 'articlewithouttags');
/* Create a CheckboxSetField with nothing selected */
$field = new CheckboxSetField("Tags", "Test field", DataObject::get("CheckboxSetFieldTest_Tag")->map());
/* Saving should work */
$field->saveInto($article);
$this->assertNull(
DB::query("SELECT *
FROM \"CheckboxSetFieldTest_Article_Tags\"
WHERE \"CheckboxSetFieldTest_Article_Tags\".\"CheckboxSetFieldTest_ArticleID\" = $article->ID
")->value(),
'Nothing should go into manymany join table for a saved field without any ticked boxes'
);
);
}
public function testSaveWithArrayValueSet() {
$article = $this->objFromFixture('CheckboxSetFieldTest_Article', 'articlewithouttags');
$articleWithTags = $this->objFromFixture('CheckboxSetFieldTest_Article', 'articlewithtags');
$tag1 = $this->objFromFixture('CheckboxSetFieldTest_Tag', 'tag1');
$tag2 = $this->objFromFixture('CheckboxSetFieldTest_Tag', 'tag2');
/* Create a CheckboxSetField with 2 items selected. Note that the array is in the format (key) => (selected) */
$field = new CheckboxSetField("Tags", "Test field", DataObject::get("CheckboxSetFieldTest_Tag")->map());
$field->setValue(array(
$tag1->ID => true,
$tag2->ID => true
));
/* Saving should work */
$field->saveInto($article);
$this->assertEquals(
array($tag1->ID,$tag2->ID),
array($tag1->ID,$tag2->ID),
DB::query("SELECT \"CheckboxSetFieldTest_TagID\"
FROM \"CheckboxSetFieldTest_Article_Tags\"
WHERE \"CheckboxSetFieldTest_Article_Tags\".\"CheckboxSetFieldTest_ArticleID\" = $article->ID
")->column(),
'Data shold be saved into CheckboxSetField manymany relation table on the "right end"'
);
);
$this->assertEquals(
array($articleWithTags->ID,$article->ID),
array($articleWithTags->ID,$article->ID),
DB::query("SELECT \"CheckboxSetFieldTest_ArticleID\"
FROM \"CheckboxSetFieldTest_Article_Tags\"
WHERE \"CheckboxSetFieldTest_Article_Tags\".\"CheckboxSetFieldTest_TagID\" = $tag1->ID
")->column(),
'Data shold be saved into CheckboxSetField manymany relation table on the "left end"'
);
);
}
public function testLoadDataFromObject() {
$article = $this->objFromFixture('CheckboxSetFieldTest_Article', 'articlewithouttags');
$articleWithTags = $this->objFromFixture('CheckboxSetFieldTest_Article', 'articlewithtags');
$tag1 = $this->objFromFixture('CheckboxSetFieldTest_Tag', 'tag1');
$tag2 = $this->objFromFixture('CheckboxSetFieldTest_Tag', 'tag2');
$field = new CheckboxSetField("Tags", "Test field", DataObject::get("CheckboxSetFieldTest_Tag")->map());
$form = new Form(
new Controller(),
new Controller(),
'Form',
new FieldList($field),
new FieldList()
@ -144,6 +144,27 @@ class CheckboxSetFieldTest extends SapphireTest {
$this->assertEquals('Test,Another', $dbValue);
}
public function testSafelyCast() {
$member = new Member();
$member->FirstName = '<firstname>';
$member->Surname = '<surname>';
$member->write();
$field1 = new CheckboxSetField('Options', 'Options', array(
'one' => 'One',
'two' => 'Two & Three',
'three' => DBField::create_field('HTMLText', 'Four &amp; Five &amp; Six'),
$member
));
$fieldHTML = (string)$field1->Field();
$this->assertContains('One', $fieldHTML);
$this->assertContains('Two &amp; Three', $fieldHTML);
$this->assertNotContains('Two & Three', $fieldHTML);
$this->assertContains('Four &amp; Five &amp; Six', $fieldHTML);
$this->assertNotContains('Four & Five & Six', $fieldHTML);
$this->assertContains('&lt;firstname&gt;', $fieldHTML);
$this->assertNotContains('<firstname>', $fieldHTML);
}
}
/**
@ -156,11 +177,11 @@ class CheckboxSetFieldTest_Article extends DataObject implements TestOnly {
private static $db = array(
"Content" => "Text",
);
private static $many_many = array(
"Tags" => "CheckboxSetFieldTest_Tag",
);
}
/**
@ -168,7 +189,7 @@ class CheckboxSetFieldTest_Article extends DataObject implements TestOnly {
* @subpackage tests
*/
class CheckboxSetFieldTest_Tag extends DataObject implements TestOnly {
private static $belongs_many_many = array(
'Articles' => 'CheckboxSetFieldTest_Article'
);

View File

@ -6,11 +6,11 @@
class OptionsetFieldTest extends SapphireTest {
public function testSetDisabledItems() {
$f = new OptionsetField(
'Test',
false,
'Test',
false,
array(0 => 'Zero', 1 => 'One')
);
$f->setDisabledItems(array(0));
$p = new CSSContentParser($f->Field());
$item0 = $p->getBySelector('#Test_0');
@ -34,4 +34,18 @@ class OptionsetFieldTest extends SapphireTest {
preg_match('/Yes/', $field->Field(), $matches);
$this->assertEquals($matches[0], 'Yes');
}
public function testSafelyCast() {
$field1 = new OptionsetField('Options', 'Options', array(
1 => 'One',
2 => 'Two & Three',
3 => DBField::create_field('HTMLText', 'Four &amp; Five &amp; Six')
));
$fieldHTML = (string)$field1->Field();
$this->assertContains('One', $fieldHTML);
$this->assertContains('Two &amp; Three', $fieldHTML);
$this->assertNotContains('Two & Three', $fieldHTML);
$this->assertContains('Four &amp; Five &amp; Six', $fieldHTML);
$this->assertNotContains('Four & Five & Six', $fieldHTML);
}
}