Compare commits
48 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
bbde99d69e | ||
|
e3c2e2391a | ||
|
8ab9a67c16 | ||
|
64607059e2 | ||
|
9488dd219c | ||
|
64bcb94c34 | ||
|
9db2aa6377 | ||
|
57f70b4d46 | ||
|
59cd361155 | ||
|
3222cf752a | ||
|
eb7ef3c72c | ||
|
752f272e53 | ||
|
c40f843145 | ||
|
92d82236e2 | ||
|
6f889ef939 | ||
|
63a16ecabe | ||
|
326f22be24 | ||
|
5136747d89 | ||
|
a1ed605a0a | ||
|
fc9f5e17fe | ||
|
b148ddf16e | ||
|
245901686b | ||
|
8ee54ccb4b | ||
|
10dca7fa20 | ||
|
bdb638e58e | ||
|
23afaa2309 | ||
|
0d683854da | ||
|
c65de0c85a | ||
|
0f17a9a6d5 | ||
|
8367c56071 | ||
|
80e2ff20b8 | ||
|
492be9705f | ||
|
c59f674f36 | ||
|
8887b48699 | ||
|
0cea0274d3 | ||
|
38daa8be70 | ||
|
0934c8a724 | ||
|
4a636eb98b | ||
|
2bc705b9ef | ||
|
292343da48 | ||
|
8aa321743b | ||
|
e0f653e2e7 | ||
|
1b1e5870f2 | ||
|
a31f388373 | ||
|
737b02dde7 | ||
|
1773598cee | ||
|
563e9da2de | ||
|
fcbddca74e |
15
.cow.json
@ -1,15 +0,0 @@
|
|||||||
{
|
|
||||||
"github-slug": "silverstripe/silverstripe-installer",
|
|
||||||
"child-stability-inherit": true,
|
|
||||||
"dependency-constraint": "loose",
|
|
||||||
"vendors": [
|
|
||||||
"silverstripe"
|
|
||||||
],
|
|
||||||
"tests": [
|
|
||||||
"vendor/bin/phpunit vendor/silverstripe/framework/tests/php",
|
|
||||||
"vendor/bin/phpunit vendor/silverstripe/cms/tests/php"
|
|
||||||
],
|
|
||||||
"exclude": [
|
|
||||||
"silverstripe/recipe-plugin"
|
|
||||||
]
|
|
||||||
}
|
|
@ -1,79 +0,0 @@
|
|||||||
# {{ version }}
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
|
|
||||||
A full list of module versions included in CMS Recipe {{ version }} is provided below. We recommend referencing recipes in your dependencies, rather than individual modules, to simplify version tracking. See [Recipes](/getting_started/).
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>Included module versions</summary>
|
|
||||||
|
|
||||||
| Module | Version |
|
|
||||||
| ------ | ------- |
|
|
||||||
| silverstripe/admin | x.x.x |
|
|
||||||
| silverstripe/asset-admin | x.x.x |
|
|
||||||
| silverstripe/assets | x.x.x |
|
|
||||||
| silverstripe/campaign-admin | x.x.x |
|
|
||||||
| silverstripe/cms | x.x.x |
|
|
||||||
| silverstripe/config | x.x.x |
|
|
||||||
| silverstripe/errorpage | x.x.x |
|
|
||||||
| silverstripe/framework | x.x.x |
|
|
||||||
| silverstripe/graphql | x.x.x |
|
|
||||||
| silverstripe/login-forms | x.x.x |
|
|
||||||
| silverstripe/mimevalidator | x.x.x |
|
|
||||||
| silverstripe/reports | x.x.x |
|
|
||||||
| silverstripe/siteconfig | x.x.x |
|
|
||||||
| silverstripe/versioned | x.x.x |
|
|
||||||
| silverstripe/versioned-admin | x.x.x |
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
{% if version.stability == 'rc' %}
|
|
||||||
|
|
||||||
## Release Candidate
|
|
||||||
|
|
||||||
This version of Silverstripe CMS is a **release candidate** for an upcoming stable version, and should not be applied to production websites. We encourage developers to test this version in development / testing environments and [report any issues they encounter via GitHub](/contributing/issues_and_bugs/).
|
|
||||||
|
|
||||||
{% elseif version.stable %}
|
|
||||||
|
|
||||||
Upgrading to Recipe {{ version }} is recommended for all sites. This upgrade can be carried out by any development team familiar with Silverstripe.
|
|
||||||
|
|
||||||
## Security considerations
|
|
||||||
|
|
||||||
This release includes security fixes. Please see the release announcements for more detailed
|
|
||||||
descriptions of each. We highly encourage upgrading your project to include the latest security patches nonetheless.
|
|
||||||
|
|
||||||
We have provided a high-level severity rating of the vulnerabilities below based on the CVSS score, however please note this could vary based on the specifics of each project. You can [read the severity rating definitions in the Silverstripe CMS release process](/contributing/release_process/#severity-rating).
|
|
||||||
|
|
||||||
* [CVE-0000-0000 The Issue Title](https://www.silverstripe.org/download/security-releases/CVE-0000-0000) Severity: {# Critical/ High/ Medium/ Low #}
|
|
||||||
* [CVE-0000-0001 The Issue Title](https://www.silverstripe.org/download/security-releases/CVE-0000-0001) Severity: {# Critical/ High/ Medium/ Low #}
|
|
||||||
|
|
||||||
## New features
|
|
||||||
|
|
||||||
The [release announcement](#) includes the note worthy features, but be sure to review the change log for full detail.
|
|
||||||
|
|
||||||
{# other upgrade notes here #}
|
|
||||||
|
|
||||||
## Known issues
|
|
||||||
|
|
||||||
{#
|
|
||||||
* [Known issue](GitHub link)
|
|
||||||
#}
|
|
||||||
|
|
||||||
### Expected test failures
|
|
||||||
|
|
||||||
The following PHPUnit test failures are expected and do not represent functional issues:
|
|
||||||
|
|
||||||
{#
|
|
||||||
* List test failures here
|
|
||||||
#}
|
|
||||||
|
|
||||||
```
|
|
||||||
...
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
...
|
|
||||||
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{{ logs }}
|
|
@ -1,25 +0,0 @@
|
|||||||
# For more information about the properties used in
|
|
||||||
# this file, please see the EditorConfig documentation:
|
|
||||||
# http://editorconfig.org/
|
|
||||||
|
|
||||||
root = true
|
|
||||||
|
|
||||||
[*]
|
|
||||||
charset = utf-8
|
|
||||||
end_of_line = lf
|
|
||||||
indent_size = 4
|
|
||||||
indent_style = space
|
|
||||||
insert_final_newline = true
|
|
||||||
trim_trailing_whitespace = true
|
|
||||||
|
|
||||||
[*.md]
|
|
||||||
trim_trailing_whitespace = false
|
|
||||||
|
|
||||||
[*.{yml,json}]
|
|
||||||
# The indent size used in the `package.json` file cannot be changed
|
|
||||||
# https://github.com/npm/npm/pull/3180#issuecomment-16336516
|
|
||||||
indent_size = 2
|
|
||||||
indent_style = space
|
|
||||||
|
|
||||||
[composer.json]
|
|
||||||
indent_size = 4
|
|
12
.env.example
@ -1,12 +0,0 @@
|
|||||||
# For a complete list of core environment variables see
|
|
||||||
# https://docs.silverstripe.org/en/4/getting_started/environment_management/#core-environment-variables
|
|
||||||
|
|
||||||
# DB credentials
|
|
||||||
SS_DATABASE_CLASS="MySQLDatabase"
|
|
||||||
SS_DATABASE_SERVER="localhost"
|
|
||||||
SS_DATABASE_USERNAME="<user>"
|
|
||||||
SS_DATABASE_PASSWORD="<password>"
|
|
||||||
SS_DATABASE_NAME="<database>"
|
|
||||||
|
|
||||||
# WARNING: in a live environment, change this to "live" instead of dev
|
|
||||||
SS_ENVIRONMENT_TYPE="dev"
|
|
11
.gitattributes
vendored
@ -1,11 +0,0 @@
|
|||||||
.github export-ignore
|
|
||||||
.cow.json export-ignore
|
|
||||||
.cow export-ignore
|
|
||||||
.gitattributes export-ignore
|
|
||||||
.travis.yml export-ignore
|
|
||||||
behat.yml export-ignore
|
|
||||||
build.xml export-ignore
|
|
||||||
CONTRIBUTING.md export-ignore
|
|
||||||
LICENSE export-ignore
|
|
||||||
phpunit.xml.dist export-ignore
|
|
||||||
README.md
|
|
27
.github/workflows/ci.yml
vendored
@ -1,27 +0,0 @@
|
|||||||
name: CI
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
pull_request:
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
ci:
|
|
||||||
name: CI
|
|
||||||
uses: silverstripe/gha-ci/.github/workflows/ci.yml@v1
|
|
||||||
with:
|
|
||||||
# installer contains a sample behat.yml file, though there are no behat tests to run
|
|
||||||
endtoend: false
|
|
||||||
# require the following in ci.yml rather than composer.json require-dev specifically for installer because unlike
|
|
||||||
# regular modules, require-dev will get installed to projects during `composer create-project silverstripe/installer`
|
|
||||||
composer_require_extra: silverstripe/recipe-testing:^2 silverstripe/frameworktest:^0.4.2 mikey179/vfsstream:^1.6.10
|
|
||||||
extra_jobs: |
|
|
||||||
- endtoend: true
|
|
||||||
endtoend_suite: admin
|
|
||||||
endtoend_config: vendor/silverstripe/admin/behat.yml
|
|
||||||
- endtoend: true
|
|
||||||
endtoend_suite: asset-admin
|
|
||||||
endtoend_config: vendor/silverstripe/asset-admin/behat.yml
|
|
||||||
- endtoend: true
|
|
||||||
endtoend_suite: cms
|
|
||||||
endtoend_config: vendor/silverstripe/cms/behat.yml
|
|
16
.github/workflows/dispatch-ci.yml
vendored
@ -1,16 +0,0 @@
|
|||||||
name: Dispatch CI
|
|
||||||
|
|
||||||
on:
|
|
||||||
# At 4:00 PM and 5:00 PM
|
|
||||||
schedule:
|
|
||||||
- cron: '0 16,17 * * *'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
dispatch-ci:
|
|
||||||
name: Dispatch CI
|
|
||||||
# Only run cron on the silverstripe account
|
|
||||||
if: (github.event_name == 'schedule' && github.repository_owner == 'silverstripe') || (github.event_name != 'schedule')
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Dispatch CI
|
|
||||||
uses: silverstripe/gha-dispatch-ci@v1
|
|
17
.github/workflows/keepalive.yml
vendored
@ -1,17 +0,0 @@
|
|||||||
name: Keepalive
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
# The 8th of every month at 4:50pm UTC
|
|
||||||
schedule:
|
|
||||||
- cron: '50 16 8 * *'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
keepalive:
|
|
||||||
name: Keepalive
|
|
||||||
# Only run cron on the silverstripe account
|
|
||||||
if: (github.event_name == 'schedule' && github.repository_owner == 'silverstripe') || (github.event_name != 'schedule')
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Keepalive
|
|
||||||
uses: silverstripe/gha-keepalive@v1
|
|
8
.gitignore
vendored
@ -1,8 +0,0 @@
|
|||||||
/silverstripe-cache/
|
|
||||||
/.env
|
|
||||||
/vendor/
|
|
||||||
/themes/simple/
|
|
||||||
/_resources/
|
|
||||||
/public/_resources/
|
|
||||||
/.graphql-generated/
|
|
||||||
/public/_graphql/
|
|
17
.htaccess
@ -1,2 +1,17 @@
|
|||||||
|
### SILVERSTRIPE START ###
|
||||||
|
<Files *.ss>
|
||||||
|
Order deny,allow
|
||||||
|
Deny from all
|
||||||
|
Allow from 127.0.0.1
|
||||||
|
</Files>
|
||||||
|
|
||||||
|
<IfModule mod_rewrite.c>
|
||||||
RewriteEngine On
|
RewriteEngine On
|
||||||
RewriteRule ^(.*)$ public/$1
|
|
||||||
|
RewriteCond %{REQUEST_URI} !(\.gif$)|(\.jpg$)|(\.png$)|(\.css$)|(\.js$)
|
||||||
|
|
||||||
|
RewriteCond %{REQUEST_URI} ^(.*)$
|
||||||
|
RewriteCond %{REQUEST_FILENAME} !-f
|
||||||
|
RewriteRule .* sapphire/main.php?url=%1&%{QUERY_STRING} [L]
|
||||||
|
</IfModule>
|
||||||
|
### SILVERSTRIPE END ###
|
||||||
|
@ -1,28 +0,0 @@
|
|||||||
# Contributing
|
|
||||||
|
|
||||||
Any open source product is only as good as the community behind it. You can participate by sharing code, ideas, or simply helping others. No matter what your skill level is, every contribution counts. See our [high level contribution overview](http://silverstripe.org/contributing-to-silverstripe) on silverstripe.org on how you can help out.
|
|
||||||
|
|
||||||
## Bugtracker ##
|
|
||||||
|
|
||||||
Bugs are tracked on [github.com](https://github.com/silverstripe/framework/issues).
|
|
||||||
Please read our [issue reporting guidelines](http://doc.silverstripe.org/framework/en/misc/contributing/issues).
|
|
||||||
|
|
||||||
## Development and Contribution ##
|
|
||||||
|
|
||||||
For submitting patches, please read our [guide to contributing code](http://doc.silverstripe.org/framework/en/misc/contributing/code). We only accept pull requests on github.com.
|
|
||||||
|
|
||||||
## Links ##
|
|
||||||
|
|
||||||
* [Server Requirements](http://doc.silverstripe.org/framework/en/installation/server-requirements)
|
|
||||||
* [Changelogs](http://doc.silverstripe.org/framework/en/changelogs/)
|
|
||||||
* [Bugtracker: Framework](https://github.com/silverstripe/silverstripe-framework/issues)
|
|
||||||
* [Bugtracker: CMS](https://github.com/silverstripe/silverstripe-cms/issues)
|
|
||||||
* [Bugtracker: Installer](https://github.com/silverstripe/silverstripe-installer/issues)
|
|
||||||
* [Forums](http://silverstripe.org/forums)
|
|
||||||
* [Developer Mailinglist](https://groups.google.com/forum/#!forum/silverstripe-dev)
|
|
||||||
|
|
||||||
## Copyright
|
|
||||||
|
|
||||||
**IMPORTANT: By supplying code to the SilverStripe core team in patches, tickets and pull requests, you agree to assign copyright of that code to SilverStripe Limited, on the condition that SilverStripe Limited releases that code under the BSD license.**
|
|
||||||
|
|
||||||
We ask for this so that the ownership in the license is clear and unambiguous, and so that community involvement doesn't stop us from being able to continue supporting these projects. By releasing this code under a permissive license, this copyright assignment won't prevent you from using the code in any way you see fit.
|
|
@ -1,17 +1,17 @@
|
|||||||
Copyright (c) 2007-2017, SilverStripe Limited - www.silverstripe.com
|
Copyright (c) 2007-2008, SilverStripe Limited - www.silverstripe.com
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||||
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the
|
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the
|
||||||
documentation and/or other materials provided with the distribution.
|
documentation and/or other materials provided with the distribution.
|
||||||
* Neither the name of SilverStripe nor the names of its contributors may be used to endorse or promote products derived from this software
|
* Neither the name of SilverStripe nor the names of its contributors may be used to endorse or promote products derived from this software
|
||||||
without specific prior written permission.
|
without specific prior written permission.
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||||
OF SUCH DAMAGE.
|
OF SUCH DAMAGE.
|
1
ChangeLog
Normal file
@ -0,0 +1 @@
|
|||||||
|
For a full change log, please visit http://open.silverstripe.org/wiki/ChangeLog.
|
22
INSTALL
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
Thanks for downloading SilverStripe CMS.
|
||||||
|
|
||||||
|
Simply extract the archive to a folder in a web-accessible location and visit the folder
|
||||||
|
in your web browser (which in turn runs index.php).
|
||||||
|
|
||||||
|
This will lead you through a web-based installation process.
|
||||||
|
|
||||||
|
|
||||||
|
Server Requirements
|
||||||
|
* PHP 5+
|
||||||
|
* MySQL 4.1+
|
||||||
|
* Apache or Lighttpd webserver (feel free to try with others)
|
||||||
|
* Details at http://doc.silverstripe.com/doku.php?id=server-requirements
|
||||||
|
|
||||||
|
|
||||||
|
General documentation, tutorials:
|
||||||
|
* Wiki: http://doc.silverstripe.com/
|
||||||
|
* Tutorials: http://doc.silverstripe.com/doku.php?id=silverstripe-tutorial
|
||||||
|
|
||||||
|
|
||||||
|
Forum
|
||||||
|
* http://www.silverstripe.com/silverstripe-forum/
|
10
Makefile
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
#
|
||||||
|
# This makefile is a secondary way of installing SilverStripe.
|
||||||
|
# It is used for things like continuous integration
|
||||||
|
#
|
||||||
|
# Most users should simply visit the site root in your web browser.
|
||||||
|
#
|
||||||
|
|
||||||
|
test:
|
||||||
|
php ./sapphire/cli-script.php dev/build flush=1
|
||||||
|
$(MAKE) -C sapphire test
|
32
README.md
@ -1,32 +0,0 @@
|
|||||||
## Overview
|
|
||||||
|
|
||||||
[![CI](https://github.com/silverstripe/silverstripe-installer/actions/workflows/ci.yml/badge.svg)](https://github.com/silverstripe/silverstripe-installer/actions/workflows/ci.yml)
|
|
||||||
[![Silverstripe supported module](https://img.shields.io/badge/silverstripe-supported-0071C4.svg)](https://www.silverstripe.org/software/addons/silverstripe-commercially-supported-module-list/)
|
|
||||||
|
|
||||||
Base project folder for a Silverstripe ([http://silverstripe.org](http://silverstripe.org)) installation. Required modules are installed via [http://github.com/silverstripe/recipe-cms](http://github.com/silverstripe/recipe-cms). For information on how to change the dependencies in a recipe, please have a look at [https://github.com/silverstripe/recipe-plugin](https://github.com/silverstripe/recipe-plugin). In addition, installer includes [theme/simple](https://github.com/silverstripe-themes/silverstripe-simple) as a default theme.
|
|
||||||
|
|
||||||
## Installation ##
|
|
||||||
|
|
||||||
`composer create-project silverstripe/installer my-app`
|
|
||||||
|
|
||||||
See [Getting Started](https://docs.silverstripe.org/en/4/getting_started/) for more information.
|
|
||||||
|
|
||||||
## Bugtracker ##
|
|
||||||
|
|
||||||
Bugs are tracked on github.com ([framework issues](https://github.com/silverstripe/silverstripe-framework/issues),
|
|
||||||
[cms issues](https://github.com/silverstripe/silverstripe-cms/issues)).
|
|
||||||
Please read our [issue reporting guidelines](https://docs.silverstripe.org/en/4/contributing/issues_and_bugs/).
|
|
||||||
|
|
||||||
## Development and Contribution ##
|
|
||||||
|
|
||||||
If you would like to make changes to the Silverstripe core codebase, we have an extensive [guide to contributing code](https://docs.silverstripe.org/en/4/contributing/code/).
|
|
||||||
|
|
||||||
## Links ##
|
|
||||||
|
|
||||||
* [Changelogs](https://docs.silverstripe.org/en/4/changelogs/)
|
|
||||||
* [Bugtracker: Framework](https://github.com/silverstripe/silverstripe-framework/issues)
|
|
||||||
* [Bugtracker: CMS](https://github.com/silverstripe/silverstripe-cms/issues)
|
|
||||||
* [Bugtracker: Installer](https://github.com/silverstripe/silverstripe-installer/issues)
|
|
||||||
* [Forums](http://silverstripe.org/forums)
|
|
||||||
* [Developer Mailinglist](https://groups.google.com/forum/#!forum/silverstripe-dev)
|
|
||||||
* [License](./LICENSE)
|
|
20
UPGRADING
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
Usually upgrading your SilverStripe installation just means overwriting files
|
||||||
|
and updating your database-schema.
|
||||||
|
|
||||||
|
- Backup your database
|
||||||
|
- Backup your webroot
|
||||||
|
- Download the new release and uncompress it to a temporary folder
|
||||||
|
- With these folders: cms, sapphire, jsparty and auth_openid
|
||||||
|
- Delete your existing folders
|
||||||
|
- Extract and replace folders from your download (leave modules
|
||||||
|
and your custom directories alone)
|
||||||
|
- Moving your current folders (rather than installing on top) means
|
||||||
|
you can undo the installation, and ensures if the new release has no
|
||||||
|
longer contains some files, these files won’t be left behind, which otherwise
|
||||||
|
could cause bugs.
|
||||||
|
- Visit http://your.silverstripe.site/db/build?flush=1 (This adds new
|
||||||
|
fields/tables to the database, and empties your template cache)
|
||||||
|
- Check if any modules (e.g. blog or forum) in your installation are compatible
|
||||||
|
and need to be upgraded as well
|
||||||
|
- Check if you need to adapt your code to changed APIs, see
|
||||||
|
http://doc.silverstripe.com/doku.php?id=upgrading
|
@ -1,26 +0,0 @@
|
|||||||
# SilverStripe 4.4 changes the way files are resolved. `silverstripe-assets` resolves files using a variety of formats
|
|
||||||
# by default. When starting a brand new project on SilverStripe 4.4 or greater, those extra formats are not needed and
|
|
||||||
# will slowdown file resolution requests a bit. This config removes those redundant formats.
|
|
||||||
|
|
||||||
---
|
|
||||||
Name: project-assetsflysystem
|
|
||||||
After: '#assetsflysystem'
|
|
||||||
---
|
|
||||||
SilverStripe\Core\Injector\Injector:
|
|
||||||
# Define public resolution strategy
|
|
||||||
SilverStripe\Assets\FilenameParsing\FileResolutionStrategy.public:
|
|
||||||
class: SilverStripe\Assets\FilenameParsing\FileIDHelperResolutionStrategy
|
|
||||||
properties:
|
|
||||||
ResolutionFileIDHelpers:
|
|
||||||
- '%$SilverStripe\Assets\FilenameParsing\HashFileIDHelper'
|
|
||||||
- '%$SilverStripe\Assets\FilenameParsing\NaturalFileIDHelper'
|
|
||||||
DefaultFileIDHelper: '%$SilverStripe\Assets\FilenameParsing\NaturalFileIDHelper'
|
|
||||||
VersionedStage: Live
|
|
||||||
# Define protected resolution strategy
|
|
||||||
SilverStripe\Assets\FilenameParsing\FileResolutionStrategy.protected:
|
|
||||||
class: SilverStripe\Assets\FilenameParsing\FileIDHelperResolutionStrategy
|
|
||||||
properties:
|
|
||||||
DefaultFileIDHelper: '%$SilverStripe\Assets\FilenameParsing\HashFileIDHelper'
|
|
||||||
ResolutionFileIDHelpers:
|
|
||||||
- '%$SilverStripe\Assets\FilenameParsing\HashFileIDHelper'
|
|
||||||
VersionedStage: Stage
|
|
@ -1,9 +0,0 @@
|
|||||||
# See https://docs.silverstripe.org/en/4/developer_guides/email/ for additional information about setting up email
|
|
||||||
---
|
|
||||||
Name: project-emailconfig
|
|
||||||
After:
|
|
||||||
- '#emailconfig'
|
|
||||||
---
|
|
||||||
SilverStripe\Core\Injector\Injector:
|
|
||||||
Swift_Transport:
|
|
||||||
class: Swift_SendmailTransport
|
|
@ -1,8 +0,0 @@
|
|||||||
---
|
|
||||||
Name: mytheme
|
|
||||||
---
|
|
||||||
SilverStripe\View\SSViewer:
|
|
||||||
themes:
|
|
||||||
- '$public'
|
|
||||||
- 'simple'
|
|
||||||
- '$default'
|
|
2
assets/.htaccess
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
RemoveHandler .php .phtml .php3 .php4 .php5 .inc
|
||||||
|
RemoveType .php .phtml .php3 .php4 .php5 .inc
|
BIN
assets/Uploads/SilverStripeLogo.png
Normal file
After Width: | Height: | Size: 12 KiB |
21
behat.yml
@ -1,21 +0,0 @@
|
|||||||
# Note: Currently chrome latest is recommended
|
|
||||||
# Behat test setup requires an `.env` with `SS_BASE_URL` defined, as well
|
|
||||||
# as each of the following commands to initiate a test run:
|
|
||||||
# ========================================================================= #
|
|
||||||
# composer require silverstripe/recipe-testing ^1
|
|
||||||
# vendor/bin/behat-ss @<module>
|
|
||||||
# ========================================================================= #
|
|
||||||
default:
|
|
||||||
suites: []
|
|
||||||
extensions:
|
|
||||||
SilverStripe\BehatExtension\MinkExtension:
|
|
||||||
default_session: facebook_web_driver
|
|
||||||
javascript_session: facebook_web_driver
|
|
||||||
facebook_web_driver:
|
|
||||||
browser: chrome
|
|
||||||
wd_host: "http://127.0.0.1:9515" #chromedriver port
|
|
||||||
browser_name: chrome
|
|
||||||
SilverStripe\BehatExtension\Extension:
|
|
||||||
bootstrap_file: vendor/silverstripe/cms/tests/behat/serve-bootstrap.php
|
|
||||||
screenshot_path: '%paths.base%/artifacts/screenshots'
|
|
||||||
retry_seconds: 4 # default is 2
|
|
55
build.xml
@ -1,55 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Phing build tooling for SilverStripe releases (see phing.info).
|
|
||||||
Install through "pear channel-discover pear.phing.info && pear install phing/phing".
|
|
||||||
Most tooling is placed in a separate module, install with "composer require silverstripe/buildtools".
|
|
||||||
It is safe to remove this file for normal website operation.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<project name="silverstripe-installer" default="help" phingVersion="2.4.5">
|
|
||||||
|
|
||||||
<import file="buildtools/build.xml" optional="true" />
|
|
||||||
|
|
||||||
<property name="basedir" value="." override="true" />
|
|
||||||
|
|
||||||
<target name="help">
|
|
||||||
<phingcall target="buildtools.help" />
|
|
||||||
</target>
|
|
||||||
|
|
||||||
<target name="phpunit"
|
|
||||||
description="Runs unit tests as defined through phpunix.xml. Requires the 'phpunit' binary.">
|
|
||||||
<if>
|
|
||||||
<available file="${basedir}/vendor/bin/phpunit" />
|
|
||||||
<then>
|
|
||||||
<property name="phpunit_bin" value="vendor/bin/phpunit" />
|
|
||||||
</then>
|
|
||||||
<else>
|
|
||||||
<property name="phpunit_bin" value="phpunit" />
|
|
||||||
</else>
|
|
||||||
</if>
|
|
||||||
<exec command="${phpunit_bin}" checkreturn="true" passthru="true" />
|
|
||||||
</target>
|
|
||||||
|
|
||||||
<target name="behat" if="basedir"
|
|
||||||
description="Runs behaviour tests through Behat, on the 'framework' and 'cms' modules (if available). Requires phpunit, composer and behat.">
|
|
||||||
|
|
||||||
<if>
|
|
||||||
<available file="${basedir}/framework/" type="dir" />
|
|
||||||
<then>
|
|
||||||
<echo msg="Testing 'framework' module" />
|
|
||||||
<exec command="vendor/bin/behat --ansi @framework" checkreturn="true" passthru="true" />
|
|
||||||
</then>
|
|
||||||
</if>
|
|
||||||
|
|
||||||
<if>
|
|
||||||
<available file="${basedir}/cms/" type="dir" />
|
|
||||||
<then>
|
|
||||||
<echo msg="Testing 'cms' module" />
|
|
||||||
<exec command="vendor/bin/behat --ansi @cms" checkreturn="true" passthru="true" />
|
|
||||||
</then>
|
|
||||||
</if>
|
|
||||||
|
|
||||||
</target>
|
|
||||||
|
|
||||||
</project>
|
|
@ -1,37 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "silverstripe/installer",
|
|
||||||
"type": "silverstripe-recipe",
|
|
||||||
"description": "The SilverStripe Framework Installer",
|
|
||||||
"require": {
|
|
||||||
"php": "^7.4 || ^8.0",
|
|
||||||
"silverstripe/recipe-plugin": "^1.2",
|
|
||||||
"silverstripe/recipe-cms": "4.x-dev",
|
|
||||||
"silverstripe-themes/simple": "~3.2.0",
|
|
||||||
"silverstripe/login-forms": "4.x-dev"
|
|
||||||
},
|
|
||||||
"require-dev": {
|
|
||||||
"phpunit/phpunit": "^9.5"
|
|
||||||
},
|
|
||||||
"extra": {
|
|
||||||
"project-files": [
|
|
||||||
"app/_config/*",
|
|
||||||
".env.example",
|
|
||||||
".graphql-generated/*"
|
|
||||||
],
|
|
||||||
"public-files": [
|
|
||||||
"assets/*",
|
|
||||||
"favicon.ico"
|
|
||||||
],
|
|
||||||
"resources-dir": "_resources"
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"process-timeout": 600,
|
|
||||||
"allow-plugins": {
|
|
||||||
"composer/installers": true,
|
|
||||||
"silverstripe/recipe-plugin": true,
|
|
||||||
"silverstripe/vendor-plugin": true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"prefer-stable": true,
|
|
||||||
"minimum-stability": "dev"
|
|
||||||
}
|
|
BIN
favicon.ico
Normal file
After Width: | Height: | Size: 318 B |
71
index.php
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
************************************************************************************
|
||||||
|
** **
|
||||||
|
** If you can read this text in your browser then you don't have PHP installed. **
|
||||||
|
** Please install PHP 5.0 or higher, preferably PHP 5.2. **
|
||||||
|
** **
|
||||||
|
************************************************************************************
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This script bolts on top of SilverStripe/Sapphire to allow access without the use of .htaccess
|
||||||
|
* rewriting rules.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// This is the URL of the script that everything must be viewed with.
|
||||||
|
define('BASE_SCRIPT_URL','index.php/');
|
||||||
|
|
||||||
|
$ruLen = strlen($_SERVER['REQUEST_URI']);
|
||||||
|
$snLen = strlen($_SERVER['SCRIPT_NAME']);
|
||||||
|
|
||||||
|
$isIIS = (strpos($_SERVER['SERVER_SOFTWARE'], 'Microsoft-IIS') !== false);
|
||||||
|
|
||||||
|
// IIS will populate server variables using one of these two ways
|
||||||
|
if($isIIS) {
|
||||||
|
if($_SERVER['REQUEST_URI'] == $_SERVER['SCRIPT_NAME']) {
|
||||||
|
$url = "";
|
||||||
|
} else if($ruLen > $snLen && substr($_SERVER['REQUEST_URI'],0,$snLen+1) == ($_SERVER['SCRIPT_NAME'] . '/')) {
|
||||||
|
$url = substr($_SERVER['REQUEST_URI'],$snLen+1);
|
||||||
|
$url = strtok($url, '?');
|
||||||
|
} else {
|
||||||
|
$url = $_SERVER['REQUEST_URI'];
|
||||||
|
if($url[0] == '/') $url = substr($url,1);
|
||||||
|
$url = strtok($url, '?');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apache will populate the server variables this way
|
||||||
|
} else {
|
||||||
|
if($ruLen > $snLen && substr($_SERVER['REQUEST_URI'],0,$snLen+1) == ($_SERVER['SCRIPT_NAME'] . '/')) {
|
||||||
|
$url = substr($_SERVER['REQUEST_URI'],$snLen+1);
|
||||||
|
$url = strtok($url, '?');
|
||||||
|
} else {
|
||||||
|
$url = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$_GET['url'] = $_REQUEST['url'] = $url;
|
||||||
|
|
||||||
|
$fileName = dirname($_SERVER['SCRIPT_FILENAME']) . '/' . $url;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This code is a very simple wrapper for sending files
|
||||||
|
* Very quickly pass through references to files
|
||||||
|
*/
|
||||||
|
if($url && file_exists($fileName)) {
|
||||||
|
$fileURL = dirname($_SERVER['SCRIPT_NAME']) . '/' . $url;
|
||||||
|
header($_SERVER['SERVER_PROTOCOL'] . ' 301 Moved Permanently');
|
||||||
|
header("Location: $fileURL");
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
// For linux
|
||||||
|
$_SERVER['SCRIPT_FILENAME'] = str_replace('/index.php','/sapphire/main.php', $_SERVER['SCRIPT_FILENAME']);
|
||||||
|
$_SERVER['SCRIPT_NAME'] = str_replace('/index.php','/sapphire/main.php', $_SERVER['SCRIPT_NAME']);
|
||||||
|
// And for windows
|
||||||
|
$_SERVER['SCRIPT_FILENAME'] = str_replace('\\index.php','\\sapphire\\main.php', $_SERVER['SCRIPT_FILENAME']);
|
||||||
|
$_SERVER['SCRIPT_NAME'] = str_replace('\\index.php','\\sapphire\\main.php', $_SERVER['SCRIPT_NAME']);
|
||||||
|
|
||||||
|
chdir('sapphire');
|
||||||
|
require_once('sapphire/main.php');
|
1071
install.php
Normal file
@ -0,0 +1,1071 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
************************************************************************************
|
||||||
|
** **
|
||||||
|
** If you can read this text in your browser then you don't have PHP installed. **
|
||||||
|
** Please install PHP 5.0 or higher, preferably PHP 5.2. **
|
||||||
|
** **
|
||||||
|
************************************************************************************
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SilverStripe CMS Installer
|
||||||
|
* This installer doesn't use any of the fancy Sapphire stuff in case it's unsupported.
|
||||||
|
* It's also PHP4 syntax compatable
|
||||||
|
*/
|
||||||
|
|
||||||
|
ini_set('max_execution_time', 0);
|
||||||
|
error_reporting(E_ALL ^ E_NOTICE);
|
||||||
|
session_start();
|
||||||
|
|
||||||
|
$majorVersion = strtok(phpversion(),'.');
|
||||||
|
if($majorVersion < 5) {
|
||||||
|
header("HTTP/1.1 500 Server Error");
|
||||||
|
echo str_replace('$PHPVersion', phpversion(), file_get_contents("sapphire/dev/install/php5-required.html"));
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Include environment files
|
||||||
|
$usingEnv = false;
|
||||||
|
$envFiles = array('_ss_environment.php', '../_ss_environment.php', '../../_ss_environment.php');
|
||||||
|
foreach($envFiles as $envFile) {
|
||||||
|
if(@file_exists($envFile)) {
|
||||||
|
include_once($envFile);
|
||||||
|
$usingEnv = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Load database config
|
||||||
|
if(isset($_REQUEST['mysql'])) {
|
||||||
|
$databaseConfig = $_REQUEST['mysql'];
|
||||||
|
} else {
|
||||||
|
$_REQUEST['mysql'] = $databaseConfig = array(
|
||||||
|
"type" => "MySQLDatabase",
|
||||||
|
"server" => defined('SS_DATABASE_SERVER') ? SS_DATABASE_SERVER : "localhost",
|
||||||
|
"username" => defined('SS_DATABASE_USERNAME') ? SS_DATABASE_USERNAME : "root",
|
||||||
|
"password" => defined('SS_DATABASE_PASSWORD') ? SS_DATABASE_PASSWORD : "",
|
||||||
|
"database" => isset($_SERVER['argv'][2]) ? $_SERVER['argv'][2] : "SS_mysite",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(isset($_REQUEST['admin'])) {
|
||||||
|
$adminConfig = $_REQUEST['admin'];
|
||||||
|
} else {
|
||||||
|
$_REQUEST['admin'] = $adminConfig = array(
|
||||||
|
'username' => 'admin',
|
||||||
|
'password' => '',
|
||||||
|
'firstname' => '',
|
||||||
|
'surname' => ''
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$alreadyInstalled = false;
|
||||||
|
if(file_exists('mysite/_config.php')) {
|
||||||
|
// Find the $database variable in the relevant config file without having to execute the config file
|
||||||
|
if(preg_match("/\\\$database\s*=\s*[^\n\r]+[\n\r]/", file_get_contents("mysite/_config.php"), $parts)) {
|
||||||
|
eval($parts[0]);
|
||||||
|
if($database) $alreadyInstalled = true;
|
||||||
|
// Assume that if $databaseConfig is defined in mysite/_config.php, then a non-environment-based installation has
|
||||||
|
// already gone ahead
|
||||||
|
} else if(preg_match("/\\\$databaseConfig\s*=\s*[^\n\r]+[\n\r]/", file_get_contents("mysite/_config.php"), $parts)) {
|
||||||
|
$alreadyInstalled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if(file_exists('sapphire/silverstripe_version')) {
|
||||||
|
$sapphireVersionFile = file_get_contents('sapphire/silverstripe_version');
|
||||||
|
if(strstr($sapphireVersionFile, "/sapphire/trunk")) {
|
||||||
|
$silverstripe_version = "trunk";
|
||||||
|
} else {
|
||||||
|
preg_match("/sapphire\/(?:(?:branches)|(?:tags))(?:\/rc)?\/([A-Za-z0-9._-]+)\/silverstripe_version/", $sapphireVersionFile, $matches);
|
||||||
|
$silverstripe_version = $matches[1];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$silverstripe_version = "unknown";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check requirements
|
||||||
|
$req = new InstallRequirements();
|
||||||
|
$req->check();
|
||||||
|
|
||||||
|
if($req->hasErrors()) {
|
||||||
|
$hasErrorOtherThanDatabase = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if($databaseConfig) {
|
||||||
|
$dbReq = new InstallRequirements();
|
||||||
|
$dbReq->checkdatabase($databaseConfig);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Actual processor
|
||||||
|
$installFromCli = (isset($_SERVER['argv'][1]) && $_SERVER['argv'][1] == 'install');
|
||||||
|
|
||||||
|
// CLI-install error message. exit(1) will halt any makefile.
|
||||||
|
if($installFromCli && ($req->hasErrors() || $dbReq->hasErrors())) {
|
||||||
|
echo "Cannot install due to errors:\n";
|
||||||
|
$req->listErrors();
|
||||||
|
$dbReq->listErrors();
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if((isset($_REQUEST['go']) || $installFromCli) && !$req->hasErrors() && !$dbReq->hasErrors() && $adminConfig['username'] && $adminConfig['password']) {
|
||||||
|
// Confirm before reinstalling
|
||||||
|
if(!isset($_REQUEST['force_reinstall']) && !$installFromCli && $alreadyInstalled) {
|
||||||
|
include('sapphire/dev/install/config-form.html');
|
||||||
|
|
||||||
|
} else {
|
||||||
|
$inst = new Installer();
|
||||||
|
if($_REQUEST) $inst->install($_REQUEST);
|
||||||
|
else $inst->install(array(
|
||||||
|
'database' => $databaseConfig['type'],
|
||||||
|
'mysql' => $databaseConfig,
|
||||||
|
'admin' => $adminConfig,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show the config form
|
||||||
|
} else {
|
||||||
|
include('sapphire/dev/install/config-form.html');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class checks requirements
|
||||||
|
* Each of the requireXXX functions takes an argument which gives a user description of the test. It's an array
|
||||||
|
* of 3 parts:
|
||||||
|
* $description[0] - The test catetgory
|
||||||
|
* $description[1] - The test title
|
||||||
|
* $description[2] - The test error to show, if it goes wrong
|
||||||
|
*/
|
||||||
|
|
||||||
|
class InstallRequirements {
|
||||||
|
var $errors, $warnings, $tests;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Just check that the database configuration is okay
|
||||||
|
*/
|
||||||
|
function checkdatabase($databaseConfig) {
|
||||||
|
if($this->requireFunction('mysql_connect', array("PHP Configuration", "MySQL support", "MySQL support not included in PHP."))) {
|
||||||
|
$this->requireMySQLServer($databaseConfig['server'], array("MySQL Configuration", "Does the server exist",
|
||||||
|
"Can't find the a MySQL server on '$databaseConfig[server]'", $databaseConfig['server']));
|
||||||
|
if($this->requireMysqlConnection($databaseConfig['server'], $databaseConfig['username'], $databaseConfig['password'],
|
||||||
|
array("MySQL Configuration", "Are the access credentials correct", "That username/password doesn't work"))) {
|
||||||
|
@$this->requireMySQLVersion("4.1", array("MySQL Configuration", "MySQL version at least 4.1", "MySQL version 4.1 is required, you only have ", "MySQL " . mysql_get_server_info()));
|
||||||
|
}
|
||||||
|
$this->requireDatabaseOrCreatePermissions($databaseConfig['server'], $databaseConfig['username'], $databaseConfig['password'], $databaseConfig['database'],
|
||||||
|
array("MySQL Configuration", "Can I access/create the database", "I can't create new databases and the database '$databaseConfig[database]' doesn't exist"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check everything except the database
|
||||||
|
*/
|
||||||
|
function check() {
|
||||||
|
$this->errors = null;
|
||||||
|
|
||||||
|
$this->requirePHPVersion('5.2.0', '5.0.4', array("PHP Configuration", "PHP5 installed", null, "PHP version " . phpversion()));
|
||||||
|
|
||||||
|
// Check that we can identify the root folder successfully
|
||||||
|
$this->requireFile('sapphire/dev/install/config-form.html', array("File permissions",
|
||||||
|
"Does the webserver know where files are stored?",
|
||||||
|
"The webserver isn't letting me identify where files are stored.",
|
||||||
|
$this->getBaseDir()
|
||||||
|
));
|
||||||
|
$this->requireFile('mysite', array("File permissions", "mysite/ folder exists", "There's no mysite folder."));
|
||||||
|
$this->requireFile('sapphire', array("File permissions", "sapphire/ folder exists", "There's no sapphire folder."));
|
||||||
|
$this->requireFile('cms', array("File permissions", "cms/ folder exists", "There's no cms folder."));
|
||||||
|
$this->requireFile('jsparty', array("File permissions", "jsparty/ folder exists", "There's no jsparty folder."));
|
||||||
|
$this->requireWriteable('.htaccess', array("File permissions", "Is the .htaccess file writeable?", null));
|
||||||
|
$this->requireWriteable('mysite/_config.php', array("File permissions", "Is the mysite/_config.php file writeable?", null));
|
||||||
|
$this->requireWriteable('assets', array("File permissions", "Is the assets/ folder writeable?", null));
|
||||||
|
|
||||||
|
$this->requireTempFolder(array('File permissions', 'Is the temporary folder writeable?', null));
|
||||||
|
|
||||||
|
// Check for web server, unless we're calling the installer from the command-line
|
||||||
|
if(!isset($_SERVER['argv']) || !$_SERVER['argv']) {
|
||||||
|
$webserver = strip_tags(trim($_SERVER['SERVER_SIGNATURE']));
|
||||||
|
if($webserver == '') {
|
||||||
|
$webserver = "I can't tell what webserver you are running";
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->isRunningApache(array("Webserver Configuration", "Server software", "$webserver. Without Apache I can't tell if mod_rewrite is enabled.", $webserver));
|
||||||
|
if(function_exists('apache_get_modules')) {
|
||||||
|
$this->requireApacheModule('mod_rewrite', array("Webserver Configuration", "mod_rewrite enabled", "You need mod_rewrite to run SilverStripe CMS, but it is not enabled."));
|
||||||
|
} else {
|
||||||
|
$this->warning(array("Webserver Configuration", "mod_rewrite enabled", "I can't tell whether mod_rewrite is running. You may need to configure a rewriting rule yourself."));
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->requireServerVariables(array('SCRIPT_NAME','HTTP_HOST','SCRIPT_FILENAME'), array("Webserver config", "Recognised webserver", "You seem to be using an unsupported webserver. The server variables SCRIPT_NAME, HTTP_HOST, SCRIPT_FILENAME need to be set."));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for GD support
|
||||||
|
if(!$this->requireFunction("imagecreatetruecolor", array("PHP Configuration", "GD2 support", "PHP must have GD version 2."))) {
|
||||||
|
$this->requireFunction("imagecreate", array("PHP Configuration", "GD2 support", "GD support for PHP not included."));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for XML support
|
||||||
|
$this->requireFunction('xml_set_object', array("PHP Configuration", "XML support", "XML support not included in PHP."));
|
||||||
|
|
||||||
|
// Check for MySQL support
|
||||||
|
$this->requireFunction('mysql_connect', array("PHP Configuration", "MySQL support", "MySQL support not included in PHP."));
|
||||||
|
|
||||||
|
// Check memory allocation
|
||||||
|
$this->requireMemory(32*1024*1024, 64*1024*1024, array("PHP Configuration", "Memory allocated (PHP config option 'memory_limit')", "SilverStripe needs a minimum of 32M allocated to PHP, but recommends 64M.", ini_get("memory_limit")));
|
||||||
|
|
||||||
|
// Check that troublesome classes don't exist
|
||||||
|
$badClasses = array('Query', 'HTTPResponse');
|
||||||
|
$this->requireNoClasses($badClasses, array("PHP Configuration", "Check that certain classes haven't been defined by PHP plugins", "Your version of PHP has defined some classes that conflict with SilverStripe's"));
|
||||||
|
|
||||||
|
return $this->errors;
|
||||||
|
}
|
||||||
|
|
||||||
|
function suggestPHPSetting($settingName, $settingValues, $testDetails) {
|
||||||
|
$this->testing($testDetails);
|
||||||
|
|
||||||
|
$val = ini_get($settingName);
|
||||||
|
if(!in_array($val, $settingValues) && $val != $settingValues) {
|
||||||
|
$testDetails[2] = "$settingName is set to '$val' in php.ini. $testDetails[2]";
|
||||||
|
$this->warning($testDetails);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function requireMemory($min, $recommended, $testDetails) {
|
||||||
|
$_SESSION['forcemem'] = false;
|
||||||
|
|
||||||
|
$mem = $this->getPHPMemory();
|
||||||
|
if($mem < (64 * 1024 * 1024)) {
|
||||||
|
ini_set('memory_limit', '64M');
|
||||||
|
$mem = $this->getPHPMemory();
|
||||||
|
$testDetails[3] = ini_get("memory_limit");
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->testing($testDetails);
|
||||||
|
|
||||||
|
if($mem < $min && $mem > 0) {
|
||||||
|
$testDetails[2] .= " You only have " . ini_get("memory_limit") . " allocated";
|
||||||
|
$this->error($testDetails);
|
||||||
|
} else if($mem < $recommended && $mem > 0) {
|
||||||
|
$testDetails[2] .= " You only have " . ini_get("memory_limit") . " allocated";
|
||||||
|
$this->warning($testDetails);
|
||||||
|
} elseif($mem == 0) {
|
||||||
|
$testDetails[2] .= " We can't determine how much memory you have allocated. Install only if you're sure you've allocated at least 20 MB.";
|
||||||
|
$this->warning($testDetails);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getPHPMemory() {
|
||||||
|
$memString = ini_get("memory_limit");
|
||||||
|
|
||||||
|
switch(strtolower(substr($memString,-1))) {
|
||||||
|
case "k":
|
||||||
|
return round(substr($memString,0,-1)*1024);
|
||||||
|
|
||||||
|
case "m":
|
||||||
|
return round(substr($memString,0,-1)*1024*1024);
|
||||||
|
|
||||||
|
case "g":
|
||||||
|
return round(substr($memString,0,-1)*1024*1024*1024);
|
||||||
|
|
||||||
|
default:
|
||||||
|
return round($memString);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function listErrors() {
|
||||||
|
if($this->errors) {
|
||||||
|
echo "<p>The following problems are preventing me from installing SilverStripe CMS:</p>\n\n";
|
||||||
|
foreach($this->errors as $error) {
|
||||||
|
echo "<li>" . htmlentities(implode(", ", $error)) . "</li>\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function showTable($section = null) {
|
||||||
|
if($section) {
|
||||||
|
$tests = $this->tests[$section];
|
||||||
|
echo "<table class=\"testResults\" width=\"100%\">";
|
||||||
|
foreach($tests as $test => $result) {
|
||||||
|
echo "<tr class=\"$result[0]\"><td>$test</td><td>" . nl2br(htmlentities($result[1])) . "</td></tr>";
|
||||||
|
}
|
||||||
|
echo "</table>";
|
||||||
|
|
||||||
|
} else {
|
||||||
|
foreach($this->tests as $section => $tests) {
|
||||||
|
echo "<h5>$section</h5>";
|
||||||
|
echo "<table class=\"testResults\">";
|
||||||
|
|
||||||
|
foreach($tests as $test => $result) {
|
||||||
|
echo "<tr class=\"$result[0]\"><td>$test</td><td>" . nl2br(htmlentities($result[1])) . "</td></tr>";
|
||||||
|
}
|
||||||
|
echo "</table>";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function showInstallStatus() {
|
||||||
|
if($this->warnings) {
|
||||||
|
echo "I have installed SilverStripe CMS, however, you should note the following:";
|
||||||
|
foreach($this->warnings as $warning) {
|
||||||
|
echo "<li>" . htmlentities($warning) . "</li>";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if(isset($_SERVER['HTTP_HOST'])) {
|
||||||
|
?>
|
||||||
|
<p>I have installed SilverStripe CMS successfully!</p>
|
||||||
|
<p><a href="./admin/" target="_blank">Open the CMS tool</a><br />
|
||||||
|
<a href="./" target="_blank">Open the site</a></p>
|
||||||
|
<?php
|
||||||
|
} else {
|
||||||
|
echo "\nSilverStripe successfully installed\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function requireFunction($funcName, $testDetails) {
|
||||||
|
$this->testing($testDetails);
|
||||||
|
if(!function_exists($funcName)) $this->error($testDetails);
|
||||||
|
else return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Require that the given class doesn't exist
|
||||||
|
*/
|
||||||
|
function requireNoClasses($classNames, $testDetails) {
|
||||||
|
$this->testing($testDetails);
|
||||||
|
$badClasses = array();
|
||||||
|
foreach($classNames as $className) {
|
||||||
|
if(class_exists($className)) $badClasses[] = $className;
|
||||||
|
}
|
||||||
|
if($badClasses) {
|
||||||
|
$testDetails[2] .= ". The following classes are at fault: " . implode(', ', $badClasses);
|
||||||
|
$this->error($testDetails);
|
||||||
|
}
|
||||||
|
else return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function requirePHPVersion($recommendedVersion, $requiredVersion, $testDetails) {
|
||||||
|
$this->testing($testDetails);
|
||||||
|
|
||||||
|
$installedVersion = phpversion();
|
||||||
|
|
||||||
|
if(version_compare($installedVersion, $requiredVersion, '<')) {
|
||||||
|
$testDetails[2] = "SilverStripe requires PHP version $requiredVersion or later.\n
|
||||||
|
PHP version $installedVersion is currently installed.\n
|
||||||
|
While SilverStripe requires at least PHP version $requiredVersion, upgrading to $recommendedVersion or later is recommended.\n
|
||||||
|
If you are installing SilverStripe on a shared web server, please ask your web hosting provider to upgrade PHP for you.";
|
||||||
|
$this->error($testDetails);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(version_compare($installedVersion, $recommendedVersion, '<')) {
|
||||||
|
$testDetails[2] = "PHP version $installedVersion is currently installed.\n
|
||||||
|
Upgrading to at least PHP version $recommendedVersion is recommended.\n
|
||||||
|
SilverStripe should run, but you may run into issues. Future releases may require a later version of PHP.\n";
|
||||||
|
$this->warning($testDetails);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function requireFile($filename, $testDetails) {
|
||||||
|
$this->testing($testDetails);
|
||||||
|
$filename = $this->getBaseDir() . $filename;
|
||||||
|
if(!file_exists($filename)) {
|
||||||
|
$testDetails[2] .= " (file '$filename' not found)";
|
||||||
|
$this->error($testDetails);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function requireNoFile($filename, $testDetails) {
|
||||||
|
$this->testing($testDetails);
|
||||||
|
$filename = $this->getBaseDir() . $filename;
|
||||||
|
if(file_exists($filename)) {
|
||||||
|
$testDetails[2] .= " (file '$filename' found)";
|
||||||
|
$this->error($testDetails);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function moveFileOutOfTheWay($filename, $testDetails) {
|
||||||
|
$this->testing($testDetails);
|
||||||
|
$filename = $this->getBaseDir() . $filename;
|
||||||
|
if(file_exists($filename)) {
|
||||||
|
if(file_exists("$filename.bak")) rm("$filename.bak");
|
||||||
|
rename($filename, "$filename.bak");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function requireWriteable($filename, $testDetails) {
|
||||||
|
$this->testing($testDetails);
|
||||||
|
$filename = $this->getBaseDir() . str_replace("/", DIRECTORY_SEPARATOR,$filename);
|
||||||
|
|
||||||
|
if(!is_writeable($filename)) {
|
||||||
|
if(function_exists('posix_getgroups')) {
|
||||||
|
$userID = posix_geteuid();
|
||||||
|
$user = posix_getpwuid($userID);
|
||||||
|
|
||||||
|
$currentOwnerID = fileowner($filename);
|
||||||
|
$currentOwner = posix_getpwuid($currentOwnerID);
|
||||||
|
|
||||||
|
$testDetails[2] .= "User '$user[name]' needs to be able to write to this file:\n$filename\n\nThe file is currently owned by '$currentOwner[name]'. ";
|
||||||
|
|
||||||
|
if($user['name'] == $currentOwner['name']) {
|
||||||
|
$testDetails[2] .= "We recommend that you make the file writeable.";
|
||||||
|
} else {
|
||||||
|
|
||||||
|
$groups = posix_getgroups();
|
||||||
|
foreach($groups as $group) {
|
||||||
|
$groupInfo = posix_getgrgid($group);
|
||||||
|
if(in_array($currentOwner['name'], $groupInfo['members'])) $groupList[] = $groupInfo['name'];
|
||||||
|
}
|
||||||
|
if($groupList) {
|
||||||
|
$testDetails[2] .= " We recommend that you make the file group-writeable and change the group to one of these groups:\n - ". implode("\n - ", $groupList)
|
||||||
|
. "\n\nFor example:\nchmod g+w $filename\nchgrp " . $groupList[0] . " $filename";
|
||||||
|
} else {
|
||||||
|
$testDetails[2] .= " There is no user-group that contains both the web-server user and the owner of this file. Change the ownership of the file, create a new group, or temporarily make the file writeable by everyone during the install process.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
$testDetails[2] .= "The webserver user needs to be able to write to this file:\n$filename";
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->error($testDetails);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function requireTempFolder($testDetails) {
|
||||||
|
$this->testing($testDetails);
|
||||||
|
|
||||||
|
if(function_exists('sys_get_temp_dir')) {
|
||||||
|
$sysTmp = sys_get_temp_dir();
|
||||||
|
} elseif(isset($_ENV['TMP'])) {
|
||||||
|
$sysTmp = $_ENV['TMP'];
|
||||||
|
} else {
|
||||||
|
@$tmpFile = tempnam('adfadsfdas','');
|
||||||
|
@unlink($tmpFile);
|
||||||
|
$sysTmp = dirname($tmpFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
$worked = true;
|
||||||
|
$ssTmp = "$sysTmp/silverstripe-cache";
|
||||||
|
|
||||||
|
if(!@file_exists($ssTmp)) {
|
||||||
|
@$worked = mkdir($ssTmp);
|
||||||
|
|
||||||
|
if(!$worked) {
|
||||||
|
$ssTmp = dirname($_SERVER['SCRIPT_FILENAME']) . "/silverstripe-cache";
|
||||||
|
$worked = true;
|
||||||
|
if(!@file_exists($ssTmp)) {
|
||||||
|
@$worked = mkdir($ssTmp);
|
||||||
|
}
|
||||||
|
if(!$worked) {
|
||||||
|
$testDetails[2] = "Permission problem gaining access to a temp folder. " .
|
||||||
|
"Please create a folder named silverstripe-cache in the base folder " .
|
||||||
|
"of the installation and ensure it has the adequate permissions";
|
||||||
|
$this->error($testDetails);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function requireApacheModule($moduleName, $testDetails) {
|
||||||
|
$this->testing($testDetails);
|
||||||
|
if(!in_array($moduleName, apache_get_modules())) $this->error($testDetails);
|
||||||
|
}
|
||||||
|
|
||||||
|
function requireMysqlConnection($server, $username, $password, $testDetails) {
|
||||||
|
$this->testing($testDetails);
|
||||||
|
$conn = @mysql_connect($server, $username, $password);
|
||||||
|
|
||||||
|
if($conn) {
|
||||||
|
return true;
|
||||||
|
/*
|
||||||
|
if(mysql_query("CREATE DATABASE testing123")) {
|
||||||
|
mysql_query("DROP DATABASE testing123");
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
$testDetails[2] .= " (user '$username' doesn't have CREATE DATABASE permissions.)";
|
||||||
|
$this->error($testDetails);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
} else {
|
||||||
|
$testDetails[2] .= ": " . mysql_error();
|
||||||
|
$this->error($testDetails);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function requireMySQLServer($server, $testDetails) {
|
||||||
|
$this->testing($testDetails);
|
||||||
|
$conn = @mysql_connect($server, null, null);
|
||||||
|
|
||||||
|
if($conn || mysql_errno() < 2000) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
$testDetails[2] .= ": " . mysql_error();
|
||||||
|
$this->error($testDetails);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function requireMySQLVersion($version, $testDetails) {
|
||||||
|
$this->testing($testDetails);
|
||||||
|
|
||||||
|
if(!mysql_get_server_info()) {
|
||||||
|
$testDetails[2] = 'Cannot determine the version of MySQL installed. Please ensure at least version 4.1 is installed.';
|
||||||
|
$this->warning($testDetails);
|
||||||
|
} else {
|
||||||
|
list($majorRequested, $minorRequested) = explode('.', $version);
|
||||||
|
$result = mysql_query('SELECT VERSION()');
|
||||||
|
$row=mysql_fetch_row($result);
|
||||||
|
$version = ereg_replace("([A-Za-z-])", "", $row[0]);
|
||||||
|
list($majorHas, $minorHas) = explode('.', substr(trim($version), 0, 3));
|
||||||
|
|
||||||
|
if(($majorHas > $majorRequested) || ($majorHas == $majorRequested && $minorHas >= $minorRequested)) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
$testDetails[2] .= "{$majorHas}.{$minorHas}.";
|
||||||
|
$this->error($testDetails);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function requireDatabaseOrCreatePermissions($server, $username, $password, $database, $testDetails) {
|
||||||
|
$this->testing($testDetails);
|
||||||
|
$conn = @mysql_connect($server, $username, $password);
|
||||||
|
|
||||||
|
if(@mysql_select_db($database)) {
|
||||||
|
$okay = "Database '$database' exists";
|
||||||
|
|
||||||
|
} else {
|
||||||
|
if(@mysql_query("CREATE DATABASE testing123")) {
|
||||||
|
mysql_query("DROP DATABASE testing123");
|
||||||
|
$okay = "Able to create a new database";
|
||||||
|
|
||||||
|
} else {
|
||||||
|
$testDetails[2] .= " (user '$username' doesn't have CREATE DATABASE permissions.)";
|
||||||
|
$this->error($testDetails);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if($okay) {
|
||||||
|
$testDetails[3] = $okay;
|
||||||
|
$this->testing($testDetails);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function requireServerVariables($varNames, $errorMessage) {
|
||||||
|
//$this->testing($testDetails);
|
||||||
|
foreach($varNames as $varName) {
|
||||||
|
if(!$_SERVER[$varName]) $missing[] = '$_SERVER[' . $varName . ']';
|
||||||
|
}
|
||||||
|
if(!isset($missing)) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
$testDetails[2] .= " (the following PHP variables are missing: " . implode(", ", $missing) . ")";
|
||||||
|
$this->error($testDetails);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function isRunningApache($testDetails) {
|
||||||
|
$this->testing($testDetails);
|
||||||
|
if(function_exists('apache_get_modules') || stristr($_SERVER['SERVER_SIGNATURE'], 'Apache'))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
$this->warning($testDetails);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Must be PHP4 compatible
|
||||||
|
var $baseDir;
|
||||||
|
function getBaseDir() {
|
||||||
|
// Cache the value so that when the installer mucks with SCRIPT_FILENAME half way through, this method
|
||||||
|
// still returns the correct value.
|
||||||
|
if(!$this->baseDir) $this->baseDir = realpath(dirname($_SERVER['SCRIPT_FILENAME'])) . DIRECTORY_SEPARATOR;
|
||||||
|
return $this->baseDir;
|
||||||
|
}
|
||||||
|
|
||||||
|
function testing($testDetails) {
|
||||||
|
if(!$testDetails) return;
|
||||||
|
|
||||||
|
$section = $testDetails[0];
|
||||||
|
$test = $testDetails[1];
|
||||||
|
|
||||||
|
$message = "OK";
|
||||||
|
if(isset($testDetails[3])) $message .= " ($testDetails[3])";
|
||||||
|
|
||||||
|
$this->tests[$section][$test] = array("good", $message);
|
||||||
|
}
|
||||||
|
|
||||||
|
function error($testDetails) {
|
||||||
|
$section = $testDetails[0];
|
||||||
|
$test = $testDetails[1];
|
||||||
|
|
||||||
|
$this->tests[$section][$test] = array("error", $testDetails[2]);
|
||||||
|
$this->errors[] = $testDetails;
|
||||||
|
|
||||||
|
}
|
||||||
|
function warning($testDetails) {
|
||||||
|
$section = $testDetails[0];
|
||||||
|
$test = $testDetails[1];
|
||||||
|
|
||||||
|
|
||||||
|
$this->tests[$section][$test] = array("warning", $testDetails[2]);
|
||||||
|
$this->warnings[] = $testDetails;
|
||||||
|
}
|
||||||
|
|
||||||
|
function hasErrors() {
|
||||||
|
return sizeof($this->errors);
|
||||||
|
}
|
||||||
|
function hasWarnings() {
|
||||||
|
return sizeof($this->warnings);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class Installer extends InstallRequirements {
|
||||||
|
function __construct() {
|
||||||
|
// Cache the baseDir value
|
||||||
|
$this->getBaseDir();
|
||||||
|
}
|
||||||
|
|
||||||
|
function install($config) {
|
||||||
|
if(isset($_SERVER['HTTP_HOST'])) {
|
||||||
|
?>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>PHP 5 is required</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="themes/blackcandy/css/layout.css" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="themes/blackcandy/css/typography.css" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="themes/blackcandy/css/form.css" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="sapphire/dev/install/install.css" />
|
||||||
|
<script src="jsparty/jquery/jquery.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="BgContainer">
|
||||||
|
<div id="Container">
|
||||||
|
<div id="Header">
|
||||||
|
<h1>SilverStripe CMS Installation</h1>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="Navigation"> </div>
|
||||||
|
<div class="clear"><!-- --></div>
|
||||||
|
|
||||||
|
<div id="Layout">
|
||||||
|
<div class="typography">
|
||||||
|
<h1>Installing SilverStripe...</h1>
|
||||||
|
<p>I am now running through the installation steps (this should take about 30 seconds)</p>
|
||||||
|
<p>If you receive a fatal error, refresh this page to continue the installation</p>
|
||||||
|
<ul>
|
||||||
|
<?php
|
||||||
|
} else {
|
||||||
|
echo "SILVERSTRIPE COMMAND-LINE INSTALLATION\n\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
flush();
|
||||||
|
|
||||||
|
if(isset($_POST['stats'])) {
|
||||||
|
if(file_exists('sapphire/silverstripe_version')) {
|
||||||
|
$sapphireVersionFile = file_get_contents('sapphire/silverstripe_version');
|
||||||
|
if(strstr($sapphireVersionFile, "/sapphire/trunk")) {
|
||||||
|
$silverstripe_version = "trunk";
|
||||||
|
} else {
|
||||||
|
preg_match("/sapphire\/(?:(?:branches)|(?:tags))(?:\/rc)?\/([A-Za-z0-9._-]+)\/silverstripe_version/", $sapphireVersionFile, $matches);
|
||||||
|
$silverstripe_version = $matches[1];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$silverstripe_version = "unknown";
|
||||||
|
}
|
||||||
|
|
||||||
|
$phpVersion = urlencode(phpversion());
|
||||||
|
$conn = @mysql_connect($config['mysql']['server'], null, null);
|
||||||
|
$databaseVersion = urlencode('MySQL ' . mysql_get_server_info());
|
||||||
|
$webserver = urlencode($_SERVER['SERVER_SOFTWARE']);
|
||||||
|
|
||||||
|
$url = "http://ss2stat.silverstripe.com/Installation/add?SilverStripe=$silverstripe_version&PHP=$phpVersion&Database=$databaseVersion&WebServer=$webserver";
|
||||||
|
|
||||||
|
if(isset($_SESSION['StatsID']) && $_SESSION['StatsID']) {
|
||||||
|
$url .= '&ID=' . $_SESSION['StatsID'];
|
||||||
|
}
|
||||||
|
|
||||||
|
@$_SESSION['StatsID'] = file_get_contents($url);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(file_exists('mysite/_config.php')) {
|
||||||
|
unlink('mysite/_config.php');
|
||||||
|
}
|
||||||
|
$theme = isset($_POST['template']) ? $_POST['template'] : 'blackcandy';
|
||||||
|
// Write the config file
|
||||||
|
global $usingEnv;
|
||||||
|
if($usingEnv) {
|
||||||
|
$this->statusMessage("Creating 'mysite/_config.php' for use with _ss_environment.php...");
|
||||||
|
$this->createFile("mysite/_config.php", <<<PHP
|
||||||
|
<?php
|
||||||
|
|
||||||
|
global \$project;
|
||||||
|
\$project = 'mysite';
|
||||||
|
|
||||||
|
global \$database;
|
||||||
|
\$database = "{$config['mysql']['database']}";
|
||||||
|
|
||||||
|
require_once("conf/ConfigureFromEnv.php");
|
||||||
|
|
||||||
|
// This line set's the current theme. More themes can be
|
||||||
|
// downloaded from http://www.silverstripe.com/themes/
|
||||||
|
SSViewer::set_theme('$theme');
|
||||||
|
|
||||||
|
?>
|
||||||
|
PHP
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
} else {
|
||||||
|
$this->statusMessage("Creating 'mysite/_config.php'...");
|
||||||
|
|
||||||
|
$devServers = $this->var_export_array_nokeys(explode("\n", $_POST['devsites']));
|
||||||
|
|
||||||
|
$escapedPassword = addslashes($config['mysql']['password']);
|
||||||
|
$this->createFile("mysite/_config.php", <<<PHP
|
||||||
|
<?php
|
||||||
|
|
||||||
|
global \$project;
|
||||||
|
\$project = 'mysite';
|
||||||
|
|
||||||
|
global \$databaseConfig;
|
||||||
|
\$databaseConfig = array(
|
||||||
|
"type" => "$config[database]",
|
||||||
|
"server" => "{$config['mysql']['server']}",
|
||||||
|
"username" => "{$config['mysql']['username']}",
|
||||||
|
"password" => "{$escapedPassword}",
|
||||||
|
"database" => "{$config['mysql']['database']}",
|
||||||
|
);
|
||||||
|
|
||||||
|
// Sites running on the following servers will be
|
||||||
|
// run in development mode. See
|
||||||
|
// http://doc.silverstripe.com/doku.php?id=devmode
|
||||||
|
// for a description of what dev mode does.
|
||||||
|
Director::set_dev_servers($devServers);
|
||||||
|
|
||||||
|
// This line set's the current theme. More themes can be
|
||||||
|
// downloaded from http://www.silverstripe.com/themes/
|
||||||
|
SSViewer::set_theme('$theme');
|
||||||
|
|
||||||
|
?>
|
||||||
|
PHP
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->statusMessage("Creating '.htaccess' file...");
|
||||||
|
|
||||||
|
$this->createHtaccess();
|
||||||
|
|
||||||
|
// Load the sapphire runtime
|
||||||
|
$_SERVER['SCRIPT_FILENAME'] = dirname(realpath($_SERVER['SCRIPT_FILENAME'])) . '/sapphire/main.php';
|
||||||
|
chdir('sapphire');
|
||||||
|
|
||||||
|
// Rebuild the manifest
|
||||||
|
$_GET['flush'] = true;
|
||||||
|
// Show errors as if you're in development mode
|
||||||
|
$_SESSION['isDev'] = 1;
|
||||||
|
|
||||||
|
require_once('core/Core.php');
|
||||||
|
|
||||||
|
$this->statusMessage("Building database schema...");
|
||||||
|
|
||||||
|
// Build database
|
||||||
|
$con = new Controller();
|
||||||
|
$con->pushCurrent();
|
||||||
|
|
||||||
|
global $databaseConfig;
|
||||||
|
DB::connect($databaseConfig);
|
||||||
|
|
||||||
|
$dbAdmin = new DatabaseAdmin();
|
||||||
|
$dbAdmin->init();
|
||||||
|
|
||||||
|
$_REQUEST['username'] = $config['admin']['username'];
|
||||||
|
$_REQUEST['password'] = $config['admin']['password'];
|
||||||
|
$dbAdmin->doBuild(true);
|
||||||
|
|
||||||
|
$adminmember = DataObject::get_one('Member',"`Email`= '".$_REQUEST['admin']['username']."'");
|
||||||
|
if($adminmember) {
|
||||||
|
$adminmember->FirstName = $_REQUEST['admin']['firstname'];
|
||||||
|
$adminmember->Surname = $_REQUEST['admin']['surname'];
|
||||||
|
$adminmember->write();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Syncing filesystem (so /assets/Uploads is available instantly, see ticket #2266)
|
||||||
|
FileSystem::sync();
|
||||||
|
|
||||||
|
$_SESSION['username'] = $config['admin']['username'];
|
||||||
|
$_SESSION['password'] = $config['admin']['password'];
|
||||||
|
|
||||||
|
if(!$this->errors) {
|
||||||
|
if(isset($_SERVER['HTTP_HOST'])) {
|
||||||
|
$this->statusMessage("Checking that friendly URLs work...");
|
||||||
|
$this->checkModRewrite();
|
||||||
|
} else {
|
||||||
|
echo "\n\nSilverStripe successfully installed\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->errors;
|
||||||
|
}
|
||||||
|
|
||||||
|
function makeFolder($folder) {
|
||||||
|
$base = $this->getBaseDir();
|
||||||
|
if(!file_exists($base . $folder)) {
|
||||||
|
if(!mkdir($base . $folder, 02775)) {
|
||||||
|
$this->error("Couldn't create a folder called $base$folder");
|
||||||
|
} else {
|
||||||
|
chmod($base . $folder, 02775);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function renameFolder($oldName, $newName) {
|
||||||
|
if($oldName == $newName) return true;
|
||||||
|
|
||||||
|
$base = $this->getBaseDir();
|
||||||
|
if(!rename($base . $oldName, $base . $newName)) {
|
||||||
|
$this->error("Couldn't rename $base$oldName to $base$newName");
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function copyFolder($oldName, $newName) {
|
||||||
|
if($oldName == $newName) return true;
|
||||||
|
|
||||||
|
$base = $this->getBaseDir();
|
||||||
|
if(!copyr($base . $oldName, $base . $newName)) {
|
||||||
|
$this->error("Couldn't rename $base$oldName to $base$newName");
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function createFile($filename, $content) {
|
||||||
|
$base = $this->getBaseDir();
|
||||||
|
$this->statusMessage("Creating $base$filename");
|
||||||
|
|
||||||
|
if((@$fh = fopen($base . $filename, 'w')) && fwrite($fh, $content) && fclose($fh)) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
$this->error("Couldn't write to file $base$filename");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function createHtaccess() {
|
||||||
|
$start = "### SILVERSTRIPE START ###\n";
|
||||||
|
$end = "\n### SILVERSTRIPE END ###";
|
||||||
|
|
||||||
|
$base = dirname($_SERVER['SCRIPT_NAME']);
|
||||||
|
if(defined('DIRECTORY_SEPARATOR')) $base = str_replace(DIRECTORY_SEPARATOR, '/', $base);
|
||||||
|
else $base = str_replace("\\", '/', $base);
|
||||||
|
|
||||||
|
if($base != '.') $baseClause = "RewriteBase $base\n";
|
||||||
|
else $baseClause = "";
|
||||||
|
|
||||||
|
$rewrite = <<<TEXT
|
||||||
|
<Files *.ss>
|
||||||
|
Order deny,allow
|
||||||
|
Deny from all
|
||||||
|
Allow from 127.0.0.1
|
||||||
|
</Files>
|
||||||
|
|
||||||
|
<IfModule mod_rewrite.c>
|
||||||
|
RewriteEngine On
|
||||||
|
$baseClause
|
||||||
|
RewriteCond %{REQUEST_URI} !(\.gif$)|(\.jpg$)|(\.png$)|(\.css$)|(\.js$)
|
||||||
|
|
||||||
|
RewriteCond %{REQUEST_URI} ^(.*)$
|
||||||
|
RewriteCond %{REQUEST_FILENAME} !-f
|
||||||
|
RewriteRule .* sapphire/main.php?url=%1&%{QUERY_STRING} [L]
|
||||||
|
</IfModule>
|
||||||
|
TEXT
|
||||||
|
;
|
||||||
|
|
||||||
|
if(file_exists('.htaccess')) {
|
||||||
|
$htaccess = file_get_contents('.htaccess');
|
||||||
|
|
||||||
|
if(strpos($htaccess, '### SILVERSTRIPE START ###') === false && strpos($htaccess, '### SILVERSTRIPE END ###') === false) {
|
||||||
|
$htaccess .= "\n### SILVERSTRIPE START ###\n### SILVERSTRIPE END ###\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
if(strpos($htaccess, '### SILVERSTRIPE START ###') !== false && strpos($htaccess, '### SILVERSTRIPE END ###') !== false) {
|
||||||
|
$start = substr($htaccess, 0, strpos($htaccess, '### SILVERSTRIPE START ###')) . "### SILVERSTRIPE START ###\n";
|
||||||
|
$end = "\n" . substr($htaccess, strpos($htaccess, '### SILVERSTRIPE END ###'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->createFile('.htaccess', $start . $rewrite . $end);
|
||||||
|
}
|
||||||
|
|
||||||
|
function restoreHtaccess() {
|
||||||
|
$start = "### SILVERSTRIPE START ###\n";
|
||||||
|
$end= "\n### SILVERSTRIPE END ###";
|
||||||
|
|
||||||
|
if(file_exists('.htaccess')) {
|
||||||
|
$htaccess = file_get_contents('.htaccess');
|
||||||
|
|
||||||
|
if(strpos($htaccess, '### SILVERSTRIPE START ###') === false && strpos($htaccess, '### SILVERSTRIPE END ###') === false) {
|
||||||
|
$htaccess .= "\n### SILVERSTRIPE START ###\n### SILVERSTRIPE END ###\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
if(strpos($htaccess, '### SILVERSTRIPE START ###') !== false && strpos($htaccess, '### SILVERSTRIPE END ###') !== false) {
|
||||||
|
$start = substr($htaccess, 0, strpos($htaccess, '### SILVERSTRIPE START ###')) . "### SILVERSTRIPE START ###\n";
|
||||||
|
$end = "\n" . substr($htaccess, strpos($htaccess, '### SILVERSTRIPE END ###'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->createFile('.htaccess', $start . $end);
|
||||||
|
}
|
||||||
|
|
||||||
|
function checkModRewrite() {
|
||||||
|
if(!isset($_SERVER['HTTP_HOST']) || !$_SERVER['HTTP_HOST']) {
|
||||||
|
$this->statusMessage("Installer seems to be called from command-line, we're going to assume that rewriting is working.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
echo <<<HTML
|
||||||
|
<li id="ModRewriteResult">Testing...</li>
|
||||||
|
<script>
|
||||||
|
if(typeof $ == 'undefined') {
|
||||||
|
document.getElemenyById('ModeRewriteResult').innerHTML = "I can't run jQuery ajax to set rewriting; I will redirect you to the homepage to see if everything is working.";
|
||||||
|
setTimeout(function() {
|
||||||
|
window.location = "home/successfullyinstalled?flush=1";
|
||||||
|
}, 10000);
|
||||||
|
} else {
|
||||||
|
$.ajax({
|
||||||
|
method: 'get',
|
||||||
|
url: 'InstallerTest/testrewrite',
|
||||||
|
complete: function(response) {
|
||||||
|
if(response.responseText == 'OK') {
|
||||||
|
$('#ModRewriteResult').html("Friendly URLs set up successfully; I am now redirecting you to your SilverStripe site...")
|
||||||
|
setTimeout(function() {
|
||||||
|
window.location = "home/successfullyinstalled?flush=1";
|
||||||
|
}, 2000);
|
||||||
|
} else {
|
||||||
|
$('#ModRewriteResult').html("Friendly URLs are not working. This is most likely because mod_rewrite isn't configured"
|
||||||
|
+ "correctly on your site. Please check the following things in your Apache configuration; "
|
||||||
|
+ " you may need to get your web host or server administrator to do this for you:"
|
||||||
|
+ "<ul><li>mod_rewrite is enabled</li><li>AllowOverride All is set for your directory</li></ul>");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<noscript>
|
||||||
|
<li><a href="home/successfullyinstalled?flush=1">Click here to check friendly URLs are working. If you get a 404 then something is wrong.</li>
|
||||||
|
</noscript>
|
||||||
|
HTML;
|
||||||
|
}
|
||||||
|
|
||||||
|
function var_export_array_nokeys($array) {
|
||||||
|
$retval = "array(\n";
|
||||||
|
foreach($array as $item) {
|
||||||
|
$retval .= "\t'";
|
||||||
|
$retval .= trim($item);
|
||||||
|
$retval .= "',\n";
|
||||||
|
}
|
||||||
|
$retval .= ")";
|
||||||
|
return $retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show an installation status message.
|
||||||
|
* The output differs depending on whether this is CLI or web based
|
||||||
|
*/
|
||||||
|
function statusMessage($msg) {
|
||||||
|
if(isset($_SERVER['HTTP_HOST'])) echo "<li>$msg</li>\n";
|
||||||
|
else echo "$msg\n";
|
||||||
|
flush();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copy a file, or recursively copy a folder and its contents
|
||||||
|
*
|
||||||
|
* @author Aidan Lister <aidan@php.net>
|
||||||
|
* @version 1.0.1
|
||||||
|
* @link http://aidanlister.com/repos/v/function.copyr.php
|
||||||
|
* @param string $source Source path
|
||||||
|
* @param string $dest Destination path
|
||||||
|
* @return bool Returns TRUE on success, FALSE on failure
|
||||||
|
*/
|
||||||
|
function copyr($source, $dest)
|
||||||
|
{
|
||||||
|
// Simple copy for a file
|
||||||
|
if (is_file($source)) {
|
||||||
|
return copy($source, $dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make destination directory
|
||||||
|
if (!is_dir($dest)) {
|
||||||
|
mkdir($dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Loop through the folder
|
||||||
|
$dir = dir($source);
|
||||||
|
while (false !== $entry = $dir->read()) {
|
||||||
|
// Skip pointers
|
||||||
|
if ($entry == '.' || $entry == '..') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deep copy directories
|
||||||
|
if ($dest !== "$source/$entry") {
|
||||||
|
copyr("$source/$entry", "$dest/$entry");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clean up
|
||||||
|
$dir->close();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function rm($fileglob)
|
||||||
|
{
|
||||||
|
if (is_string($fileglob)) {
|
||||||
|
if (is_file($fileglob)) {
|
||||||
|
return unlink($fileglob);
|
||||||
|
} else if (is_dir($fileglob)) {
|
||||||
|
$ok = rm("$fileglob/*");
|
||||||
|
if (! $ok) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return rmdir($fileglob);
|
||||||
|
} else {
|
||||||
|
$matching = glob($fileglob);
|
||||||
|
if ($matching === false) {
|
||||||
|
trigger_error(sprintf('No files match supplied glob %s', $fileglob), E_USER_WARNING);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$rcs = array_map('rm', $matching);
|
||||||
|
if (in_array(false, $rcs)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (is_array($fileglob)) {
|
||||||
|
$rcs = array_map('rm', $fileglob);
|
||||||
|
if (in_array(false, $rcs)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
trigger_error('Param #1 must be filename or glob pattern, or array of filenames or glob patterns', E_USER_ERROR);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
15
mysite/_config.php
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
global $project;
|
||||||
|
$project = 'mysite';
|
||||||
|
|
||||||
|
global $database;
|
||||||
|
$database = "";
|
||||||
|
|
||||||
|
require_once("conf/ConfigureFromEnv.php");
|
||||||
|
|
||||||
|
// This line set's the current theme. More themes can be
|
||||||
|
// downloaded from http://www.silverstripe.com/themes/
|
||||||
|
SSViewer::set_theme('blackcandy');
|
||||||
|
|
||||||
|
?>
|
56
mysite/code/Page.php
Executable file
@ -0,0 +1,56 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
class Page extends SiteTree {
|
||||||
|
|
||||||
|
public static $db = array(
|
||||||
|
);
|
||||||
|
|
||||||
|
public static $has_one = array(
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class Page_Controller extends ContentController {
|
||||||
|
|
||||||
|
public function init() {
|
||||||
|
parent::init();
|
||||||
|
|
||||||
|
// Note: you should use SS template require tags inside your templates
|
||||||
|
// instead of putting Requirements calls here. However these are
|
||||||
|
// included so that our older themes still work
|
||||||
|
Requirements::themedCSS("layout");
|
||||||
|
Requirements::themedCSS("typography");
|
||||||
|
Requirements::themedCSS("form");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Site search form
|
||||||
|
*/
|
||||||
|
function SearchForm() {
|
||||||
|
$searchText = isset($_REQUEST['Search']) ? $_REQUEST['Search'] : 'Search';
|
||||||
|
$fields = new FieldSet(
|
||||||
|
new TextField("Search", "", $searchText)
|
||||||
|
);
|
||||||
|
$actions = new FieldSet(
|
||||||
|
new FormAction('results', 'Search')
|
||||||
|
);
|
||||||
|
|
||||||
|
return new SearchForm($this, "SearchForm", $fields, $actions);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Process and render search results
|
||||||
|
*/
|
||||||
|
function results($data, $form){
|
||||||
|
$data = array(
|
||||||
|
'Results' => $form->getResults(),
|
||||||
|
'Query' => $form->getSearchQuery(),
|
||||||
|
'Title' => 'Search Results'
|
||||||
|
);
|
||||||
|
|
||||||
|
return $this->customise($data)->renderWith(array('Page_results', 'Page'));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
@ -1,26 +0,0 @@
|
|||||||
<?xml version="1.0"?>
|
|
||||||
<ruleset name="SS3">
|
|
||||||
<description>Coding standard for SilverStripe 4.x</description>
|
|
||||||
|
|
||||||
<file>app</file>
|
|
||||||
|
|
||||||
<!-- Don't sniff third party libraries -->
|
|
||||||
<exclude-pattern>*/vendor/*</exclude-pattern>
|
|
||||||
<exclude-pattern>*/thirdparty/*</exclude-pattern>
|
|
||||||
|
|
||||||
<!-- Show progress and output sniff names on violation, and add colours -->
|
|
||||||
<arg value="sp"/>
|
|
||||||
<arg name="colors"/>
|
|
||||||
|
|
||||||
<!-- Use PSR-2 as a base standard -->
|
|
||||||
<rule ref="PSR2">
|
|
||||||
<!-- Allow classes to not declare a namespace -->
|
|
||||||
<exclude name="PSR1.Classes.ClassDeclaration.MissingNamespace"/>
|
|
||||||
|
|
||||||
<!-- Allow underscores in class names -->
|
|
||||||
<exclude name="Squiz.Classes.ValidClassName.NotCamelCaps"/>
|
|
||||||
|
|
||||||
<!-- Allow non camel cased method names -->
|
|
||||||
<exclude name="PSR1.Methods.CamelCapsMethodName.NotCamelCaps"/>
|
|
||||||
</rule>
|
|
||||||
</ruleset>
|
|
@ -1,59 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!--
|
|
||||||
PHPUnit configuration for SilverStripe
|
|
||||||
|
|
||||||
Requires PHPUnit 9+
|
|
||||||
|
|
||||||
Usage:
|
|
||||||
- "vendor/bin/phpunit": Runs all tests in all folders
|
|
||||||
- "vendor/bin/phpunit vendor/silverstripe/framework/tests/": Run all tests of the framework module
|
|
||||||
- "vendor/bin/phpunit vendor/silverstripe/framework/tests/filesystem": Run all filesystem tests within framework
|
|
||||||
- "vendor/bin/phpunit vendor/silverstripe/framework/tests/filesystem/FolderTest.php": Run a single test
|
|
||||||
- "vendor/bin/phpunit <dash><dash>coverage-html assets/": Generate coverage report (replace
|
|
||||||
<dash> with "-", requires xdebug or phpdbg)
|
|
||||||
|
|
||||||
More information:
|
|
||||||
- http://www.phpunit.de/manual/current/en/textui.html
|
|
||||||
- http://doc.silverstripe.org/framework/en/topics/testing/#configuration
|
|
||||||
|
|
||||||
It is safe to remove this file for normal website operation.
|
|
||||||
-->
|
|
||||||
<phpunit bootstrap="vendor/silverstripe/framework/tests/bootstrap.php" colors="true">
|
|
||||||
<testsuites>
|
|
||||||
<testsuite name="Default">
|
|
||||||
<directory>app/tests</directory>
|
|
||||||
<directory>vendor/silverstripe/cms/tests/php</directory>
|
|
||||||
<directory>vendor/silverstripe/framework/tests/php</directory>
|
|
||||||
</testsuite>
|
|
||||||
|
|
||||||
<!-- Framework ORM tests are split up to run in parallel -->
|
|
||||||
<testsuite name="framework-core">
|
|
||||||
<directory>vendor/silverstripe/framework/tests/php</directory>
|
|
||||||
<exclude>vendor/silverstripe/framework/tests/php/ORM</exclude>
|
|
||||||
</testsuite>
|
|
||||||
<testsuite name="framework-orm">
|
|
||||||
<directory>vendor/silverstripe/framework/tests/php/ORM</directory>
|
|
||||||
</testsuite>
|
|
||||||
|
|
||||||
<!-- other core components -->
|
|
||||||
<testsuite name="core">
|
|
||||||
<directory>vendor/silverstripe/assets/tests/php/</directory>
|
|
||||||
<directory>vendor/silverstripe/versioned/tests/php/</directory>
|
|
||||||
</testsuite>
|
|
||||||
|
|
||||||
<!-- admin components -->
|
|
||||||
<testsuite name="admin">
|
|
||||||
<directory>vendor/silverstripe/admin/tests/php/</directory>
|
|
||||||
<directory>vendor/silverstripe/asset-admin/tests/php/</directory>
|
|
||||||
<directory>vendor/silverstripe/campaign-admin/tests/php/</directory>
|
|
||||||
<directory>vendor/silverstripe/cms/tests/</directory>
|
|
||||||
<directory>vendor/silverstripe/config/tests/</directory>
|
|
||||||
<directory>vendor/silverstripe/errorpage/tests/</directory>
|
|
||||||
<directory>vendor/silverstripe/graphql/tests/</directory>
|
|
||||||
<directory>vendor/silverstripe/login-forms/tests/php/</directory>
|
|
||||||
<directory>vendor/silverstripe/mimevalidator/tests/</directory>
|
|
||||||
<directory>vendor/silverstripe/reports/tests/</directory>
|
|
||||||
<directory>vendor/silverstripe/siteconfig/tests/php/</directory>
|
|
||||||
</testsuite>
|
|
||||||
</testsuites>
|
|
||||||
</phpunit>
|
|
4
public/assets/.gitignore
vendored
@ -1,4 +0,0 @@
|
|||||||
/**/*
|
|
||||||
!.gitignore
|
|
||||||
!.htaccess
|
|
||||||
!web.config
|
|
@ -1,35 +0,0 @@
|
|||||||
#
|
|
||||||
# Whitelist appropriate assets files.
|
|
||||||
# This file is automatically generated via File.allowed_extensions configuration
|
|
||||||
# See AssetAdapter::renderTemplate() for reference.
|
|
||||||
#
|
|
||||||
|
|
||||||
# We disable PHP via several methods
|
|
||||||
# Replace the handler with the default plaintext handler
|
|
||||||
AddHandler default-handler php phtml php3 php4 php5 inc
|
|
||||||
|
|
||||||
<IfModule mod_php5.c>
|
|
||||||
# Turn the PHP engine off
|
|
||||||
php_flag engine off
|
|
||||||
</IfModule>
|
|
||||||
|
|
||||||
<IfModule mod_rewrite.c>
|
|
||||||
<IfModule mod_env.c>
|
|
||||||
SetEnv HTTP_MOD_REWRITE On
|
|
||||||
</IfModule>
|
|
||||||
|
|
||||||
RewriteEngine On
|
|
||||||
|
|
||||||
# Allow error pages
|
|
||||||
RewriteCond %{REQUEST_FILENAME} -f
|
|
||||||
RewriteRule error[^\\/]*\.html$ - [L]
|
|
||||||
|
|
||||||
# Block invalid file extensions
|
|
||||||
RewriteCond %{REQUEST_URI} !^[^.]*\.(?i:css|js|ace|arc|arj|asf|au|avi|bmp|bz2|cab|cda|csv|dmg|doc|docx|dotx|flv|gif|gpx|gz|hqx|ico|jpeg|jpg|kml|m4a|m4v|mid|midi|mkv|mov|mp3|mp4|mpa|mpeg|mpg|ogg|ogv|pages|pcx|pdf|png|pps|ppt|pptx|potx|ra|ram|rm|rtf|sit|sitx|tar|tgz|tif|tiff|txt|wav|webm|wma|wmv|xls|xlsx|xltx|zip|zipx)$
|
|
||||||
RewriteRule .* - [F]
|
|
||||||
|
|
||||||
# Non-existent files passed to requesthandler
|
|
||||||
RewriteCond %{REQUEST_URI} ^(.*)$
|
|
||||||
RewriteCond %{REQUEST_FILENAME} !-f
|
|
||||||
RewriteRule .* ../index.php [QSA]
|
|
||||||
</IfModule>
|
|
@ -1,101 +0,0 @@
|
|||||||
<!--
|
|
||||||
|
|
||||||
Configuration to whitelist appropriate asset files, for IIS.
|
|
||||||
Note that you will need to maintain this whitelist yourself if you modify File::$allowed_extensions
|
|
||||||
|
|
||||||
If you are not using IIS then you can ignore this file.
|
|
||||||
If you are using Apache then you should look at assets/.htaccess instead.
|
|
||||||
|
|
||||||
To add an extension to to the list, you will need to add another <add> entry inside the <fileExtensions>
|
|
||||||
tag.
|
|
||||||
|
|
||||||
For example, to add *.exe files to the list of downloadable assets, add this line below the
|
|
||||||
<fileExtensions line>:
|
|
||||||
|
|
||||||
<add fileExtension=".exe" allowed="true" />
|
|
||||||
|
|
||||||
Once you do this, visitors will be able to download *.exe files that are uploaded to the assets
|
|
||||||
directory.
|
|
||||||
|
|
||||||
-->
|
|
||||||
<configuration>
|
|
||||||
<system.webServer>
|
|
||||||
<security>
|
|
||||||
<requestFiltering>
|
|
||||||
<fileExtensions allowUnlisted="false" applyToWebDAV="true">
|
|
||||||
<add fileExtension=".html" allowed="true" />
|
|
||||||
<add fileExtension=".htm" allowed="true" />
|
|
||||||
<add fileExtension=".xhtml" allowed="true" />
|
|
||||||
<add fileExtension=".js" allowed="true" />
|
|
||||||
<add fileExtension=".css" allowed="true" />
|
|
||||||
<add fileExtension=".bmp" allowed="true" />
|
|
||||||
<add fileExtension=".png" allowed="true" />
|
|
||||||
<add fileExtension=".gif" allowed="true" />
|
|
||||||
<add fileExtension=".jpg" allowed="true" />
|
|
||||||
<add fileExtension=".jpeg" allowed="true" />
|
|
||||||
<add fileExtension=".ico" allowed="true" />
|
|
||||||
<add fileExtension=".pcx" allowed="true" />
|
|
||||||
<add fileExtension=".tif" allowed="true" />
|
|
||||||
<add fileExtension=".tiff" allowed="true" />
|
|
||||||
<add fileExtension=".au" allowed="true" />
|
|
||||||
<add fileExtension=".mid" allowed="true" />
|
|
||||||
<add fileExtension=".midi" allowed="true" />
|
|
||||||
<add fileExtension=".mpa" allowed="true" />
|
|
||||||
<add fileExtension=".mp3" allowed="true" />
|
|
||||||
<add fileExtension=".ogg" allowed="true" />
|
|
||||||
<add fileExtension=".m4a" allowed="true" />
|
|
||||||
<add fileExtension=".ra" allowed="true" />
|
|
||||||
<add fileExtension=".wma" allowed="true" />
|
|
||||||
<add fileExtension=".wav" allowed="true" />
|
|
||||||
<add fileExtension=".cda" allowed="true" />
|
|
||||||
<add fileExtension=".avi" allowed="true" />
|
|
||||||
<add fileExtension=".mpg" allowed="true" />
|
|
||||||
<add fileExtension=".mpeg" allowed="true" />
|
|
||||||
<add fileExtension=".asf" allowed="true" />
|
|
||||||
<add fileExtension=".wmv" allowed="true" />
|
|
||||||
<add fileExtension=".m4v" allowed="true" />
|
|
||||||
<add fileExtension=".mov" allowed="true" />
|
|
||||||
<add fileExtension=".mkv" allowed="true" />
|
|
||||||
<add fileExtension=".mp4" allowed="true" />
|
|
||||||
<add fileExtension=".ogv" allowed="true" />
|
|
||||||
<add fileExtension=".webm" allowed="true" />
|
|
||||||
<add fileExtension=".swf" allowed="true" />
|
|
||||||
<add fileExtension=".flv" allowed="true" />
|
|
||||||
<add fileExtension=".ram" allowed="true" />
|
|
||||||
<add fileExtension=".rm" allowed="true" />
|
|
||||||
<add fileExtension=".doc" allowed="true" />
|
|
||||||
<add fileExtension=".docx" allowed="true" />
|
|
||||||
<add fileExtension=".txt" allowed="true" />
|
|
||||||
<add fileExtension=".rtf" allowed="true" />
|
|
||||||
<add fileExtension=".xls" allowed="true" />
|
|
||||||
<add fileExtension=".xlsx" allowed="true" />
|
|
||||||
<add fileExtension=".pages" allowed="true" />
|
|
||||||
<add fileExtension=".ppt" allowed="true" />
|
|
||||||
<add fileExtension=".pptx" allowed="true" />
|
|
||||||
<add fileExtension=".pps" allowed="true" />
|
|
||||||
<add fileExtension=".csv" allowed="true" />
|
|
||||||
<add fileExtension=".cab" allowed="true" />
|
|
||||||
<add fileExtension=".arj" allowed="true" />
|
|
||||||
<add fileExtension=".tar" allowed="true" />
|
|
||||||
<add fileExtension=".zip" allowed="true" />
|
|
||||||
<add fileExtension=".zipx" allowed="true" />
|
|
||||||
<add fileExtension=".sit" allowed="true" />
|
|
||||||
<add fileExtension=".sitx" allowed="true" />
|
|
||||||
<add fileExtension=".gz" allowed="true" />
|
|
||||||
<add fileExtension=".tgz" allowed="true" />
|
|
||||||
<add fileExtension=".bz2" allowed="true" />
|
|
||||||
<add fileExtension=".ace" allowed="true" />
|
|
||||||
<add fileExtension=".arc" allowed="true" />
|
|
||||||
<add fileExtension=".pkg" allowed="true" />
|
|
||||||
<add fileExtension=".dmg" allowed="true" />
|
|
||||||
<add fileExtension=".hqx" allowed="true" />
|
|
||||||
<add fileExtension=".jar" allowed="true" />
|
|
||||||
<add fileExtension=".xml" allowed="true" />
|
|
||||||
<add fileExtension=".pdf" allowed="true" />
|
|
||||||
<add fileExtension=".gpx" allowed="true" />
|
|
||||||
<add fileExtension=".kml" allowed="true" />
|
|
||||||
</fileExtensions>
|
|
||||||
</requestFiltering>
|
|
||||||
</security>
|
|
||||||
</system.webServer>
|
|
||||||
</configuration>
|
|
Before Width: | Height: | Size: 1.4 KiB |
170
rewritetest.php
Normal file
@ -0,0 +1,170 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
createHtaccess();
|
||||||
|
|
||||||
|
$baseURL = dirname($_SERVER['SCRIPT_NAME']);
|
||||||
|
if($baseURL == "/") {
|
||||||
|
$baseURL = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
if(isset($_REQUEST['force'])) {
|
||||||
|
echo "Forced continue, attempting to redirect to <a href=\"home/successfullyinstalled?flush=1\">home/successfullyinstalled</a>.
|
||||||
|
<script>setTimeout(function() { window.location.href = 'home/successfullyinstalled?flush=1'; }, 1000);</script>";
|
||||||
|
} else {
|
||||||
|
$modRewriteWorking = performModRewriteTest();
|
||||||
|
|
||||||
|
if(!$modRewriteWorking) {
|
||||||
|
createHtaccessAlternative();
|
||||||
|
$modRewriteWorking = performModRewriteTest();
|
||||||
|
}
|
||||||
|
|
||||||
|
if($modRewriteWorking) {
|
||||||
|
echo "mod_rewrite is working! I will now try and direct you to
|
||||||
|
<a href=\"home/successfullyinstalled?flush=1\">home/successfullyinstalled</a> to confirm that the installation was successful.
|
||||||
|
<script>setTimeout(function() { window.location.href = 'home/successfullyinstalled?flush=1'; }, 1000);</script>
|
||||||
|
";
|
||||||
|
} else {
|
||||||
|
restoreHtaccess();
|
||||||
|
|
||||||
|
echo "mod_rewrite doesn't appear to be working. Make sure:" .
|
||||||
|
"<ul>" .
|
||||||
|
"<li>mod_rewrite is enabled in your httpd.conf</li>" .
|
||||||
|
"<li>AllowOverride is enabled for the current path.</li>" .
|
||||||
|
"</ul>" .
|
||||||
|
"Please check these options, then refresh this page." .
|
||||||
|
"If you believe that your configuration is correct, <a href=\"rewritetest.php?force=1\">click here to proceed anyway.</a>";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function performModRewriteTest() {
|
||||||
|
$baseURL = dirname($_SERVER['SCRIPT_NAME']);
|
||||||
|
if($baseURL == "/") {
|
||||||
|
$baseURL = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if mod_rewrite works properly
|
||||||
|
$location = 'http://' . (isset($_SERVER['PHP_AUTH_USER']) ? "$_SERVER[PHP_AUTH_USER]:$_SERVER[PHP_AUTH_PW]@" : '') . $_SERVER['HTTP_HOST'] . $baseURL . '/InstallerTest/testrewrite';
|
||||||
|
$testrewriting = file_get_contents($location);
|
||||||
|
|
||||||
|
if($testrewriting == 'OK') {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Workaround for 'URL file-access is disabled in the server configuration' using curl
|
||||||
|
if(function_exists('curl_init')) {
|
||||||
|
$ch = curl_init($location);
|
||||||
|
$fp = @fopen(dirname(tempnam('adfadsfdas','')) . '/rewritetest', "w");
|
||||||
|
|
||||||
|
if($fp) {
|
||||||
|
curl_setopt($ch, CURLOPT_FILE, $fp);
|
||||||
|
curl_setopt($ch, CURLOPT_HEADER, 0);
|
||||||
|
curl_exec($ch);
|
||||||
|
curl_close($ch);
|
||||||
|
fclose($fp);
|
||||||
|
$testrewriting = file_get_contents(dirname(tempnam('adfadsfdas','')) . '/rewritetest');
|
||||||
|
unlink(dirname(tempnam('adfadsfdas','')) . '/rewritetest');
|
||||||
|
if($testrewriting == 'OK') {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function createHtaccess() {
|
||||||
|
$start = "### SILVERSTRIPE START ###\n";
|
||||||
|
$end= "\n### SILVERSTRIPE END ###";
|
||||||
|
$base = dirname($_SERVER['SCRIPT_NAME']);
|
||||||
|
|
||||||
|
$rewrite = <<<TEXT
|
||||||
|
RewriteEngine On
|
||||||
|
RewriteBase $base
|
||||||
|
|
||||||
|
RewriteCond %{REQUEST_URI} !(\.gif$)|(\.jpg$)|(\.png$)|(\.css$)|(\.js$)
|
||||||
|
|
||||||
|
RewriteCond %{REQUEST_URI} ^(.*)$
|
||||||
|
RewriteCond %{REQUEST_FILENAME} !-f
|
||||||
|
RewriteRule .* sapphire/main.php?url=%1&%{QUERY_STRING} [L]
|
||||||
|
TEXT
|
||||||
|
;
|
||||||
|
|
||||||
|
if(file_exists('.htaccess')) {
|
||||||
|
$htaccess = file_get_contents('.htaccess');
|
||||||
|
|
||||||
|
if(strpos($htaccess, '### SILVERSTRIPE START ###') === false && strpos($htaccess, '### SILVERSTRIPE END ###') === false) {
|
||||||
|
$htaccess .= "\n### SILVERSTRIPE START ###\n### SILVERSTRIPE END ###\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
if(strpos($htaccess, '### SILVERSTRIPE START ###') !== false && strpos($htaccess, '### SILVERSTRIPE END ###') !== false) {
|
||||||
|
$start = substr($htaccess, 0, strpos($htaccess, '### SILVERSTRIPE START ###')) . "### SILVERSTRIPE START ###\n";
|
||||||
|
$end = "\n" . substr($htaccess, strpos($htaccess, '### SILVERSTRIPE END ###'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
createFile('.htaccess', $start . $rewrite . $end);
|
||||||
|
}
|
||||||
|
|
||||||
|
function createHtaccessAlternative() {
|
||||||
|
$start = "### SILVERSTRIPE START ###\n";
|
||||||
|
$end= "\n### SILVERSTRIPE END ###";
|
||||||
|
$base = dirname($_SERVER['SCRIPT_NAME']);
|
||||||
|
|
||||||
|
$rewrite = <<<TEXT
|
||||||
|
RewriteEngine On
|
||||||
|
RewriteBase $base
|
||||||
|
|
||||||
|
RewriteCond %{REQUEST_URI} !(\.gif$)|(\.jpg$)|(\.png$)|(\.css$)|(\.js$)
|
||||||
|
|
||||||
|
RewriteCond %{REQUEST_URI} ^(.*)$
|
||||||
|
RewriteCond %{REQUEST_FILENAME} !-f
|
||||||
|
RewriteRule .* $_SERVER[DOCUMENT_ROOT]/sapphire/main.php?url=%1&%{QUERY_STRING} [L]
|
||||||
|
TEXT
|
||||||
|
;
|
||||||
|
|
||||||
|
if(file_exists('.htaccess')) {
|
||||||
|
$htaccess = file_get_contents('.htaccess');
|
||||||
|
|
||||||
|
if(strpos($htaccess, '### SILVERSTRIPE START ###') === false && strpos($htaccess, '### SILVERSTRIPE END ###') === false) {
|
||||||
|
$htaccess .= "\n### SILVERSTRIPE START ###\n### SILVERSTRIPE END ###\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
if(strpos($htaccess, '### SILVERSTRIPE START ###') !== false && strpos($htaccess, '### SILVERSTRIPE END ###') !== false) {
|
||||||
|
$start = substr($htaccess, 0, strpos($htaccess, '### SILVERSTRIPE START ###')) . "### SILVERSTRIPE START ###\n";
|
||||||
|
$end = "\n" . substr($htaccess, strpos($htaccess, '### SILVERSTRIPE END ###'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
createFile('.htaccess', $start . $rewrite . $end);
|
||||||
|
}
|
||||||
|
|
||||||
|
function restoreHtaccess() {
|
||||||
|
$start = "### SILVERSTRIPE START ###\n";
|
||||||
|
$end= "\n### SILVERSTRIPE END ###";
|
||||||
|
|
||||||
|
if(file_exists('.htaccess')) {
|
||||||
|
$htaccess = file_get_contents('.htaccess');
|
||||||
|
|
||||||
|
if(strpos($htaccess, '### SILVERSTRIPE START ###') === false && strpos($htaccess, '### SILVERSTRIPE END ###') === false) {
|
||||||
|
$htaccess .= "\n### SILVERSTRIPE START ###\n### SILVERSTRIPE END ###\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
if(strpos($htaccess, '### SILVERSTRIPE START ###') !== false && strpos($htaccess, '### SILVERSTRIPE END ###') !== false) {
|
||||||
|
$start = substr($htaccess, 0, strpos($htaccess, '### SILVERSTRIPE START ###')) . "### SILVERSTRIPE START ###\n";
|
||||||
|
$end = "\n" . substr($htaccess, strpos($htaccess, '### SILVERSTRIPE END ###'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
createFile('.htaccess', $start . $end);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getBaseDir() {
|
||||||
|
return dirname($_SERVER['SCRIPT_FILENAME']) . '/';
|
||||||
|
}
|
||||||
|
|
||||||
|
function createFile($filename, $content) {
|
||||||
|
$base = getBaseDir();
|
||||||
|
if(($fh = fopen($base . $filename, 'w')) && fwrite($fh, $content) && fclose($fh))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
?>
|
14
themes/tutorial/css/editor.css
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* This support file is used to style the WYSIWYG editor in the CMS
|
||||||
|
*/
|
||||||
|
|
||||||
|
@import "typography.css";
|
||||||
|
|
||||||
|
body.mceContentBody {
|
||||||
|
min-height: 200px;
|
||||||
|
font-size: 62.5%;
|
||||||
|
}
|
||||||
|
body.mceContentBody a.broken {
|
||||||
|
background-color: #FF7B71;
|
||||||
|
border: 1px red solid;
|
||||||
|
}
|
64
themes/tutorial/css/form.css
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
/* GENERIC FORM STYLING */
|
||||||
|
#Content form {
|
||||||
|
width:378px;
|
||||||
|
}
|
||||||
|
#Content form fieldset {
|
||||||
|
border:0;
|
||||||
|
padding:12px;
|
||||||
|
}
|
||||||
|
#Content .message {
|
||||||
|
color:red;
|
||||||
|
background:#ddd;
|
||||||
|
border:1px solid #ccc;
|
||||||
|
padding:5px;
|
||||||
|
margin:5px;
|
||||||
|
}
|
||||||
|
#Content span.message {
|
||||||
|
width: 300px;
|
||||||
|
}
|
||||||
|
#Content form div {
|
||||||
|
margin-top:10px;
|
||||||
|
width:100%;
|
||||||
|
}
|
||||||
|
#Content form label {
|
||||||
|
font-size:1.1em;
|
||||||
|
color:#333;
|
||||||
|
}
|
||||||
|
#Content form label.left {
|
||||||
|
float:left;
|
||||||
|
width:12em;
|
||||||
|
}
|
||||||
|
#Content form label.FormHeading {
|
||||||
|
font-size:1.3em;
|
||||||
|
color:#ff7200;
|
||||||
|
font-weight:bold;
|
||||||
|
}
|
||||||
|
#Content form input.text,
|
||||||
|
#Content form textarea,
|
||||||
|
#Content form select {
|
||||||
|
width:200px;
|
||||||
|
color:#000;
|
||||||
|
background:#f8f8f8;
|
||||||
|
border:1px solid #aaa;
|
||||||
|
padding:3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#Content form input.numeric {
|
||||||
|
width:20px;
|
||||||
|
background:#f0f0f0;
|
||||||
|
border:1px solid #aaa;
|
||||||
|
padding:3px;
|
||||||
|
color:#000;
|
||||||
|
margin-right:4px;
|
||||||
|
}
|
||||||
|
#Content form input.year {
|
||||||
|
width:35px;
|
||||||
|
}
|
||||||
|
#Content form p.Actions {
|
||||||
|
text-align:right;
|
||||||
|
padding:0 22px 15px 0;
|
||||||
|
}
|
||||||
|
#Content form p.Actions input {
|
||||||
|
padding:2px;
|
||||||
|
}
|
||||||
|
|
287
themes/tutorial/css/layout.css
Normal file
@ -0,0 +1,287 @@
|
|||||||
|
/* Global Resetting */
|
||||||
|
html{
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background:url(../images/body_bg.gif) repeat;
|
||||||
|
}
|
||||||
|
body {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
font-size: 62.5%;
|
||||||
|
/* reset font-sizes to 1em == 10px */
|
||||||
|
}
|
||||||
|
* {
|
||||||
|
font-size: 1em;
|
||||||
|
/* reset font-sizes to 1em == 10px */
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
font-family:Verdana,Helvetica,sans-serif;
|
||||||
|
list-style:none;
|
||||||
|
}
|
||||||
|
a img{
|
||||||
|
border:0;
|
||||||
|
}
|
||||||
|
.clear{
|
||||||
|
clear:both;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Layout CSS */
|
||||||
|
#Main {
|
||||||
|
margin:20px auto;
|
||||||
|
width:900px;
|
||||||
|
}
|
||||||
|
#Header {
|
||||||
|
background:url(../images/blueback.gif) bottom left repeat-x;
|
||||||
|
border-left:1px solid #ccc;
|
||||||
|
border-right:1px solid #ccc;
|
||||||
|
clear:left;
|
||||||
|
}
|
||||||
|
#Header h1 {
|
||||||
|
color:#fff;
|
||||||
|
font-size:1.5em;
|
||||||
|
line-height:4.5em;
|
||||||
|
padding-left:20px;
|
||||||
|
}
|
||||||
|
#Menu1 {
|
||||||
|
padding:10px 50px 0;
|
||||||
|
}
|
||||||
|
#Menu1 li {
|
||||||
|
float:left;
|
||||||
|
margin-left:2px;
|
||||||
|
background:url(../images/menu1_right.gif) no-repeat right top;
|
||||||
|
}
|
||||||
|
#Menu1 li.current,
|
||||||
|
#Menu1 li.section {
|
||||||
|
background:url(../images/menu1_right_on.gif) no-repeat right top;
|
||||||
|
}
|
||||||
|
#Menu1 li a {
|
||||||
|
display:block;
|
||||||
|
color:#fff;
|
||||||
|
font-weight:bold;
|
||||||
|
font-size:1.1em;
|
||||||
|
text-decoration:none;
|
||||||
|
padding:5px 15px;
|
||||||
|
background:url(../images/menu1_left.gif) no-repeat left top;
|
||||||
|
}
|
||||||
|
#Menu1 li a:hover {
|
||||||
|
color:#d2ebff;
|
||||||
|
}
|
||||||
|
#Menu1 li.current a,
|
||||||
|
#Menu1 li.section a {
|
||||||
|
background:url(../images/menu1_left_on.gif) no-repeat left top;
|
||||||
|
color:#d2ebff;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ContentContainer {
|
||||||
|
background:#f5f5f5 url(../images/ss_watermark.gif) bottom left no-repeat;
|
||||||
|
padding-top:20px;
|
||||||
|
padding-bottom:20px;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
#Banner {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
#Menu2 {
|
||||||
|
margin-left: 20px;
|
||||||
|
width: 17em;
|
||||||
|
float:left;
|
||||||
|
background:#f0f0f0;
|
||||||
|
border:1px solid #ddd;
|
||||||
|
padding:10px 10px 10px 10px;
|
||||||
|
}
|
||||||
|
#Menu2 li {
|
||||||
|
padding-left:15px;
|
||||||
|
background:url(../images/menu2_arrow.gif) no-repeat left center;
|
||||||
|
}
|
||||||
|
#Menu2 a {
|
||||||
|
color:#333;
|
||||||
|
font-weight:bold;
|
||||||
|
font-size:1.1em;
|
||||||
|
line-height:1.6em;
|
||||||
|
text-decoration:none;
|
||||||
|
}
|
||||||
|
#Menu2 a:hover {
|
||||||
|
text-decoration:underline;
|
||||||
|
}
|
||||||
|
#Menu2 li.current a,
|
||||||
|
#Menu2 li.section a {
|
||||||
|
color:#0083C8;
|
||||||
|
}
|
||||||
|
|
||||||
|
#Content {
|
||||||
|
float: left;
|
||||||
|
margin: 0px 20px;
|
||||||
|
width:70%;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.breadcrumbs {
|
||||||
|
margin-bottom:10px;
|
||||||
|
font-size:1em;
|
||||||
|
color:#666;
|
||||||
|
}
|
||||||
|
div.breadcrumbs a {
|
||||||
|
text-decoration:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#Footer {
|
||||||
|
background:#015581;
|
||||||
|
clear:both;
|
||||||
|
text-align:right;
|
||||||
|
padding-right:20px;
|
||||||
|
border:1px solid #ccc;
|
||||||
|
border-top:0;
|
||||||
|
}
|
||||||
|
#Footer span {
|
||||||
|
color:#ccc;
|
||||||
|
font-size:1.1em;
|
||||||
|
line-height:2em;
|
||||||
|
font-weight:bold;
|
||||||
|
padding-left:20px;
|
||||||
|
background:url(../images/ss_logo.gif) no-repeat;
|
||||||
|
}
|
||||||
|
#Footer a {
|
||||||
|
color:#fff;
|
||||||
|
}
|
||||||
|
#Footer a:hover {
|
||||||
|
text-decoration:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* The rest of this file is for the second tutorial */
|
||||||
|
#NewsList,
|
||||||
|
#StaffList {
|
||||||
|
background:#f0f0f0;
|
||||||
|
border:1px dotted #ccc;
|
||||||
|
padding:10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#NewsList li,
|
||||||
|
#StaffList li {
|
||||||
|
margin: 0;
|
||||||
|
list-style-type: none;
|
||||||
|
}
|
||||||
|
#NewsList li.newsDateTitle span {
|
||||||
|
color:#666;
|
||||||
|
line-height:2em;
|
||||||
|
}
|
||||||
|
#NewsList li.newsDateTitle a {
|
||||||
|
font-size:1.3em;
|
||||||
|
font-weight:bold;
|
||||||
|
color:#0083C8;
|
||||||
|
text-decoration:none;
|
||||||
|
padding-left:20px;
|
||||||
|
background:url(../images/treeicons/news-file.gif) no-repeat left center;
|
||||||
|
}
|
||||||
|
#NewsList li.newsDateTitle a:hover {
|
||||||
|
border-bottom:1px dotted #0083C8;
|
||||||
|
}
|
||||||
|
|
||||||
|
#NewsList li.newsSummary {
|
||||||
|
margin-bottom:20px;
|
||||||
|
}
|
||||||
|
#NewsList li.newsSummary span {
|
||||||
|
font-size:1.1em;
|
||||||
|
line-height:1.5em;
|
||||||
|
color:#333;
|
||||||
|
}
|
||||||
|
#NewsList li.newsSummary a.readMoreLink {
|
||||||
|
color:#0083C8;
|
||||||
|
text-decoration:none;
|
||||||
|
}
|
||||||
|
#NewsList li.newsSummary a.readMoreLink:hover {
|
||||||
|
border-bottom:1px dotted #0083C8;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.newsDetails {
|
||||||
|
margin-bottom:10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.newsDetails p {
|
||||||
|
color:#666;
|
||||||
|
margin:0;
|
||||||
|
font-size:1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.pageComments {
|
||||||
|
background:#f0f0f0;
|
||||||
|
border:1px dotted #ccc;
|
||||||
|
padding:10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#StaffList .staffname {
|
||||||
|
clear: both;
|
||||||
|
padding-left: 60px;
|
||||||
|
height: 1.2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
#StaffList .staffphoto {
|
||||||
|
float: left;
|
||||||
|
margin-left: 3px;
|
||||||
|
margin-top: -1.2em;
|
||||||
|
}
|
||||||
|
#StaffList .staffphoto img {
|
||||||
|
border:1px solid #AAA;
|
||||||
|
}
|
||||||
|
|
||||||
|
#StaffList .staffdescription {
|
||||||
|
margin-left: 60px;
|
||||||
|
margin-bottom:30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#StaffPhoto {
|
||||||
|
float: left;
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#StaffPhoto img {
|
||||||
|
border:1px solid #AAA;
|
||||||
|
}
|
||||||
|
|
||||||
|
#PageComments {
|
||||||
|
list-style:none;
|
||||||
|
background:#e9e9e9;
|
||||||
|
border:1px solid #ccc;
|
||||||
|
border-bottom:0;
|
||||||
|
padding:0;
|
||||||
|
margin:0;
|
||||||
|
}
|
||||||
|
#PageComments li {
|
||||||
|
list-style:none;
|
||||||
|
padding:5px;
|
||||||
|
margin:0;
|
||||||
|
font-size:1em;
|
||||||
|
border-bottom:1px dotted #bbb;
|
||||||
|
}
|
||||||
|
#PageComments li p span {
|
||||||
|
font-style:italic;
|
||||||
|
}
|
||||||
|
#PageComments a.deletelink {
|
||||||
|
font-weight:bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#PageNumbers {
|
||||||
|
font-weight:bold;
|
||||||
|
color:#333;
|
||||||
|
font-size:1.1em;
|
||||||
|
text-align:center;
|
||||||
|
padding:5px;
|
||||||
|
border:1px solid #ddd;
|
||||||
|
background:#e9e9e9;
|
||||||
|
}
|
||||||
|
#PageNumbers * {
|
||||||
|
padding:0 5px;
|
||||||
|
line-height:1.5em;
|
||||||
|
}
|
||||||
|
#PageNumbers a {
|
||||||
|
color:#0083C8;
|
||||||
|
text-decoration:none;
|
||||||
|
}
|
||||||
|
#PageNumbers a:hover {
|
||||||
|
text-decoration:underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
113
themes/tutorial/css/typography.css
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
/**
|
||||||
|
* This typography file is included in the WYSIWYG editor
|
||||||
|
*/
|
||||||
|
.typography * {
|
||||||
|
font-family:Verdana,Arial,sans-serif;
|
||||||
|
font-size:1em;
|
||||||
|
}
|
||||||
|
.typography blockquote {
|
||||||
|
margin-left:20px;
|
||||||
|
}
|
||||||
|
.typography hr {
|
||||||
|
padding:5px;
|
||||||
|
}
|
||||||
|
.typography p,
|
||||||
|
.typography ul li,
|
||||||
|
.typography ol li,
|
||||||
|
.typography a {
|
||||||
|
color:#333;
|
||||||
|
line-height:1.5em;
|
||||||
|
font-size:1.1em;
|
||||||
|
}
|
||||||
|
.typography p {
|
||||||
|
margin-bottom:20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** CMS LIST STYLES **/
|
||||||
|
.typography ul,
|
||||||
|
.typography ol {
|
||||||
|
margin-left:10px;
|
||||||
|
margin-bottom:20px;
|
||||||
|
}
|
||||||
|
.typography ul li,
|
||||||
|
.typography ol li {
|
||||||
|
margin:4px 10px;
|
||||||
|
line-height:1.4em;
|
||||||
|
}
|
||||||
|
.typography ul li {
|
||||||
|
list-style-type:disc;
|
||||||
|
}
|
||||||
|
.typography ol li {
|
||||||
|
list-style-type:decimal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* HEADER STYLES */
|
||||||
|
|
||||||
|
.typography h1,
|
||||||
|
.typography h2,
|
||||||
|
.typography h3,
|
||||||
|
.typography h4 {
|
||||||
|
margin-bottom:14px;
|
||||||
|
color:#0083C8;
|
||||||
|
}
|
||||||
|
.typography h1,
|
||||||
|
.typography h4 {
|
||||||
|
font-weight:bold;
|
||||||
|
}
|
||||||
|
.typography h2,
|
||||||
|
.typography h3 {
|
||||||
|
font-weight:normal;
|
||||||
|
}
|
||||||
|
.typography h1 {
|
||||||
|
font-size:2.2em;
|
||||||
|
}
|
||||||
|
.typography h2 {
|
||||||
|
font-size:2.2em;
|
||||||
|
}
|
||||||
|
.typography h3 {
|
||||||
|
font-size:1.6em;
|
||||||
|
}
|
||||||
|
.typography h4 {
|
||||||
|
font-size:1.4em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* LINK STYLES */
|
||||||
|
.typography a {
|
||||||
|
color:#0083C8;
|
||||||
|
font-size:1em;
|
||||||
|
text-decoration:none;
|
||||||
|
}
|
||||||
|
.typography a:hover {
|
||||||
|
text-decoration:underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.typography table {
|
||||||
|
font-size:1.1em;
|
||||||
|
}
|
||||||
|
.typography table tr td {
|
||||||
|
padding:3px 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* WYSIWYG EDITOR ALIGNMENT CLASSES */
|
||||||
|
.typography .left {
|
||||||
|
text-align:left;
|
||||||
|
}
|
||||||
|
.typography .center {
|
||||||
|
text-align:center;
|
||||||
|
}
|
||||||
|
.typography .right {
|
||||||
|
text-align:right;
|
||||||
|
}
|
||||||
|
.typography img.right {
|
||||||
|
float:right;
|
||||||
|
}
|
||||||
|
.typography img.left {
|
||||||
|
float:left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.typography p.MsoNormal, .typography p.MsoBodyText {
|
||||||
|
margin: 0;
|
||||||
|
}
|
BIN
themes/tutorial/images/blueback.gif
Normal file
After Width: | Height: | Size: 285 B |
BIN
themes/tutorial/images/body_bg.gif
Normal file
After Width: | Height: | Size: 51 B |
BIN
themes/tutorial/images/menu1_left.gif
Normal file
After Width: | Height: | Size: 312 B |
BIN
themes/tutorial/images/menu1_left_on.gif
Normal file
After Width: | Height: | Size: 446 B |
BIN
themes/tutorial/images/menu1_right.gif
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
themes/tutorial/images/menu1_right_on.gif
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
themes/tutorial/images/menu2_arrow.gif
Normal file
After Width: | Height: | Size: 117 B |
BIN
themes/tutorial/images/ss_logo.gif
Normal file
After Width: | Height: | Size: 556 B |
BIN
themes/tutorial/images/ss_watermark.gif
Normal file
After Width: | Height: | Size: 4.1 KiB |
BIN
themes/tutorial/images/treeicons/home-file.gif
Normal file
After Width: | Height: | Size: 173 B |
BIN
themes/tutorial/images/treeicons/news-file.gif
Normal file
After Width: | Height: | Size: 176 B |
BIN
themes/tutorial/images/welcome.png
Normal file
After Width: | Height: | Size: 19 KiB |
27
themes/tutorial/templates/Page.ss
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
|
||||||
|
<head>
|
||||||
|
<% base_tag %>
|
||||||
|
<link rel="stylesheet" type="text/css" href="tutorial/css/layout.css" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="tutorial/css/typography.css" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="tutorial/css/form.css" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="Main">
|
||||||
|
<div id="Header">
|
||||||
|
<h1> </h1>
|
||||||
|
</div>
|
||||||
|
<div id="ContentContainer">
|
||||||
|
<div id="Content" class="typography">
|
||||||
|
$Content
|
||||||
|
$Form
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="Footer">
|
||||||
|
<span>Visit <a href="http://www.silverstripe.com" title="Visit www.silverstripe.com">www.silverstripe.com</a> to download the CMS</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
$SilverStripeNavigator
|
||||||
|
</body>
|
||||||
|
</html>
|
23
web.config
@ -1,23 +0,0 @@
|
|||||||
<!-- Routing configuration for Microsoft IIS web server -->
|
|
||||||
<configuration>
|
|
||||||
<system.webServer>
|
|
||||||
<rewrite>
|
|
||||||
<rules>
|
|
||||||
<rule name="SilverStripe Global URLs">
|
|
||||||
<match url="^(.*)$" />
|
|
||||||
<conditions>
|
|
||||||
<add input="{R:1}" matchType="Pattern" pattern="public(/|$)" negate="true" />
|
|
||||||
</conditions>
|
|
||||||
<action type="Rewrite" url="public/{R:1}" appendQueryString="true" />
|
|
||||||
</rule>
|
|
||||||
<rule name="SilverStripe Preprocessed URLs" stopProcessing="true">
|
|
||||||
<match url="^(.*)$" />
|
|
||||||
<conditions>
|
|
||||||
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
|
|
||||||
</conditions>
|
|
||||||
<action type="Rewrite" url="public/index.php" appendQueryString="true" />
|
|
||||||
</rule>
|
|
||||||
</rules>
|
|
||||||
</rewrite>
|
|
||||||
</system.webServer>
|
|
||||||
</configuration>
|
|