Source Code for /public/appendix-samples/fruits-and-filters-js-enhanced.php
<?php
function get_fruits() {
$jpgs = glob('../img/fruit/*.jpg');
$webps = glob('../img/fruit/*.webp');
$files = array_merge( $jpgs, $webps );
sort( $files );
return $files;
}
function get_filters() {
return [
'filter: grayscale(100%)',
'filter: blur(2px)',
'filter: brightness(1.5)',
'filter: contrast(1.5)',
'filter: hue-rotate(90deg)',
'filter: invert(1)',
'filter: sepia(1)',
'transform: rotateZ(90deg);',
'transform: skewX(-15deg);',
];
}
function user_requested_a_fruit_and_filter() {
if( ! isset( $_POST['fruit_id'] ) ) return false;
if( ! isset( $_POST['filter_id'] ) ) return false;
return true;
}
function show_a_filtered_fruit() {
$fruit_id = intval( $_POST['fruit_id'] );
$filter_id = intval( $_POST['filter_id'] );
$fruit = get_fruits()[ $fruit_id ];
$filter = get_filters()[ $filter_id ];
?>
<img src="<?php echo $fruit; ?>"
width="200"
height="200"
style="border: 1px solid black; <?php echo $filter; ?>;">
<?php
}
if( isset( $_GET['js'] ) && ( $_GET['js'] === 'true' ) && user_requested_a_fruit_and_filter() ) {
echo json_encode([
'fruit' => get_fruits()[ intval( $_POST['fruit_id'] ) ],
'filter' => get_filters()[ intval( $_POST['filter_id'] ) ]
]);
die();
}
?>
<h1>Fruity Filters</h1>
<!--
This block is always added ot the page, but it's only displayed if a fruit and filter was requested
at page load (e.g. if JS was disabled). But because it's always added, it can be MADE visible by
JavaScript in the event of a form submission using a fetch() request!
-->
<div id="results" style="display: <?php echo( user_requested_a_fruit_and_filter() ) ? 'block' : 'none'; ?>;">
<h2>
Here's your filtered fruit:
</h2>
<?php show_a_filtered_fruit(); ?>
</div>
<h2>
<?php if( user_requested_a_fruit_and_filter() ) { ?>
Filter another fruit!
<?php } else { ?>
Filter a fruit!
<?php } ?>
</h2>
<form method="post" action="fruits-and-filters-js-enhanced.php">
<p>
<label for="fruit">Fruit:</label>
<select id="fruit" name="fruit_id">
<?php foreach( get_fruits() as $id => $fruit ) { ?>
<option value="<?php echo $id; ?>">
<?php echo basename( $fruit ); ?>
</option>
<?php } ?>
</select>
</p>
<p>
<label for="filter">Filter:</label>
<select id="filter" name="filter_id">
<?php foreach( get_filters() as $id => $filter ) { ?>
<option value="<?php echo $id; ?>">
<?php echo $filter; ?>
</option>
<?php } ?>
</select>
</p>
<button type="submit">Submit</button>
</form>
<script>
const results = document.getElementById('results');
const resultsImage = results.querySelector('img');
const form = document.querySelector('form');
const submitButton = form.querySelector('button[type="submit"]');
form.addEventListener('submit', function(event) {
event.preventDefault();
submitButton.disabled = true;
submitButton.innerHTML = 'Please wait...';
const url = this.action + '?js=true';
fetch(url, {
method: 'POST',
body: new FormData(this)
})
.then(response => response.json())
.then(data => {
resultsImage.src = data.fruit;
resultsImage.style.cssText = 'transition: box-shadow 0.2s; border: 1px solid black;' + data.filter;
resultsImage.style.boxShadow = '0 0 12px yellow';
setTimeout(()=>resultsImage.style.boxShadow = 'none', 250);
results.style.display = 'block';
})
.catch(error => {
alert('Something went wrong: ' + error);
})
.finally(() => {
submitButton.disabled = false;
submitButton.innerHTML = 'Submit';
});
});
</script>
<p>
<a href="/source-viewer.php?file=public/appendix-samples/fruits-and-filters-js-enhanced.php">View source code for this page</a>
</p>