Merge branch '5.1' into 5

This commit is contained in:
github-actions 2023-11-01 20:14:50 +00:00
commit cb520db8b7
115 changed files with 6 additions and 379 deletions

2
sake
View File

@ -90,7 +90,6 @@ if [ "$1" = "-start" ]; then
url=$3 url=$3
fi fi
# TODO: Give a globally unique processname by including the projectname as well
processname=$2 processname=$2
daemon -n $processname -r -D $base --pidfile=$pidfile --stdout=$outlog --stderr=$errlog $sake $url daemon -n $processname -r -D $base --pidfile=$pidfile --stdout=$outlog --stderr=$errlog $sake $url
@ -105,7 +104,6 @@ if [ "$1" = "-stop" ]; then
if [ -f $pidfile ]; then if [ -f $pidfile ]; then
echo "Stopping service $2" echo "Stopping service $2"
# TODO: This is a bad way of killing the process
kill -KILL `cat $pidfile` kill -KILL `cat $pidfile`
unlink $pidfile unlink $pidfile
else else

View File

@ -25,10 +25,6 @@ use SilverStripe\Core\Injector\Injectable;
* *
* Please see http://webkit.org/blog/68/understanding-html-xml-and-xhtml/ for further information. * Please see http://webkit.org/blog/68/understanding-html-xml-and-xhtml/ for further information.
* *
* @todo Check for correct XHTML doctype in xhtml()
* @todo Allow for other HTML4 doctypes (e.g. Transitional) in html()
* @todo Make content replacement and doctype setting two separately configurable behaviours
*
* Some developers might know what they're doing and don't want ContentNegotiator messing with their * Some developers might know what they're doing and don't want ContentNegotiator messing with their
* HTML4 doctypes, but still find it useful to have self-closing tags removed. * HTML4 doctypes, but still find it useful to have self-closing tags removed.
*/ */
@ -169,8 +165,6 @@ class ContentNegotiator
* <input>, checked, selected). * <input>, checked, selected).
* *
* @param HTTPResponse $response * @param HTTPResponse $response
*
* @todo Search for more xhtml replacement
*/ */
public function xhtml(HTTPResponse $response) public function xhtml(HTTPResponse $response)
{ {

View File

@ -146,8 +146,6 @@ class Controller extends RequestHandler implements TemplateGlobalProvider
/** /**
* A bootstrap for the handleRequest method * A bootstrap for the handleRequest method
* *
* @todo setDataModel and setRequest are redundantly called in parent::handleRequest() - sort this out
*
* @param HTTPRequest $request * @param HTTPRequest $request
*/ */
protected function beforeHandleRequest(HTTPRequest $request) protected function beforeHandleRequest(HTTPRequest $request)

View File

@ -11,10 +11,6 @@ use LogicException;
* This backend allows one to better test Cookie setting and separate cookie * This backend allows one to better test Cookie setting and separate cookie
* handling from the core * handling from the core
* *
* @todo Create a config array for defaults (eg: httpOnly, secure, path, domain, expiry)
* @todo A getter for cookies that haven't been sent to the browser yet
* @todo Tests / a way to set the state without hacking with $_COOKIE
* @todo Store the meta information around cookie setting (path, domain, secure, etc)
*/ */
class CookieJar implements Cookie_Backend class CookieJar implements Cookie_Backend
{ {

View File

@ -121,7 +121,6 @@ class HTTP
$regExps[] = "/(<{$tagPrefix}[^>]*$attrib *= *)([^\"' ]*)( )/i"; $regExps[] = "/(<{$tagPrefix}[^>]*$attrib *= *)([^\"' ]*)( )/i";
} }
// Replace css styles // Replace css styles
// @todo - http://www.css3.info/preview/multiple-backgrounds/
$styles = ['background-image', 'background', 'list-style-image', 'list-style', 'content']; $styles = ['background-image', 'background', 'list-style-image', 'list-style', 'content'];
foreach ($styles as $style) { foreach ($styles as $style) {
$regExps[] = "/($style:[^;]*url *\\(\")([^\"]+)(\"\\))/i"; $regExps[] = "/($style:[^;]*url *\\(\")([^\"]+)(\"\\))/i";

View File

@ -28,8 +28,6 @@ class HTTPCacheControlMiddleware implements HTTPMiddleware, Resettable
/** /**
* Generate response for the given request * Generate response for the given request
* *
* @todo Refactor HTTP::add_cache_headers() (e.g. etag handling) into this middleware
*
* @param HTTPRequest $request * @param HTTPRequest $request
* @param callable $delegate * @param callable $delegate
* @return HTTPResponse * @return HTTPResponse

View File

@ -18,7 +18,6 @@ use SilverStripe\View\ViewableData;
* RSSFeed class * RSSFeed class
* *
* This class is used to create an RSS feed. * This class is used to create an RSS feed.
* @todo Improve documentation
*/ */
class RSSFeed extends ViewableData class RSSFeed extends ViewableData
{ {
@ -215,8 +214,6 @@ class RSSFeed extends ViewableData
/** /**
* Output the feed to the browser. * Output the feed to the browser.
* *
* TODO: Pass $response object to ->outputToBrowser() to loosen dependence on global state for easier testing/prototyping so dev can inject custom HTTPResponse instance.
*
* @return DBHTMLText * @return DBHTMLText
*/ */
public function outputToBrowser() public function outputToBrowser()

View File

@ -171,8 +171,6 @@ class RequestHandler extends ViewableData
// We used to put "handleAction" as the action on controllers, but (a) this could only be called when // We used to put "handleAction" as the action on controllers, but (a) this could only be called when
// you had $Action in your rule, and (b) RequestHandler didn't have one. $Action is better // you had $Action in your rule, and (b) RequestHandler didn't have one. $Action is better
if ($action == 'handleAction') { if ($action == 'handleAction') {
// TODO Fix LeftAndMain usage
// Deprecation::notice('3.2.0', 'Calling handleAction directly is deprecated - use $Action instead');
$action = '$Action'; $action = '$Action';
} }

View File

@ -140,7 +140,6 @@ class SimpleResourceURLGenerator implements ResourceURLGenerator
// All resources mapped directly to _resources/ // All resources mapped directly to _resources/
$relativePath = Path::join(RESOURCES_DIR, $relativePath); $relativePath = Path::join(RESOURCES_DIR, $relativePath);
} elseif (stripos($relativePath ?? '', ManifestFileFinder::VENDOR_DIR . DIRECTORY_SEPARATOR) === 0) { } elseif (stripos($relativePath ?? '', ManifestFileFinder::VENDOR_DIR . DIRECTORY_SEPARATOR) === 0) {
// @todo Non-public dir support will be removed in 5.0, so remove this block there
// If there is no public folder, map to _resources/ but trim leading vendor/ too (4.0 compat) // If there is no public folder, map to _resources/ but trim leading vendor/ too (4.0 compat)
$relativePath = Path::join( $relativePath = Path::join(
RESOURCES_DIR, RESOURCES_DIR,

View File

@ -114,7 +114,6 @@ abstract class BaseKernel implements Kernel
$this->setModuleLoader($moduleLoader); $this->setModuleLoader($moduleLoader);
// Config loader // Config loader
// @todo refactor CoreConfigFactory
$configFactory = new CoreConfigFactory($manifestCacheFactory); $configFactory = new CoreConfigFactory($manifestCacheFactory);
$configManifest = $configFactory->createRoot(); $configManifest = $configFactory->createRoot();
$configLoader = ConfigLoader::inst(); $configLoader = ConfigLoader::inst();

View File

@ -82,8 +82,6 @@ class ClassInfo
} }
/** /**
* @todo Move this to SS_Database or DB
*
* @param string $tableName * @param string $tableName
* @return bool * @return bool
*/ */
@ -130,8 +128,6 @@ class ClassInfo
* Returns an array of the current class and all its ancestors and children * Returns an array of the current class and all its ancestors and children
* which require a DB table. * which require a DB table.
* *
* @todo Move this into {@see DataObjectSchema}
*
* @param string|object $nameOrObject Class or object instance * @param string|object $nameOrObject Class or object instance
* @return array * @return array
*/ */

View File

@ -204,7 +204,6 @@ class Convert
* Warning: Does not decode array keys * Warning: Does not decode array keys
* *
* @uses html2raw() * @uses html2raw()
* @todo Currently &#xxx; entries are stripped; they should be converted
* @param mixed $val * @param mixed $val
* @return array|string * @return array|string
*/ */

View File

@ -217,8 +217,6 @@ trait Extensible
* Clears any previously created singletons through {@link singleton()} * Clears any previously created singletons through {@link singleton()}
* to avoid side-effects from stale extension information. * to avoid side-effects from stale extension information.
* *
* @todo Add support for removing extensions with parameters
*
* @param string $extension class name of an {@link Extension} subclass, without parameters * @param string $extension class name of an {@link Extension} subclass, without parameters
*/ */
public static function remove_extension($extension) public static function remove_extension($extension)

View File

@ -666,10 +666,6 @@ class Injector implements ContainerInterface
/** /**
* Inject $object with available objects from the service cache * Inject $object with available objects from the service cache
* *
* @todo Track all the existing objects that have had a service bound
* into them, so we can update that binding at a later point if needbe (ie
* if the managed service changes)
*
* @param object $object * @param object $object
* The object to inject * The object to inject
* @param string $asType * @param string $asType

View File

@ -12,10 +12,6 @@ use SilverStripe\View\ViewableData;
* *
* You can configure column-handling, * You can configure column-handling,
* *
* @todo Add support for adding/editing has_many relations.
* @todo Add support for deep chaining of relation properties (e.g. Player.Team.Stats.GoalCount)
* @todo Character conversion
*
* @see http://tools.ietf.org/html/rfc4180 * @see http://tools.ietf.org/html/rfc4180
* @author Ingo Schommer, Silverstripe Ltd. (<firstname>@silverstripe.com) * @author Ingo Schommer, Silverstripe Ltd. (<firstname>@silverstripe.com)
*/ */
@ -217,7 +213,6 @@ abstract class BulkLoader extends ViewableData
* ] * ]
* </code> * </code>
* *
* @todo Mix in custom column mappings
* *
* @return array * @return array
**/ **/

View File

@ -11,8 +11,6 @@ use SilverStripe\View\ArrayData;
* Encapsulates the result of a {@link BulkLoader} import * Encapsulates the result of a {@link BulkLoader} import
* (usually through the {@link BulkLoader->processAll()} method). * (usually through the {@link BulkLoader->processAll()} method).
* *
* @todo Refactor to support lazy-loaded DataObjectSets once they are implemented.
*
* @author Ingo Schommer, Silverstripe Ltd. (<firstname>@silverstripe.com) * @author Ingo Schommer, Silverstripe Ltd. (<firstname>@silverstripe.com)
*/ */
class BulkLoader_Result implements \Countable class BulkLoader_Result implements \Countable

View File

@ -9,8 +9,6 @@ use SilverStripe\Core\Convert;
/** /**
* A basic HTML wrapper for stylish rendering of a development info view. * A basic HTML wrapper for stylish rendering of a development info view.
* Used to output error messages, and test results. * Used to output error messages, and test results.
*
* @todo Perhaps DebugView should be an interface / ABC, implemented by HTMLDebugView and CliDebugView?
*/ */
class CliDebugView extends DebugView class CliDebugView extends DebugView
{ {

View File

@ -74,8 +74,6 @@ class ViewableDataContains extends Constraint implements TestOnly
/** /**
* Returns a string representation of the object. * Returns a string representation of the object.
*
* @todo: add representation for more than one match
*/ */
public function toString(): string public function toString(): string
{ {

View File

@ -15,9 +15,6 @@ use SilverStripe\ORM\DataObject;
* input. * input.
* *
* @see http://tools.ietf.org/html/rfc4180 * @see http://tools.ietf.org/html/rfc4180
*
* @todo Support for deleting existing records not matched in the import
* (through relation checks)
*/ */
class CsvBulkLoader extends BulkLoader class CsvBulkLoader extends BulkLoader
{ {
@ -160,9 +157,6 @@ class CsvBulkLoader extends BulkLoader
} }
/** /**
* @todo Better messages for relation checks and duplicate detection
* Note that columnMap isn't used.
*
* @param array $record * @param array $record
* @param array $columnMap * @param array $columnMap
* @param BulkLoader_Result $results * @param BulkLoader_Result $results
@ -261,7 +255,6 @@ class CsvBulkLoader extends BulkLoader
$obj->write(); $obj->write();
} }
// @todo better message support
$message = ''; $message = '';
// save to results // save to results
@ -289,8 +282,6 @@ class CsvBulkLoader extends BulkLoader
* Find an existing objects based on one or more uniqueness columns * Find an existing objects based on one or more uniqueness columns
* specified via {@link self::$duplicateChecks}. * specified via {@link self::$duplicateChecks}.
* *
* @todo support $columnMap
*
* @param array $record CSV data column * @param array $record CSV data column
* @param array $columnMap * @param array $columnMap
* @return DataObject * @return DataObject

View File

@ -25,9 +25,6 @@ use SilverStripe\Security\Security;
* Errors handled by this class are passed along to {@link SS_Log}. * Errors handled by this class are passed along to {@link SS_Log}.
* For configuration information, see the {@link SS_Log} * For configuration information, see the {@link SS_Log}
* class documentation. * class documentation.
*
* @todo add support for user defined config: Debug::die_on_notice(true | false)
* @todo better way of figuring out the error context to display in highlighted source
*/ */
class Debug class Debug
{ {
@ -212,7 +209,6 @@ class Debug
// being called again. // being called again.
// This basically calls Permission::checkMember($_SESSION['loggedInAs'], 'ADMIN'); // This basically calls Permission::checkMember($_SESSION['loggedInAs'], 'ADMIN');
// @TODO - Rewrite safely using DataList::filter
$memberID = $_SESSION['loggedInAs']; $memberID = $_SESSION['loggedInAs'];
$permission = DB::prepared_query( $permission = DB::prepared_query(
' '

View File

@ -19,11 +19,6 @@ use Exception;
* *
* Configured in framework/_config/dev.yml, with the config key registeredControllers being * Configured in framework/_config/dev.yml, with the config key registeredControllers being
* used to generate the list of links for /dev. * used to generate the list of links for /dev.
*
* @todo documentation for how to add new unit tests and tasks
* @todo do we need buildDefaults and generatesecuretoken? if so, register in the list
* @todo cleanup errors() it's not even an allowed action, so can go
* @todo cleanup index() html building
*/ */
class DevelopmentAdmin extends Controller class DevelopmentAdmin extends Controller
{ {

View File

@ -104,9 +104,6 @@ class ExtensionTestState implements TestState
public function tearDownOnce($class) public function tearDownOnce($class)
{ {
// @todo: This isn't strictly necessary to restore extensions, but only to ensure that
// Object::$extra_methods is properly flushed. This should be replaced with a simple
// flush mechanism for each $class.
/** @var string|DataObject $dataClass */ /** @var string|DataObject $dataClass */
// Remove extensions added for testing // Remove extensions added for testing

View File

@ -36,11 +36,6 @@ use SilverStripe\View\ArrayData;
* the database records. * the database records.
* - If the field name matches a database field, a comma-separated list of values will be saved to that field. The * - 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. * 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?
*/ */
class CheckboxSetField extends MultiSelectField class CheckboxSetField extends MultiSelectField
{ {
@ -48,9 +43,6 @@ class CheckboxSetField extends MultiSelectField
protected $schemaDataType = FormField::SCHEMA_DATA_TYPE_MULTISELECT; protected $schemaDataType = FormField::SCHEMA_DATA_TYPE_MULTISELECT;
/** /**
* @todo Explain different source data that can be used with this field,
* e.g. SQLMap, ArrayList or an array.
*
* @param array $properties * @param array $properties
* @return DBHTMLText * @return DBHTMLText
*/ */

View File

@ -121,8 +121,6 @@ class CompositeField extends FormField
* If the CompositeField doesn't have a name, but we still want the ID/name to be set. * If the CompositeField doesn't have a name, but we still want the ID/name to be set.
* This code generates the ID from the nested children. * This code generates the ID from the nested children.
* *
* @todo this is temporary, and should be removed when FormTemplateHelper is updated to handle ID for CompositeFields with no name
*
* @return String $name * @return String $name
*/ */
public function getName() public function getName()

View File

@ -9,8 +9,6 @@ use SilverStripe\ORM\FieldType\DBCurrency;
* Limited to US-centric formats, including a hardcoded currency * Limited to US-centric formats, including a hardcoded currency
* symbol and decimal separators. * symbol and decimal separators.
* See {@link MoneyField} for a more flexible implementation. * See {@link MoneyField} for a more flexible implementation.
*
* @todo Add localization support, see http://open.silverstripe.com/ticket/2931
*/ */
class CurrencyField extends TextField class CurrencyField extends TextField
{ {

View File

@ -67,7 +67,6 @@ class DefaultFormFactory implements FormFactory
protected function getFormFields(RequestHandler $controller = null, $name, $context = []) protected function getFormFields(RequestHandler $controller = null, $name, $context = [])
{ {
// Fall back to standard "getCMSFields" which itself uses the FormScaffolder as a fallback // Fall back to standard "getCMSFields" which itself uses the FormScaffolder as a fallback
// @todo Deprecate or formalise support for getCMSFields()
$fields = $context['Record']->getCMSFields(); $fields = $context['Record']->getCMSFields();
$this->invokeWithExtensions('updateFormFields', $fields, $controller, $name, $context); $this->invokeWithExtensions('updateFormFields', $fields, $controller, $name, $context);
return $fields; return $fields;
@ -83,7 +82,6 @@ class DefaultFormFactory implements FormFactory
*/ */
protected function getFormActions(RequestHandler $controller = null, $name, $context = []) protected function getFormActions(RequestHandler $controller = null, $name, $context = [])
{ {
// @todo Deprecate or formalise support for getCMSActions()
$actions = $context['Record']->getCMSActions(); $actions = $context['Record']->getCMSActions();
$this->invokeWithExtensions('updateFormActions', $actions, $controller, $name, $context); $this->invokeWithExtensions('updateFormActions', $actions, $controller, $name, $context);
return $actions; return $actions;

View File

@ -105,9 +105,6 @@ class FieldGroup extends CompositeField
* Returns the name (ID) for the element. * Returns the name (ID) for the element.
* In some cases the FieldGroup doesn't have a title, but we still want * In some cases the FieldGroup doesn't have a title, but we still want
* the ID / name to be set. This code, generates the ID from the nested children * the ID / name to be set. This code, generates the ID from the nested children
*
* TODO this is temporary, and should be removed when FormTemplateHelper is updated to handle ID
* for CompositeFields with no name
*/ */
public function getName() public function getName()
{ {

View File

@ -411,8 +411,6 @@ class FieldList extends ArrayList
/** /**
* Returns the specified tab object, creating it if necessary. * Returns the specified tab object, creating it if necessary.
* *
* @todo Support recursive creation of TabSets
*
* @param string $tabName The tab to return, in the form "Tab.Subtab.Subsubtab". * @param string $tabName The tab to return, in the form "Tab.Subtab.Subsubtab".
* Caution: Does not recursively create TabSet instances, you need to make sure everything * Caution: Does not recursively create TabSet instances, you need to make sure everything
* up until the last tab in the chain exists. * up until the last tab in the chain exists.
@ -462,8 +460,6 @@ class FieldList extends ArrayList
* Returns a named field. * Returns a named field.
* You can use dot syntax to get fields from child composite fields * You can use dot syntax to get fields from child composite fields
* *
* @todo Implement similarly to dataFieldByName() to support nested sets - or merge with dataFields()
*
* @param string $name * @param string $name
* @return FormField|null * @return FormField|null
*/ */

View File

@ -123,8 +123,6 @@ class FormField extends RequestHandler
* Adds a title attribute to the markup. * Adds a title attribute to the markup.
* *
* @var string * @var string
*
* @todo Implement in all subclasses
*/ */
protected $description; protected $description;
@ -1425,8 +1423,6 @@ class FormField extends RequestHandler
* *
* @param array $schemaData - The data to be merged with $this->schemaData. * @param array $schemaData - The data to be merged with $this->schemaData.
* @return FormField * @return FormField
*
* @todo Add deep merging of arrays like `data` and `attributes`.
*/ */
public function setSchemaData($schemaData = []) public function setSchemaData($schemaData = [])
{ {
@ -1447,8 +1443,6 @@ class FormField extends RequestHandler
} }
/** /**
* @todo Throw exception if value is missing, once a form field schema is mandatory across the CMS
*
* @return string * @return string
*/ */
public function getSchemaDataType() public function getSchemaDataType()
@ -1501,8 +1495,6 @@ class FormField extends RequestHandler
* *
* @param array $schemaState The data to be merged with $this->schemaData. * @param array $schemaState The data to be merged with $this->schemaData.
* @return FormField * @return FormField
*
* @todo Add deep merging of arrays like `data` and `attributes`.
*/ */
public function setSchemaState($schemaState = []) public function setSchemaState($schemaState = [])
{ {
@ -1529,7 +1521,6 @@ class FormField extends RequestHandler
* Includes validation data if the field is associated to a {@link Form}, * Includes validation data if the field is associated to a {@link Form},
* and {@link Form->validate()} has been called. * and {@link Form->validate()} has been called.
* *
* @todo Make form / field messages not always stored as html; Store value / casting as separate values.
* @return array * @return array
*/ */
public function getSchemaStateDefaults() public function getSchemaStateDefaults()

View File

@ -137,7 +137,6 @@ class FormRequestHandler extends RequestHandler
$this->form->loadDataFrom($vars, true, $allowedFields); $this->form->loadDataFrom($vars, true, $allowedFields);
// Protection against CSRF attacks // Protection against CSRF attacks
// @todo Move this to SecurityTokenField::validate()
$token = $this->form->getSecurityToken(); $token = $this->form->getSecurityToken();
if (! $token->checkRequest($request)) { if (! $token->checkRequest($request)) {
$securityID = $token->getName(); $securityID = $token->getName();

View File

@ -36,16 +36,12 @@ class FormScaffolder
/** /**
* @var array $restrictFields Numeric array of a field name whitelist. * @var array $restrictFields Numeric array of a field name whitelist.
* If left blank, all fields from {@link DataObject->db()} will be included. * If left blank, all fields from {@link DataObject->db()} will be included.
*
* @todo Implement restrictions for has_many and many_many relations.
*/ */
public $restrictFields; public $restrictFields;
/** /**
* @var array $fieldClasses Optional mapping of fieldnames to subclasses of {@link FormField}. * @var array $fieldClasses Optional mapping of fieldnames to subclasses of {@link FormField}.
* By default the scaffolder will determine the field instance by {@link DBField::scaffoldFormField()}. * By default the scaffolder will determine the field instance by {@link DBField::scaffoldFormField()}.
*
* @todo Implement fieldClasses for has_many and many_many relations
*/ */
public $fieldClasses; public $fieldClasses;
@ -87,7 +83,6 @@ class FormScaffolder
continue; continue;
} }
// @todo Pass localized title
if ($this->fieldClasses && isset($this->fieldClasses[$fieldName])) { if ($this->fieldClasses && isset($this->fieldClasses[$fieldName])) {
$fieldClass = $this->fieldClasses[$fieldName]; $fieldClass = $this->fieldClasses[$fieldName];
$fieldObject = new $fieldClass($fieldName); $fieldObject = new $fieldClass($fieldName);

View File

@ -342,8 +342,6 @@ class GridField extends FormField
/** /**
* Cast an arbitrary value with the help of a $castingDefinition. * Cast an arbitrary value with the help of a $castingDefinition.
* *
* @todo refactor this into GridFieldComponent
*
* @param mixed $value * @param mixed $value
* @param string|array $castingDefinition * @param string|array $castingDefinition
* *
@ -555,8 +553,6 @@ class GridField extends FormField
]; ];
$fragmentDeferred = []; $fragmentDeferred = [];
// TODO: Break the below into separate reducer methods
// Continue looping if any placeholders exist // Continue looping if any placeholders exist
while (array_filter($content ?? [], function ($value) { while (array_filter($content ?? [], function ($value) {
return preg_match(self::FRAGMENT_REGEX ?? '', $value ?? ''); return preg_match(self::FRAGMENT_REGEX ?? '', $value ?? '');
@ -1182,8 +1178,6 @@ class GridField extends FormField
* Custom request handler that will check component handlers before proceeding to the default * Custom request handler that will check component handlers before proceeding to the default
* implementation. * implementation.
* *
* @todo copy less code from RequestHandler.
*
* @param HTTPRequest $request * @param HTTPRequest $request
* @return array|RequestHandler|HTTPResponse|string * @return array|RequestHandler|HTTPResponse|string
* @throws HTTPResponse_Exception * @throws HTTPResponse_Exception

View File

@ -169,7 +169,6 @@ class GridFieldDetailForm_ItemRequest extends RequestHandler
} else { } else {
// If not requested by ajax, we need to render it within the controller context+template // If not requested by ajax, we need to render it within the controller context+template
return $controller->customise([ return $controller->customise([
// TODO CMS coupling
'Content' => $return, 'Content' => $return,
]); ]);
} }
@ -179,10 +178,6 @@ class GridFieldDetailForm_ItemRequest extends RequestHandler
* Builds an item edit form. The arguments to getCMSFields() are the popupController and * Builds an item edit form. The arguments to getCMSFields() are the popupController and
* popupFormName, however this is an experimental API and may change. * popupFormName, however this is an experimental API and may change.
* *
* @todo In the future, we will probably need to come up with a tigher object representing a partially
* complete controller with gaps for extra functionality. This, for example, would be a better way
* of letting Security/login put its log-in form inside a UI specified elsewhere.
*
* @return Form|HTTPResponse * @return Form|HTTPResponse
*/ */
public function ItemEditForm() public function ItemEditForm()
@ -266,12 +261,10 @@ class GridFieldDetailForm_ItemRequest extends RequestHandler
$form->loadDataFrom(['ManyMany' => $extraData]); $form->loadDataFrom(['ManyMany' => $extraData]);
} }
// TODO Coupling with CMS
$toplevelController = $this->getToplevelController(); $toplevelController = $this->getToplevelController();
if ($toplevelController && $toplevelController instanceof LeftAndMain) { if ($toplevelController && $toplevelController instanceof LeftAndMain) {
// Always show with base template (full width, no other panels), // Always show with base template (full width, no other panels),
// regardless of overloaded CMS controller templates. // regardless of overloaded CMS controller templates.
// TODO Allow customization, e.g. to display an edit form alongside a search form from the CMS controller
$form->setTemplate([ $form->setTemplate([
'type' => 'Includes', 'type' => 'Includes',
'SilverStripe\\Admin\\LeftAndMain_EditForm', 'SilverStripe\\Admin\\LeftAndMain_EditForm',
@ -464,7 +457,6 @@ class GridFieldDetailForm_ItemRequest extends RequestHandler
protected function getBackLink() protected function getBackLink()
{ {
// TODO Coupling with CMS
$backlink = ''; $backlink = '';
$toplevelController = $this->getToplevelController(); $toplevelController = $this->getToplevelController();
if ($toplevelController && $toplevelController instanceof LeftAndMain) { if ($toplevelController && $toplevelController instanceof LeftAndMain) {

View File

@ -209,7 +209,6 @@ class GridFieldExportButton extends AbstractGridFieldComponent implements GridFi
$items = $gridField->getManipulatedList(); $items = $gridField->getManipulatedList();
// @todo should GridFieldComponents change behaviour based on whether others are available in the config?
foreach ($gridField->getConfig()->getComponents() as $component) { foreach ($gridField->getConfig()->getComponents() as $component) {
if ($component instanceof GridFieldFilterHeader || $component instanceof GridFieldSortableHeader) { if ($component instanceof GridFieldFilterHeader || $component instanceof GridFieldSortableHeader) {
$items = $component->getManipulatedData($gridField, $items); $items = $component->getManipulatedData($gridField, $items);

View File

@ -55,8 +55,6 @@ use SilverStripe\View\ArrayData;
class GroupedDropdownField extends DropdownField class GroupedDropdownField extends DropdownField
{ {
// TODO remove this when GroupedDropdownField is implemented
// This should be one of SCHEMA_DATA_TYPE_* constants instead
protected $schemaDataType = 'GroupedDropdownField'; protected $schemaDataType = 'GroupedDropdownField';
/** /**

View File

@ -17,7 +17,6 @@ use SilverStripe\ORM\DataObjectInterface;
class MoneyField extends FormField class MoneyField extends FormField
{ {
// TODO replace with `FormField::SCHEMA_DATA_TYPE_TEXT` when MoneyField is implemented
protected $schemaDataType = 'MoneyField'; protected $schemaDataType = 'MoneyField';
/** /**

View File

@ -90,7 +90,6 @@ class SelectionGroup extends CompositeField
} }
$itemID = $this->ID() . '_' . (++$count); $itemID = $this->ID() . '_' . (++$count);
// @todo Move into SelectionGroup_Item.ss template at some point.
$extra = [ $extra = [
"RadioButton" => DBField::create_field('HTMLFragment', HTML::createTag( "RadioButton" => DBField::create_field('HTMLFragment', HTML::createTag(
'input', 'input',

View File

@ -14,8 +14,6 @@ use SilverStripe\ORM\FieldType\DBTime;
* # Localization * # Localization
* *
* See {@link DateField} * See {@link DateField}
*
* @todo Timezone support
*/ */
class TimeField extends TextField class TimeField extends TextField
{ {

View File

@ -126,7 +126,6 @@ class DebugViewFriendlyErrorFormatter implements FormatterInterface
*/ */
public function output($statusCode) public function output($statusCode)
{ {
// TODO: Refactor into a content-type option
if (Director::is_ajax()) { if (Director::is_ajax()) {
return $this->getTitle(); return $this->getTitle();
} }

View File

@ -165,8 +165,6 @@ class HTTPOutputHandler extends AbstractProcessingHandler
} }
} }
// TODO: This coupling isn't ideal
// See https://github.com/silverstripe/silverstripe-framework/issues/4484
if (Controller::has_curr()) { if (Controller::has_curr()) {
$response = Controller::curr()->getResponse(); $response = Controller::curr()->getResponse();
} else { } else {

View File

@ -37,7 +37,6 @@ abstract class DBConnector
* it will be called on the object itself and as such can be overridden in a subclass. * it will be called on the object itself and as such can be overridden in a subclass.
* Subclasses should run all errors through this function. * Subclasses should run all errors through this function.
* *
* @todo hook this into a more well-structured error handling system.
* @param string $msg The error message. * @param string $msg The error message.
* @param integer $errorLevel The level of the error to throw. * @param integer $errorLevel The level of the error to throw.
* @param string $sql The SQL related to this query * @param string $sql The SQL related to this query

View File

@ -350,8 +350,6 @@ abstract class DBSchemaManager
* Generate the following table in the database, modifying whatever already exists * Generate the following table in the database, modifying whatever already exists
* as necessary. * as necessary.
* *
* @todo Change detection for CREATE TABLE $options other than "Engine"
*
* @param string $table The name of the table * @param string $table The name of the table
* @param array $fieldSchema A list of the fields to create, in the same form as DataObject::$db * @param array $fieldSchema A list of the fields to create, in the same form as DataObject::$db
* @param array $indexSchema A list of indexes to create. See {@link requireIndex()} * @param array $indexSchema A list of indexes to create. See {@link requireIndex()}
@ -669,7 +667,6 @@ abstract class DBSchemaManager
*/ */
public function requireField($table, $field, $spec) public function requireField($table, $field, $spec)
{ {
//TODO: this is starting to get extremely fragmented.
//There are two different versions of $spec floating around, and their content changes depending //There are two different versions of $spec floating around, and their content changes depending
//on how they are structured. This needs to be tidied up. //on how they are structured. This needs to be tidied up.
$fieldValue = null; $fieldValue = null;
@ -687,7 +684,6 @@ abstract class DBSchemaManager
// Collations didn't come in until MySQL 4.1. Anything earlier will throw a syntax error if you try and use // Collations didn't come in until MySQL 4.1. Anything earlier will throw a syntax error if you try and use
// collations. // collations.
// TODO: move this to the MySQLDatabase file, or drop it altogether?
if (!$this->database->supportsCollations()) { if (!$this->database->supportsCollations()) {
$spec = preg_replace('/ *character set [^ ]+( collate [^ ]+)?( |$)/', '\\2', $spec ?? ''); $spec = preg_replace('/ *character set [^ ]+( collate [^ ]+)?( |$)/', '\\2', $spec ?? '');
} }
@ -974,7 +970,6 @@ abstract class DBSchemaManager
* @param string $tableName The name of the table. * @param string $tableName The name of the table.
* @param string $indexName The name of the index. * @param string $indexName The name of the index.
* @param array $indexSpec The specification of the index, see Database::requireIndex() for more details. * @param array $indexSpec The specification of the index, see Database::requireIndex() for more details.
* @todo Find out where this is called from - Is it even used? Aren't indexes always dropped and re-added?
*/ */
abstract public function alterIndex($tableName, $indexName, $indexSpec); abstract public function alterIndex($tableName, $indexName, $indexSpec);

View File

@ -563,7 +563,6 @@ abstract class Database
*/ */
public function concatOperator() public function concatOperator()
{ {
// @todo Make ' + ' in mssql
return ' || '; return ' || ';
} }
@ -724,7 +723,6 @@ abstract class Database
* will be an extension name, and the value the configuration for that extension. This * will be an extension name, and the value the configuration for that extension. This
* could be one of partitions, tablespaces, or clustering * could be one of partitions, tablespaces, or clustering
* @return boolean Flag indicating support for all of the above * @return boolean Flag indicating support for all of the above
* @todo Write test cases
*/ */
public function supportsExtensions($extensions) public function supportsExtensions($extensions)
{ {

View File

@ -471,8 +471,6 @@ class DB
* That's a limitation of the system that's due to it being written for {@link DataObject::write()}, * That's a limitation of the system that's due to it being written for {@link DataObject::write()},
* which needs to do a single write on a number of different tables. * which needs to do a single write on a number of different tables.
* *
* @todo Update this to support paramaterised queries
*
* @param array $manipulation * @param array $manipulation
*/ */
public static function manipulate($manipulation) public static function manipulate($manipulation)

View File

@ -472,8 +472,6 @@ class DataList extends ViewableData implements SS_List, Filterable, Sortable, Li
* E.g. ->filter('Field:not', 'value) will generate '... OR "Field" IS NULL', and * E.g. ->filter('Field:not', 'value) will generate '... OR "Field" IS NULL', and
* ->filter('Field:not', null) will generate '"Field" IS NOT NULL' * ->filter('Field:not', null) will generate '"Field" IS NOT NULL'
* *
* @todo extract the sql from $customQuery into a SQLGenerator class
*
* @param string|array Escaped SQL statement. If passed as array, all keys and values will be escaped internally * @param string|array Escaped SQL statement. If passed as array, all keys and values will be escaped internally
* @return $this * @return $this
*/ */
@ -536,8 +534,6 @@ class DataList extends ViewableData implements SS_List, Filterable, Sortable, Li
* $list = $list->filterAny(array('Name'=>array('bob','phil'), 'Age'=>array(21, 43))); * $list = $list->filterAny(array('Name'=>array('bob','phil'), 'Age'=>array(21, 43)));
* // SQL: WHERE (("Name" IN ('bob', 'phil')) OR ("Age" IN ('21', '43')) * // SQL: WHERE (("Name" IN ('bob', 'phil')) OR ("Age" IN ('21', '43'))
* *
* @todo extract the sql from this method into a SQLGenerator class
*
* @param string|array See {@link filter()} * @param string|array See {@link filter()}
* @return static * @return static
*/ */
@ -679,8 +675,6 @@ class DataList extends ViewableData implements SS_List, Filterable, Sortable, Li
* @example $list = $list->exclude(array('Name'=>array('bob','phil'), 'Age'=>array(21, 43))); * @example $list = $list->exclude(array('Name'=>array('bob','phil'), 'Age'=>array(21, 43)));
* // bob age 21 or 43, phil age 21 or 43 would be excluded * // bob age 21 or 43, phil age 21 or 43 would be excluded
* *
* @todo extract the sql from this method into a SQLGenerator class
*
* @param string|array * @param string|array
* @param string [optional] * @param string [optional]
* *
@ -1836,7 +1830,6 @@ class DataList extends ViewableData implements SS_List, Filterable, Sortable, Li
/** /**
* Return a new item to add to this DataList. * Return a new item to add to this DataList.
* *
* @todo This doesn't factor in filters.
* @param array $initialFields * @param array $initialFields
* @return DataObject * @return DataObject
*/ */
@ -1850,8 +1843,6 @@ class DataList extends ViewableData implements SS_List, Filterable, Sortable, Li
* Remove this item by deleting it * Remove this item by deleting it
* *
* @param DataObject $item * @param DataObject $item
* @todo Allow for amendment of this behaviour - for example, we can remove an item from
* an "ActiveItems" DataList by changing the status to inactive.
*/ */
public function remove($item) public function remove($item)
{ {

View File

@ -99,9 +99,6 @@ use stdClass;
* the results are cached in memory through {@link cachedCall()}. * the results are cached in memory through {@link cachedCall()}.
* *
* *
* @todo Add instance specific removeExtension() which undos loadExtraStatics()
* and defineMethods()
*
* @property int $ID ID of the DataObject, 0 if the DataObject doesn't exist in database. * @property int $ID ID of the DataObject, 0 if the DataObject doesn't exist in database.
* @property int $OldID ID of object, if deleted * @property int $OldID ID of object, if deleted
* @property string $Title * @property string $Title
@ -128,8 +125,6 @@ class DataObject extends ViewableData implements DataObjectInterface, i18nEntity
private static $plural_name = null; private static $plural_name = null;
/** /**
* Allow API access to this object?
* @todo Define the options that can be set here
* @config * @config
*/ */
private static $api_access = false; private static $api_access = false;
@ -682,8 +677,6 @@ class DataObject extends ViewableData implements DataObjectInterface, i18nEntity
$clonedItem = $item->duplicate(false); $clonedItem = $item->duplicate(false);
$destinationObject->setComponent($relation, $clonedItem); $destinationObject->setComponent($relation, $clonedItem);
// After $clonedItem is assigned the appropriate FieldID / FieldClass, force write // After $clonedItem is assigned the appropriate FieldID / FieldClass, force write
// @todo Write this component in onAfterWrite instead, assigning the FieldID then
// https://github.com/silverstripe/silverstripe-framework/issues/7818
$clonedItem->write(); $clonedItem->write();
} }
@ -1151,7 +1144,6 @@ class DataObject extends ViewableData implements DataObjectInterface, i18nEntity
continue; continue;
} }
// TODO remove redundant merge of has_one fields
$leftObj->{$key} = $rightObj->{$key}; $leftObj->{$key} = $rightObj->{$key};
} }
@ -1752,10 +1744,6 @@ class DataObject extends ViewableData implements DataObjectInterface, i18nEntity
throw new LogicException("DataObject::delete() called on a DataObject without an ID"); throw new LogicException("DataObject::delete() called on a DataObject without an ID");
} }
// TODO: This is quite ugly. To improve:
// - move the details of the delete code in the DataQuery system
// - update the code to just delete the base table, and rely on cascading deletes in the DB to do the rest
// obviously, that means getting requireTable() to configure cascading deletes ;-)
$srcQuery = DataList::create(static::class) $srcQuery = DataList::create(static::class)
->filter('ID', $this->ID) ->filter('ID', $this->ID)
->dataQuery() ->dataQuery()
@ -1908,8 +1896,6 @@ class DataObject extends ViewableData implements DataObjectInterface, i18nEntity
$schema = static::getSchema(); $schema = static::getSchema();
if ($class = $schema->hasOneComponent(static::class, $componentName)) { if ($class = $schema->hasOneComponent(static::class, $componentName)) {
// Force item to be written if not by this point // Force item to be written if not by this point
// @todo This could be lazy-written in a beforeWrite hook, but force write here for simplicity
// https://github.com/silverstripe/silverstripe-framework/issues/7818
if ($item && !$item->isInDB()) { if ($item && !$item->isInDB()) {
$item->write(); $item->write();
} }
@ -2594,8 +2580,6 @@ class DataObject extends ViewableData implements DataObjectInterface, i18nEntity
* by default. To customize, either overload this method in your * by default. To customize, either overload this method in your
* subclass, or extend it by {@link DataExtension->updateFrontEndFields()}. * subclass, or extend it by {@link DataExtension->updateFrontEndFields()}.
* *
* @todo Decide on naming for "website|frontend|site|page" and stick with it in the API
*
* @param array $params See {@link scaffoldFormFields()} * @param array $params See {@link scaffoldFormFields()}
* @return FieldList Always returns a simple field collection without TabSet. * @return FieldList Always returns a simple field collection without TabSet.
*/ */
@ -2692,7 +2676,6 @@ class DataObject extends ViewableData implements DataObjectInterface, i18nEntity
$columns = []; $columns = [];
// Add SQL for fields, both simple & multi-value // Add SQL for fields, both simple & multi-value
// TODO: This is copy & pasted from buildSQL(), it could be moved into a method
$databaseFields = $schema->databaseFields($class, false); $databaseFields = $schema->databaseFields($class, false);
foreach ($databaseFields as $k => $v) { foreach ($databaseFields as $k => $v) {
if (!isset($this->record[$k]) || $this->record[$k] === null) { if (!isset($this->record[$k]) || $this->record[$k] === null) {
@ -2771,7 +2754,6 @@ class DataObject extends ViewableData implements DataObjectInterface, i18nEntity
array_keys($this->record ?? []), array_keys($this->record ?? []),
array_fill(0, count($this->record ?? []), self::CHANGE_STRICT) array_fill(0, count($this->record ?? []), self::CHANGE_STRICT)
); );
// @todo Find better way to allow versioned to write a new version after forceChange
unset($changed['Version']); unset($changed['Version']);
} else { } else {
$changed = $this->changed; $changed = $this->changed;
@ -2905,8 +2887,6 @@ class DataObject extends ViewableData implements DataObjectInterface, i18nEntity
// if a field is not existing or has strictly changed // if a field is not existing or has strictly changed
if (!array_key_exists($fieldName, $this->original ?? []) || $this->original[$fieldName] !== $val) { if (!array_key_exists($fieldName, $this->original ?? []) || $this->original[$fieldName] !== $val) {
// TODO Add check for php-level defaults which are not set in the db
// TODO Add check for hidden input-fields (readonly) which are not set in the db
// At the very least, the type has changed // At the very least, the type has changed
$this->changed[$fieldName] = self::CHANGE_STRICT; $this->changed[$fieldName] = self::CHANGE_STRICT;
@ -3314,8 +3294,6 @@ class DataObject extends ViewableData implements DataObjectInterface, i18nEntity
* @param string|array $limit A limit expression to be inserted into the LIMIT clause. * @param string|array $limit A limit expression to be inserted into the LIMIT clause.
* @param string $containerClass The container class to return the results in. * @param string $containerClass The container class to return the results in.
* *
* @todo $containerClass is Ignored, why?
*
* @return DataList The objects matching the filter, in the class specified by $containerClass * @return DataList The objects matching the filter, in the class specified by $containerClass
*/ */
public static function get( public static function get(
@ -3480,7 +3458,6 @@ class DataObject extends ViewableData implements DataObjectInterface, i18nEntity
*/ */
public static function reset() public static function reset()
{ {
// @todo Decouple these
DBEnum::flushCache(); DBEnum::flushCache();
ClassInfo::reset_db_cache(); ClassInfo::reset_db_cache();
static::getSchema()->reset(); static::getSchema()->reset();
@ -3941,8 +3918,6 @@ class DataObject extends ViewableData implements DataObjectInterface, i18nEntity
/** /**
* Get the default summary fields for this object. * Get the default summary fields for this object.
* *
* @todo use the translation apparatus to return a default field selection for the language
*
* @return array * @return array
*/ */
public function summaryFields() public function summaryFields()
@ -4000,8 +3975,6 @@ class DataObject extends ViewableData implements DataObjectInterface, i18nEntity
* it is constructed here. Otherwise, the default filter specified in * it is constructed here. Otherwise, the default filter specified in
* {@link DBField} is used. * {@link DBField} is used.
* *
* @todo error handling/type checking for valid FormField and SearchFilter subclasses?
*
* @return array * @return array
*/ */
public function defaultSearchFilters() public function defaultSearchFilters()

View File

@ -1153,7 +1153,7 @@ class DataObjectSchema
if ($key === 'from') { if ($key === 'from') {
return $relationClass; return $relationClass;
} }
// @todo support polymorphic 'to'
throw new InvalidArgumentException( throw new InvalidArgumentException(
"many_many through relation {$parentClass}.{$component} {$key} references a polymorphic field " "many_many through relation {$parentClass}.{$component} {$key} references a polymorphic field "
. "{$joinClass}::{$relation} which is not supported" . "{$joinClass}::{$relation} which is not supported"

View File

@ -68,9 +68,8 @@ class DataQuery
*/ */
private $queryFinalised = false; private $queryFinalised = false;
// TODO: replace subclass_access with this
protected $querySubclasses = true; protected $querySubclasses = true;
// TODO: replace restrictclasses with this
protected $filterByClassName = true; protected $filterByClassName = true;
/** /**
@ -346,9 +345,6 @@ class DataQuery
"RecordClassName" "RecordClassName"
); );
// TODO: Versioned, SiteTreeSubsites, etc, could probably be better implemented as subclasses
// of DataQuery
$obj = Injector::inst()->get($this->dataClass); $obj = Injector::inst()->get($this->dataClass);
$obj->extend('augmentSQL', $query, $this); $obj->extend('augmentSQL', $query, $this);

View File

@ -519,8 +519,6 @@ class DatabaseAdmin extends Controller
/** /**
* Migrate all class names * Migrate all class names
*
* @todo Migrate to separate build task
*/ */
protected function migrateClassNames() protected function migrateClassNames()
{ {

View File

@ -12,8 +12,6 @@ use SilverStripe\ORM\Queries\SQLSelect;
* Extend this class when designing a {@link DBField} that doesn't have a 1-1 mapping with a database field. * Extend this class when designing a {@link DBField} that doesn't have a 1-1 mapping with a database field.
* This includes multi-value fields and transformed fields * This includes multi-value fields and transformed fields
* *
* @todo Unittests for loading and saving composite values (see GIS module for existing similar unittests)
*
* Example with a combined street name and number: * Example with a combined street name and number:
* <code> * <code>
* class Street extends DBComposite { * class Street extends DBComposite {

View File

@ -30,7 +30,6 @@ use SilverStripe\View\TemplateGlobalProvider;
* ); * );
* </code> * </code>
* *
* @todo Add localization support, see http://open.silverstripe.com/ticket/2931
*/ */
class DBDatetime extends DBDate implements TemplateGlobalProvider class DBDatetime extends DBDate implements TemplateGlobalProvider
{ {

View File

@ -14,7 +14,6 @@ class DBDouble extends DBFloat
public function requireField() public function requireField()
{ {
// HACK: MSSQL does not support double so we're using float instead // HACK: MSSQL does not support double so we're using float instead
// @todo This should go into MSSQLDatabase ideally somehow
if (DB::get_conn() instanceof MySQLDatabase) { if (DB::get_conn() instanceof MySQLDatabase) {
DB::require_field($this->tableName, $this->name, "double"); DB::require_field($this->tableName, $this->name, "double");
} else { } else {

View File

@ -41,8 +41,6 @@ use SilverStripe\View\ViewableData;
* } * }
* } * }
* </code> * </code>
*
* @todo remove MySQL specific code from subclasses
*/ */
abstract class DBField extends ViewableData implements DBIndexable abstract class DBField extends ViewableData implements DBIndexable
{ {
@ -579,12 +577,6 @@ abstract class DBField extends ViewableData implements DBIndexable
} }
/** /**
* @todo documentation
*
* @todo figure out how we pass configuration parameters to
* search filters (note: parameter hack now in place to pass in the required full path - using $this->name
* won't work)
*
* @param string $name Override name of this field * @param string $name Override name of this field
* @return SearchFilter * @return SearchFilter
*/ */

View File

@ -6,8 +6,6 @@ use SilverStripe\i18n\i18n;
/** /**
* Locale database field * Locale database field
*
* @todo Allowing showing locale values in different languages through Nice()
*/ */
class DBLocale extends DBVarchar class DBLocale extends DBVarchar
{ {

View File

@ -35,7 +35,6 @@ class DBMultiEnum extends DBEnum
public function requireField() public function requireField()
{ {
// @todo: Remove mysql-centric logic from this
$charset = Config::inst()->get(MySQLDatabase::class, 'charset'); $charset = Config::inst()->get(MySQLDatabase::class, 'charset');
$collation = Config::inst()->get(MySQLDatabase::class, 'collation'); $collation = Config::inst()->get(MySQLDatabase::class, 'collation');
$values = [ $values = [

View File

@ -18,9 +18,8 @@ class DBPolymorphicForeignKey extends DBComposite
public function scaffoldFormField($title = null, $params = null) public function scaffoldFormField($title = null, $params = null)
{ {
// Opt-out of form field generation - Scaffolding should be performed on // Don't provide scaffolded form field generation - Scaffolding should be performed on
// the has_many end, or set programmatically. // the has_many end, or set programmatically.
// @todo - Investigate suitable FormField
return null; return null;
} }

View File

@ -7,8 +7,6 @@ use SilverStripe\ORM\DB;
/** /**
* A special type Int field used for primary keys. * A special type Int field used for primary keys.
*
* @todo Allow for custom limiting/filtering of scaffoldFormField dropdown
*/ */
class DBPrimaryKey extends DBInt class DBPrimaryKey extends DBInt
{ {

View File

@ -13,7 +13,6 @@ use SilverStripe\ORM\DataList;
/** /**
* Selects textual content with an exact match between columnname and keyword. * Selects textual content with an exact match between columnname and keyword.
* *
* @todo documentation
*/ */
class ExactMatchFilter extends SearchFilter class ExactMatchFilter extends SearchFilter
{ {

View File

@ -25,7 +25,6 @@ use Exception;
* ]; * ];
* </code> * </code>
* *
* @todo Add support for databases besides MySQL
*/ */
class FulltextFilter extends SearchFilter class FulltextFilter extends SearchFilter
{ {

View File

@ -332,7 +332,6 @@ abstract class SearchFilter
public function getDbFormattedValue() public function getDbFormattedValue()
{ {
// SRM: This code finds the table where the field named $this->name lives // SRM: This code finds the table where the field named $this->name lives
// Todo: move to somewhere more appropriate, such as DataMapper, the magical class-to-be?
if ($this->aggregate) { if ($this->aggregate) {
return intval($this->value); return intval($this->value);

View File

@ -4,11 +4,6 @@ namespace SilverStripe\ORM\Filters;
use SilverStripe\ORM\DataQuery; use SilverStripe\ORM\DataQuery;
/**
* Incomplete.
*
* @todo add to tests
*/
class WithinRangeFilter extends SearchFilter class WithinRangeFilter extends SearchFilter
{ {

View File

@ -119,7 +119,6 @@ class HasManyList extends RelationList
* Doesn't actually remove the item, it just clears the foreign key value. * Doesn't actually remove the item, it just clears the foreign key value.
* *
* @param DataObject $item The DataObject to be removed * @param DataObject $item The DataObject to be removed
* @todo Maybe we should delete the object instead?
*/ */
public function remove($item) public function remove($item)
{ {

View File

@ -111,7 +111,6 @@ class PolymorphicHasManyList extends HasManyList
* Doesn't actually remove the item, it just clears the foreign key value. * Doesn't actually remove the item, it just clears the foreign key value.
* *
* @param DataObject $item The DataObject to be removed * @param DataObject $item The DataObject to be removed
* @todo Maybe we should delete the object instead?
*/ */
public function remove($item) public function remove($item)
{ {

View File

@ -68,8 +68,6 @@ class SQLAssignmentRow
$parameters = [$parameters]; $parameters = [$parameters];
} }
// @todo Some input sanitisation checking the key contains the
// correct number of ? placeholders as the number of parameters
return [$sql => $parameters]; return [$sql => $parameters];
} }
} }

View File

@ -271,8 +271,6 @@ abstract class SQLConditionalExpression extends SQLExpression
/** /**
* Retrieves the finalized list of joins * Retrieves the finalized list of joins
* *
* @todo This part of the code could be simplified
*
* @param array $parameters Out variable for parameters required for this query * @param array $parameters Out variable for parameters required for this query
* @return array List of joins as a mapping from array('Alias' => 'Join Expression') * @return array List of joins as a mapping from array('Alias' => 'Join Expression')
*/ */
@ -716,8 +714,6 @@ abstract class SQLConditionalExpression extends SQLExpression
/** /**
* Checks whether this query is for a specific ID in a table * Checks whether this query is for a specific ID in a table
* *
* @todo Doesn't work with combined statements (e.g. "Foo='bar' AND ID=5")
*
* @return boolean * @return boolean
*/ */
public function filtersOnID() public function filtersOnID()
@ -736,15 +732,12 @@ abstract class SQLConditionalExpression extends SQLExpression
/** /**
* Checks whether this query is filtering on a foreign key, ie finding a has_many relationship * Checks whether this query is filtering on a foreign key, ie finding a has_many relationship
* *
* @todo Doesn't work with combined statements (e.g. "Foo='bar' AND ParentID=5")
*
* @return boolean * @return boolean
*/ */
public function filtersOnFK() public function filtersOnFK()
{ {
$regexp = '/^(.*\.)?("|`)?[a-zA-Z]+ID("|`)?\s?(=|IN)/'; $regexp = '/^(.*\.)?("|`)?[a-zA-Z]+ID("|`)?\s?(=|IN)/';
// @todo - Test this works with parameterized queries
foreach ($this->getWhereParameterised($parameters) as $predicate) { foreach ($this->getWhereParameterised($parameters) as $predicate) {
if (preg_match($regexp ?? '', $predicate ?? '')) { if (preg_match($regexp ?? '', $predicate ?? '')) {
return true; return true;

View File

@ -45,8 +45,6 @@ abstract class SQLExpression
/** /**
* Return the generated SQL string for this query * Return the generated SQL string for this query
* *
* @todo Is it ok for this to consider parameters? Test cases here!
*
* @return string * @return string
*/ */
public function __toString() public function __toString()

View File

@ -653,7 +653,6 @@ class SQLSelect extends SQLConditionalExpression
// Choose a default column // Choose a default column
if ($column == null) { if ($column == null) {
if ($this->groupby) { if ($this->groupby) {
// @todo Test case required here
$countQuery = new SQLSelect(); $countQuery = new SQLSelect();
$countQuery->setSelect("count(*)"); $countQuery->setSelect("count(*)");
$countQuery->setFrom(['(' . $clone->sql($innerParameters) . ') all_distinct']); $countQuery->setFrom(['(' . $clone->sql($innerParameters) . ') all_distinct']);

View File

@ -107,10 +107,6 @@ class SearchContext
return ($this->fields) ? $this->fields : singleton($this->modelClass)->scaffoldSearchFields(); return ($this->fields) ? $this->fields : singleton($this->modelClass)->scaffoldSearchFields();
} }
/**
* @todo move to SQLSelect
* @todo fix hack
*/
protected function applyBaseTableFields() protected function applyBaseTableFields()
{ {
$classes = ClassInfo::dataClassesFor($this->modelClass); $classes = ClassInfo::dataClassesFor($this->modelClass);
@ -327,8 +323,6 @@ class SearchContext
/** /**
* Returns a result set from the given search parameters. * Returns a result set from the given search parameters.
* *
* @todo rearrange start and limit params to reflect DataObject
*
* @param array $searchParams * @param array $searchParams
* @param array|bool|string $sort * @param array|bool|string $sort
* @param array|null|string $limit * @param array|null|string $limit

View File

@ -183,8 +183,6 @@ class Group extends DataObject
if ($record && !$record->ID) { if ($record && !$record->ID) {
$groupsField->setValue($group->ID); $groupsField->setValue($group->ID);
} elseif ($record && $record->ID) { } elseif ($record && $record->ID) {
// TODO Mark disabled once chosen.js supports it
// $groupsField->setDisabledItems(array($group->ID));
$form->Fields()->replaceField( $form->Fields()->replaceField(
'DirectGroups', 'DirectGroups',
$groupsField->performReadonlyTransformation() $groupsField->performReadonlyTransformation()
@ -194,8 +192,6 @@ class Group extends DataObject
}); });
$memberList = GridField::create('Members', false, $this->DirectMembers(), $config) $memberList = GridField::create('Members', false, $this->DirectMembers(), $config)
->addExtraClass('members_grid'); ->addExtraClass('members_grid');
// @todo Implement permission checking on GridField
//$memberList->setPermissions(array('edit', 'delete', 'export', 'add', 'inlineadd'));
$fields->addFieldToTab('Root.Members', $memberList); $fields->addFieldToTab('Root.Members', $memberList);
} }
@ -238,8 +234,6 @@ class Group extends DataObject
sprintf( sprintf(
'<a href="%s" class="add-role">%s</a>', '<a href="%s" class="add-role">%s</a>',
SecurityAdmin::singleton()->Link('show/root#Root_Roles'), SecurityAdmin::singleton()->Link('show/root#Root_Roles'),
// TODO This should include #Root_Roles to switch directly to the tab,
// but tabstrip.js doesn't display tabs when directly addressed through a URL pragma
_t('SilverStripe\\Security\\Group.RolesAddEditLink', 'Manage roles') _t('SilverStripe\\Security\\Group.RolesAddEditLink', 'Manage roles')
) . ) .
"</p>" "</p>"

View File

@ -5,9 +5,6 @@ namespace SilverStripe\Security;
use SilverStripe\Dev\CsvBulkLoader; use SilverStripe\Dev\CsvBulkLoader;
use SilverStripe\ORM\DataObject; use SilverStripe\ORM\DataObject;
/**
* @todo Migrate Permission->Arg and Permission->Type values
*/
class GroupCsvBulkLoader extends CsvBulkLoader class GroupCsvBulkLoader extends CsvBulkLoader
{ {

View File

@ -116,9 +116,6 @@ class Member extends DataObject
* statement. * statement.
* *
* @var array * @var array
* @todo Generic implementation of $searchable_fields on DataObject,
* with definition for different searching algorithms
* (LIKE, FULLTEXT) and default FormFields to construct a searchform.
*/ */
private static $searchable_fields = [ private static $searchable_fields = [
'FirstName', 'FirstName',
@ -448,7 +445,6 @@ class Member extends DataObject
*/ */
public function beforeMemberLoggedIn() public function beforeMemberLoggedIn()
{ {
// @todo Move to middleware on the AuthenticationMiddleware IdentityStore
$this->extend('beforeMemberLoggedIn'); $this->extend('beforeMemberLoggedIn');
} }
@ -621,7 +617,6 @@ class Member extends DataObject
* Returns the fields for the member form - used in the registration/profile module. * Returns the fields for the member form - used in the registration/profile module.
* It should return fields that are editable by the admin and the logged-in user. * It should return fields that are editable by the admin and the logged-in user.
* *
* @todo possibly move this to an extension
* *
* @return FieldList Returns a {@link FieldList} containing the fields for * @return FieldList Returns a {@link FieldList} containing the fields for
* the member form. * the member form.
@ -778,7 +773,6 @@ class Member extends DataObject
// We don't send emails out on dev/tests sites to prevent accidentally spamming users. // We don't send emails out on dev/tests sites to prevent accidentally spamming users.
// However, if TestMailer is in use this isn't a risk. // However, if TestMailer is in use this isn't a risk.
// @todo some developers use external tools, so emailing might be a good idea anyway
if ((Director::isLive() || Injector::inst()->get(MailerInterface::class) instanceof TestMailer) if ((Director::isLive() || Injector::inst()->get(MailerInterface::class) instanceof TestMailer)
&& $this->isChanged('Password') && $this->isChanged('Password')
&& $this->record['Password'] && $this->record['Password']
@ -1159,7 +1153,6 @@ class Member extends DataObject
* including any parent groups where membership is implied. * including any parent groups where membership is implied.
* Use {@link DirectGroups()} to only retrieve the group relations without inheritance. * Use {@link DirectGroups()} to only retrieve the group relations without inheritance.
* *
* @todo Push all this logic into Member_GroupSet's getIterator()?
* @return Member_Groupset * @return Member_Groupset
*/ */
public function Groups() public function Groups()

View File

@ -58,7 +58,6 @@ class ChangePasswordHandler extends RequestHandler
/** /**
* Handle the change password request * Handle the change password request
* @todo this could use some spring cleaning
* *
* @return array|HTTPResponse * @return array|HTTPResponse
*/ */

View File

@ -173,13 +173,9 @@ class CookieAuthenticationHandler implements AuthenticationHandler
} }
if ($this->cascadeInTo) { if ($this->cascadeInTo) {
// @todo look at how to block "regular login" triggers from happening here
// @todo deal with the fact that the Session::current_session() isn't correct here :-/
$this->cascadeInTo->logIn($member, false, $request); $this->cascadeInTo->logIn($member, false, $request);
} }
// @todo Consider whether response should be part of logIn() as well
// Renew the token // Renew the token
$rememberLoginHash->renew(); $rememberLoginHash->renew();
$tokenExpiryDays = RememberLoginHash::config()->uninherited('token_expiry_days'); $tokenExpiryDays = RememberLoginHash::config()->uninherited('token_expiry_days');

View File

@ -168,7 +168,6 @@ class MemberAuthenticator implements Authenticator
/** /**
* Log login attempt * Log login attempt
* TODO We could handle this with an extension
* *
* @param array $data * @param array $data
* @param HTTPRequest $request * @param HTTPRequest $request

View File

@ -84,7 +84,6 @@ class MemberLoginForm extends BaseLoginForm
} }
if ($checkCurrentUser && Security::getCurrentUser()) { if ($checkCurrentUser && Security::getCurrentUser()) {
// @todo find a more elegant way to handle this
$logoutAction = Security::logout_url(); $logoutAction = Security::logout_url();
$fields = FieldList::create( $fields = FieldList::create(
HiddenField::create('AuthenticationMethod', null, $this->getAuthenticatorClass(), $this) HiddenField::create('AuthenticationMethod', null, $this->getAuthenticatorClass(), $this)
@ -134,7 +133,6 @@ class MemberLoginForm extends BaseLoginForm
HiddenField::create("AuthenticationMethod", null, $this->getAuthenticatorClass(), $this), HiddenField::create("AuthenticationMethod", null, $this->getAuthenticatorClass(), $this),
// Regardless of what the unique identifier field is (usually 'Email'), it will be held in the // Regardless of what the unique identifier field is (usually 'Email'), it will be held in the
// 'Email' value, below: // 'Email' value, below:
// @todo Rename the field to a more generic covering name
$emailField = TextField::create("Email", $label, null, null, $this), $emailField = TextField::create("Email", $label, null, null, $this),
PasswordField::create("Password", _t('SilverStripe\\Security\\Member.PASSWORD', 'Password')) PasswordField::create("Password", _t('SilverStripe\\Security\\Member.PASSWORD', 'Password'))
); );

View File

@ -80,7 +80,6 @@ class SessionAuthenticationHandler implements AuthenticationHandler
$session->set($this->getSessionVariable(), $member->ID); $session->set($this->getSessionVariable(), $member->ID);
// This lets apache rules detect whether the user has logged in // This lets apache rules detect whether the user has logged in
// @todo make this a setting on the authentication handler
if (Member::config()->get('login_marker_cookie')) { if (Member::config()->get('login_marker_cookie')) {
Cookie::set(Member::config()->get('login_marker_cookie'), 1, 0); Cookie::set(Member::config()->get('login_marker_cookie'), 1, 0);
} }
@ -109,7 +108,6 @@ class SessionAuthenticationHandler implements AuthenticationHandler
$file = ''; $file = '';
$line = ''; $line = '';
// TODO: deprecate and use Session::regenerateSessionId
// @ is to suppress win32 warnings/notices when session wasn't cleaned up properly // @ is to suppress win32 warnings/notices when session wasn't cleaned up properly
// There's nothing we can do about this, because it's an operating system function! // There's nothing we can do about this, because it's an operating system function!
if (!headers_sent($file, $line)) { if (!headers_sent($file, $line)) {

View File

@ -45,7 +45,6 @@ class MemberCsvBulkLoader extends CsvBulkLoader
/** @var Member $member */ /** @var Member $member */
$member = DataObject::get_by_id($this->objectClass, $objID); $member = DataObject::get_by_id($this->objectClass, $objID);
foreach ($this->groups as $group) { foreach ($this->groups as $group) {
// TODO This isnt the most memory effective way to add members to a group
$member->Groups()->add($group); $member->Groups()->add($group);
} }

View File

@ -133,7 +133,6 @@ class Permission extends DataObject implements TemplateGlobalProvider, Resettabl
/** /**
* Flush the permission cache, for example if you have edited group membership or a permission record. * Flush the permission cache, for example if you have edited group membership or a permission record.
* @todo Call this whenever Group_Members is added to or removed from
*/ */
public static function reset() public static function reset()
{ {

View File

@ -416,7 +416,6 @@ class Security extends Controller implements TemplateGlobalProvider
$request->getSession()->set("BackURL", $_SERVER['REQUEST_URI']); $request->getSession()->set("BackURL", $_SERVER['REQUEST_URI']);
} }
// TODO AccessLogEntry needs an extension to handle permission denied errors
// Audit logging hook // Audit logging hook
$controller->extend('permissionDenied', $member); $controller->extend('permissionDenied', $member);

View File

@ -35,7 +35,6 @@ use SilverStripe\View\TemplateGlobalProvider;
* } * }
* </code> * </code>
* *
* @todo Make token name form specific for additional forgery protection.
*/ */
class SecurityToken implements TemplateGlobalProvider class SecurityToken implements TemplateGlobalProvider
{ {

View File

@ -1886,8 +1886,6 @@ class SSTemplateParser extends Parser implements TemplateParser
$res['php'] .= '((bool)'.$sub['php'].')'; $res['php'] .= '((bool)'.$sub['php'].')';
} else { } else {
$php = ($sub['ArgumentMode'] == 'default' ? $sub['lookup_php'] : $sub['php']); $php = ($sub['ArgumentMode'] == 'default' ? $sub['lookup_php'] : $sub['php']);
// TODO: kinda hacky - maybe we need a way to pass state down the parse chain so
// Lookup_LastLookupStep and Argument_BareWord can produce hasValue instead of XML_val
$res['php'] .= str_replace('$$FINAL', 'hasValue', $php ?? ''); $res['php'] .= str_replace('$$FINAL', 'hasValue', $php ?? '');
} }
} }
@ -5292,8 +5290,6 @@ class SSTemplateParser extends Parser implements TemplateParser
$text = stripslashes($text ?? ''); $text = stripslashes($text ?? '');
$text = addcslashes($text ?? '', '\'\\'); $text = addcslashes($text ?? '', '\'\\');
// TODO: This is pretty ugly & gets applied on all files not just html. I wonder if we can make this
// non-dynamically calculated
$code = <<<'EOC' $code = <<<'EOC'
(\SilverStripe\View\SSViewer::getRewriteHashLinksDefault() (\SilverStripe\View\SSViewer::getRewriteHashLinksDefault()
? \SilverStripe\Core\Convert::raw2att( preg_replace("/^(\\/)+/", "/", $_SERVER['REQUEST_URI'] ) ) ? \SilverStripe\Core\Convert::raw2att( preg_replace("/^(\\/)+/", "/", $_SERVER['REQUEST_URI'] ) )
@ -5332,8 +5328,7 @@ EOC;
$this->includeDebuggingComments = $includeDebuggingComments; $this->includeDebuggingComments = $includeDebuggingComments;
// Ignore UTF8 BOM at beginning of string. TODO: Confirm this is needed, make sure SSViewer handles UTF // Ignore UTF8 BOM at beginning of string.
// (and other encodings) properly
if (substr($string ?? '', 0, 3) == pack("CCC", 0xef, 0xbb, 0xbf)) { if (substr($string ?? '', 0, 3) == pack("CCC", 0xef, 0xbb, 0xbf)) {
$this->pos = 3; $this->pos = 3;
} }

View File

@ -438,8 +438,6 @@ class ViewableData implements IteratorAggregate
{ {
$class = $this->castingClass($field) ?: $this->config()->get('default_cast'); $class = $this->castingClass($field) ?: $this->config()->get('default_cast');
// TODO: It would be quicker not to instantiate the object, but to merely
// get its class from the Injector
/** @var DBField $type */ /** @var DBField $type */
$type = Injector::inst()->get($class, true); $type = Injector::inst()->get($class, true);
return $type->config()->get('escape_type'); return $type->config()->get('escape_type');

View File

@ -71,8 +71,6 @@ class i18nTextCollector
* The directory base on which the collector should act. * The directory base on which the collector should act.
* Usually the webroot set through {@link Director::baseFolder()}. * Usually the webroot set through {@link Director::baseFolder()}.
* *
* @todo Fully support changing of basePath through {@link SSViewer} and {@link ManifestBuilder}
*
* @var string * @var string
*/ */
public $basePath; public $basePath;
@ -314,9 +312,6 @@ class i18nTextCollector
return $owner; return $owner;
} }
// @todo - How to determine ownership of templates? Templates can
// exist in multiple locations with the same name.
// Display notice if not found // Display notice if not found
Debug::message( Debug::message(
"Duplicate key {$key} detected in no / multiple modules with no obvious owner", "Duplicate key {$key} detected in no / multiple modules with no obvious owner",

View File

@ -137,7 +137,6 @@ class CmsFormsContext implements Context
* Example: Given "my text" in the "Content" HTML field should be right aligned * Example: Given "my text" in the "Content" HTML field should be right aligned
* Example: Given "my text" in the "Content" HTML field should not be bold * Example: Given "my text" in the "Content" HTML field should not be bold
* *
* @todo Use an actual DOM parser for more accurate assertions
* *
* @Given /^"(?P<text>([^"]*))" in the "(?P<field>(?:[^"]|\\")*)" HTML field should(?P<negate>(?: not)?) be (?P<formatting>(.*))$/ * @Given /^"(?P<text>([^"]*))" in the "(?P<field>(?:[^"]|\\")*)" HTML field should(?P<negate>(?: not)?) be (?P<formatting>(.*))$/
*/ */
@ -194,8 +193,7 @@ class CmsFormsContext implements Context
$text = addcslashes($text ?? '', "'"); $text = addcslashes($text ?? '', "'");
$js = <<<JS $js = <<<JS
// TODO <IE9 support
// TODO Allow text matches across nodes
var editor = jQuery('#$inputFieldId').entwine('ss').getEditor(), var editor = jQuery('#$inputFieldId').entwine('ss').getEditor(),
doc = editor.getInstance().getDoc(), doc = editor.getInstance().getDoc(),
sel = editor.getInstance().selection, sel = editor.getInstance().selection,

View File

@ -594,8 +594,6 @@ SCRIPT
*/ */
public function clickLinkInPreview($link) public function clickLinkInPreview($link)
{ {
// TODO Remove once we have native support in Mink and php-webdriver,
// see https://groups.google.com/forum/#!topic/behat/QNhOuGHKEWI
$this->getSession()->switchToIFrame('cms-preview-iframe'); $this->getSession()->switchToIFrame('cms-preview-iframe');
$link = $this->fixStepArgument($link); $link = $this->fixStepArgument($link);
$this->getSession()->getPage()->clickLink($link); $this->getSession()->getPage()->clickLink($link);

View File

@ -18,9 +18,6 @@ use SilverStripe\Core\Environment;
use SilverStripe\Core\Kernel; use SilverStripe\Core\Kernel;
use SilverStripe\Dev\SapphireTest; use SilverStripe\Dev\SapphireTest;
/**
* @todo test Director::alternateBaseFolder()
*/
class DirectorTest extends SapphireTest class DirectorTest extends SapphireTest
{ {
protected static $extra_controllers = [ protected static $extra_controllers = [

View File

@ -133,9 +133,6 @@ class SessionTest extends SapphireTest
public function testStartRetainsInMemoryData() public function testStartRetainsInMemoryData()
{ {
$this->markTestIncomplete('Test'); $this->markTestIncomplete('Test');
// TODO Figure out how to simulate session vars without a session_start() resetting them
// $_SESSION['existing'] = true;
// $_SESSION['merge'] = 1;
$req = new HTTPRequest('GET', '/'); $req = new HTTPRequest('GET', '/');
$session = new Session(null); // unstarted session $session = new Session(null); // unstarted session
$session->set('new', true); $session->set('new', true);

View File

@ -214,8 +214,6 @@ PHP
/** /**
* Tests {@link Convert::testRaw2URL()} * Tests {@link Convert::testRaw2URL()}
*
* @todo test toASCII()
*/ */
public function testRaw2URL() public function testRaw2URL()
{ {

View File

@ -213,7 +213,6 @@ class ThemeResourceLoaderTest extends SapphireTest
*/ */
public function testFindTemplatesInApplication() public function testFindTemplatesInApplication()
{ {
// TODO: replace with one that doesn't create temporary files (so bad)
$templates = [ $templates = [
$this->base . '/myproject/templates/Page.ss', $this->base . '/myproject/templates/Page.ss',
$this->base . '/myproject/templates/Layout/Page.ss' $this->base . '/myproject/templates/Layout/Page.ss'

View File

@ -22,11 +22,6 @@ use SilverStripe\Core\Tests\ObjectTest\TestExtension;
use SilverStripe\Dev\SapphireTest; use SilverStripe\Dev\SapphireTest;
use SilverStripe\Versioned\Versioned; use SilverStripe\Versioned\Versioned;
/**
* @todo tests for addStaticVars()
* @todo tests for setting statics which are not defined on the object as built-in PHP statics
* @todo tests for setting statics through extensions (#2387)
*/
class ObjectTest extends SapphireTest class ObjectTest extends SapphireTest
{ {
@ -253,8 +248,6 @@ class ObjectTest extends SapphireTest
"Injected sub-extensions are detected with static has_extension() when added through add_extension()" "Injected sub-extensions are detected with static has_extension() when added through add_extension()"
); );
// @todo At the moment, this does NOT remove the extension due to parameterized naming,
// meaning the extension will remain added in further test cases
ExtensionTest::remove_extension(ExtendTest3::class); ExtensionTest::remove_extension(ExtendTest3::class);
} }

View File

@ -18,7 +18,6 @@ class PhpSyntaxTest extends SapphireTest
public function testShortTagsOffWillWork() public function testShortTagsOffWillWork()
{ {
// Ignore this test completely if running the test suite on windows // Ignore this test completely if running the test suite on windows
// TODO: Make it work on all platforms, by building an alternative to find | grep.
$returnCode = 0; $returnCode = 0;
$output = []; $output = [];
exec("which find && which grep && which php", $output, $returnCode); exec("which find && which grep && which php", $output, $returnCode);
@ -51,7 +50,6 @@ class PhpSyntaxTest extends SapphireTest
public function getAllFiles($ext = 'php') public function getAllFiles($ext = 'php')
{ {
// TODO: Unix only
$cmd = sprintf( $cmd = sprintf(
'find %s | grep %s', 'find %s | grep %s',
BASE_PATH, BASE_PATH,

View File

@ -227,8 +227,6 @@ class CsvBulkLoaderTest extends SapphireTest
/** /**
* Test import with custom identifiers by importing the data. * Test import with custom identifiers by importing the data.
*
* @todo Test duplicateCheck callbacks
*/ */
public function testLoadWithIdentifiers() public function testLoadWithIdentifiers()
{ {

View File

@ -18,9 +18,6 @@ class CurrencyFieldDisabledTest extends SapphireTest
$this->assertStringContainsString('$5.00', $result, 'The value should be rendered'); $this->assertStringContainsString('$5.00', $result, 'The value should be rendered');
} }
/**
* @todo: Update the expectation when intl for currencies is implemented
*/
public function testFieldWithCustomisedCurrencySymbol() public function testFieldWithCustomisedCurrencySymbol()
{ {
DBCurrency::config()->set('currency_symbol', '€'); DBCurrency::config()->set('currency_symbol', '€');

View File

@ -37,9 +37,6 @@ class CurrencyFieldReadonlyTest extends SapphireTest
$this->assertStringContainsString('AUD0.00', $result, 'The value should be rendered'); $this->assertStringContainsString('AUD0.00', $result, 'The value should be rendered');
} }
/**
* @todo: Update the expectation when intl for currencies is implemented
*/
public function testFieldWithCustomisedCurrencySymbol() public function testFieldWithCustomisedCurrencySymbol()
{ {
DBCurrency::config()->set('currency_symbol', '€'); DBCurrency::config()->set('currency_symbol', '€');

View File

@ -18,8 +18,6 @@ class EmailFieldTest extends FunctionalTest
/** /**
* Check the php validator for email addresses. We should be checking against RFC 5322 which defines email address * Check the php validator for email addresses. We should be checking against RFC 5322 which defines email address
* syntax. * syntax.
*
* @TODO
* - double quotes around the local part (before @) is not supported * - double quotes around the local part (before @) is not supported
* - special chars ! # $ % & ' * + - / = ? ^ _ ` { | } ~ are all valid in local part * - special chars ! # $ % & ' * + - / = ? ^ _ ` { | } ~ are all valid in local part
* - special chars ()[]\;:,<> are valid in the local part if the local part is in double quotes * - special chars ()[]\;:,<> are valid in the local part if the local part is in double quotes

View File

@ -20,17 +20,6 @@ use SilverStripe\Forms\HiddenField;
/** /**
* Tests for FieldList * Tests for FieldList
*
* @todo test for {@link FieldList->setValues()}. Need to check
* that the values that were set are the correct ones given back.
* @todo test for {@link FieldList->transform()} and {@link FieldList->makeReadonly()}.
* Need to ensure that it correctly transforms the FieldList object.
* @todo test for {@link FieldList->HiddenFields()}. Need to check
* the fields returned are the correct HiddenField objects for a
* given FieldList instance.
* @todo test for {@link FieldList->dataFields()}.
* @todo test for {@link FieldList->findOrMakeTab()}.
* @todo the same as above with insertBefore() and insertAfter()
*/ */
class FieldListTest extends SapphireTest class FieldListTest extends SapphireTest
{ {
@ -856,9 +845,6 @@ class FieldListTest extends SapphireTest
); );
} }
/**
* @todo check actual placement of fields
*/
public function testInsertBeforeWithNestedTabsets() public function testInsertBeforeWithNestedTabsets()
{ {
$FieldListA = new FieldList( $FieldListA = new FieldList(
@ -973,9 +959,6 @@ class FieldListTest extends SapphireTest
); );
} }
/**
* @todo check actual placement of fields
*/
public function testInsertAfterWithNestedTabsets() public function testInsertAfterWithNestedTabsets()
{ {
$FieldListA = new FieldList( $FieldListA = new FieldList(

View File

@ -24,7 +24,6 @@ class Category extends DataObject implements TestOnly
public function getCMSFields() public function getCMSFields()
{ {
$fields = parent::getCMSFields(); $fields = parent::getCMSFields();
// TODO No longer necessary once FormScaffolder uses GridField
$fields->replaceField( $fields->replaceField(
'People', 'People',
GridField::create( GridField::create(

View File

@ -29,7 +29,6 @@ class PeopleGroup extends DataObject implements TestOnly
public function getCMSFields() public function getCMSFields()
{ {
$fields = parent::getCMSFields(); $fields = parent::getCMSFields();
// TODO No longer necessary once FormScaffolder uses GridField
$fields->replaceField( $fields->replaceField(
'People', 'People',
GridField::create( GridField::create(

View File

@ -39,7 +39,6 @@ class Person extends DataObject implements TestOnly
public function getCMSFields() public function getCMSFields()
{ {
$fields = parent::getCMSFields(); $fields = parent::getCMSFields();
// TODO No longer necessary once FormScaffolder uses GridField
$fields->replaceField( $fields->replaceField(
'Categories', 'Categories',
GridField::create( GridField::create(

View File

@ -185,10 +185,6 @@ class GridFieldTest extends SapphireTest
{ {
$obj = new GridField('testfield', 'testfield'); $obj = new GridField('testfield', 'testfield');
// @todo - PHP 7.0.6 change requires __isset() to return true
// for each reference from left to right along an isset() invocation.
// See https://bugs.php.net/bug.php?id=62059
// Check value persistence // Check value persistence
$this->assertEquals(15, $obj->State->NoValue(15)); $this->assertEquals(15, $obj->State->NoValue(15));
$this->assertEquals(15, $obj->State->NoValue(-1)); $this->assertEquals(15, $obj->State->NoValue(-1));

View File

@ -255,7 +255,7 @@ EOS
$editor->setEditorConfig($restrictedConfig); $editor->setEditorConfig($restrictedConfig);
$expectedHtmlString = '<p>standard text</p>Header'; $expectedHtmlString = '<p>standard text</p>Header';
$htmlValue = '<p>standard text</p><table><th><tr><td>Header</td></tr></th><tbody></tbody></table>'; $htmlValue = '<p>standard text</p><table><th></th><tr><td>Header</td></tr><tbody></tbody></table>';
$editor->setValue($htmlValue); $editor->setValue($htmlValue);
$editor->saveInto($obj); $editor->saveInto($obj);
$this->assertEquals($expectedHtmlString, $obj->Content, 'Table is not removed'); $this->assertEquals($expectedHtmlString, $obj->Content, 'Table is not removed');

View File

@ -222,15 +222,6 @@ class ListboxFieldTest extends SapphireTest
'Field validates values in source map' 'Field validates values in source map'
); );
/**
* @todo re-enable these tests when field validation is removed from {@link ListboxField::setValue()} and moved
* to the {@link ListboxField::validate()} function
*/
// $field->setValue(4);
// $this->assertFalse(
// $field->validate($validator),
// 'Field does not validate values outside of source map'
// );
$field->setValue( $field->setValue(
false, false,
new ArrayData( new ArrayData(

View File

@ -128,9 +128,6 @@ class NumericFieldTest extends SapphireTest
$field = new NumericField('Number'); $field = new NumericField('Number');
$html = $field->Field(); $html = $field->Field();
// @todo - Revert to number one day when html5 number supports proper localisation
// See https://github.com/silverstripe/silverstripe-framework/pull/4565
$this->assertStringContainsString('type="text"', $html, 'number type not set'); $this->assertStringContainsString('type="text"', $html, 'number type not set');
} }

View File

@ -5,9 +5,6 @@ namespace SilverStripe\Forms\Tests;
use SilverStripe\Dev\SapphireTest; use SilverStripe\Dev\SapphireTest;
use SilverStripe\Forms\RequiredFields; use SilverStripe\Forms\RequiredFields;
/**
* @todo Test the validation method php()
*/
class RequiredFieldsTest extends SapphireTest class RequiredFieldsTest extends SapphireTest
{ {

View File

@ -59,7 +59,6 @@ class TimeFieldTest extends SapphireTest
$f = new TimeField('Time', 'Time'); $f = new TimeField('Time', 'Time');
$f->setHTML5(false); $f->setHTML5(false);
$f->setLocale('fr_FR'); $f->setLocale('fr_FR');
// TODO Find an hour format that's actually different
$f->setValue('23:59'); $f->setValue('23:59');
$this->assertEquals($f->dataValue(), '23:59:00'); $this->assertEquals($f->dataValue(), '23:59:00');
} }

View File

@ -117,8 +117,6 @@ class DBFieldTest extends SapphireTest
$this->assertEquals(true, $boolean->prepValueForDB(1)); $this->assertEquals(true, $boolean->prepValueForDB(1));
$this->assertEquals(true, $boolean->prepValueForDB('1')); $this->assertEquals(true, $boolean->prepValueForDB('1'));
// @todo - Revisit Varchar to evaluate correct behaviour of nullifyEmpty
/* Varchar behaviour: nullifyifEmpty defaults to true */ /* Varchar behaviour: nullifyifEmpty defaults to true */
$varchar = DBVarchar::create(); $varchar = DBVarchar::create();
$this->assertEquals(0, $varchar->prepValueForDB(0)); $this->assertEquals(0, $varchar->prepValueForDB(0));

View File

@ -95,8 +95,6 @@ class DataObjectLazyLoadingTest extends SapphireTest
$teams = DataObject::get(Team::class); // query parent class $teams = DataObject::get(Team::class); // query parent class
$subteam1Lazy = $teams->find('ID', $subteam1->ID); $subteam1Lazy = $teams->find('ID', $subteam1->ID);
// TODO Fix hasField() to exclude *_Lazy
// $this->assertFalse($subteam1Lazy->hasField('SubclassDatabaseField_Lazy'));
$this->assertTrue($subteam1Lazy->hasField('SubclassDatabaseField')); $this->assertTrue($subteam1Lazy->hasField('SubclassDatabaseField'));
} }

View File

@ -830,9 +830,6 @@ class DataObjectTest extends SapphireTest
$this->assertEquals($captain2->ID, $team1->Captain->ID); $this->assertEquals($captain2->ID, $team1->Captain->ID);
} }
/**
* @todo Extend type change tests (e.g. '0'==NULL)
*/
public function testChangedFields() public function testChangedFields()
{ {
$obj = $this->objFromFixture(DataObjectTest\Player::class, 'captain1'); $obj = $this->objFromFixture(DataObjectTest\Player::class, 'captain1');
@ -1140,9 +1137,6 @@ class DataObjectTest extends SapphireTest
); );
} }
/**
* @todo Re-enable all test cases for field existence after behaviour has been fixed
*/
public function testFieldExistence() public function testFieldExistence()
{ {
$teamInstance = $this->objFromFixture(DataObjectTest\Team::class, 'team1'); $teamInstance = $this->objFromFixture(DataObjectTest\Team::class, 'team1');
@ -1290,9 +1284,6 @@ class DataObjectTest extends SapphireTest
); );
} }
/**
* @todo Re-enable all test cases for field inheritance aggregation after behaviour has been fixed
*/
public function testFieldInheritance() public function testFieldInheritance()
{ {
$schema = DataObject::getSchema(); $schema = DataObject::getSchema();
@ -1633,12 +1624,6 @@ class DataObjectTest extends SapphireTest
null, null,
'merge() with $overwriteWithEmpty overwrites empty fields on left object' 'merge() with $overwriteWithEmpty overwrites empty fields on left object'
); );
// @todo test "left" priority flag
// @todo test includeRelations flag
// @todo test includeRelations in combination with overwriteWithEmpty
// @todo test has_one relations
// @todo test has_many and many_many relations
} }
public function testPopulateDefaults() public function testPopulateDefaults()
@ -1919,7 +1904,6 @@ class DataObjectTest extends SapphireTest
public function testManyManyUnlimitedRowCount() public function testManyManyUnlimitedRowCount()
{ {
$player = $this->objFromFixture(DataObjectTest\Player::class, 'player2'); $player = $this->objFromFixture(DataObjectTest\Player::class, 'player2');
// TODO: What's going on here?
$this->assertEquals(2, $player->Teams()->dataQuery()->query()->unlimitedRowCount()); $this->assertEquals(2, $player->Teams()->dataQuery()->query()->unlimitedRowCount());
} }

View File

@ -243,9 +243,6 @@ class DataQueryTest extends SapphireTest
); );
} }
/**
* @todo Test paramaterised
*/
public function testNestedGroups() public function testNestedGroups()
{ {
$dq = new DataQuery(DataQueryTest\ObjectA::class); $dq = new DataQuery(DataQueryTest\ObjectA::class);

View File

@ -21,7 +21,6 @@ class PolyItem extends DataObject implements TestOnly
/** /**
* Placeholder for missing belongs_many_many for polymorphic relation * Placeholder for missing belongs_many_many for polymorphic relation
* *
* @todo Make this work for belongs_many_many
* @return Generator|DataObject[] * @return Generator|DataObject[]
*/ */
public function Objects() public function Objects()

View File

@ -10,8 +10,6 @@ use SilverStripe\ORM\Tests\DataObjectTest\Team;
* Tests the PolymorphicHasManyList class * Tests the PolymorphicHasManyList class
* *
* @see PolymorphicHasManyList * @see PolymorphicHasManyList
*
* @todo Complete
*/ */
class PolymorphicHasManyListTest extends SapphireTest class PolymorphicHasManyListTest extends SapphireTest
{ {

View File

@ -104,7 +104,6 @@ class MemberCsvBulkLoaderTest extends SapphireTest
DataObject::flush_and_destroy_cache(); DataObject::flush_and_destroy_cache();
$member = DataObject::get_by_id(Member::class, $memberID); $member = DataObject::get_by_id(Member::class, $memberID);
// TODO Direct getter doesn't work, wtf!
$this->assertEquals(Security::config()->password_encryption_algorithm, $member->getField('PasswordEncryption')); $this->assertEquals(Security::config()->password_encryption_algorithm, $member->getField('PasswordEncryption'));
$auth = new MemberAuthenticator(); $auth = new MemberAuthenticator();
$result = $auth->checkPassword($member, 'mypassword'); $result = $auth->checkPassword($member, 'mypassword');

View File

@ -21,8 +21,6 @@ class SecurityDefaultAdminTest extends SapphireTest
{ {
parent::setUp(); parent::setUp();
// TODO Workaround to force database clearing with no fixture present,
// and avoid sideeffects from other tests
if (!static::$tempDB->isUsed()) { if (!static::$tempDB->isUsed()) {
static::$tempDB->build(); static::$tempDB->build();
} }

View File

@ -18,10 +18,6 @@ use SilverStripe\Dev\Deprecation;
use SilverStripe\View\SSViewer; use SilverStripe\View\SSViewer;
use SilverStripe\View\ThemeResourceLoader; use SilverStripe\View\ThemeResourceLoader;
/**
* @todo Test that order of combine_files() is correct
* @todo Figure out how to clear the modified state of Requirements class - might affect other tests.
*/
class RequirementsTest extends SapphireTest class RequirementsTest extends SapphireTest
{ {

View File

@ -2057,7 +2057,6 @@ EOC;
public function testRequireCallInTemplateInclude() public function testRequireCallInTemplateInclude()
{ {
//TODO undo skip test on the event that templates ever obtain the ability to reference MODULE_DIR (or something to that effect)
if (FRAMEWORK_DIR === 'framework') { if (FRAMEWORK_DIR === 'framework') {
$template = new SSViewer(['SSViewerTestProcess']); $template = new SSViewer(['SSViewerTestProcess']);