<?php
include('Flags.class.php');
session_start();
$statusList = array();
/**
* In this example, the page allows the viewer to specify the number of flags, meaning
* we need to retrieve the number of flags from the session as well as check for a change
* in that number (through the form provided).
* We also store the number of flags in the session for further page views.
**/
if(is_array($_SESSION) && array_key_exists('flagnum',$_SESSION)) {
$numberOfFlags = $_SESSION['flagnum'];
} else {
$numberOfFlags = 62;
}
if(is_array($_POST) && array_key_exists('flagnumsub',$_POST)) {
$numberOfFlags = (int)$_POST['numberofflags'];
}
$_SESSION['flagnum'] = $numberOfFlags;
/**
* Generate the flag name list.
* For the purposes of this example, flags are generated dynamically using
* a naming template (fXX where XX is the flag number).
**/
for($i=count($statusList);$i<$numberOfFlags;$i++) {
$statusList[$i] = 'flag'.($i+1);
}
/**
* Create our flags class...
**/
$state = new Flags($statusList);
/**
* First off, because the example requires multiple page loads, we check to see if
* the session is currently holding any flag data.
*
* If it is, we load that data into the flags class.
*
* If not, we set the initial values to true (which showcases the maximum footprint
* of the class).
**/
if(is_array($_SESSION) && array_key_exists('flags',$_SESSION)) {
// Load flags from session
$state->setData($_SESSION['flags']);
} else {
// Set all flags to true.
for($i=0,$l=count($statusList);$i<$l;$i++) {
$state->{$statusList[$i]} = true;
}
}
/**
* Because we allow the viewer to toggle the flag state, we now loop through and check
* to see if it was toggled. If it is, toggle it. Otherwise, nothing happens.
*
* ------------------------------------------------------------------------------------
*
* Be aware that this example only toggles flags. You can also set flags to an explicit
* boolean value like so:
*
* $flagClassInstance->flagName = true; // sets flagName to true ('on')
* $flagClassInstance->flagName = false; // sets flagName to false ('off')
*
* $flagClassInstance->setFlag('flagName',true); // sets flagName to true ('on')
* $flagClassInstance->setFlag('flagName',false); // sets flagName to false ('off')
**/
foreach($statusList as $i=>$status) {
if(is_array($_POST) && array_key_exists('sub'.$status,$_POST)) {
/**
* All that is required to toggle the flag is to call:
* $flagClassInstance->flagName();
**/
$state->$status();
}
}
/**
* Again, because the example spans multiple page views, store the updated flag data in
* the session.
**/
$_SESSION['flags'] = $state->getData();
/**
* And now, we start building the interface.
* Start with echoing the current state (built-in __toString method to automatically
* format the class conversion to string for display. Will show the state of each flag
* as '1' or '0', in order of it's bit).
**/
echo 'Flag value:<br />'.$state.'<br /><br /><br />';
/**
* Quick form to allow the user to set the number of flags
**/
echo "
<form name='flagnum' action='index.php' method='post'>
Number of flags: <input type='text' name='numberofflags' id='numberofflags' value='{$numberOfFlags}' /><br />
<input type='submit' name='flagnumsub' id='flagnumsub' value='Change' />
</form>
";
/**
* Some quick formatting variables.
* $perLine = number of flags to show per table row
* $currentPer = used within the loop.
* Neither are of significant value.
**/
$perLine = 20;
$currentPer = 0;
echo '<table><tr>';
for($i=count($statusList)-1,$l=0;$i>=$l;$i--) {
$status = $statusList[$i];
// Form to show the toggle button...
$stateForm = "
<form name='changeState{$status}' action='index.php' method='post' style='display: inline;'>
<input type='submit' name='sub{$status}' id='sub{$status}' value='toggle' />
</form>
";
echo '<td style="text-align: center;">';
echo $status.'<br />';
echo ( $state->$status ? 'Yes' : 'No' ).'<br />'; // $flagClassInstance->FlagName will return the flag value.
echo ( $state->isFlagSet($status) ? '1' : '0' ).'<br />'; // $flagClassInstance->isFlagSet('flagName') will also return the flag value.
echo $stateForm; // The form generated above...
echo '</td>';
// Below is formatting code...
$currentPer++;
if($currentPer%$perLine == 0) {
echo '</tr>'
.'<tr><td colspan="'.$perLine.'"><hr /></td>'
.'<tr>';
}
}
echo '</tr></table>';
/**
* Here, we show the viewer how the data is stored. It is in a seriealized array of integers.
*
* We also show the overall length of the flag data.
*
* Though not shown, the length of the data string is on average less than the length required
* to store an array of boolean values. Ultimately, this is a great tool for large amounts of
* boolean values, though the advantages may be lost below a certain amount of values.
**/
echo 'To Store:<br />';
$toStore = $state->getData();
echo $toStore.'<br />';
echo 'Length: '.strlen($toStore);
?>
|