Crazy updates. Moved the Smarty functions to a dedicated folder, added shared Smarty templates, updated the VNN config file, added more shared CSS, added a mail class, added fairly common AJAX too!

git-svn-id: http://svn.cleancode.org/svn/pickles@26 4d10bc64-7434-11dc-a737-d2d0f8310089
This commit is contained in:
Josh Sherman 2008-06-29 01:31:04 +00:00
parent 3e913ece7f
commit b43fd4df44
10 changed files with 205 additions and 4 deletions

View file

@ -88,9 +88,10 @@ class Controller {
$smarty->assign('session', $_SESSION);
}
// Load it up
// Load it up!
header('Content-type: text/html; charset=UTF-8');
$smarty->display('index.tpl');
// @todo
$smarty->display(isset($_REQUEST['ajax']) ? '/var/www/josh/common/smarty/templates/ajax.tpl' : 'index.tpl');
}
private function authenticate() {

43
classes/Mail.php Normal file
View file

@ -0,0 +1,43 @@
<?php
class Mail {
static function send($recipients = null, $prefix = null) {
global $smarty;
$defaults = Config::get('contact');
if (!isset($recipients)) {
$recipients = $defaults['recipients']['recipient'];
}
if (is_array($recipients)) {
$to = null;
foreach ($recipients as $recipient) {
$to .= (isset($to) ? ',' : '') . $recipient;
}
}
else {
$to = $recipients;
}
if (!isset($prefix)) {
$prefix = isset($defaults['prefix']) ? $defaults['prefix'] : null;
}
if (mail($to, str_replace("\n", '', (isset($prefix) ? "[{$prefix}] " : '') . $_REQUEST['subject']), stripslashes($_REQUEST['message']), "From: {$_REQUEST['email']}\r\n")) {
$type = 'success';
$message = 'Message sent successfully';
}
else {
$type = 'error';
$message = 'An unexpected error has occurred';
}
$smarty->assign('type', $type);
$smarty->assign('message', $message);
}
}
?>

View file

@ -25,4 +25,11 @@
<user>User Account</user>
<logout>Logout</logout>
</admin>
<contact>
<prefix>VNN</prefix>
<recipients>
<recipient>verynicenoise@gmail.com</recipient>
<recipient>joshsherman@gmail.com</recipient>
</recipients>
</contact>
</config>

View file

@ -51,7 +51,7 @@ if (Config::getSession() && !isset($_SESSION)) {
// Smarty default stuff
if (Config::getSmarty()) {
require_once 'contrib/smarty/Smarty.class.php';
require_once 'contrib/smarty/libs/Smarty.class.php';
$smarty = new Smarty();
@ -71,7 +71,7 @@ if (Config::getSmarty()) {
$smarty->load_filter('output','trimwhitespace');
// Include custom Smarty functions
$directory = JLIB_PATH . 'smarty/';
$directory = JLIB_PATH . 'smarty/functions/';
if (is_dir($directory)) {
if ($handle = opendir($directory)) {
while (($file = readdir($handle)) !== false) {

View file

@ -0,0 +1,19 @@
<?php
function smarty_function_contact_form($params, &$smarty) {
$form = '
<form action="/contact/send" method="post">
Email:<br />
<input name="email" title="required" class="contact_input" /><br /><br />
Subject:<br />
<input name="subject" title="required" class="contact_input" /><br /><br />
Message:<br />
<textarea name="message" title="required" class="contact_textarea"></textarea><br /><br />
<input type="button" value="Send" onclick="ajaxSubmit(this.parentNode); return false;" class="contact_button" />
</form>
';
return $form;
}
?>

View file

@ -0,0 +1 @@
{$type}|{$message}

39
static/css/messages.css Normal file
View file

@ -0,0 +1,39 @@
div.error,
div.warning,
div.success,
div.notice
{
border: 1px solid;
font-weight: bold;
margin: 0;
padding: 4px;
text-align: center;
}
div.error
{
background: #FCC;
border-color: #900;
color: #900;
}
div.warning
{
background: #FC9;
border-color: #F30;
color: #F30;
}
div.success
{
background: #CFC;
border-color: #090;
color: #090;
}
div.notice
{
background: #CCF;
border-color: #009;
color: #009;
}

91
static/js/ajax.js Normal file
View file

@ -0,0 +1,91 @@
var request = null;
function getForm(form) {
var params = 'ajax=true';
var count = form.elements.length;
for (var i = 0; i < count; i++) {
element = form.elements[i];
switch (element.type) {
case 'hidden':
case 'password':
case 'text':
case 'textarea':
// Check if it's required
if (element.title == 'required' && element.value == '') {
alert('Error: The ' + element.name + ' field is required.');
element.focus();
return false;
}
params += '&' + element.name + '=' + encodeURI(element.value);
break;
case 'checkbox':
case 'radio':
if (element.checked) {
params += '&' + element.name + '=' + encodeURI(element.value);
}
break;
case 'select-one':
params += '&' + element.name + "=" + element.options[element.selectedIndex].value;
break;
}
}
return params;
}
function createRequest() {
try {
request = new XMLHttpRequest();
} catch (trymicrosoft) {
try {
request = new ActiveXObject("Msxml12.XMLHTTP");
} catch (othermicrosoft) {
try {
request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (failed) {
request = null;
}
}
}
if (request == null) {
alert("Error creating request object!");
}
}
function ajaxSubmit(form) {
var params = '';
if (params = getForm(form)) {
createRequest();
request.open(form.method, form.action, true);
request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
request.setRequestHeader("Content-length", params.length);
request.setRequestHeader("Connection", "close");
request.onreadystatechange = function() {
if (request.readyState == 4 && request.status == 200) {
// We need to split the response because the response comes
// back in this format: type | message
// Where type could be error or success (and eventually warning)
var responseText = request.responseText;
var splitResponse = responseText.split('|');
var responseElement = document.createElement('div');
responseElement.className = splitResponse[0];
var responseMessage = document.createTextNode(splitResponse[1]);
responseElement.appendChild(responseMessage);
form.insertBefore(responseElement, form.firstChild);
}
}
request.send(params);
}
}