MINOR: Fixed newlines and set svn:eol-style to native

git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/trunk@79478 467b73ca-7a2a-4603-9d3b-597d59a354a9
This commit is contained in:
Sam Minnee 2009-06-17 23:14:40 +00:00
parent 6bd759b4ca
commit 610232f19c
5 changed files with 753 additions and 753 deletions

View File

@ -1,231 +1,231 @@
<?php
/**
* Base class for URL access to development tools. Currently supports the
* ; and TaskRunner.
*
* @todo documentation for how to add new unit tests and tasks
* @package sapphire
* @subpackage dev
*/
class DevelopmentAdmin extends Controller {
static $url_handlers = array(
'' => 'index',
'$Action' => '$Action',
'$Action//$Action/$ID' => 'handleAction',
);
function init() {
parent::init();
// We allow access to this controller regardless of live-status or ADMIN permission only
// if on CLI. Access to this controller is always allowed in "dev-mode", or of the user is ADMIN.
$canAccess = (
Director::isDev()
|| Director::is_cli()
|| Permission::check("ADMIN")
);
if(!$canAccess) {
return Security::permissionFailure($this,
"This page is secured and you need administrator rights to access it. " .
"Enter your credentials below and we will send you right along.");
}
// check for valid url mapping
// lacking this information can cause really nasty bugs,
// e.g. when running Director::test() from a FunctionalTest instance
global $_FILE_TO_URL_MAPPING;
if(Director::is_cli()) {
if(isset($_FILE_TO_URL_MAPPING)) {
$fullPath = $testPath = $_SERVER['SCRIPT_FILENAME'];
while($testPath && $testPath != "/") {
$matched = false;
if(isset($_FILE_TO_URL_MAPPING[$testPath])) {
$matched = true;
break;
}
$testPath = dirname($testPath);
}
if(!$matched) {
echo 'Warning: You probably want to define '.
'an entry in $_FILE_TO_URL_MAPPING that covers "' . Director::baseFolder() . '"' . "\n";
}
}
else {
echo 'Warning: You probably want to define $_FILE_TO_URL_MAPPING in '.
'your _ss_environment.php as instructed on the "sake" page of the doc.silverstripe.com wiki' . "\n";
}
}
}
function index() {
$actions = array(
"build" => "Build/rebuild this environment (formerly db/build). Call this whenever you have updated your project sources",
"reset" => "Reset this environment - truncate the database and rebuild. This is useful after testing to start with a fresh working copy",
"tests" => "See a list of unit tests to run",
"tests/all" => "Run all tests",
"jstests" => "See a list of JavaScript tests to run",
"jstests/all" => "Run all JavaScript tests",
"modules/add" => "Add a module, for example, 'sake dev/modules/add ecommerce'",
"tasks" => "See a list of build tasks to run",
"viewcode" => "Read source code in a literate programming style",
);
// Web mode
if(!Director::is_cli()) {
// This action is sake-only right now.
unset($actions["modules/add"]);
$renderer = new DebugView();
$renderer->writeHeader();
$renderer->writeInfo("Sapphire Development Tools", Director::absoluteBaseURL());
$base = Director::baseURL();
echo '<div class="options"><ul>';
foreach($actions as $action => $description) {
echo "<li><a href=\"{$base}dev/$action\"><b>/dev/$action:</b> $description</a></li>\n";
}
$renderer->writeFooter();
// CLI mode
} else {
echo "SAPPHIRE DEVELOPMENT TOOLS\n--------------------------\n\n";
echo "You can execute any of the following commands:\n\n";
foreach($actions as $action => $description) {
echo " sake dev/$action: $description\n";
}
echo "\n\n";
}
}
function tests($request) {
return new TestRunner();
}
function jstests($request) {
return new JSTestRunner();
}
function tasks() {
return new TaskRunner();
}
function modules() {
return new ModuleManager();
}
function viewmodel() {
return new ModelViewer();
}
function build() {
if(Director::is_cli()) {
$da = new DatabaseAdmin();
$da->build();
} else {
$renderer = new DebugView();
$renderer->writeHeader();
$renderer->writeInfo("Environment Builder (formerly db/build)", Director::absoluteBaseURL());
echo "<div style=\"margin: 0 2em\">";
$da = new DatabaseAdmin();
$da->build();
echo "</div>";
$renderer->writeFooter();
}
}
function reset() {
global $databaseConfig;
$databaseName = $databaseConfig['database'];
if(Director::is_cli()) {
echo "\nPlease run dev/reset from your web browser.\n";
} else {
$renderer = new DebugView();
$renderer->writeHeader();
$renderer->writeInfo('Database reset', 'Completely truncate and rebuild the current database');
echo '<div style="margin: 0 2em">';
if(isset($_GET['done'])) {
echo "<p style=\"color: green\"><b>$databaseName</b> has been completely truncated and rebuilt.</p>";
echo "<p>Note: If you had <i>SS_DEFAULT_ADMIN_USERNAME</i> and <i>SS_DEFAULT_ADMIN_PASSWORD</i>
defined in your <b>_ss_environment.php</b> file, a default admin Member record has been created
with those credentials.</p>";
} else {
echo $this->ResetForm()->renderWith('Form');
}
echo '</div>';
$renderer->writeFooter();
}
}
function ResetForm() {
global $databaseConfig;
$databaseName = $databaseConfig['database'];
if(!Session::get('devResetRandNumber')) {
$rand = rand(5,500);
Session::set('devResetRandNumber', $rand);
} else {
$rand = Session::get('devResetRandNumber');
}
$form = new Form(
$this,
'ResetForm',
new FieldSet(
new LiteralField('ResetWarning', "<p style=\"color: red\">WARNING: This will completely
destroy ALL existing data in <b>$databaseName</b>! &nbsp; Press the button below to
confirm this action.</p>"),
new HiddenField('devResetRandNumber', '', $rand)
),
new FieldSet(
new FormAction('doReset', 'Reset and completely rebuild the database')
)
);
$form->setFormAction(Director::absoluteBaseURL() . 'dev/ResetForm');
return $form;
}
function doReset($data, $form, $request) {
if(!isset($data['devResetRandNumber'])) {
Director::redirectBack();
return false;
}
// Avoid accidental database resets by checking the posted number to the one in session
if(Session::get('devResetRandNumber') != $data['devResetRandNumber']) {
Director::redirectBack();
return false;
}
$da = new DatabaseAdmin();
$da->clearAllData();
// If _ss_environment.php has some constants set for default admin, set these up in the request
$_REQUEST['username'] = defined('SS_DEFAULT_ADMIN_USERNAME') ? SS_DEFAULT_ADMIN_USERNAME : null;
$_REQUEST['password'] = defined('SS_DEFAULT_ADMIN_PASSWORD') ? SS_DEFAULT_ADMIN_PASSWORD : null;
$da->build();
Session::clear('devResetRandNumber');
Director::redirect(Director::absoluteBaseURL() . 'dev/reset?done=1');
}
function errors() {
Director::redirect("Debug_");
}
function viewcode($request) {
return new CodeViewer();
}
}
<?php
/**
* Base class for URL access to development tools. Currently supports the
* ; and TaskRunner.
*
* @todo documentation for how to add new unit tests and tasks
* @package sapphire
* @subpackage dev
*/
class DevelopmentAdmin extends Controller {
static $url_handlers = array(
'' => 'index',
'$Action' => '$Action',
'$Action//$Action/$ID' => 'handleAction',
);
function init() {
parent::init();
// We allow access to this controller regardless of live-status or ADMIN permission only
// if on CLI. Access to this controller is always allowed in "dev-mode", or of the user is ADMIN.
$canAccess = (
Director::isDev()
|| Director::is_cli()
|| Permission::check("ADMIN")
);
if(!$canAccess) {
return Security::permissionFailure($this,
"This page is secured and you need administrator rights to access it. " .
"Enter your credentials below and we will send you right along.");
}
// check for valid url mapping
// lacking this information can cause really nasty bugs,
// e.g. when running Director::test() from a FunctionalTest instance
global $_FILE_TO_URL_MAPPING;
if(Director::is_cli()) {
if(isset($_FILE_TO_URL_MAPPING)) {
$fullPath = $testPath = $_SERVER['SCRIPT_FILENAME'];
while($testPath && $testPath != "/") {
$matched = false;
if(isset($_FILE_TO_URL_MAPPING[$testPath])) {
$matched = true;
break;
}
$testPath = dirname($testPath);
}
if(!$matched) {
echo 'Warning: You probably want to define '.
'an entry in $_FILE_TO_URL_MAPPING that covers "' . Director::baseFolder() . '"' . "\n";
}
}
else {
echo 'Warning: You probably want to define $_FILE_TO_URL_MAPPING in '.
'your _ss_environment.php as instructed on the "sake" page of the doc.silverstripe.com wiki' . "\n";
}
}
}
function index() {
$actions = array(
"build" => "Build/rebuild this environment (formerly db/build). Call this whenever you have updated your project sources",
"reset" => "Reset this environment - truncate the database and rebuild. This is useful after testing to start with a fresh working copy",
"tests" => "See a list of unit tests to run",
"tests/all" => "Run all tests",
"jstests" => "See a list of JavaScript tests to run",
"jstests/all" => "Run all JavaScript tests",
"modules/add" => "Add a module, for example, 'sake dev/modules/add ecommerce'",
"tasks" => "See a list of build tasks to run",
"viewcode" => "Read source code in a literate programming style",
);
// Web mode
if(!Director::is_cli()) {
// This action is sake-only right now.
unset($actions["modules/add"]);
$renderer = new DebugView();
$renderer->writeHeader();
$renderer->writeInfo("Sapphire Development Tools", Director::absoluteBaseURL());
$base = Director::baseURL();
echo '<div class="options"><ul>';
foreach($actions as $action => $description) {
echo "<li><a href=\"{$base}dev/$action\"><b>/dev/$action:</b> $description</a></li>\n";
}
$renderer->writeFooter();
// CLI mode
} else {
echo "SAPPHIRE DEVELOPMENT TOOLS\n--------------------------\n\n";
echo "You can execute any of the following commands:\n\n";
foreach($actions as $action => $description) {
echo " sake dev/$action: $description\n";
}
echo "\n\n";
}
}
function tests($request) {
return new TestRunner();
}
function jstests($request) {
return new JSTestRunner();
}
function tasks() {
return new TaskRunner();
}
function modules() {
return new ModuleManager();
}
function viewmodel() {
return new ModelViewer();
}
function build() {
if(Director::is_cli()) {
$da = new DatabaseAdmin();
$da->build();
} else {
$renderer = new DebugView();
$renderer->writeHeader();
$renderer->writeInfo("Environment Builder (formerly db/build)", Director::absoluteBaseURL());
echo "<div style=\"margin: 0 2em\">";
$da = new DatabaseAdmin();
$da->build();
echo "</div>";
$renderer->writeFooter();
}
}
function reset() {
global $databaseConfig;
$databaseName = $databaseConfig['database'];
if(Director::is_cli()) {
echo "\nPlease run dev/reset from your web browser.\n";
} else {
$renderer = new DebugView();
$renderer->writeHeader();
$renderer->writeInfo('Database reset', 'Completely truncate and rebuild the current database');
echo '<div style="margin: 0 2em">';
if(isset($_GET['done'])) {
echo "<p style=\"color: green\"><b>$databaseName</b> has been completely truncated and rebuilt.</p>";
echo "<p>Note: If you had <i>SS_DEFAULT_ADMIN_USERNAME</i> and <i>SS_DEFAULT_ADMIN_PASSWORD</i>
defined in your <b>_ss_environment.php</b> file, a default admin Member record has been created
with those credentials.</p>";
} else {
echo $this->ResetForm()->renderWith('Form');
}
echo '</div>';
$renderer->writeFooter();
}
}
function ResetForm() {
global $databaseConfig;
$databaseName = $databaseConfig['database'];
if(!Session::get('devResetRandNumber')) {
$rand = rand(5,500);
Session::set('devResetRandNumber', $rand);
} else {
$rand = Session::get('devResetRandNumber');
}
$form = new Form(
$this,
'ResetForm',
new FieldSet(
new LiteralField('ResetWarning', "<p style=\"color: red\">WARNING: This will completely
destroy ALL existing data in <b>$databaseName</b>! &nbsp; Press the button below to
confirm this action.</p>"),
new HiddenField('devResetRandNumber', '', $rand)
),
new FieldSet(
new FormAction('doReset', 'Reset and completely rebuild the database')
)
);
$form->setFormAction(Director::absoluteBaseURL() . 'dev/ResetForm');
return $form;
}
function doReset($data, $form, $request) {
if(!isset($data['devResetRandNumber'])) {
Director::redirectBack();
return false;
}
// Avoid accidental database resets by checking the posted number to the one in session
if(Session::get('devResetRandNumber') != $data['devResetRandNumber']) {
Director::redirectBack();
return false;
}
$da = new DatabaseAdmin();
$da->clearAllData();
// If _ss_environment.php has some constants set for default admin, set these up in the request
$_REQUEST['username'] = defined('SS_DEFAULT_ADMIN_USERNAME') ? SS_DEFAULT_ADMIN_USERNAME : null;
$_REQUEST['password'] = defined('SS_DEFAULT_ADMIN_PASSWORD') ? SS_DEFAULT_ADMIN_PASSWORD : null;
$da->build();
Session::clear('devResetRandNumber');
Director::redirect(Director::absoluteBaseURL() . 'dev/reset?done=1');
}
function errors() {
Director::redirect("Debug_");
}
function viewcode($request) {
return new CodeViewer();
}
}
?>

View File

@ -1,173 +1,173 @@
<!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>
<title>SilverStripe CMS Installation</title>
<script type="text/js">
function show(id) {
document.getElementById(id).style.display = '';
}
function hide(id) {
document.getElementById(id).style.display = 'none';
}
</script>
<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" />
<link rel="shortcut icon" href="favicon.ico" />
</head>
<body>
<div id="BgContainer">
<div id="Container">
<div id="Header">
<h1>SilverStripe CMS Installation</h1>
<p>Version <?php echo $silverstripe_version; ?></p>
</div>
<div id="Navigation">&nbsp;</div>
<div class="clear"><!-- --></div>
<div id="Layout">
<div class="typography">
<h1>Welcome to SilverStripe</h1>
<p>Thanks for choosing to use SilverStripe! Please follow the instructions below to get SilverStripe installed.</p>
<form action="install.php" method="post">
<?php if(isset($hasErrorOtherThanDatabase)) { ?>
<p class="error">
You aren't currently able to install the software. Please <a href="#requirements">see below</a> for details.<br />
If you are having problems meeting the requirements, see the <a href="http://doc.silverstripe.com/doku.php?id=server-requirements">server requirements wiki page</a>.
</p>
<?php } else { ?>
<?php if($req->hasWarnings()) { ?>
<p class="warning">
There are some issues that we recommend you look at before installing, however, you are still able to install the software.
Please see below for details.<br />
If you are having problems meeting the requirements, see the <a href="http://doc.silverstripe.com/doku.php?id=server-requirements">server requirements wiki page</a>.
</p>
<?php } else if(!$dbReq->hasErrors()) { ?>
<p class="good">
You're ready to install! &nbsp;&nbsp;
</p>
<?php } ?>
<p>
<b>Template to install:</b>
</p>
<ul id="Themes">
<li><input type="radio" name="template" value="blackcandy" id="BlackCandy" <?php if(!isset($_POST['template']) || $_POST['template'] == 'blackcandy') {?>checked="checked"<?php }?> /><label for="BlackCandy">BlackCandy, default template ready to use.</label></li>
<li><input type="radio" name="template" value="tutorial" id="EmptyTemplate" <?php if(isset($_POST['template']) && $_POST['template'] == 'tutorial') {?>checked="checked"<?php }?>/><label for="EmptyTemplate">Empty template, ready to begin the tutorial.</label></li>
</ul>
<p>You can change the template or download another from the SilverStripe website after installation.</p>
<input type="checkbox" id="stats" name="stats" checked="checked"><label for="stats">Send information on my webserver to SilverStripe (this is only version information, used for statistical purposes)</label><br />
<?php if($alreadyInstalled) { ?>
<p class="warning">
<strong>Note:</strong> It seems as though SilverStripe is already installed here. If you ask me to install, I will overwrite
the <strong>.htaccess</strong> and <strong>mysite/_config.php</strong> files.
<br />
<input type="checkbox" id="ReIn" name="force_reinstall" onclick="document.getElementById('install_button').disabled = !this.checked" /><label for="ReIn">That's okay, please re-install SilverStripe and overwrite these files.</label>
</p>
<?php } ?>
<p>
<?php if($alreadyInstalled) { ?>
<input id="install_button" type="submit" disabled="disabled" class="action" name="go" value="Install SilverStripe" onclick="document.getElementById('saving_top').style.display = ''; this.value = 'Installing SilverStripe...'" />
<?php } else { ?>
<input id="install_button" type="submit" class="action" name="go" value="Install SilverStripe" onclick="document.getElementById('saving_top').style.display = ''; this.value = 'Installing SilverStripe...'" />
<?php } ?>
<span id="saving_top" style="display: none">
&nbsp;
<img src="cms/images/network-save.gif" />
(this will take a minute or so)
</span>
</p>
<?php } ?>
<input type="hidden" name="database" value="MySQLDatabase" />
<h4>MySQL Database</h4>
<?php if($dbReq->hasErrors()) { ?>
<p class="error"><!-- class="error" -->
These database details don't appear to be correct. Please enter the correct details before installing.
</p>
<?php } else { ?>
<p class="good">
These database details look all good!
</p>
<?php } ?>
<p id="mysql_credentials">
<label for="mysql_server">MySQL server:</label>
<span class="middleColumn"><input id="mysql_server" class="text" type="text" name="mysql[server]" value="<?php echo $databaseConfig['server']; ?>" /></span>
<label for="mysql_username">MySQL username:</label>
<span class="middleColumn"><input id="mysql_username" class="text" type="text" name="mysql[username]" value="<?php echo $databaseConfig['username']; ?>" /></span>
<label for="mysql_password">MySQL password:</label>
<span class="middleColumn"><input id="mysql_password" class="text" type="password" name="mysql[password]" value="<?php echo $databaseConfig['password']; ?>" /></span>
<label for="mysql_database">MySQL database:</label>
<span class="middleColumn"><input id="mysql_database" class="text" type="text" name="mysql[database]" value="<?php echo $databaseConfig['database']; ?>" onchange="this.value = this.value.replace(/[\/\\:*?&quot;<>|. \t]+/g,'');" /></span>
<input type="submit" class="action" value="Re-check requirements" />
</p>
<p class="mysql">SilverStripe stores its content in a MySQL database. Please provide the username and password to connect to the server here. If this account has permission to create databases, then we will create the database for you; otherwise, you must give the name of a database that already exists.</p>
<div class="clear"><!-- --></div>
<h5>Details</h5>
<?php $dbReq->showTable("MySQL Configuration"); ?>
<br />
<h4>SilverStripe Administration Account</h4>
<p id="AdminAccount">
<label for="admin_username">Administrator email:</label>
<span class="middleColumn"><input type="text" class="text" name="admin[username]" id="admin_username" value="<?php echo $adminConfig['username']; ?>" /></span>
<label for="admin_password">Administrator password:</label>
<span class="middleColumn"><input type="text" class="text" name="admin[password]" id="admin_password" value="<?php echo $adminConfig['password']; ?>" /></span>
<label for="admin_firstname">Administrator first name:</label>
<span class="middleColumn"><input type="text" class="text" name="admin[firstname]" id="admin_firstname" value="<?php echo $adminConfig['firstname']; ?>" /></span>
<label for="admin_surname">Administrator surname:</label>
<span class="middleColumn"><input type="text" class="text" name="admin[surname]" id="admin_surname" value="<?php echo $adminConfig['surname']; ?>" /></span>
</p>
<p class="adminAcc">
We will set up 1 administrator account for you automatically. Enter the email address and password. If you'd
rather log-in with a username instead of an email address, enter that instead.
</p>
<br />
<h4>Development Servers</h4>
<p id="DevSites">
<label for="devsites">Development servers:</label>
<span class="middleColumn"><textarea name="devsites" id="devsites" rows="5" />localhost
127.0.0.1</textarea></span>
</p>
<p class="devHelp">
SilverStripe allows you to run a site in <a href="http://doc.silverstripe.com/doku.php?id=devmode">development mode</a>.
This shows all error messages in the web browser instead of emailing them to the administrator, and allows
the database to be built without logging in as administrator. Please enter the host/domain names for servers
you will be using for development.
</p>
<br />
<h4 id="requirements">Requirements</h4>
<?php
$req->showTable();
?>
</form>
</div>
</div>
<div class="clear"><!-- --></div>
</div>
<div id="Footer">
<div class="footerTop"><!-- --></div>
<p><a href="http://www.silverstripe.com">SilverStripe Open Source CMS</a> | Copyright &copy; 2008 SilverStripe Limited</p>
</div>
</div>
</body>
</html>
<!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>
<title>SilverStripe CMS Installation</title>
<script type="text/js">
function show(id) {
document.getElementById(id).style.display = '';
}
function hide(id) {
document.getElementById(id).style.display = 'none';
}
</script>
<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" />
<link rel="shortcut icon" href="favicon.ico" />
</head>
<body>
<div id="BgContainer">
<div id="Container">
<div id="Header">
<h1>SilverStripe CMS Installation</h1>
<p>Version <?php echo $silverstripe_version; ?></p>
</div>
<div id="Navigation">&nbsp;</div>
<div class="clear"><!-- --></div>
<div id="Layout">
<div class="typography">
<h1>Welcome to SilverStripe</h1>
<p>Thanks for choosing to use SilverStripe! Please follow the instructions below to get SilverStripe installed.</p>
<form action="install.php" method="post">
<?php if(isset($hasErrorOtherThanDatabase)) { ?>
<p class="error">
You aren't currently able to install the software. Please <a href="#requirements">see below</a> for details.<br />
If you are having problems meeting the requirements, see the <a href="http://doc.silverstripe.com/doku.php?id=server-requirements">server requirements wiki page</a>.
</p>
<?php } else { ?>
<?php if($req->hasWarnings()) { ?>
<p class="warning">
There are some issues that we recommend you look at before installing, however, you are still able to install the software.
Please see below for details.<br />
If you are having problems meeting the requirements, see the <a href="http://doc.silverstripe.com/doku.php?id=server-requirements">server requirements wiki page</a>.
</p>
<?php } else if(!$dbReq->hasErrors()) { ?>
<p class="good">
You're ready to install! &nbsp;&nbsp;
</p>
<?php } ?>
<p>
<b>Template to install:</b>
</p>
<ul id="Themes">
<li><input type="radio" name="template" value="blackcandy" id="BlackCandy" <?php if(!isset($_POST['template']) || $_POST['template'] == 'blackcandy') {?>checked="checked"<?php }?> /><label for="BlackCandy">BlackCandy, default template ready to use.</label></li>
<li><input type="radio" name="template" value="tutorial" id="EmptyTemplate" <?php if(isset($_POST['template']) && $_POST['template'] == 'tutorial') {?>checked="checked"<?php }?>/><label for="EmptyTemplate">Empty template, ready to begin the tutorial.</label></li>
</ul>
<p>You can change the template or download another from the SilverStripe website after installation.</p>
<input type="checkbox" id="stats" name="stats" checked="checked"><label for="stats">Send information on my webserver to SilverStripe (this is only version information, used for statistical purposes)</label><br />
<?php if($alreadyInstalled) { ?>
<p class="warning">
<strong>Note:</strong> It seems as though SilverStripe is already installed here. If you ask me to install, I will overwrite
the <strong>.htaccess</strong> and <strong>mysite/_config.php</strong> files.
<br />
<input type="checkbox" id="ReIn" name="force_reinstall" onclick="document.getElementById('install_button').disabled = !this.checked" /><label for="ReIn">That's okay, please re-install SilverStripe and overwrite these files.</label>
</p>
<?php } ?>
<p>
<?php if($alreadyInstalled) { ?>
<input id="install_button" type="submit" disabled="disabled" class="action" name="go" value="Install SilverStripe" onclick="document.getElementById('saving_top').style.display = ''; this.value = 'Installing SilverStripe...'" />
<?php } else { ?>
<input id="install_button" type="submit" class="action" name="go" value="Install SilverStripe" onclick="document.getElementById('saving_top').style.display = ''; this.value = 'Installing SilverStripe...'" />
<?php } ?>
<span id="saving_top" style="display: none">
&nbsp;
<img src="cms/images/network-save.gif" />
(this will take a minute or so)
</span>
</p>
<?php } ?>
<input type="hidden" name="database" value="MySQLDatabase" />
<h4>MySQL Database</h4>
<?php if($dbReq->hasErrors()) { ?>
<p class="error"><!-- class="error" -->
These database details don't appear to be correct. Please enter the correct details before installing.
</p>
<?php } else { ?>
<p class="good">
These database details look all good!
</p>
<?php } ?>
<p id="mysql_credentials">
<label for="mysql_server">MySQL server:</label>
<span class="middleColumn"><input id="mysql_server" class="text" type="text" name="mysql[server]" value="<?php echo $databaseConfig['server']; ?>" /></span>
<label for="mysql_username">MySQL username:</label>
<span class="middleColumn"><input id="mysql_username" class="text" type="text" name="mysql[username]" value="<?php echo $databaseConfig['username']; ?>" /></span>
<label for="mysql_password">MySQL password:</label>
<span class="middleColumn"><input id="mysql_password" class="text" type="password" name="mysql[password]" value="<?php echo $databaseConfig['password']; ?>" /></span>
<label for="mysql_database">MySQL database:</label>
<span class="middleColumn"><input id="mysql_database" class="text" type="text" name="mysql[database]" value="<?php echo $databaseConfig['database']; ?>" onchange="this.value = this.value.replace(/[\/\\:*?&quot;<>|. \t]+/g,'');" /></span>
<input type="submit" class="action" value="Re-check requirements" />
</p>
<p class="mysql">SilverStripe stores its content in a MySQL database. Please provide the username and password to connect to the server here. If this account has permission to create databases, then we will create the database for you; otherwise, you must give the name of a database that already exists.</p>
<div class="clear"><!-- --></div>
<h5>Details</h5>
<?php $dbReq->showTable("MySQL Configuration"); ?>
<br />
<h4>SilverStripe Administration Account</h4>
<p id="AdminAccount">
<label for="admin_username">Administrator email:</label>
<span class="middleColumn"><input type="text" class="text" name="admin[username]" id="admin_username" value="<?php echo $adminConfig['username']; ?>" /></span>
<label for="admin_password">Administrator password:</label>
<span class="middleColumn"><input type="text" class="text" name="admin[password]" id="admin_password" value="<?php echo $adminConfig['password']; ?>" /></span>
<label for="admin_firstname">Administrator first name:</label>
<span class="middleColumn"><input type="text" class="text" name="admin[firstname]" id="admin_firstname" value="<?php echo $adminConfig['firstname']; ?>" /></span>
<label for="admin_surname">Administrator surname:</label>
<span class="middleColumn"><input type="text" class="text" name="admin[surname]" id="admin_surname" value="<?php echo $adminConfig['surname']; ?>" /></span>
</p>
<p class="adminAcc">
We will set up 1 administrator account for you automatically. Enter the email address and password. If you'd
rather log-in with a username instead of an email address, enter that instead.
</p>
<br />
<h4>Development Servers</h4>
<p id="DevSites">
<label for="devsites">Development servers:</label>
<span class="middleColumn"><textarea name="devsites" id="devsites" rows="5" />localhost
127.0.0.1</textarea></span>
</p>
<p class="devHelp">
SilverStripe allows you to run a site in <a href="http://doc.silverstripe.com/doku.php?id=devmode">development mode</a>.
This shows all error messages in the web browser instead of emailing them to the administrator, and allows
the database to be built without logging in as administrator. Please enter the host/domain names for servers
you will be using for development.
</p>
<br />
<h4 id="requirements">Requirements</h4>
<?php
$req->showTable();
?>
</form>
</div>
</div>
<div class="clear"><!-- --></div>
</div>
<div id="Footer">
<div class="footerTop"><!-- --></div>
<p><a href="http://www.silverstripe.com">SilverStripe Open Source CMS</a> | Copyright &copy; 2008 SilverStripe Limited</p>
</div>
</div>
</body>
</html>

View File

@ -1,118 +1,118 @@
body {
text-align: center;
}
#Container * {
text-align: left;
}
ul#Themes{
list-style: none;
margin: 5px;
}
ul#Themes li {
clear: both;
padding: 3px 0;
}
ul#Themes input {
float: left;
width: 10px;
height: 10px;
}
ul#Themes label {
margin: -2px 5px 0 15px;
}
.good td {
color: green;
}
.warning td {
color: #ef7f24;
}
.testResults .error td {
border: 1px #CCC solid;
color: red;
}
p.error {
padding: 0.5em;
background-color: #ffe9e9;
border: 1px #ff8e8e solid;
color: #f03838;
}
p.warning {
padding: 0.5em;
background-color: #fef1e1;
border: 1px #ffc28b solid;
color: #cb6a1c;
}
p.warning label {
display: inline;
margin-left: 5px;
color: #cb6a1c
}
p.good {
padding: 0.5em;
background-color: #e2fee1;
border: 1px #43cb3e solid;
color: #359318;
}
p.error a,
p.warning a,
p.good a {
color: inherit;
text-decoration: underline;
}
p.error a:hover {
text-decoration: none;
}
span.middleColumn {
width: 312px;
margin-right: 0;
padding: 4px;
}
input.text, textarea, select {
padding: 2px;
border: 1px solid #A7A7A7;
color: #000;
font-size: 1.2em;
font-weight: bold;
width: 305px;
body {
text-align: center;
}
#Container * {
text-align: left;
}
ul#Themes{
list-style: none;
margin: 5px;
}
ul#Themes li {
clear: both;
padding: 3px 0;
}
ul#Themes input {
float: left;
width: 10px;
height: 10px;
}
ul#Themes label {
margin: -2px 5px 0 15px;
}
.good td {
color: green;
}
.warning td {
color: #ef7f24;
}
.testResults .error td {
border: 1px #CCC solid;
color: red;
}
p.error {
padding: 0.5em;
background-color: #ffe9e9;
border: 1px #ff8e8e solid;
color: #f03838;
}
p.warning {
padding: 0.5em;
background-color: #fef1e1;
border: 1px #ffc28b solid;
color: #cb6a1c;
}
p.warning label {
display: inline;
margin-left: 5px;
color: #cb6a1c
}
p.good {
padding: 0.5em;
background-color: #e2fee1;
border: 1px #43cb3e solid;
color: #359318;
}
p.error a,
p.warning a,
p.good a {
color: inherit;
text-decoration: underline;
}
p.error a:hover {
text-decoration: none;
}
span.middleColumn {
width: 312px;
margin-right: 0;
padding: 4px;
}
input.text, textarea, select {
padding: 2px;
border: 1px solid #A7A7A7;
color: #000;
font-size: 1.2em;
font-weight: bold;
width: 305px;
}
#stats {
float: left;
margin: 5px;
}
table.testResults {
border-collapse: collapse;
width: 100%;
margin: 10px 0;
}
#Layout h4 {
font-size: 2em;
clear: left;
}
.testResults td {
border: 1px #CCC solid;
width: 400px;
padding: 4px;
}
.clear {
clear: both;
}
p.mysql,
p.adminAcc,
p.devHelp {
padding-top: 20px;
}
p#mysql_credentials,
table.testResults {
border-collapse: collapse;
width: 100%;
margin: 10px 0;
}
#Layout h4 {
font-size: 2em;
clear: left;
}
.testResults td {
border: 1px #CCC solid;
width: 400px;
padding: 4px;
}
.clear {
clear: both;
}
p.mysql,
p.adminAcc,
p.devHelp {
padding-top: 20px;
}
p#mysql_credentials,
p#AdminAccount,
p#DevSites {
width: 330px;
margin-top: 0;
float: left;
}
#Layout input.action {
text-align: center;
width: 160px;
font-size: 1em;
p#DevSites {
width: 330px;
margin-top: 0;
float: left;
}
#Layout input.action {
text-align: center;
width: 160px;
font-size: 1em;
}

