FIX Update core API changes, implement last of namespacing in test classes, PSR-4 autoloader

This commit is contained in:
Robbie Averill 2017-08-14 09:26:53 +12:00
parent 32586b6363
commit 5af348894a
19 changed files with 112 additions and 82 deletions

View File

@ -4,4 +4,4 @@ After: framework/routes#coreroutes
---
SilverStripe\Control\Director:
rules:
UserDefinedForm_Controller//$Action: UserDefinedForm_Controller
UserDefinedFormController//$Action: SilverStripe\UserForms\Model\UserDefinedFormController

View File

@ -2,6 +2,7 @@
namespace SilverStripe\UserForms\Extension;
use SilverStripe\Core\Manifest\ModuleLoader;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\GridField\GridField;
@ -28,7 +29,6 @@ use Symbiote\GridFieldExtensions\GridFieldOrderableRows;
*/
class UserFormFieldEditorExtension extends DataExtension
{
/**
* @var array
*/
@ -58,7 +58,8 @@ class UserFormFieldEditorExtension extends DataExtension
*/
public function getFieldEditorGrid()
{
Requirements::javascript(USERFORMS_DIR . '/javascript/FieldEditor.js');
$module = ModuleLoader::getModule('silverstripe/userforms');
Requirements::javascript($module->getRelativeResourcePath('javascript/FieldEditor.js'));
$fields = $this->owner->Fields();
@ -66,7 +67,7 @@ class UserFormFieldEditorExtension extends DataExtension
$editableColumns = new GridFieldEditableColumns();
$fieldClasses = singleton(EditableFormField::class)->getEditableFieldClasses();
$editableColumns->setDisplayFields(array(
$editableColumns->setDisplayFields([
'ClassName' => function ($record, $column, $grid) use ($fieldClasses) {
if ($record instanceof EditableFormField) {
return $record->getInlineClassnameField($column, $fieldClasses);
@ -77,18 +78,18 @@ class UserFormFieldEditorExtension extends DataExtension
return $record->getInlineTitleField($column);
}
}
));
]);
$config = GridFieldConfig::create()
->addComponents(
$editableColumns,
new GridFieldButtonRow(),
GridFieldAddClassesButton::create(EditableTextField::class)
(new GridFieldAddClassesButton(EditableTextField::class))
->setButtonName(_t(__CLASS__.'.ADD_FIELD', 'Add Field'))
->setButtonClass('ss-ui-action-constructive'),
GridFieldAddClassesButton::create(EditableFormStep::class)
(new GridFieldAddClassesButton(EditableFormStep::class))
->setButtonName(_t(__CLASS__.'.ADD_PAGE_BREAK', 'Add Page Break')),
GridFieldAddClassesButton::create(array(EditableFieldGroup::class, EditableFieldGroupEnd::class))
(new GridFieldAddClassesButton([EditableFieldGroup::class, EditableFieldGroupEnd::class]))
->setButtonName(_t(__CLASS__.'.ADD_FIELD_GROUP', 'Add Field Group')),
new GridFieldEditButton(),
new GridFieldDeleteAction(),
@ -165,6 +166,10 @@ class UserFormFieldEditorExtension extends DataExtension
*/
public function onAfterPublish($original)
{
if (!$original) {
return;
}
// store IDs of fields we've published
$seenIDs = array();
@ -177,14 +182,14 @@ class UserFormFieldEditorExtension extends DataExtension
// fetch any orphaned live records
$live = Versioned::get_by_stage(EditableFormField::class, "Live")
->filter(array(
->filter([
'ParentID' => $original->ID,
));
]);
if (!empty($seenIDs)) {
$live = $live->exclude(array(
$live = $live->exclude([
'ID' => $seenIDs,
));
]);
}
// delete orphaned records

View File

@ -48,7 +48,6 @@ class GridFieldAddClassesButton implements GridField_HTMLProvider, GridField_Act
*/
public function __construct($classes, $targetFragment = 'buttons-before-left')
{
parent::__construct();
$this->setClasses($classes);
$this->setFragment($targetFragment);
}

View File

@ -40,7 +40,7 @@ class UserForm extends Form
$this->setValidator($this->getRequiredFields());
// This needs to be re-evaluated since fields have been assigned
$this->setupFormErrors();
$this->restoreFormState();
// Number each page
$stepNumber = 1;
@ -52,7 +52,7 @@ class UserForm extends Form
$this->disableSecurityToken();
}
$data = Session::get("FormInfo.{$this->FormName()}.data");
$data = $this->getRequest()->getSession()->get("FormInfo.{$this->FormName()}.data");
if (is_array($data)) {
$this->loadDataFrom($data);
@ -61,11 +61,11 @@ class UserForm extends Form
$this->extend('updateForm');
}
public function setupFormErrors()
public function restoreFormState()
{
// Suppress setupFormErrors if fields haven't been bootstrapped
// Suppress restoreFormState if fields haven't been bootstrapped
if ($this->fields && $this->fields->exists()) {
return parent::setupFormErrors();
return parent::restoreFormState();
}
return $this;
@ -134,15 +134,17 @@ class UserForm extends Form
*/
public function getFormActions()
{
$submitText = ($this->controller->SubmitButtonText) ? $this->controller->SubmitButtonText : _t('SilverStripe\\UserForms\\Model\\UserDefinedForm.SUBMITBUTTON', 'Submit');
$clearText = ($this->controller->ClearButtonText) ? $this->controller->ClearButtonText : _t('SilverStripe\\UserForms\\Model\\UserDefinedForm.CLEARBUTTON', 'Clear');
$submitText = ($this->controller->SubmitButtonText)
? $this->controller->SubmitButtonText
: _t('SilverStripe\\UserForms\\Model\\UserDefinedForm.SUBMITBUTTON', 'Submit');
$clearText = ($this->controller->ClearButtonText)
? $this->controller->ClearButtonText
: _t('SilverStripe\\UserForms\\Model\\UserDefinedForm.CLEARBUTTON', 'Clear');
$actions = new FieldList(
new FormAction("process", $submitText)
);
$actions = FieldList::create(FormAction::create('process', $submitText));
if ($this->controller->ShowClearButton) {
$actions->push(new ResetFormAction("clearForm", $clearText));
$actions->push(FormAction::create('clearForm', $clearText)->setAttribute('type', 'reset'));
}
$this->extend('updateFormActions', $actions);

View File

@ -8,6 +8,7 @@ use SilverStripe\Control\Controller;
use SilverStripe\Core\ClassInfo;
use SilverStripe\Core\Config\Config;
use SilverStripe\Core\Convert;
use SilverStripe\Core\Manifest\ModuleLoader;
use SilverStripe\Dev\Deprecation;
use SilverStripe\Forms\CheckboxField;
use SilverStripe\Forms\DropdownField;
@ -422,8 +423,9 @@ class EditableFormField extends DataObject
protected function generateName()
{
do {
// Generate a new random name after this class
$class = get_class($this);
// Generate a new random name after this class (handles namespaces)
$classNamePieces = explode('\\', __CLASS__);
$class = array_pop($classNamePieces);
$entropy = substr(sha1(uniqid()), 0, 5);
$name = "{$class}_{$entropy}";
@ -730,7 +732,8 @@ class EditableFormField extends DataObject
*/
public function getIcon()
{
return USERFORMS_DIR . '/images/' . strtolower($this->class) . '.png';
return ModuleLoader::getModule('silverstripe/userforms')
->getRelativeResourcePath('images/' . strtolower($this->class) . '.png');
}
/**

View File

@ -2,6 +2,7 @@
namespace SilverStripe\UserForms\Model\EditableFormField;
use SilverStripe\Core\Manifest\ModuleLoader;
use CountryDropdownField; // @todo
use SilverStripe\UserForms\Model\EditableCustomRule;
use SilverStripe\UserForms\Model\EditableFormField;
@ -52,7 +53,8 @@ class EditableCountryDropdownField extends EditableFormField
public function getIcon()
{
return USERFORMS_DIR . '/images/editabledropdown.png';
return ModuleLoader::getModule('silverstripe/userforms')
->getRelativeResourcePath('images/editabledropdown.png');
}
public function getSelectorField(EditableCustomRule $rule, $forOnLoad = false)

View File

@ -89,7 +89,7 @@ class EditableFileField extends EditableFormField
$max = static::get_php_max_file_size();
if ($this->MaxFileSizeMB * 1024 > $max) {
$result->error("Your max file size limit can't be larger than the server's limit of {$this->getPHPMaxFileSizeMB()}.");
$result->addError("Your max file size limit can't be larger than the server's limit of {$this->getPHPMaxFileSizeMB()}.");
}
return $result;

View File

@ -144,7 +144,7 @@ class EditableLiteralField extends EditableFormField
$field = CompositeField::create($content)
->setName($this->Name)
->setID($this->Name)
// ->setID($this->Name) // @todo
->setFieldHolderTemplate('UserFormsLiteralField_holder');
$this->doUpdateFormField($field);

View File

@ -8,6 +8,7 @@ use SilverStripe\CMS\Controllers\CMSPageEditController;
use SilverStripe\Control\Controller;
use SilverStripe\Control\Email\Email;
use SilverStripe\Control\Session;
use SilverStripe\Core\Manifest\ModuleLoader;
use SilverStripe\Forms\CheckboxField;
use SilverStripe\Forms\DropdownField;
use SilverStripe\Forms\FieldGroup;
@ -164,7 +165,9 @@ class EmailRecipient extends DataObject
*/
public function getCMSFields()
{
Requirements::javascript(USERFORMS_DIR . '/javascript/Recipient.js');
Requirements::javascript(
ModuleLoader::getModule('silverstripe/userforms')->getRelativeResourcePath('javascript/Recipient.js')
);
// Determine optional field values
$form = $this->getFormParent();
@ -281,7 +284,7 @@ class EmailRecipient extends DataObject
))
]);
$fields->fieldByName('Root.EmailDetails')->setTitle(_t(__CLASS.'.EMAILDETAILSTAB', 'Email Details'));
$fields->fieldByName('Root.EmailDetails')->setTitle(_t(__CLASS__.'.EMAILDETAILSTAB', 'Email Details'));
// Only show the preview link if the recipient has been saved.
if (!empty($this->EmailTemplate)) {
@ -338,7 +341,7 @@ class EmailRecipient extends DataObject
LiteralField::create('EmailPreview', $preview)
));
$fields->fieldByName('Root.EmailContent')->setTitle(_t(__CLASS.'.EMAILCONTENTTAB', 'Email Content'));
$fields->fieldByName('Root.EmailContent')->setTitle(_t(__CLASS__.'.EMAILCONTENTTAB', 'Email Content'));
// Custom rules for sending this field
$grid = GridField::create(
@ -363,7 +366,7 @@ class EmailRecipient extends DataObject
$grid
]);
$fields->fieldByName('Root.CustomRules')->setTitle(_t(__CLASS.'.CUSTOMRULESTAB', 'Custom Rules'));
$fields->fieldByName('Root.CustomRules')->setTitle(_t(__CLASS__.'.CUSTOMRULESTAB', 'Custom Rules'));
$this->extend('updateCMSFields', $fields);
return $fields;
@ -542,7 +545,7 @@ class EmailRecipient extends DataObject
$trimAddress = trim($address);
if ($trimAddress && !Email::is_valid_address($trimAddress)) {
$error = _t(
__CLASS.".$translation",
__CLASS__.".$translation",
"Invalid email address $trimAddress"
);
$result->error($error . " ($trimAddress)");

View File

@ -5,6 +5,7 @@ namespace SilverStripe\UserForms\Model;
use Page;
use Colymba\BulkManager\BulkManager;
use SilverStripe\Core\Injector\Injector;
use SilverStripe\Core\Manifest\ModuleLoader;
use SilverStripe\Forms\CheckboxField;
use SilverStripe\Forms\CompositeField;
use SilverStripe\Forms\FieldList;
@ -171,7 +172,9 @@ class UserDefinedForm extends Page
*/
public function getCMSFields()
{
Requirements::css(USERFORMS_DIR . '/css/UserForm_cms.css');
Requirements::css(
ModuleLoader::getModule('silverstripe/userforms')->getRelativeResourcePath('css/UserForms_cms.css')
);
$this->beforeUpdateCMSFields(function ($fields) {
// define tabs
@ -181,8 +184,15 @@ class UserDefinedForm extends Page
// text to show on complete
$onCompleteFieldSet = CompositeField::create(
$label = LabelField::create('OnCompleteMessageLabel', _t(__CLASS__.'.ONCOMPLETELABEL', 'Show on completion')),
$editor = HTMLEditorField::create('OnCompleteMessage', '', _t(__CLASS__.'.ONCOMPLETEMESSAGE', $self->OnCompleteMessage))
$label = LabelField::create(
'OnCompleteMessageLabel',
_t(__CLASS__.'.ONCOMPLETELABEL', 'Show on completion')
),
$editor = HTMLEditorField::create(
'OnCompleteMessage',
'',
_t(__CLASS__.'.ONCOMPLETEMESSAGE', $this->OnCompleteMessage)
)
);
$onCompleteFieldSet->addExtraClass('field');
@ -201,7 +211,7 @@ class UserDefinedForm extends Page
$emailRecipients = GridField::create(
'EmailRecipients',
_t(__CLASS__.'.EMAILRECIPIENTS', 'Email Recipients'),
$self->EmailRecipients(),
$this->EmailRecipients(),
$emailRecipientsConfig
);
$emailRecipients
@ -211,12 +221,12 @@ class UserDefinedForm extends Page
$fields->addFieldsToTab('Root.FormOptions', $onCompleteFieldSet);
$fields->addFieldToTab('Root.Recipients', $emailRecipients);
$fields->addFieldsToTab('Root.FormOptions', $self->getFormOptions());
$fields->addFieldsToTab('Root.FormOptions', $this->getFormOptions());
// view the submissions
// make sure a numeric not a empty string is checked against this int column for SQL server
$parentID = (!empty($self->ID)) ? (int) $self->ID : 0;
$parentID = (!empty($this->ID)) ? (int) $this->ID : 0;
// get a list of all field names and values used for print and export CSV views of the GridField below.
$columnSQL = <<<SQL
@ -289,7 +299,7 @@ SQL;
$submissions = GridField::create(
'Submissions',
_t(__CLASS__.'.SUBMISSIONS', 'Submissions'),
$self->Submissions()->sort('Created', 'DESC'),
$this->Submissions()->sort('Created', 'DESC'),
$config
);
$fields->addFieldToTab('Root.Submissions', $submissions);
@ -377,23 +387,6 @@ SQL;
return $this->config()->get('error_container_id');
}
public function requireDefaultRecords()
{
parent::requireDefaultRecords();
if (!$this->config()->get('upgrade_on_build')) {
return;
}
// Perform migrations
Injector::inst()
->create(UserFormsUpgradeService::class)
->setQuiet(true)
->run();
DB::alteration_message('Migrated userforms', 'changed');
}
/**
* Validate formfields

View File

@ -7,6 +7,7 @@ use SilverStripe\Assets\File;
use SilverStripe\Assets\Upload;
use SilverStripe\Control\Controller;
use SilverStripe\Control\HTTP;
use SilverStripe\Core\Manifest\ModuleLoader;
use SilverStripe\Forms\Form;
use SilverStripe\i18n\i18n;
use SilverStripe\ORM\ArrayList;
@ -43,29 +44,37 @@ class UserDefinedFormController extends PageController
$page = $this->data();
$userforms = ModuleLoader::getModule('silverstripe/userforms');
$admin = ModuleLoader::getModule('silverstripe/admin');
// load the css
if (!$page->config()->get('block_default_userforms_css')) {
Requirements::css(USERFORMS_DIR . '/css/UserForm.css');
Requirements::css($userforms->getRelativeResourcePath('css/UserForm.css'));
}
// load the jquery
if (!$page->config()->get('block_default_userforms_js')) {
$lang = i18n::get_lang_from_locale(i18n::get_locale());
Requirements::javascript(FRAMEWORK_DIR .'/thirdparty/jquery/jquery.js');
Requirements::javascript(USERFORMS_DIR . '/thirdparty/jquery-validate/jquery.validate.min.js');
Requirements::add_i18n_javascript(USERFORMS_DIR . '/javascript/lang');
Requirements::javascript(USERFORMS_DIR . '/javascript/UserForm.js');
$lang = i18n::getData()->languageName(i18n::get_locale());
Requirements::javascript($admin->getRelativeResourcePath('thirdparty/jquery/jquery.js'));
Requirements::javascript(
USERFORMS_DIR . "/thirdparty/jquery-validate/localization/messages_{$lang}.min.js"
);
Requirements::javascript(
USERFORMS_DIR . "/thirdparty/jquery-validate/localization/methods_{$lang}.min.js"
$userforms->getRelativeResourcePath('thirdparty/jquery-validate/jquery.validate.min.js')
);
Requirements::add_i18n_javascript($userforms->getRelativeResourcePath('javascript/lang'));
Requirements::javascript($userforms->getRelativeResourcePath('javascript/UserForm.js'));
// @todo implement the $lang correctly
// Requirements::javascript(
// $userforms->getRelativeResourcePath("thirdparty/jquery-validate/localization/messages_{$lang}.min.js")
// );
// Requirements::javascript(
// $userforms->getRelativeResourcePath("thirdparty/jquery-validate/localization/methods_{$lang}.min.js")
// );
// Bind a confirmation message when navigating away from a partially completed form.
if ($page::config()->get('enable_are_you_sure')) {
Requirements::javascript(USERFORMS_DIR . '/thirdparty/jquery.are-you-sure/jquery.are-you-sure.js');
Requirements::javascript(
$userforms->getRelativeResourcePath('thirdparty/jquery.are-you-sure/jquery.are-you-sure.js')
);
}
}
}
@ -82,7 +91,11 @@ class UserDefinedFormController extends PageController
if ($this->Content && $form = $this->Form()) {
$hasLocation = stristr($this->Content, '$UserDefinedForm');
if ($hasLocation) {
$content = preg_replace('/(<p[^>]*>)?\\$UserDefinedForm(<\\/p>)?/i', $form->forTemplate(), $this->Content);
$content = preg_replace(
'/(<p[^>]*>)?\\$UserDefinedForm(<\\/p>)?/i',
$form->forTemplate(),
$this->Content
);
return [
'Content' => DBField::create_field('HTMLText', $content),
'Form' => ''

View File

@ -39,6 +39,12 @@
"phpunit/phpunit": "^5.7",
"squizlabs/php_codesniffer": "*"
},
"autoload": {
"psr-4": {
"SilverStripe\\UserForms\\": "code/",
"SilverStripe\\UserForms\\Test\\": "tests/"
}
},
"suggest": {
"colymba/gridfield-bulk-editing-tools": "Allows for bulk management of form submissions",
"silverstripe/secureassets": "Enables files uploaded via userforms to be secured from public access",

View File

@ -9,7 +9,7 @@ use SilverStripe\UserForms\Form\UserForm;
class UserFormTest extends SapphireTest
{
protected static $fixture_file = 'UserDefinedFormTest.yml';
protected static $fixture_file = 'userforms/tests/Model/UserDefinedFormTest.yml';
/**
* Tests that a form will not generate empty pages

View File

@ -6,6 +6,7 @@ use SilverStripe\Core\Config\Config;
use SilverStripe\Dev\SapphireTest;
use SilverStripe\Forms\CompositeField;
use SilverStripe\Forms\HTMLEditor\HTMLEditorConfig;
use SilverStripe\Forms\HTMLEditor\HTMLEditorField;
use SilverStripe\Forms\LiteralField;
use SilverStripe\UserForms\Model\EditableFormField\EditableLiteralField;
@ -17,7 +18,8 @@ class EditableLiteralFieldTest extends SapphireTest
protected function setUp()
{
parent::setUp();
HTMLEditorConfig::set_active('cms');
$cmsConfig = HTMLEditorConfig::get('cms');
HTMLEditorConfig::set_active($cmsConfig);
}
/**
@ -30,12 +32,12 @@ class EditableLiteralFieldTest extends SapphireTest
$field = new EditableLiteralField();
// Test with sanitisation enabled
Config::modify()->update('HtmlEditorField', 'sanitise_server_side', true);
Config::modify()->set(HTMLEditorField::class, 'sanitise_server_side', true);
$field->setContent($rawContent);
$this->assertEquals($safeContent, $field->getContent());
// Test with sanitisation disabled
Config::modify()->remove('HtmlEditorField', 'sanitise_server_side');
Config::modify()->remove(HTMLEditorField::class, 'sanitise_server_side');
$field->setContent($rawContent);
$this->assertEquals($rawContent, $field->getContent());
}

View File

@ -14,8 +14,8 @@ SilverStripe\UserForms\Model\EditableCustomRule:
Display: Show
ConditionOption: HasValue
FieldValue: NZ
ConditionField: =>EditableFormField.countryTextField
Parent: =>EditableFormField.irdNumberField
ConditionField: =>SilverStripe\UserForms\Model\EditableFormField.countryTextField
Parent: =>SilverStripe\UserForms\Model\EditableFormField.irdNumberField
rule-1:
Display: Hide
ConditionOption: HasValue

View File

@ -4,7 +4,7 @@ SilverStripe\UserForms\Model\EditableFormField\EditableTextField:
SilverStripe\UserForms\Model\EditableFormField\EditableNumericField:
ageField:
Name: Age
SilverStripe\UserForms\Model\EditableFormField\EmailRecipientCondition:
SilverStripe\UserForms\Model\Recipient\EmailRecipientCondition:
blankTest:
ConditionOption: IsBlank
ConditionValue: null

View File

@ -2,6 +2,7 @@
namespace SilverStripe\UserForms\Test\Model;
use SilverStripe\Core\Config\Config;
use SilverStripe\Dev\CSSContentParser;
use SilverStripe\Dev\FunctionalTest;
use SilverStripe\Dev\TestOnly;
@ -227,7 +228,7 @@ class UserDefinedFormControllerTest extends FunctionalTest
$actions = $controller->Form()->getFormActions();
$expected = new FieldList(new FormAction('process', 'Custom Button'));
$expected->push(new ResetFormAction("clearForm", "Clear"));
$expected->push(FormAction::create('clearForm', 'Clear')->setAttribute('type', 'reset'));
$expected->setForm($controller->Form());
$this->assertEquals($actions, $expected);
@ -237,8 +238,9 @@ class UserDefinedFormControllerTest extends FunctionalTest
{
$form = $this->setupFormFrontend();
$this->logInWithPermission('ADMIN');
$form->Content = 'This is some content without a form nested between it';
$form->doPublish();
$form->publishRecursive();
$controller = new UserDefinedFormController($form);
@ -272,7 +274,7 @@ class UserDefinedFormControllerTest extends FunctionalTest
$form = $this->objFromFixture(UserDefinedForm::class, $fixtureName);
$this->logInWithPermission('ADMIN');
$form->doPublish();
$form->publishRecursive();
$member = Member::currentUser();
$member->logOut();

View File

@ -282,7 +282,7 @@ SilverStripe\UserForms\Model\UserDefinedForm:
filtered-form-page:
Title: 'Page with filtered recipients'
Fields: =>SilverStripe\UserForms\Model\EditableFormField\EditableFormStep.form5step1,=>SilverStripe\UserForms\Model\EditableFormField\EditableCheckboxGroupField.checkbox-group, =>SilverStripe\UserForms\Model\EditableFormField\EditableTextField.your-name-field, =>SilverStripe\UserForms\Model\EditableFormField\EditableTextField.street-field, =>SilverStripe\UserForms\Model\EditableFormField\EditableTextField.city-field
EmailRecipients: =>EmailRecipient.unfiltered-recipient-1, =>EmailRecipient.filtered-recipient-1, =>EmailRecipient.filtered-recipient-2
EmailRecipients: =>SilverStripe\UserForms\Model\Recipient\EmailRecipient.unfiltered-recipient-1, =>SilverStripe\UserForms\Model\Recipient\EmailRecipient.filtered-recipient-1, =>SilverStripe\UserForms\Model\Recipient\EmailRecipient.filtered-recipient-2
empty-page:
Title: 'Page with empty step'