      1: <?php
      2:
      3: // include the config file
      4: if(!isset($config)) {
      5:     require_once '../util/AlphaConfig.inc';
      6:     $config = AlphaConfig::getInstance();
      7:
      8:     require_once $config->get('app.root').'alpha/util/AlphaAutoLoader.inc';
      9: }
     10:
     11: /**
     12:  *
     13:  * Controller used to list a BO, which must be supplied in GET vars
     14:  *
     15:  * @package alpha::controller
     16:  * @since 1.0
     17:  * @author John Collins <dev@alphaframework.org>
     18:  * @version $Id: ListAll.php 1548 2012-07-29 17:07:07Z alphadevx $
     19:  * @license http://www.opensource.org/licenses/bsd-license.php The BSD License
     20:  * @copyright Copyright (c) 2012, John Collins (founder of Alpha Framework).
     21:  * All rights reserved.
     22:  *
     23:  * <pre>
     24:  * Redistribution and use in source and binary forms, with or
     25:  * without modification, are permitted provided that the
     26:  * following conditions are met:
     27:  *
     28:  * * Redistributions of source code must retain the above
     29:  *   copyright notice, this list of conditions and the
     30:  *   following disclaimer.
     31:  * * Redistributions in binary form must reproduce the above
     32:  *   copyright notice, this list of conditions and the
     33:  *   following disclaimer in the documentation and/or other
     34:  *   materials provided with the distribution.
     35:  * * Neither the name of the Alpha Framework nor the names
     36:  *   of its contributors may be used to endorse or promote
     37:  *   products derived from this software without specific
     38:  *   prior written permission.
     39:  *
     40:  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
     41:  * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
     42:  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     43:  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     44:  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
     45:  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     46:  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     47:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     48:  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     49:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     50:  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
     51:  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     52:  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     53:  * </pre>
     54:  *
     55:  */
     56: class ListAll extends AlphaController implements AlphaControllerInterface {
     57:     /**
     58:      * The name of the BO
     59:      *
     60:      * @var string
     61:      * @since 1.0
     62:      */
     63:     protected $BOname;
     64:
     65:     /**
     66:      * The new default AlphaView object used for rendering the onjects to list
     67:      *
     68:      * @var AlphaView
     69:      * @since 1.0
     70:      */
     71:     protected $BOView;
     72:
     73:     /**
     74:      * The start number for list pageination
     75:      *
     76:      * @var integer
     77:      * @since 1.0
     78:      */
     79:     protected $startPoint;
     80:
     81:     /**
     82:      * The count of the BOs of this type in the database
     83:      *
     84:      * @var integer
     85:      * @since 1.0
     86:      */
     87:     protected $BOCount = 0;
     88:
     89:     /**
     90:      * The field name to sort the list by (optional, default is OID)
     91:      *
     92:      * @var string
     93:      * @since 1.0
     94:      */
     95:     protected $sort;
     96:
     97:     /**
     98:      * The order to sort the list by (optional, should be ASC or DESC, default is ASC)
     99:      *
    100:      * @var string
    101:      * @since 1.0
    102:      */
    103:     protected $order;
    104:
    105:     /**
    106:      * The name of the BO field to filter the list by (optional)
    107:      *
    108:      * @var string
    109:      * @since 1.0
    110:      */
    111:     protected $filterField;
    112:
    113:     /**
    114:      * The value of the filterField to filter by (optional)
    115:      *
    116:      * @var string
    117:      * @since 1.0
    118:      */
    119:     protected $filterValue;
    120:
    121:     /**
    122:      * Trace logger
    123:      *
    124:      * @var Logger
    125:      * @since 1.0
    126:      */
    127:     private static $logger = null;
    128:
    129:     /**
    130:      * Constructor to set up the object
    131:      *
    132:      * @param string $visibility
    133:      * @since 1.0
    134:      */
    135:     public function __construct($visibility='Admin') {
    136:         self::$logger = new Logger('ListAll');
    137:         self::$logger->debug('>>__construct()');
    138:
    139:         global $config;
    140:
    141:         // ensure that the super class constructor is called, indicating the rights group
    142:         parent::__construct($visibility);
    143:
    144:         self::$logger->debug('<<__construct');
    145:     }
    146:
    147:     /**
    148:      * Handle GET requests
    149:      *
    150:      * @param array $params
    151:      * @since 1.0
    152:      */
    153:     public function doGET($params) {
    154:         self::$logger->debug('>>doGET($params=['.var_export($params, true).'])');
    155:
    156:         try{
    157:             // load the business object (BO) definition
    158:             if (isset($params['bo'])) {
    159:                 $BOname = $params['bo'];
    160:                 $this->BOname = $BOname;
    161:             }elseif(isset($this->BOname)) {
    162:                 $BOname = $this->BOname;
    163:             }else{
    164:                 throw new IllegalArguementException('No BO available to list!');
    165:             }
    166:
    167:             if (isset($params['order'])) {
    168:                 if($params['order'] == 'ASC' || $params['order'] == 'DESC')
    169:                     $this->order = $params['order'];
    170:                 else
    171:                     throw new IllegalArguementException('Order value ['.$params['order'].'] provided is invalid!');
    172:             }
    173:
    174:             if (isset($params['sort']))
    175:                 $this->sort = $params['sort'];
    176:
    177:             AlphaDAO::loadClassDef($BOname);
    178:
    179:             /*
    180:              *  check and see if a custom create controller exists for this BO, and if it does use it otherwise continue
    181:              */
    182:             if($this->getCustomControllerName($BOname, 'list') != null)
    183:                 $this->loadCustomController($BOname, 'list');
    184:
    185:             $this->BO = new $BOname();
    186:             $this->BOView = AlphaView::getInstance($this->BO);
    187:
    188:             echo AlphaView::displayPageHead($this);
    189:         }catch(IllegalArguementException $e) {
    190:             self::$logger->error($e->getMessage());
    191:         }
    192:
    193:         $this->displayBodyContent();
    194:
    195:         echo AlphaView::displayPageFoot($this);
    196:
    197:         self::$logger->debug('<<doGET');
    198:     }
    199:
    200:     /**
    201:      * Handle POST requests
    202:      *
    203:      * @param array $params
    204:      * @since 1.0
    205:      */
    206:     public function doPOST($params) {
    207:         self::$logger->debug('>>doPOST($params=['.var_export($params, true).'])');
    208:
    209:         try{
    210:             // check the hidden security fields before accepting the form POST data
    211:             if(!$this->checkSecurityFields()) {
    212:                 throw new SecurityException('This page cannot accept post data from remote servers!');
    213:                 self::$logger->debug('<<doPOST');
    214:             }
    215:
    216:             // load the business object (BO) definition
    217:             if (isset($params['bo'])) {
    218:                 $BOname = $params['bo'];
    219:                 $this->BOname = $BOname;
    220:             }elseif(isset($this->BOname)) {
    221:                 $BOname = $this->BOname;
    222:             }else{
    223:                 throw new IllegalArguementException('No BO available to list!');
    224:             }
    225:
    226:             if (isset($params['order'])) {
    227:                 if($params['order'] == 'ASC' || $params['order'] == 'DESC')
    228:                     $this->order = $params['order'];
    229:                 else
    230:                     throw new IllegalArguementException('Order value ['.$params['order'].'] provided is invalid!');
    231:             }
    232:
    233:             if (isset($params['sort']))
    234:                 $this->sort = $params['sort'];
    235:
    236:             AlphaDAO::loadClassDef($BOname);
    237:
    238:             $this->BO = new $BOname();
    239:             $this->BOname = $BOname;
    240:             $this->BOView = AlphaView::getInstance($this->BO);
    241:
    242:             echo AlphaView::displayPageHead($this);
    243:
    244:             if (!empty($params['deleteOID'])) {
    245:                 if(!AlphaValidator::isInteger($params['deleteOID']))
    246:                         throw new IllegalArguementException('Invalid deleteOID ['.$params['deleteOID'].'] provided on the request!');
    247:
    248:                 try {
    249:                     $temp = new $BOname();
    250:                     $temp->load($params['deleteOID']);
    251:
    252:                     AlphaDAO::begin();
    253:                     $temp->delete();
    254:                     AlphaDAO::commit();
    255:
    256:                     echo AlphaView::displayUpdateMessage($BOname.' '.$params['deleteOID'].' deleted successfully.');
    257:
    258:                     $this->displayBodyContent();
    259:                 }catch(AlphaException $e) {
    260:                     self::$logger->error($e->getMessage());
    261:                     echo AlphaView::displayErrorMessage('Error deleting the BO of OID ['.$params['deleteOID'].'], check the log!');
    262:                     AlphaDAO::rollback();
    263:                 }
    264:
    265:                 AlphaDAO::disconnect();
    266:             }
    267:         }catch(SecurityException $e) {
    268:             echo AlphaView::displayErrorMessage($e->getMessage());
    269:             self::$logger->warn($e->getMessage());
    270:         }catch(IllegalArguementException $e) {
    271:             echo AlphaView::displayErrorMessage($e->getMessage());
    272:             self::$logger->error($e->getMessage());
    273:         }
    274:
    275:         echo AlphaView::displayPageFoot($this);
    276:
    277:         self::$logger->debug('<<doPOST');
    278:     }
    279:
    280:     /**
    281:      * Sets up the title etc. and pagination start point
    282:      *
    283:      * @since 1.0
    284:      */
    285:     public function before_displayPageHead_callback() {
    286:         // set up the title and meta details
    287:         if(!isset($this->title))
    288:             $this->setTitle('Listing all '.$this->BOname);
    289:         if(!isset($this->description))
    290:             $this->setDescription('Page listing all '.$this->BOname.'.');
    291:         if(!isset($this->keywords))
    292:             $this->setKeywords('list,all,'.$this->BOname);
    293:         // set the start point for the list pagination
    294:         if (isset($_GET['start']) ? $this->startPoint = $_GET['start']: $this->startPoint = 1);
    295:     }
    296:
    297:     /**
    298:      * Method to display the page footer with pageination links
    299:      *
    300:      * @return string
    301:      * @since 1.0
    302:      */
    303:     public function before_displayPageFoot_callback() {
    304:         $html = $this->renderPageLinks();
    305:
    306:         $html .= '<br>';
    307:
    308:         return $html;
    309:     }
    310:
    311:     /**
    312:      * Method for rendering the pagination links
    313:      *
    314:      * @return string
    315:      * @since 1.0
    316:      */
    317:     protected function renderPageLinks() {
    318:         global $config;
    319:
    320:         $html = '';
    321:
    322:         $end = (($this->startPoint-1)+$config->get('app.list.page.amount'));
    323:
    324:         if($end > $this->BOCount)
    325:             $end = $this->BOCount;
    326:
    327:         if($this->BOCount > 0)
    328:             $html .= '<p align="center">Displaying '.($this->startPoint).' to '.$end.' of <strong>'.$this->BOCount.'</strong>.&nbsp;&nbsp;';
    329:         else
    330:             $html .= '<p align="center">The list is empty.&nbsp;&nbsp;';
    331:
    332:         if ($this->startPoint > 1) {
    333:             // handle secure URLs
    334:             if(isset($_GET['tk']))
    335:                 $html .= '<a href="'.FrontController::generateSecureURL('act=ListAll&bo='.$this->BOname.'&start='.($this->startPoint-$config->get('app.list.page.amount'))).'">&lt;&lt;-Previous</a>&nbsp;&nbsp;';
    336:             else
    337:                 $html .= '<a href="'.$_SERVER["PHP_SELF"].'?bo='.$this->BOname."&start=".($this->startPoint-$config->get('app.list.page.amount')).'">&lt;&lt;-Previous</a>&nbsp;&nbsp;';
    338:         }elseif($this->BOCount > $config->get('app.list.page.amount')){
    339:             $html .= '&lt;&lt;-Previous&nbsp;&nbsp;';
    340:         }
    341:         $page = 1;
    342:         for ($i = 0; $i < $this->BOCount; $i+=$config->get('app.list.page.amount')) {
    343:             if($i != ($this->startPoint-1)) {
    344:                 // handle secure URLs
    345:                 if(isset($_GET['tk']))
    346:                     $html .= '&nbsp;<a href="'.FrontController::generateSecureURL('act=ListAll&bo='.$this->BOname.'&start='.($i+1)).'">'.$page.'</a>&nbsp;';
    347:                 else
    348:                     $html .= '&nbsp;<a href="'.$_SERVER["PHP_SELF"].'?bo='.$this->BOname."&start=".($i+1).'">'.$page.'</a>&nbsp;';
    349:             }elseif($this->BOCount > $config->get('app.list.page.amount')){
    350:                 $html .= '&nbsp;'.$page.'&nbsp;';
    351:             }
    352:             $page++;
    353:         }
    354:         if ($this->BOCount > $end) {
    355:             // handle secure URLs
    356:             if(isset($_GET['tk']))
    357:                 $html .= '&nbsp;&nbsp;<a href="'.FrontController::generateSecureURL('act=ListAll&bo='.$this->BOname.'&start='.($this->startPoint+$config->get('app.list.page.amount'))).'">Next-&gt;&gt;</a>';
    358:             else
    359:                 $html .= '&nbsp;&nbsp;<a href="'.$_SERVER["PHP_SELF"].'?bo='.$this->BOname."&start=".($this->startPoint+$config->get('app.list.page.amount')).
    360:                     '">Next-&gt;&gt;</a>';
    361:         }elseif($this->BOCount > $config->get('app.list.page.amount')){
    362:             $html .= '&nbsp;&nbsp;Next-&gt;&gt;';
    363:         }
    364:         $html .= '</p>';
    365:
    366:         return $html;
    367:     }
    368:
    369:     /**
    370:      * Method to display the main body HTML for this page
    371:      *
    372:      * @since 1.0
    373:      */
    374:     protected function displayBodyContent() {
    375:         global $config;
    376:
    377:         // get all of the BOs and invoke the listView on each one
    378:         $temp = new $this->BOname;
    379:
    380:         if(isset($this->filterField) && isset($this->filterValue)) {
    381:             if(isset($this->sort) && isset($this->order)) {
    382:                 $objects = $temp->loadAllByAttribute($this->filterField, $this->filterValue, $this->startPoint-1, $config->get('app.list.page.amount'),
    383:                     $this->sort, $this->order);
    384:             }else{
    385:                 $objects = $temp->loadAllByAttribute($this->filterField, $this->filterValue, $this->startPoint-1, $config->get('app.list.page.amount'));
    386:             }
    387:
    388:             $this->BOCount = $temp->getCount(array($this->filterField), array($this->filterValue));
    389:         }else{
    390:             if(isset($this->sort) && isset($this->order))
    391:                 $objects = $temp->loadAll($this->startPoint-1, $config->get('app.list.page.amount'), $this->sort, $this->order);
    392:             else
    393:                 $objects = $temp->loadAll($this->startPoint-1, $config->get('app.list.page.amount'));
    394:
    395:             $this->BOCount = $temp->getCount();
    396:         }
    397:
    398:         AlphaDAO::disconnect();
    399:
    400:         echo AlphaView::renderDeleteForm();
    401:
    402:         foreach($objects as $object) {
    403:             $temp = AlphaView::getInstance($object);
    404:             $temp->listView();
    405:         }
    406:     }
    407:
    408:     /**
    409:      * Use this callback to inject in the admin menu template fragment for admin users of
    410:      * the backend only.
    411:      *
    412:      * @since 1.2
    413:      */
    414:     public function after_displayPageHead_callback() {
    415:         $menu = '';
    416:
    417:         if (isset($_SESSION['currentUser']) && AlphaDAO::isInstalled() && $_SESSION['currentUser']->inGroup('Admin') && strpos($_SERVER['REQUEST_URI'], '/tk/') !== false) {
    418:             $menu .= AlphaView::loadTemplateFragment('html', 'adminmenu.phtml', array());
    419:         }
    420:
    421:         return $menu;
    422:     }
    423: }
    424:
    425: // now build the new controller
    426: if(basename($_SERVER['PHP_SELF']) == 'ListAll.php') {
    427:     $controller = new ListAll();
    428:
    429:     if(!empty($_POST)) {
    430:         $controller->doPOST($_REQUEST);
    431:     }else{
    432:         $controller->doGET($_GET);
    433:     }
    434: }
    435:
    436: ?>