View File

@ -29,15 +29,15 @@ RelationComplexTableField.prototype = {
//if( checkedListNameArray == null ) {
checkedListNameArray = [];
checkedListNameArray.push( checkedListName );
checkedArray = [];
checkedArray = [];
if( checkedList.getAttribute( 'value' ) )
checkedArray.push( checkedList.getAttribute( 'value' ).split( ',' ) );
//}
/*
else if( checkedListNameArray.indexOf( checkedListName ) < 0 ) {
checkedListNameArray.push( checkedListName );
checkedListNameArray.push( checkedListName );
if( checkedList.getAttribute( 'value' ) )
checkedArray[ checkedListNameArray.length - 1 ] = checkedList.getAttribute( 'value' ).split( ',' );
checkedArray[ checkedListNameArray.length - 1 ] = checkedList.getAttribute( 'value' ).split( ',' );
}
else {
@ -56,7 +56,7 @@ RelationComplexTableField.prototype = {
if( checkedArray[ index ] && checkedArray[ index ].indexOf( markingInput.getAttribute( 'value' ) ) > -1 ) {
markingInput.setAttribute( 'checked', 'checked' );}
else
markingInput.removeAttribute( 'checked' );
markingInput.removeAttribute( 'checked' );
}
} */
@ -75,7 +75,7 @@ RelationComplexTableField.prototype = {
for( var i = 0; i < inputs.length; i++ ) {
var checkedList = inputs[ i ];
if( checkedList.getAttribute( 'name' ) == checkedListName )
break;
break;
}
var index = checkedListNameArray.indexOf( checkedListName );
@ -104,8 +104,8 @@ RelationComplexTableField.prototype = {
// 3) Update The Hidden Input Field
checkedList.setAttribute( 'value', checkedArray[ index ] );
}
checkedList.setAttribute( 'value', checkedArray[ index ] );
}
};
Behaviour.register( rules );

