qcubed/framework

View on GitHub
includes/base_controls/QPaginatedControl.class.php

Summary

Maintainability
F
3 days
Test Coverage
<?php
    /**
     * This file contains the QPaginatedControl and QDataBindException class.
     *
     * @package Controls
     */

    /**
     * @package Controls
     * @property string         $Noun Name of the items which are being paginated (book, movie, post etc.)
     * @property string         $NounPlural Plural form of name of the items which are being paginated (books, movies, posts etc.)
     * @property QPaginatorBase $Paginator
     * @property QPaginatorBase $PaginatorAlternate
     * @property boolean        $UseAjax
     * @property integer        $ItemsPerPage   is how many items you want to display per page when Pagination is enabled
     * @property integer        $TotalItemCount is the total number of items in the ENTIRE recordset -- only used when Pagination is enabled
     * @property mixed          $DataSource     is an array of anything.  THIS MUST BE SET EVERY TIME (DataSource does NOT persist from postback to postback
     * @property-read mixed     $LimitClause
     * @property-read mixed     $LimitInfo      is what should be passed in to the LIMIT clause of the sql query that retrieves the array of items from the database
     * @property-read integer   $ItemCount
     * @property integer        $PageNumber     is the current page number you are viewing
     * @property-read integer   $PageCount
     * @property-read integer   $ItemsOffset    Current offset of Items from the result
     */
    abstract class QPaginatedControl extends QControl {
        use QDataBinder;

        // APPEARANCE
        /** @var string Name of the items which are being paginated (books, movies, posts etc.) */
        protected $strNoun;
        /**  @var string Plural form of name of the items which are being paginated (books, movies, posts etc.) */
        protected $strNounPlural;

        // BEHAVIOR
        /** @var null|QPaginator Paginator at the top */
        protected $objPaginator = null;
        /** @var null|QPaginator Paginator at the bottom */
        protected $objPaginatorAlternate = null;
        /** @var bool Determines whether this QDataGrid wll use AJAX or not */
        protected $blnUseAjax = true;

        // MISC
        /** @var array DataSource from which the items are picked and rendered */
        protected $objDataSource;

        // SETUP
        /** @var bool Is this paginator a block element? */
        protected $blnIsBlockElement = true;

        /**
         * @param QControl|QControlBase|QForm $objParentObject
         * @param null|string                       $strControlId
         *
         * @throws Exception
         * @throws QCallerException
         */
        public function __construct($objParentObject, $strControlId = null) {
            parent::__construct($objParentObject, $strControlId);

            $this->strNoun = QApplication::Translate('item');
            $this->strNounPlural = QApplication::Translate('items');
        }

        // PaginatedControls should (in general) never have anything that ever needs to be validated -- so this always
        // returns true.
        public function Validate() {
            return true;
        }

        public function DataBind() {
            // Run the DataBinder (if applicable)
            if (($this->objDataSource === null) && ($this->HasDataBinder()) && (!$this->blnRendered))
            {
                try {
                    $this->CallDataBinder();
                } catch (QCallerException $objExc) {
                    $objExc->IncrementOffset();
                    throw $objExc;
                }
                
                if ($this->objPaginator && $this->PageNumber > $this->PageCount) {
                    $this->PageNumber = max($this->PageCount,1);
                }
            }
        }

        /////////////////////////
        // Public Properties: GET
        /////////////////////////
        /**
         * PHP magic method
         * @param string $strName Property name
         *
         * @return mixed
         * @throws Exception|QCallerException
         */
        public function __get($strName) {
            switch ($strName) {
                // APPEARANCE
                case "Noun": return $this->strNoun;
                case "NounPlural": return $this->strNounPlural;

                // BEHAVIOR
                case "Paginator": return $this->objPaginator;
                case "PaginatorAlternate": return $this->objPaginatorAlternate;
                case "UseAjax": return $this->blnUseAjax;
                case "ItemsPerPage":
                    if ($this->objPaginator)
                        return $this->objPaginator->ItemsPerPage;
                    else
                        return null;
                case "ItemsOffset":
                    if ($this->objPaginator)
                        return ($this->objPaginator->PageNumber - 1) * $this->objPaginator->ItemsPerPage;
                    else
                        return null;
                case "TotalItemCount":
                    if ($this->objPaginator)
                        return $this->objPaginator->TotalItemCount;
                    else
                        return null;

                // MISC
                case "DataSource": return $this->objDataSource;
                case "LimitClause":
                    if ($this->objPaginator) {
//                        if ($this->objPaginator->TotalItemCount > 0) {
                            $intOffset = $this->ItemsOffset;
                            return QQ::LimitInfo($this->objPaginator->ItemsPerPage, $intOffset);
//                        }
                    }
                    return null;
                case "LimitInfo":
                    if ($this->objPaginator) {
//                        if ($this->objPaginator->TotalItemCount > 0) {
                            $intOffset = $this->ItemsOffset;
                            return $intOffset . ',' . $this->objPaginator->ItemsPerPage;
//                        }
                    }
                    return null;
                case "ItemCount": return count($this->objDataSource);

                case 'PageNumber':
                    if ($this->objPaginator)
                        return $this->objPaginator->PageNumber;
                    else
                        return null;

                case 'PageCount':
                    if ($this->objPaginator)
                        return $this->objPaginator->PageCount;
                    else
                        return null;

                default:
                    try {
                        return parent::__get($strName);
                    } catch (QCallerException $objExc) {
                        $objExc->IncrementOffset();
                        throw $objExc;
                    }
            }
        }





        /////////////////////////
        // Public Properties: SET
        /////////////////////////
        public function __set($strName, $mixValue) {
            switch ($strName) {
                // APPEARANCE
                case "Noun":
                    try {
                        $this->strNoun = QType::Cast($mixValue, QType::String);
                        $this->blnModified = true;
                        break;
                    } catch (QInvalidCastException $objExc) {
                        $objExc->IncrementOffset();
                        throw $objExc;
                    }
                case "NounPlural":
                    try {
                        $this->strNounPlural = QType::Cast($mixValue, QType::String);
                        $this->blnModified = true;
                        break;
                    } catch (QInvalidCastException $objExc) {
                        $objExc->IncrementOffset();
                        throw $objExc;
                    }

                // BEHAVIOR
                case "Paginator":
                    try {
                        $this->objPaginator = QType::Cast($mixValue, 'QPaginatorBase');
                        if ($this->objPaginator) {
                            if ($this->objPaginator->Form->FormId != $this->Form->FormId)
                                throw new QCallerException('The assigned paginator must belong to the same form that this control belongs to.');
                            $this->objPaginator->SetPaginatedControl($this);
                        }
                        $this->blnModified = true;
                        break;
                    } catch (QInvalidCastException $objExc) {
                        $objExc->IncrementOffset();
                        throw $objExc;
                    }

                case "PaginatorAlternate":
                    try {
                        $this->objPaginatorAlternate = QType::Cast($mixValue, 'QPaginatorBase');
                        if ($this->objPaginatorAlternate->Form->FormId != $this->Form->FormId)
                            throw new QCallerException('The assigned paginator must belong to the same form that this control belongs to.');
                        $this->objPaginatorAlternate->SetPaginatedControl($this);
                        $this->blnModified = true;
                        break;
                    } catch (QInvalidCastException $objExc) {
                        $objExc->IncrementOffset();
                        throw $objExc;
                    }

                case "UseAjax":
                    try {
                        $this->blnUseAjax = QType::Cast($mixValue, QType::Boolean);
                        
                        if ($this->objPaginator)
                            $this->objPaginator->UseAjax = $this->blnUseAjax;
                        if ($this->objPaginatorAlternate)
                            $this->objPaginatorAlternate->UseAjax = $this->blnUseAjax;

                        $this->blnModified = true;
                        break;
                    } catch (QInvalidCastException $objExc) {
                        $objExc->IncrementOffset();
                        throw $objExc;
                    }
                case "ItemsPerPage":
                    if ($this->objPaginator) {
                        try {
                            $intItemsPerPage = QType::Cast($mixValue, QType::Integer);
                            $this->objPaginator->ItemsPerPage = $intItemsPerPage;

                            if ($this->objPaginatorAlternate) {
                                $this->objPaginatorAlternate->ItemsPerPage = $intItemsPerPage;
                            }

                            $this->blnModified = true;
                            break;
                        } catch (QCallerException $objExc) {
                            $objExc->IncrementOffset();
                            throw $objExc;
                        }
                    } else
                        throw new QCallerException('Setting ItemsPerPage requires a Paginator to be set');
                case "TotalItemCount":
                    if ($this->objPaginator) {
                        try {
                            $intTotalCount = QType::Cast($mixValue, QType::Integer);
                            $this->objPaginator->TotalItemCount = $intTotalCount;

                            if ($this->objPaginatorAlternate) {
                                $this->objPaginatorAlternate->TotalItemCount = $intTotalCount;
                            }

                            $this->blnModified = true;
                            break;
                        } catch (QCallerException $objExc) {
                            $objExc->IncrementOffset();
                            throw $objExc;
                        }
                    } else
                        throw new QCallerException('Setting TotalItemCount requires a Paginator to be set');

                // MISC
                case "DataSource": 
                    $this->objDataSource = $mixValue;
                    $this->blnModified = true;
                    break;

                case "PageNumber":
                    if ($this->objPaginator) {
                        try {
                            $intPageNumber = QType::Cast($mixValue, QType::Integer);
                            $this->objPaginator->PageNumber = $intPageNumber;

                            if ($this->objPaginatorAlternate) {
                                $this->objPaginatorAlternate->PageNumber = $intPageNumber;
                            }
                            $this->blnModified = true;
                            break;
                        } catch (QCallerException $objExc) {
                            $objExc->IncrementOffset();
                            throw $objExc;
                        }
                    } else
                        throw new QCallerException('Setting PageNumber requires a Paginator to be set');

                default:
                    try {
                        parent::__set($strName, $mixValue);
                        break;
                    } catch (QCallerException $objExc) {
                        $objExc->IncrementOffset();
                        throw $objExc;
                    }
            }
        }
    }