diff --git a/.gitignore b/.gitignore index e43b0f98..4b35e723 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,9 @@ +app +resources +vendor .DS_Store +.htaccess +behat.yml +composer.lock +index.php +web.config diff --git a/.travis.yml b/.travis.yml index 59e9cb1c..d4031a6b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,36 +1,39 @@ language: php +services: + - mysql + env: global: - COMPOSER_ROOT_VERSION=5.0.x-dev - - PHPSTAN_VERSION=0.9.2 + - PHPSTAN_VERSION=^0.12 - SS_BASE_URL="http://localhost/" matrix: include: - # NOTE(Jake): 2018-05-02 - # - # PHP 5.6 is not supported due to undebuggable errors in Travis - # occuring in the config layer. - # - #- php: 5.6 - # env: DB=MYSQL RECIPE_VERSION=1.0.x-dev - - php: 7.0 - env: DB=MYSQL RECIPE_VERSION=1.1.x-dev PHPCS_TEST=1 - - php: 7.1 - env: DB=MYSQL RECIPE_VERSION=1.2.x-dev - php: 7.2 - env: DB=MYSQL RECIPE_VERSION=1.2.x-dev # NOTE(Jake): 2018-05-03, Needs fixes PHP include fixes, - PHPSTAN_TEST=1 + env: DB=MYSQL RECIPE_VERSION=4.5.x-dev PHPCS_TEST=1 + - php: 7.3 + env: DB=MYSQL RECIPE_VERSION=4.x-dev PHPSTAN_TEST=1 + - php: 7.4 + env: DB=MYSQL RECIPE_VERSION=4.x-dev PHPUNIT_TEST=1 before_script: + # Extra $PATH + - export PATH=./vendor/bin:$PATH + + # Init PHP - phpenv rehash - phpenv config-rm xdebug.ini + - echo 'memory_limit = 2G' >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini + + # Install composer dependencies - composer validate - - composer require --no-update silverstripe/recipe-cms:$RECIPE_VERSION - - if [[ $PHPSTAN_TEST ]]; then composer require --no-update phpstan/phpstan-shim:$PHPSTAN_VERSION; fi + - composer require --no-update silverstripe/recipe-testing:^1 silverstripe/recipe-cms:$RECIPE_VERSION + - if [[ $PHPSTAN_TEST ]]; then composer require --no-update phpstan/phpstan:$PHPSTAN_VERSION; fi - composer install --prefer-dist --no-interaction --no-progress --no-suggest --optimize-autoloader --verbose --profile script: - - if [[ $PHPCS_TEST ]]; then vendor/bin/phpcs --ignore=tests/bootstrap-phpstan.php src/ tests/ *.php; fi - - if [[ $PHPSTAN_TEST ]]; then vendor/bin/phpstan analyse src/ tests/ -c "phpstan.neon" -a "tests/bootstrap-phpstan.php" --level 3; fi - - vendor/bin/phpunit + - if [[ $PHPCS_TEST ]]; then phpcs --ignore=tests/bootstrap-phpstan.php src/ tests/ *.php; fi + - if [[ $PHPSTAN_TEST ]]; then phpstan analyse src/ tests/ -c "phpstan.neon" -a "tests/bootstrap-phpstan.php" --level 3; fi + - if [[ $PHPUNIT_TEST ]]; then phpunit; fi diff --git a/phpstan.neon b/phpstan.neon index b51a74f9..83cffc07 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -7,13 +7,11 @@ parameters: - redirect excludes_analyse: - silverstripe-cache - exclude_files: - tests/bootstrap-phpstan.php ignoreErrors: # No SilverStripe 4 support yet - '%undefined property SilverStripe\\Security\\Member::%' - '%undefined property SilverStripe\\ORM\\DataObject::%' - - '%undefined property SilverStripe\\SiteConfig\\SiteConfig::%' # Ignore because added by MemberProfileExtension - '%undefined method SilverStripe\\Security\\Member::getPublicFields()%' - '%undefined method SilverStripe\\Security\\Member::setPublicFields()%' @@ -23,5 +21,3 @@ parameters: # Unsupported introspection level - '%Call to an undefined method SilverStripe\\Forms\\FormField::setCanBeEmpty()%' - '%Call to an undefined method SilverStripe\\Forms\\Form::enableSpamProtection()%' - # Ignore modules / classes that may or may not be installed - - '%UndefinedOffset\\SortableGridField\\Forms\\GridFieldSortableRows not found%' diff --git a/src/Forms/CheckableVisibilityField.php b/src/Forms/CheckableVisibilityField.php index 8982e378..12d0a29f 100644 --- a/src/Forms/CheckableVisibilityField.php +++ b/src/Forms/CheckableVisibilityField.php @@ -2,6 +2,7 @@ namespace Symbiote\MemberProfiles\Forms; +use SilverStripe\ORM\DataObject; use SilverStripe\Security\Member; use SilverStripe\ORM\DataObjectInterface; use SilverStripe\Forms\ReadonlyField; @@ -10,6 +11,8 @@ use SilverStripe\Forms\FormField; use SilverStripe\Forms\CheckboxField; use SilverStripe\Forms\CheckboxField_Readonly; +use SilverStripe\ORM\FieldType\DBHTMLText; +use Symbiote\MemberProfiles\Extensions\MemberProfileExtension; /** * A wrapper around a field to add a checkbox to optionally mark it as visible. @@ -25,7 +28,7 @@ class CheckableVisibilityField extends FormField private $child; /** - * @var CheckboxField|CheckboxField_Readonly + * @var FormField|CheckboxField|CheckboxField_Readonly */ private $checkbox; @@ -54,7 +57,7 @@ public function getChild() } /** - * @return CheckboxField|CheckboxField_Readonly + * @return FormField|CheckboxField|CheckboxField_Readonly */ public function getCheckbox() { @@ -72,6 +75,11 @@ public function makeAlwaysVisible() return $this; } + /** + * @param mixed $value Either the parent object, or array of source data being loaded + * @param array|MemberProfileExtension $data {@see Form::loadDataFrom} + * @return $this + */ public function setValue($value, $data = array()) { $this->child->setValue($value); @@ -143,7 +151,10 @@ public function setForm($form) public function Field($properties = array()) { - return $this->child->Field() . ' ' . $this->checkbox->Field(); + return DBHTMLText::create_field( + 'HTMLFragment', + $this->child->Field() . ' ' . $this->checkbox->Field() + ); } public function Title() diff --git a/src/Forms/MemberProfileValidator.php b/src/Forms/MemberProfileValidator.php index 8bf8f358..2bc5c93c 100644 --- a/src/Forms/MemberProfileValidator.php +++ b/src/Forms/MemberProfileValidator.php @@ -116,7 +116,7 @@ public function php($data) //pass in the Unique Identifier Field (usually Email) $idField = Member::config()->get('unique_identifier_field'); - if(isset($data[$idField])) { + if (isset($data[$idField])) { $member->$idField = $data[$idField]; } } diff --git a/src/Pages/MemberApprovalController.php b/src/Pages/MemberApprovalController.php index 5e8e75d1..e6125679 100644 --- a/src/Pages/MemberApprovalController.php +++ b/src/Pages/MemberApprovalController.php @@ -4,6 +4,7 @@ use PageController; +use SilverStripe\Core\Config\Config; use SilverStripe\Security\Member; use SilverStripe\ORM\DataObject; use SilverStripe\Security\Security; @@ -73,7 +74,7 @@ public function index($request) )); } - if ($this->config()->redirect_to_admin) { + if (Config::inst()->get(self::class, 'redirect_to_admin')) { $controller = singleton(SecurityAdmin::class); if (!$controller->canView()) { return Security::permissionFailure(); diff --git a/src/Pages/MemberProfilePage.php b/src/Pages/MemberProfilePage.php index 0298f5f7..8e0e2e26 100644 --- a/src/Pages/MemberProfilePage.php +++ b/src/Pages/MemberProfilePage.php @@ -68,6 +68,7 @@ * @method \SilverStripe\ORM\DataList|\SilverStripe\Security\Group[] Groups() * @method \SilverStripe\ORM\DataList|\SilverStripe\Security\Group[] SelectableGroups() * @method \SilverStripe\ORM\DataList|\SilverStripe\Security\Group[] ApprovalGroups() + * @method \SilverStripe\ORM\HasManyList|MemberProfileFieldsSection[] Sections() */ class MemberProfilePage extends Page { @@ -238,14 +239,18 @@ public function getCMSFields() ) )); - $grid->getComponentByType(GridFieldDataColumns::class)->setFieldFormatting(array( - 'Unique' => function ($val, $obj) { - return $obj->dbObject('Unique')->Nice(); - }, - 'Required' => function ($val, $obj) { - return $obj->dbObject('Required')->Nice(); - } - )); + /* @var GridFieldDataColumns $dataColumns */ + $dataColumns = $grid->getComponentByType(GridFieldDataColumns::class); + if (method_exists($dataColumns, 'setFieldFormatting')) { + $dataColumns->setFieldFormatting(array( + 'Unique' => function ($val, $obj) { + return $obj->dbObject('Unique')->Nice(); + }, + 'Required' => function ($val, $obj) { + return $obj->dbObject('Required')->Nice(); + } + )); + } if (class_exists(GridFieldOrderableRows::class)) { $grid->addComponent(GridFieldOrderableRows::create('Sort')); diff --git a/src/Pages/MemberProfilePageController.php b/src/Pages/MemberProfilePageController.php index 39c943dd..abfee1f5 100644 --- a/src/Pages/MemberProfilePageController.php +++ b/src/Pages/MemberProfilePageController.php @@ -9,6 +9,7 @@ use SilverStripe\Control\Session; use SilverStripe\Security\IdentityStore; use SilverStripe\Security\Member; +use SilverStripe\Security\Member_GroupSet; use SilverStripe\Security\Security; use SilverStripe\Control\HTTPResponse; use SilverStripe\Control\Controller; @@ -73,7 +74,7 @@ class MemberProfilePageController extends PageController ]; /** - * @return array|ViewableData_Customised + * @return HTTPResponse */ public function index(HTTPRequest $request) { @@ -89,7 +90,7 @@ public function index(HTTPRequest $request) /** * Allow users to register if registration is enabled. * - * @return array|ViewableData_Customised + * @return HTTPResponse|ViewableData_Customised */ protected function indexRegister() { @@ -117,7 +118,7 @@ protected function indexRegister() * If editing is disabled, but the current user can add users, then they * are redirected to the add user page. * - * @return array|ViewableData_Customised + * @return HTTPResponse|ViewableData_Customised */ protected function indexProfile() { @@ -192,8 +193,8 @@ public function RegisterForm() new MemberProfileValidator($this->Fields()) ); - - if ($form->hasExtension(FormSpamProtectionExtension::class)) { + if (class_exists(FormSpamProtectionExtension::class) + && $form->hasExtension(FormSpamProtectionExtension::class)) { $form->enableSpamProtection(); } $this->extend('updateRegisterForm', $form); @@ -271,7 +272,7 @@ public function ProfileForm() */ public function save(array $data, Form $form) { - $member = Member::currentUser(); + $member = Security::getCurrentUser(); $groupIds = $this->getSettableGroupIdsFrom($form, $member); $member->Groups()->setByIDList($groupIds); @@ -298,6 +299,7 @@ public function save(array $data, Form $form) _t('MemberProfiles.PROFILEUPDATED', 'Your profile has been updated.'), 'good' ); + return $this->redirectBack(); } diff --git a/tests/MemberConfirmationAdminTest.php b/tests/MemberConfirmationAdminTest.php index 9f9ed27f..e4bff39e 100644 --- a/tests/MemberConfirmationAdminTest.php +++ b/tests/MemberConfirmationAdminTest.php @@ -26,7 +26,7 @@ public function testManualConfirmation() $this->assertEquals(true, (bool) $member->NeedsValidation); $this->getSecurityAdmin(); - $this->submitForm('Form_ItemEditForm', null, array ( + $this->submitForm('Form_ItemEditForm', 'action_doSave', array ( 'ManualEmailValidation' => 'confirm' )); @@ -40,7 +40,7 @@ public function testResendConfirmationEmail() $this->assertEquals(true, (bool) $member->NeedsValidation); $this->getSecurityAdmin(); - $this->submitForm('Form_ItemEditForm', null, array ( + $this->submitForm('Form_ItemEditForm', 'action_doSave', array ( 'ManualEmailValidation' => 'resend' )); diff --git a/tests/bootstrap-phpstan.php b/tests/bootstrap-phpstan.php index 9c05c6b0..db62ad50 100644 --- a/tests/bootstrap-phpstan.php +++ b/tests/bootstrap-phpstan.php @@ -5,9 +5,10 @@ $BOOTSTRAP_FILE = $PROJECT_DIR . '/vendor/silverstripe/cms/tests/bootstrap.php'; if (!file_exists($BOOTSTRAP_FILE)) { // Handle Travis build - $PROJECT_DIR = dirname(__FILE__).'/../..'; - $BOOTSTRAP_FILE = $PROJECT_DIR.'/silverstripe/cms/src/includes/autoload.php'; + $PROJECT_DIR = dirname(__FILE__).'/..'; + $BOOTSTRAP_FILE = $PROJECT_DIR.'/vendor/silverstripe/cms/tests/bootstrap.php'; } + require_once($BOOTSTRAP_FILE); // NOTE(Jake): 2018-05-01