View File

@ -1,233 +1,233 @@
/**
* On-demand JavaScript handler
* Based on http://plugins.jquery.com/files/issues/jquery.ondemand.js_.txt and modified to integrate with Sapphire
*/
(function($){
function isExternalScript(url){
re = new RegExp('(http|https)://');
return re.test(url);
};
$.extend({
requireConfig : {
routeJs : '', // empty default paths give more flexibility and user has
routeCss : '' // choice of using this config or full path in scriptUrl argument
}, // previously were useless for users which don't use '_js/' and '_css/' folders. (by PGA)
queue : [],
pending : null,
loaded_list : null, // loaded files list - to protect against loading existed file again (by PGA)
// Added by SRM: Initialise the loaded_list with the scripts included on first load
initialiseItemLoadedList : function() {
if(this.loaded_list == null) {
$this = this;
$this.loaded_list = {};
$('script').each(function() {
if($(this).attr('src')) $this.loaded_list[ $(this).attr('src') ] = 1;
});
$('link[@rel="stylesheet"]').each(function() {
if($(this).attr('href')) $this.loaded_list[ $(this).attr('href') ] = 1;
});
}
},
/**
* Returns true if the given CSS or JS script has already been loaded
*/
isItemLoaded : function(scriptUrl) {
this.initialiseItemLoadedList();
return this.loaded_list[scriptUrl] != undefined;
},
requireJs : function(scriptUrl, callback, opts, obj, scope)
{
if(opts != undefined || opts == null){
$.extend($.requireConfig, opts);
}
var _request = {
url : scriptUrl,
callback : callback,
opts : opts,
obj : obj,
scope : scope
}
if(this.pending)
{
this.queue.push(_request);
return;
}
this.pending = _request;
this.initialiseItemLoadedList();
if (this.loaded_list[this.pending.url] != undefined) { // if required file exists (by PGA)
this.requestComplete(); // => request complete
return;
}
var _this = this;
var _url = (isExternalScript(scriptUrl)) ? scriptUrl : $.requireConfig.routeJs + scriptUrl;
var _head = document.getElementsByTagName('head')[0];
var _scriptTag = document.createElement('script');
// Firefox, Opera
$(_scriptTag).bind('load', function(){
_this.requestComplete();
});
// IE
_scriptTag.onreadystatechange = function(){
if(this.readyState === 'loaded' || this.readyState === 'complete'){
_this.requestComplete();
}
}
_scriptTag.type = "text/javascript";
_scriptTag.src = _url;
_head.appendChild(_scriptTag);
},
requestComplete : function()
{
if(this.pending.callback){
if(this.pending.obj){
if(this.pending.scope){
this.pending.callback.call(this.pending.obj);
} else {
this.pending.callback.call(window, this.pending.obj);
}
} else {
this.pending.callback.call();
}
}
this.loaded_list[this.pending.url] = 1; // adding loaded file to loaded list (by PGA)
this.pending = null;
if(this.queue.length > 0)
{
var request = this.queue.shift();
this.requireJs(request.url, request.callback, request.opts, request.obj, request.scope);
}
},
requireCss : function(styleUrl, media){
if(media == null) media = 'all';
// Don't double up on loading scripts
if(this.isItemLoaded(styleUrl)) return;
if(document.createStyleSheet){
var ss = document.createStyleSheet($.requireConfig.routeCss + styleUrl);
ss.media = media;
} else {
var styleTag = document.createElement('link');
$(styleTag).attr({
href : $.requireConfig.routeCss + styleUrl,
type : 'text/css',
media : media,
rel : 'stylesheet'
}).appendTo($('head').get(0));
}
this.loaded_list[styleUrl] = 1;
}
})
/**
* Sapphire extensions
* Ajax requests are amended to look for X-Include-JS and X-Include-CSS headers
*/
_originalAjax = $.ajax;
$.ajax = function(s) {
var _complete = s.complete;
var _success = s.success;
var _dataType = s.dataType;
// This replaces the usual ajax success & complete handlers. They are called after any on demand JS is loaded.
var _ondemandComplete = function(xml) {
var status = jQuery.httpSuccess(xml) ? 'success' : 'error';
if(status == 'success') {
data = jQuery.httpData(xml, _dataType);
if(_success) _success(data, status, xml);
}
if(_complete) _complete(xml, status);
}
// We remove the success handler and take care of calling it outselves within _ondemandComplete
s.success = null;
s.complete = function(xml, status) {
processOnDemandHeaders(xml, _ondemandComplete);
}
return _originalAjax(s);
}
})(jQuery);
/**
* This is the on-demand handler used by our patched version of prototype.
* once we get rid of all uses of prototype, we can remove this
*/
function prototypeOnDemandHandler(xml, callback) {
processOnDemandHeaders(xml, callback);
}
/**
* Process the X-Include-CSS and X-Include-JS headers provided by the Requirements class
*/
function processOnDemandHeaders(xml, _ondemandComplete) {
var i;
// CSS
if(xml.getResponseHeader('X-Include-CSS')) {
var cssIncludes = xml.getResponseHeader('X-Include-CSS').split(',');
for(i=0;i<cssIncludes.length;i++) {
// Syntax 1: "URL:##:media"
if(cssIncludes[i].match(/^(.*):##:(.*)$/)) {
jQuery.requireCss(RegExp.$1, RegExp.$2);
// Syntax 2: "URL"
} else {
jQuery.requireCss(cssIncludes[i]);
}
}
}
// JavaScript
var newIncludes = [];
if(xml.getResponseHeader('X-Include-JS')) {
var jsIncludes = xml.getResponseHeader('X-Include-JS').split(',');
for(i=0;i<jsIncludes.length;i++) {
if(!jQuery.isItemLoaded(jsIncludes[i])) {
newIncludes.push(jsIncludes[i]);
}
}
}
// We make an array of the includes that are actually new, and attach the callback to the last one
// They are placed in a queue and will be included in order. This means that the callback will
// be able to execute script in the new includes (such as a livequery update)
if(newIncludes.length > 0) {
for(i=0;i<jsIncludes.length;i++) {
jQuery.requireJs(jsIncludes[i], (i == jsIncludes.length-1) ? function() { _ondemandComplete(xml); } : null);
}
// If there aren't any new includes, then we can just call the callbacks ourselves
} else {
_ondemandComplete(xml, status);
}
/**
* On-demand JavaScript handler
* Based on http://plugins.jquery.com/files/issues/jquery.ondemand.js_.txt and modified to integrate with Sapphire
*/
(function($){
function isExternalScript(url){
re = new RegExp('(http|https)://');
return re.test(url);
};
$.extend({
requireConfig : {
routeJs : '', // empty default paths give more flexibility and user has
routeCss : '' // choice of using this config or full path in scriptUrl argument
}, // previously were useless for users which don't use '_js/' and '_css/' folders. (by PGA)
queue : [],
pending : null,
loaded_list : null, // loaded files list - to protect against loading existed file again (by PGA)
// Added by SRM: Initialise the loaded_list with the scripts included on first load
initialiseItemLoadedList : function() {
if(this.loaded_list == null) {
$this = this;
$this.loaded_list = {};
$('script').each(function() {
if($(this).attr('src')) $this.loaded_list[ $(this).attr('src') ] = 1;
});
$('link[@rel="stylesheet"]').each(function() {
if($(this).attr('href')) $this.loaded_list[ $(this).attr('href') ] = 1;
});
}
},
/**
* Returns true if the given CSS or JS script has already been loaded
*/
isItemLoaded : function(scriptUrl) {
this.initialiseItemLoadedList();
return this.loaded_list[scriptUrl] != undefined;
},
requireJs : function(scriptUrl, callback, opts, obj, scope)
{
if(opts != undefined || opts == null){
$.extend($.requireConfig, opts);
}
var _request = {
url : scriptUrl,
callback : callback,
opts : opts,
obj : obj,
scope : scope
}
if(this.pending)
{
this.queue.push(_request);
return;
}
this.pending = _request;
this.initialiseItemLoadedList();
if (this.loaded_list[this.pending.url] != undefined) { // if required file exists (by PGA)
this.requestComplete(); // => request complete
return;
}
var _this = this;
var _url = (isExternalScript(scriptUrl)) ? scriptUrl : $.requireConfig.routeJs + scriptUrl;
var _head = document.getElementsByTagName('head')[0];
var _scriptTag = document.createElement('script');
// Firefox, Opera
$(_scriptTag).bind('load', function(){
_this.requestComplete();
});
// IE
_scriptTag.onreadystatechange = function(){
if(this.readyState === 'loaded' || this.readyState === 'complete'){
_this.requestComplete();
}
}
_scriptTag.type = "text/javascript";
_scriptTag.src = _url;
_head.appendChild(_scriptTag);
},
requestComplete : function()
{
if(this.pending.callback){
if(this.pending.obj){
if(this.pending.scope){
this.pending.callback.call(this.pending.obj);
} else {
this.pending.callback.call(window, this.pending.obj);
}
} else {
this.pending.callback.call();
}
}
this.loaded_list[this.pending.url] = 1; // adding loaded file to loaded list (by PGA)
this.pending = null;
if(this.queue.length > 0)
{
var request = this.queue.shift();
this.requireJs(request.url, request.callback, request.opts, request.obj, request.scope);
}
},
requireCss : function(styleUrl, media){
if(media == null) media = 'all';
// Don't double up on loading scripts
if(this.isItemLoaded(styleUrl)) return;
if(document.createStyleSheet){
var ss = document.createStyleSheet($.requireConfig.routeCss + styleUrl);
ss.media = media;
} else {
var styleTag = document.createElement('link');
$(styleTag).attr({
href : $.requireConfig.routeCss + styleUrl,
type : 'text/css',
media : media,
rel : 'stylesheet'
}).appendTo($('head').get(0));
}
this.loaded_list[styleUrl] = 1;
}
})
/**
* Sapphire extensions
* Ajax requests are amended to look for X-Include-JS and X-Include-CSS headers
*/
_originalAjax = $.ajax;
$.ajax = function(s) {
var _complete = s.complete;
var _success = s.success;
var _dataType = s.dataType;
// This replaces the usual ajax success & complete handlers. They are called after any on demand JS is loaded.
var _ondemandComplete = function(xml) {
var status = jQuery.httpSuccess(xml) ? 'success' : 'error';
if(status == 'success') {
data = jQuery.httpData(xml, _dataType);
if(_success) _success(data, status, xml);
}
if(_complete) _complete(xml, status);
}
// We remove the success handler and take care of calling it outselves within _ondemandComplete
s.success = null;
s.complete = function(xml, status) {
processOnDemandHeaders(xml, _ondemandComplete);
}
return _originalAjax(s);
}
})(jQuery);
/**
* This is the on-demand handler used by our patched version of prototype.
* once we get rid of all uses of prototype, we can remove this
*/
function prototypeOnDemandHandler(xml, callback) {
processOnDemandHeaders(xml, callback);
}
/**
* Process the X-Include-CSS and X-Include-JS headers provided by the Requirements class
*/
function processOnDemandHeaders(xml, _ondemandComplete) {
var i;
// CSS
if(xml.getResponseHeader('X-Include-CSS')) {
var cssIncludes = xml.getResponseHeader('X-Include-CSS').split(',');
for(i=0;i<cssIncludes.length;i++) {
// Syntax 1: "URL:##:media"
if(cssIncludes[i].match(/^(.*):##:(.*)$/)) {
jQuery.requireCss(RegExp.$1, RegExp.$2);
// Syntax 2: "URL"
} else {
jQuery.requireCss(cssIncludes[i]);
}
}
}
// JavaScript
var newIncludes = [];
if(xml.getResponseHeader('X-Include-JS')) {
var jsIncludes = xml.getResponseHeader('X-Include-JS').split(',');
for(i=0;i<jsIncludes.length;i++) {
if(!jQuery.isItemLoaded(jsIncludes[i])) {
newIncludes.push(jsIncludes[i]);
}
}
}
// We make an array of the includes that are actually new, and attach the callback to the last one
// They are placed in a queue and will be included in order. This means that the callback will
// be able to execute script in the new includes (such as a livequery update)
if(newIncludes.length > 0) {
for(i=0;i<jsIncludes.length;i++) {
jQuery.requireJs(jsIncludes[i], (i == jsIncludes.length-1) ? function() { _ondemandComplete(xml); } : null);
}
// If there aren't any new includes, then we can just call the callbacks ourselves
} else {
_ondemandComplete(xml, status);
}
}