<?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);
 
?>
 
 |