| 
<?phpnamespace Jackbooted\Forms;
 
 use \Jackbooted\Html\Tag;
 use \Jackbooted\Util\Invocation;
 /**
 * @copyright Confidential and copyright (c) 2016 Jackbooted Software. All rights reserved.
 *
 * Written by Brett Dutton of Jackbooted Software
 * brett at brettdutton dot com
 *
 * This software is written and distributed under the GNU General Public
 * License which means that its source code is freely-distributed and
 * available to the general public.
 */
 
 /**
 *
 */
 class Columnator extends Navigator {
 const SORT_COL          = 'C';
 const SORT_ORDER        = 'O';
 const COL_VAR           = '_CL';
 const COL_LINK_CLASS    = 'COL_LINK_CLASS';
 const COL_BUTTON_CLASS  = 'COL_BUTTON_CLASS';
 
 private static $columnation =  [ self::SORT_COL   => '',
 self::SORT_ORDER => '' ];
 
 /**
 * @static
 * @param  $suffix
 * @return string
 */
 public static function navVar ( $suffix ) {
 return self::COL_VAR . $suffix;
 }
 
 private $sortColumn;
 private $sortOrder;
 
 /**
 * Create a Columnator Object.
 * @param array $props This is the properties that the Columnator will use to display.
 * <pre>
 * $props = array ( 'attribs'          => 'array ( 'style' => 'display:none ), // Optional,
 *                                        // Attributes that will be stamped on the div that is generated
 *                                        // if not supplied will be empty array.
 *                                        // Need to supply if the primary key is not simple column name
 *                  'suffix'           => 'V', // Optional, suffix for the action variable for Columnator
 *                                        // useful when there is a numbner on the screen
 *                                        // if not supplied one will be generated based on the number of
 *                                        // Columnator that are generated
 *                  'request_vars'     => 'CEMID', // Optional, regexpression or individual name of any request
 *                                        //  vars that are to be copied to the response vars (chained vars)
 *                  'init_column'      => 'fldDate', // Optional, Initial Coloumn to be sorted
 *                  'init_order'       => 'DESC', // Optional, initial direction
 *                );
 * </pre>
 */
 public function __construct ( $props=[] ) {
 parent::__construct();
 
 $this->attribs      = ( isset ( $props['attribs'] ) ) ? $props['attribs'] :  [];
 $suffix             = ( isset ( $props['suffix'] ) )  ? $props['suffix']  : Invocation::next();
 $this->navVar       = self::navVar ( $suffix );
 $initPattern        = ( isset ( $props['request_vars'] ) ) ? $props['request_vars'] : '';
 $this->respVars     = new Response ( $initPattern );
 
 $initialVars = self::$columnation;
 $initialVars[self::SORT_COL]   = ( isset ( $props['init_column'] ) ) ? $props['init_column'] : '';
 $initialVars[self::SORT_ORDER] = ( isset ( $props['init_order'] ) ) ? $props['init_order'] : '';
 
 // ensyre that they have been set
 $requestColumnVars = Request::get ( $this->navVar,  [] );
 foreach ( $initialVars as $key => $val ) {
 $this->set ( $key, ( ( isset ( $requestColumnVars[$key] ) ) ? $requestColumnVars[$key] : $val ) );
 }
 
 // Get the current settings
 $this->sortColumn = $this->formVars[self::SORT_COL];
 $this->sortOrder  = $this->formVars[self::SORT_ORDER];
 if ( ! isset( $this->sortOrder ) || $this->sortOrder == false || ! in_array( $this->sortOrder,  [ 'ASC', 'DESC' ] ) ) {
 $this->sortOrder = 'ASC';
 }
 
 $this->styles[self::COL_LINK_CLASS]    = 'jb-collink';
 $this->styles[self::COL_BUTTON_CLASS]  = 'jb-colbutton';
 }
 
 /**
 * @param  $columnName
 * @param  $columnDisplay
 * @return string
 */
 public function toHtml ( $columnName, $columnDisplay=null ) {
 if ( $columnDisplay == null ) $columnDisplay = $columnName;
 $savedFormVars = $this->formVars;
 
 $this->set( self::SORT_COL, $columnName );
 
 if ( $this->sortColumn == $columnName ) {
 $this->set( self::SORT_ORDER, ( $this->sortOrder == 'ASC' ) ? 'DESC' : 'ASC' );
 $sortDirectionName = ( $this->sortOrder == 'ASC' ) ? 'Decending' : 'Ascending';
 $title = 'Click here to sort ' . $sortDirectionName . ' By ' . $columnDisplay;
 
 $button = ( $this->sortOrder == 'ASC' ) ? '^' : 'v';
 
 $url = $this->toUrl ();
 $html = Tag::hTag( 'a', array_merge( $this->attribs,
 [ 'href' => $url,
 'class' => $this->styles[self::COL_LINK_CLASS],
 'title' => $title ] ) ).
 $columnDisplay .
 Tag::_hTag( 'a' ) .
 Tag::linkButton ( $url, $button, array_merge ( $this->attribs,
 [ 'class' => $this->styles[self::COL_BUTTON_CLASS],
 'title' => $title ] ) );
 }
 else {
 $this->set( self::SORT_ORDER, $this->sortOrder );
 $sortDirectionName = ( $this->sortOrder == 'ASC' ) ? 'Decending' : 'Ascending';
 $title = 'Sort ' . $sortDirectionName . ' By ' . $columnDisplay;
 
 $url = $this->toUrl ();
 $html = Tag::hTag( 'a', array_merge( $this->attribs,
 [ 'href' => $url,
 'class' => $this->styles[self::COL_LINK_CLASS],
 'title' => $title ] ) ).
 $columnDisplay .
 Tag::_hTag( 'a' );
 }
 
 $this->formVars = $savedFormVars;
 return $html;
 }
 
 /**
 * @return string
 */
 public function getSort() {
 if ( ! isset( $this->formVars[self::SORT_COL] ) || $this->formVars[self::SORT_COL] == false ) {
 return '';
 }
 
 return ' ORDER BY ' . $this->formVars[self::SORT_COL] . ' ' . $this->formVars[self::SORT_ORDER];
 }
 }
 |