       1: <?php
       2:
       3: /**
       4:  * HTML renderer.  Will invoke widgets from the alpha::view::widgets package
       5:  * automatically for the correct data type.  Templates from ./templates/html
       6:  * loaded by default, but these can be overridden on a per-DAO level in
       7:  * the application when required (consider the default ones to be scaffolding).
       8:  *
       9:  * @package alpha::view::renderers
      10:  * @since 1.2
      11:  * @author John Collins <dev@alphaframework.org>
      12:  * @version $Id: AlphaRendererProviderInterface.inc 1499 2012-02-16 19:29:16Z alphadev $
      13:  * @license http://www.opensource.org/licenses/bsd-license.php The BSD License
      14:  * @copyright Copyright (c) 2014, John Collins (founder of Alpha Framework).
      15:  * All rights reserved.
      16:  *
      17:  * <pre>
      18:  * Redistribution and use in source and binary forms, with or
      19:  * without modification, are permitted provided that the
      20:  * following conditions are met:
      21:  *
      22:  * * Redistributions of source code must retain the above
      23:  *   copyright notice, this list of conditions and the
      24:  *   following disclaimer.
      25:  * * Redistributions in binary form must reproduce the above
      26:  *   copyright notice, this list of conditions and the
      27:  *   following disclaimer in the documentation and/or other
      28:  *   materials provided with the distribution.
      29:  * * Neither the name of the Alpha Framework nor the names
      30:  *   of its contributors may be used to endorse or promote
      31:  *   products derived from this software without specific
      32:  *   prior written permission.
      33:  *
      34:  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
      35:  * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
      36:  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
      37:  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
      38:  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
      39:  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
      40:  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
      41:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
      42:  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
      43:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
      44:  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
      45:  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
      46:  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
      47:  * </pre>
      48:  *
      49:  */
      50: class AlphaRendererProviderHTML implements AlphaRendererProviderInterface {
      51:     /**
      52:      * Trace logger
      53:      *
      54:      * @var Logger
      55:      * @since 1.2
      56:      */
      57:     private static $logger = null;
      58:
      59:     /**
      60:      * The business object that we are renderering
      61:      *
      62:      * @var AlphaDAO
      63:      * @since 1.2
      64:      */
      65:     private $BO;
      66:
      67:     /**
      68:      * The constructor
      69:      *
      70:      * @since 1.2
      71:      */
      72:     public function __construct() {
      73:         self::$logger = new Logger('AlphaRendererProviderHTML');
      74:         self::$logger->debug('>>__construct()');
      75:
      76:         self::$logger->debug('<<__construct');
      77:     }
      78:
      79:     /**
      80:      * (non-PHPdoc)
      81:      * @see alpha/view/renderers/AlphaRendererProvider::setBO()
      82:      */
      83:     public function setBO($BO) {
      84:         $this->BO = $BO;
      85:     }
      86:
      87:     /**
      88:      * (non-PHPdoc)
      89:      * @see alpha/view/renderers/AlphaRendererProviderInterface::createView()
      90:      */
      91:     public function createView($fields=array()) {
      92:         self::$logger->debug('>>createView(fields=['.var_export($fields, true).'])');
      93:
      94:         global $config;
      95:
      96:         // the form action
      97:         $fields['formAction'] = $_SERVER['REQUEST_URI'];
      98:
      99:         // the form ID
     100:         $fields['formID'] = get_class($this->BO).'_'.$this->BO->getOID();
     101:
     102:         // buffer form fields to $formFields
     103:         $fields['formFields'] = $this->renderAllFields('create');
     104:
     105:         // buffer HTML output for Create and Cancel buttons
     106:         $button = new Button('submit', 'Create', 'createBut');
     107:         $fields['createButton'] = $button->render();
     108:
     109:         $button = new Button("document.location.replace('".FrontController::generateSecureURL('act=ListBusinessObjects')."')", 'Cancel', 'cancelBut');
     110:         $fields['cancelButton'] = $button->render();
     111:
     112:         // buffer security fields to $formSecurityFields variable
     113:         $fields['formSecurityFields'] = self::renderSecurityFields();
     114:
     115:         self::$logger->debug('<<createView [HTML]');
     116:         return AlphaView::loadTemplate($this->BO, 'create', $fields);
     117:     }
     118:
     119:     /**
     120:      * (non-PHPdoc)
     121:      * @see alpha/view/renderers/AlphaRendererProviderInterface::editView()
     122:      */
     123:     public function editView($fields=array()) {
     124:         self::$logger->debug('>>editView(fields=['.var_export($fields, true).'])');
     125:
     126:         global $config;
     127:
     128:         // the form action
     129:         $fields['formAction'] = $_SERVER['REQUEST_URI'];
     130:
     131:         // the form ID
     132:         $fields['formID'] = get_class($this->BO).'_'.$this->BO->getOID();
     133:
     134:         // buffer form fields to $formFields
     135:         $fields['formFields'] = $this->renderAllFields('edit');
     136:
     137:         // buffer HTML output for Create and Cancel buttons
     138:         $button = new Button('submit', 'Save', 'saveBut');
     139:         $fields['saveButton'] = $button->render();
     140:
     141:         $js = "if(window.jQuery) {
     142:                     BootstrapDialog.show({
     143:                         title: 'Confirmation',
     144:                         message: 'Are you sure you wish to delete this item?',
     145:                         buttons: [
     146:                             {
     147:                                 icon: 'glyphicon glyphicon-remove',
     148:                                 label: 'Cancel',
     149:                                 cssClass: 'btn btn-default btn-xs',
     150:                                 action: function(dialogItself){
     151:                                     dialogItself.close();
     152:                                 }
     153:                             },
     154:                             {
     155:                                 icon: 'glyphicon glyphicon-ok',
     156:                                 label: 'Okay',
     157:                                 cssClass: 'btn btn-default btn-xs',
     158:                                 action: function(dialogItself) {
     159:                                     $('[id=\"".($config->get('security.encrypt.http.fieldnames') ? base64_encode(AlphaSecurityUtils::encrypt('deleteOID')) : 'deleteOID')."\"]').attr('value', '".$this->BO->getOID()."');
     160:                                     $('#deleteForm').submit();
     161:                                     dialogItself.close();
     162:                                 }
     163:                             }
     164:                         ]
     165:                     });
     166:                 }";
     167:         $button = new Button($js, "Delete", "deleteBut");
     168:         $fields['deleteButton'] = $button->render();
     169:
     170:         $button = new Button("document.location = '".FrontController::generateSecureURL('act=ListAll&bo='.get_class($this->BO))."'", "Back to List", "cancelBut");
     171:         $fields['cancelButton'] = $button->render();
     172:
     173:         // buffer security fields to $formSecurityFields variable
     174:         $fields['formSecurityFields'] = self::renderSecurityFields();
     175:
     176:         // OID will need to be posted for optimistic lock checking
     177:         $fields['version_num'] = $this->BO->getVersionNumber();
     178:
     179:         self::$logger->debug('<<editView [HTML]');
     180:         return AlphaView::loadTemplate($this->BO, 'edit', $fields);
     181:     }
     182:
     183:     /**
     184:      * (non-PHPdoc)
     185:      * @see alpha/view/renderers/AlphaRendererProviderInterface::listView()
     186:      */
     187:     public function listView($fields=array()) {
     188:         self::$logger->debug('>>listView(fields=['.var_export($fields, true).'])');
     189:
     190:         global $config;
     191:
     192:         // the form action
     193:         $fields['formAction'] = $_SERVER['REQUEST_URI'];
     194:
     195:         // work out how many columns will be in the table
     196:         $reflection = new ReflectionClass(get_class($this->BO));
     197:         $properties = array_keys($reflection->getDefaultProperties());
     198:         $fields['colCount'] = 1+count(array_diff($properties, $this->BO->getDefaultAttributes(), $this->BO->getTransientAttributes()));
     199:
     200:         // get the class attributes
     201:         $properties = $reflection->getProperties();
     202:
     203:         $html = '';
     204:
     205:         $html .= '<tr>';
     206:         foreach($properties as $propObj) {
     207:             $propName = $propObj->name;
     208:
     209:             // skip over password fields
     210:             $property = $this->BO->getPropObject($propName);
     211:             if(!($property instanceof String && $property->checkIsPassword())) {
     212:                 if (!in_array($propName, $this->BO->getDefaultAttributes()) && !in_array($propName, $this->BO->getTransientAttributes())) {
     213:                     $html .= '  <th>'.$this->BO->getDataLabel($propName).'</th>';
     214:                 }
     215:                 if ($propName == 'OID')
     216:                     $html .= '  <th>'.$this->BO->getDataLabel($propName).'</th>';
     217:             }else{
     218:                 $fields['colCount'] = $fields['colCount']-1;
     219:             }
     220:         }
     221:         $html .= '</tr><tr>';
     222:
     223:         $fields['formHeadings'] = $html;
     224:
     225:         $html = '';
     226:
     227:         // and now the values
     228:         foreach($properties as $propObj) {
     229:             $propName = $propObj->name;
     230:
     231:             $property = $this->BO->getPropObject($propName);
     232:             if(!($property instanceof String && $property->checkIsPassword())) {
     233:                 if (!in_array($propName, $this->BO->getDefaultAttributes()) && !in_array($propName, $this->BO->getTransientAttributes())) {
     234:                     $propClass = get_class($this->BO->getPropObject($propName));
     235:
     236:                     if ($propClass == 'Text') {
     237:                         $text = htmlentities($this->BO->get($propName), ENT_COMPAT, 'utf-8');
     238:                         if(mb_strlen($text) > 70)
     239:                             $html .= '  <td>&nbsp;'.mb_substr($text, 0, 70).'...</td>';
     240:                         else
     241:                             $html .= '  <td>&nbsp;'.$text.'</td>';
     242:                     }elseif($propClass == 'DEnum') {
     243:                         $html .= '  <td>&nbsp;'.$this->BO->getPropObject($propName)->getDisplayValue().'</td>';
     244:                     }else{
     245:                         $html .= '  <td>&nbsp;'.$this->BO->get($propName).'</td>';
     246:                     }
     247:                 }
     248:                 if ($propName == 'OID')
     249:                     $html .= '  <td>&nbsp;'.$this->BO->getOID().'</td>';
     250:             }
     251:         }
     252:         $html .= '</tr>';
     253:
     254:         $fields['formFields'] = $html;
     255:
     256:         // View button
     257:         if(mb_strpos($_SERVER['REQUEST_URI'], '/tk/') !== false) {
     258:             $button = new Button("document.location = '".FrontController::generateSecureURL('act=Detail&bo='.get_class($this->BO).'&oid='.$this->BO->getOID())."';", 'View', 'view'.$this->BO->getOID().'But');
     259:             $fields['viewButton'] = $button->render();
     260:         }else{
     261:             if($this->BO->hasAttribute('URL'))
     262:                 $button = new Button("document.location = '".$this->BO->get('URL')."';", 'View', 'view'.$this->BO->getOID().'But');
     263:             else
     264:                 $button = new Button("document.location = '".$config->get('app.url')."Detail/bo/".get_class($this->BO)."/oid/".$this->BO->getOID()."';", 'View', 'view'.$this->BO->getOID().'But');
     265:
     266:             $fields['viewButton'] = $button->render();
     267:         }
     268:
     269:         $html = '';
     270:         // render edit and delete buttons for admins only
     271:         if (isset($_SESSION['currentUser']) && $_SESSION['currentUser']->inGroup('Admin')) {
     272:             $html .= '&nbsp;&nbsp;';
     273:             $button = new Button("document.location = '".FrontController::generateSecureURL('act=Edit&bo='.get_class($this->BO)."&oid=".$this->BO->getOID())."'", "Edit", "edit".$this->BO->getOID()."But");
     274:             $html .= $button->render();
     275:             $html .= '&nbsp;&nbsp;';
     276:
     277:             $js = "if(window.jQuery) {
     278:                     BootstrapDialog.show({
     279:                         title: 'Confirmation',
     280:                         message: 'Are you sure you wish to delete this item?',
     281:                         buttons: [
     282:                             {
     283:                                 icon: 'glyphicon glyphicon-remove',
     284:                                 label: 'Cancel',
     285:                                 cssClass: 'btn btn-default btn-xs',
     286:                                 action: function(dialogItself){
     287:                                     dialogItself.close();
     288:                                 }
     289:                             },
     290:                             {
     291:                                 icon: 'glyphicon glyphicon-ok',
     292:                                 label: 'Okay',
     293:                                 cssClass: 'btn btn-default btn-xs',
     294:                                 action: function(dialogItself) {
     295:                                     $('[id=\"".($config->get('security.encrypt.http.fieldnames') ? base64_encode(AlphaSecurityUtils::encrypt('deleteOID')) : 'deleteOID')."\"]').attr('value', '".$this->BO->getOID()."');
     296:                                     $('#deleteForm').submit();
     297:                                     dialogItself.close();
     298:                                 }
     299:                             }
     300:                         ]
     301:                     });
     302:                 }";
     303:
     304:             $button = new Button($js, "Delete", "delete".$this->BO->getOID()."But");
     305:             $html .= $button->render();
     306:         }
     307:         $fields['adminButtons'] = $html;
     308:
     309:         // buffer security fields to $formSecurityFields variable
     310:         $fields['formSecurityFields'] = self::renderSecurityFields();
     311:
     312:         self::$logger->debug('<<listView [HTML]');
     313:         return AlphaView::loadTemplate($this->BO, 'list', $fields);
     314:     }
     315:
     316:     /**
     317:      * (non-PHPdoc)
     318:      * @see alpha/view/renderers/AlphaRendererProviderInterface::detailedView()
     319:      */
     320:     public function detailedView($fields=array()) {
     321:         self::$logger->debug('>>detailedView(fields=['.var_export($fields, true).'])');
     322:
     323:         global $config;
     324:
     325:         // we may want to display the OID regardless of class
     326:         $fields['OIDLabel'] = $this->BO->getDataLabel('OID');
     327:         $fields['OID'] = $this->BO->getOID();
     328:
     329:         // buffer form fields to $formFields
     330:         $fields['formFields'] = $this->renderAllFields('view');
     331:
     332:         // Back button
     333:         $button = new Button('history.back()', 'Back', 'backBut');
     334:         $fields['backButton'] = $button->render();
     335:
     336:         $html = '';
     337:         // render edit and delete buttons for admins only
     338:         if (isset($_SESSION['currentUser']) && $_SESSION['currentUser']->inGroup('Admin')) {
     339:
     340:             $button = new Button("document.location = '".FrontController::generateSecureURL('act=Edit&bo='.get_class($this->BO)."&oid=".$this->BO->getOID())."'", "Edit", "editBut");
     341:             $html .= $button->render();
     342:
     343:             $js = "if(window.jQuery) {
     344:                     BootstrapDialog.show({
     345:                         title: 'Confirmation',
     346:                         message: 'Are you sure you wish to delete this item?',
     347:                         buttons: [
     348:                             {
     349:                                 icon: 'glyphicon glyphicon-remove',
     350:                                 label: 'Cancel',
     351:                                 cssClass: 'btn btn-default btn-xs',
     352:                                 action: function(dialogItself){
     353:                                     dialogItself.close();
     354:                                 }
     355:                             },
     356:                             {
     357:                                 icon: 'glyphicon glyphicon-ok',
     358:                                 label: 'Okay',
     359:                                 cssClass: 'btn btn-default btn-xs',
     360:                                 action: function(dialogItself) {
     361:                                     $('[id=\"".($config->get('security.encrypt.http.fieldnames') ? base64_encode(AlphaSecurityUtils::encrypt('deleteOID')) : 'deleteOID')."\"]').attr('value', '".$this->BO->getOID()."');
     362:                                     $('#deleteForm').submit();
     363:                                     dialogItself.close();
     364:                                 }
     365:                             }
     366:                         ]
     367:                     });
     368:                 }";
     369:
     370:             $button = new Button($js, "Delete", "deleteBut");
     371:             $html .= $button->render();
     372:         }
     373:         $fields['adminButtons'] = $html;
     374:
     375:         self::$logger->debug('<<detailedView [HTML]');
     376:         return AlphaView::loadTemplate($this->BO, 'detail', $fields);
     377:     }
     378:
     379:     /**
     380:      * (non-PHPdoc)
     381:      * @see alpha/view/renderers/AlphaRendererProviderInterface::adminView()
     382:      */
     383:     public function adminView($fields=array()) {
     384:         self::$logger->debug('>>adminView(fields=['.var_export($fields, true).'])');
     385:
     386:         global $config;
     387:
     388:         // the form action
     389:         $fields['formAction'] = $_SERVER['REQUEST_URI'];
     390:
     391:         // the class name of the BO
     392:         $fields['className'] = get_class($this->BO);
     393:
     394:         // the table name in the DB for the BO
     395:         $fields['tableName'] = $this->BO->getTableName();
     396:
     397:         // record count for the BO in the DB
     398:         $fields['count'] = ($this->BO->checkTableExists() ? $this->BO->getCount() : '<span class="warning">unavailable</span>');
     399:
     400:         // table exists in the DB?
     401:         $fields['tableExists'] = ($this->BO->checkTableExists() ? '<span class="success">Yes</span>' : '<span class="warning">No</span>');
     402:
     403:         if($this->BO->getMaintainHistory())
     404:             $fields['tableExists'] = ($this->BO->checkTableExists(true) ? '<span class="success">Yes</span>' : '<span class="warning">No history table</span>');
     405:
     406:         // table schema needs to be updated in the DB?
     407:         $fields['tableNeedsUpdate'] = ($this->BO->checkTableNeedsUpdate() ? '<span class="warning">Yes</span>' : '<span class="success">No</span>');
     408:
     409:         // create button
     410:         if($this->BO->checkTableExists()) {
     411:             $button = new Button("document.location = '".FrontController::generateSecureURL('act=Create&bo='.get_class($this->BO))."'", "Create New", "create".get_class($this->BO)."But");
     412:             $fields['createButton'] = $button->render();
     413:         }else{
     414:             $fields['createButton'] = '';
     415:         }
     416:
     417:         // list all button
     418:         if($this->BO->checkTableExists()) {
     419:             $button = new Button("document.location = '".FrontController::generateSecureURL('act=ListAll&bo='.get_class($this->BO))."'", "List All", "list".get_class($this->BO)."But");
     420:             $fields['listButton'] = $button->render();
     421:         }else{
     422:             $fields['listButton'] = '';
     423:         }
     424:
     425:         // the create table button (if required)
     426:         $html = '';
     427:
     428:         if (!$this->BO->checkTableExists()) {
     429:             $fieldname = ($config->get('security.encrypt.http.fieldnames') ? base64_encode(AlphaSecurityUtils::encrypt('createTableBut')) : 'createTableBut');
     430:             $button = new Button('submit', 'Create Table', $fieldname);
     431:             $html .= $button->render();
     432:             // hidden field so that we know which class to create the table for
     433:             $fieldname = ($config->get('security.encrypt.http.fieldnames') ? base64_encode(AlphaSecurityUtils::encrypt('createTableClass')) : 'createTableClass');
     434:             $html .= '<input type="hidden" name="'.$fieldname.'" value="'.get_class($this->BO).'"/>';
     435:         }
     436:
     437:         if ($html == '' && $this->BO->getMaintainHistory() && !$this->BO->checkTableExists(true)) {
     438:             $fieldname = ($config->get('security.encrypt.http.fieldnames') ? base64_encode(AlphaSecurityUtils::encrypt('createHistoryTableBut')) : 'createHistoryTableBut');
     439:             $button = new Button('submit', 'Create History Table', $fieldname);
     440:             $html .= $button->render();
     441:             // hidden field so that we know which class to create the table for
     442:             $fieldname = ($config->get('security.encrypt.http.fieldnames') ? base64_encode(AlphaSecurityUtils::encrypt('createTableClass')) : 'createTableClass');
     443:             $html .= '<input type="hidden" name="'.$fieldname.'" value="'.get_class($this->BO).'"/>';
     444:         }
     445:         $fields['createTableButton'] = $html;
     446:
     447:         // recreate and update table buttons (if required)
     448:         $html = '';
     449:         if ($this->BO->checkTableNeedsUpdate() && $this->BO->checkTableExists()) {
     450:
     451:             $js = "if(window.jQuery) {
     452:                     BootstrapDialog.show({
     453:                         title: 'Confirmation',
     454:                         message: 'Are you sure you wish to recreate this class table (all data will be lost)?',
     455:                         buttons: [
     456:                             {
     457:                                 icon: 'glyphicon glyphicon-remove',
     458:                                 label: 'Cancel',
     459:                                 cssClass: 'btn btn-default btn-xs',
     460:                                 action: function(dialogItself){
     461:                                     dialogItself.close();
     462:                                 }
     463:                             },
     464:                             {
     465:                                 icon: 'glyphicon glyphicon-ok',
     466:                                 label: 'Okay',
     467:                                 cssClass: 'btn btn-default btn-xs',
     468:                                 action: function(dialogItself) {
     469:                                     $('[Id=\"".($config->get('security.encrypt.http.fieldnames') ? base64_encode(AlphaSecurityUtils::encrypt('admin_'.get_class($this->BO).'_button_pressed')) : 'admin_'.get_class($this->BO).'_button_pressed')."\"]').attr('value', 'recreateTableBut');
     470:                                     $('#admin_".get_class($this->BO)."').submit();
     471:                                     dialogItself.close();
     472:                                 }
     473:                             }
     474:                         ]
     475:                     });
     476:                 }";
     477:
     478:             $button = new Button($js , "Recreate Table", "recreateTableBut");
     479:             $html .= $button->render();
     480:             // hidden field so that we know which class to recreate the table for
     481:             $html .= '<input type="hidden" name="recreateTableClass" value="'.get_class($this->BO).'"/>';
     482:             $html .= '&nbsp;&nbsp;';
     483:
     484:             $js = "if(window.jQuery) {
     485:                     BootstrapDialog.show({
     486:                         title: 'Confirmation',
     487:                         message: 'Are you sure you wish to attempt to modify this class table by adding new attributes?',
     488:                         buttons: [
     489:                             {
     490:                                 icon: 'glyphicon glyphicon-remove',
     491:                                 label: 'Cancel',
     492:                                 cssClass: 'btn btn-default btn-xs',
     493:                                 action: function(dialogItself){
     494:                                     dialogItself.close();
     495:                                 }
     496:                             },
     497:                             {
     498:                                 icon: 'glyphicon glyphicon-ok',
     499:                                 label: 'Okay',
     500:                                 cssClass: 'btn btn-default btn-xs',
     501:                                 action: function(dialogItself) {
     502:                                     $('[Id=\"".($config->get('security.encrypt.http.fieldnames') ? base64_encode(AlphaSecurityUtils::encrypt('admin_'.get_class($this->BO).'_button_pressed')) : 'admin_'.get_class($this->BO).'_button_pressed')."\"]').attr('value', 'updateTableBut');
     503:                                     $('#admin_".get_class($this->BO)."').submit();
     504:                                     dialogItself.close();
     505:                                 }
     506:                             }
     507:                         ]
     508:                     });
     509:                 }";
     510:
     511:             $button = new Button($js , "Update Table", "updateTableBut");
     512:             $html .= $button->render();
     513:             // hidden field so that we know which class to update the table for
     514:             $fieldname = ($config->get('security.encrypt.http.fieldnames') ? base64_encode(AlphaSecurityUtils::encrypt('updateTableClass')) : 'updateTableClass');
     515:             $html .= '<input type="hidden" name="'.$fieldname.'" value="'.get_class($this->BO).'"/>';
     516:             // hidden field to tell us which button was pressed
     517:             $fieldname = ($config->get('security.encrypt.http.fieldnames') ? base64_encode(AlphaSecurityUtils::encrypt('admin_'.get_class($this->BO).'_button_pressed')) : 'admin_'.get_class($this->BO).'_button_pressed');
     518:             $html .= '<input type="hidden" id="'.$fieldname.'" name="'.$fieldname.'" value=""/>';
     519:         }
     520:         $fields['recreateOrUpdateButtons'] = $html;
     521:
     522:         // buffer security fields to $formSecurityFields variable
     523:         $fields['formSecurityFields'] = self::renderSecurityFields();
     524:
     525:         self::$logger->debug('<<adminView [HTML]');
     526:         return AlphaView::loadTemplate($this->BO, 'admin', $fields);
     527:     }
     528:
     529:     /**
     530:      * (non-PHPdoc)
     531:      * @see alpha/view/renderers/AlphaRendererProviderInterface::displayPageHead()
     532:      */
     533:     public static function displayPageHead($controller) {
     534:         if(self::$logger == null)
     535:             self::$logger = new Logger('AlphaRendererProviderHTML');
     536:
     537:         self::$logger->debug('>>displayPageHead(controller=['.var_export($controller, true).'])');
     538:
     539:         global $config;
     540:
     541:         if(!AlphaController::checkControllerDefExists(get_class($controller)))
     542:             throw new IllegalArguementException('The controller provided ['.get_class($controller).'] is not defined anywhere!');
     543:
     544:         $allowCSSOverrides = true;
     545:
     546:         if (isset($_SESSION['currentUser']) && AlphaDAO::isInstalled() && $_SESSION['currentUser']->inGroup('Admin') && mb_strpos($_SERVER['REQUEST_URI'], '/tk/') !== false) {
     547:             $allowCSSOverrides = false;
     548:         }
     549:
     550:         $html = AlphaView::loadTemplateFragment('html', 'head.phtml', array('title' => $controller->getTitle(), 'description' => $controller->getDescription(), 'allowCSSOverrides' => $allowCSSOverrides));
     551:
     552:         if(method_exists($controller, 'during_displayPageHead_callback'))
     553:             $html.= $controller->during_displayPageHead_callback();
     554:
     555:         $html.= '</head>';
     556:
     557:         try {
     558:             if($controller->getBO() != null)
     559:                 $html.= '<body'.($controller->getBO()->get('bodyOnload') != '' ? ' onload="'.$controller->getBO()->get('bodyOnload').'"' : '').'>';
     560:             else
     561:                 $html.= '<body>';
     562:         } catch (AlphaException $e) {
     563:             $html.= '<body>';
     564:         }
     565:
     566:         $html .= '<div class="container">';
     567:
     568:         if(method_exists($controller, 'insert_CMSDisplayStandardHeader_callback'))
     569:             $html.= $controller->insert_CMSDisplayStandardHeader_callback();
     570:
     571:
     572:         self::$logger->debug('<<displayPageHead [HTML]');
     573:         return $html;
     574:     }
     575:
     576:     /**
     577:      * (non-PHPdoc)
     578:      * @see alpha/view/renderers/AlphaRendererProviderInterface::displayPageFoot()
     579:      */
     580:     public static function displayPageFoot($controller) {
     581:         if(self::$logger == null)
     582:             self::$logger = new Logger('AlphaRendererProviderHTML');
     583:
     584:         self::$logger->debug('>>displayPageFoot(controller=['.get_class($controller).'])');
     585:
     586:
     587:         $html = AlphaView::loadTemplateFragment('html', 'footer.phtml', array());
     588:
     589:         self::$logger->debug('<<displayPageFoot ['.$html.']');
     590:         return $html;
     591:     }
     592:
     593:     /**
     594:      * (non-PHPdoc)
     595:      * @see alpha/view/renderers/AlphaRendererProviderInterface::displayUpdateMessage()
     596:      */
     597:     public static function displayUpdateMessage($message) {
     598:         if(self::$logger == null)
     599:             self::$logger = new Logger('AlphaRendererProviderHTML');
     600:         self::$logger->debug('>>displayUpdateMessage(message=['.$message.'])');
     601:
     602:         $html = '<div class="alert alert-success alert-dismissable"><button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>'.$message.'</div>';
     603:
     604:         self::$logger->debug('<<displayUpdateMessage ['.$html.']');
     605:         return $html;
     606:     }
     607:
     608:     /**
     609:      * (non-PHPdoc)
     610:      * @see alpha/view/renderers/AlphaRendererProviderInterface::displayErrorMessage()
     611:      */
     612:     public static function displayErrorMessage($message) {
     613:         if(self::$logger == null)
     614:             self::$logger = new Logger('AlphaRendererProviderHTML');
     615:         self::$logger->debug('>>displayErrorMessage(message=['.$message.'])');
     616:
     617:         $html = '<div class="alert alert-danger">'.$message.'</div>';
     618:
     619:         self::$logger->debug('<<displayErrorMessage ['.$html.']');
     620:         return $html;
     621:     }
     622:
     623:     /**
     624:      * (non-PHPdoc)
     625:      * @see alpha/view/renderers/AlphaRendererProviderInterface::renderErrorPage()
     626:      */
     627:     public static function renderErrorPage($code, $message) {
     628:         global $config;
     629:
     630:         $html = '<html><head>';
     631:         $html .= '<link rel="StyleSheet" type="text/css" href="'.$config->get('app.url').'alpha/lib/jquery/ui/themes/'.$config->get('app.css.theme').'/jquery.ui.all.css">';
     632:         $html .= '<link rel="StyleSheet" type="text/css" href="'.$config->get('app.url').'alpha/css/alpha.css">';
     633:         $html .= '<title>'.$code.' - '.$message.'</title></head>';
     634:         $html .= '<body>';
     635:         $html .= self::displayErrorMessage('<strong>'.$code.':</strong> '.$message);
     636:         $html .= '</body></html>';
     637:
     638:         return $html;
     639:     }
     640:
     641:     /**
     642:      * (non-PHPdoc)
     643:      * @see alpha/view/renderers/AlphaRendererProviderInterface::renderDeleteForm()
     644:      */
     645:     public static function renderDeleteForm() {
     646:         if(self::$logger == null)
     647:             self::$logger = new Logger('AlphaRendererProviderHTML');
     648:         self::$logger->debug('>>renderDeleteForm()');
     649:
     650:         global $config;
     651:
     652:         $html = '<form action="'.$_SERVER['REQUEST_URI'].'" method="POST" id="deleteForm" accept-charset="UTF-8">';
     653:         $fieldname = ($config->get('security.encrypt.http.fieldnames') ? base64_encode(AlphaSecurityUtils::encrypt('deleteOID')) : 'deleteOID');
     654:         $html .= '<input type="hidden" name="'.$fieldname.'" id="'.$fieldname.'" value=""/>';
     655:         $html .= self::renderSecurityFields();
     656:         $html .= '</form>';
     657:
     658:         self::$logger->debug('<<renderDeleteForm ['.$html.']');
     659:         return $html;
     660:     }
     661:
     662:     /**
     663:      * (non-PHPdoc)
     664:      * @see alpha/view/renderers/AlphaRendererProviderInterface::renderSecurityFields()
     665:      */
     666:     public static function renderSecurityFields() {
     667:         if(self::$logger == null)
     668:             self::$logger = new Logger('AlphaRendererProviderHTML');
     669:
     670:         self::$logger->debug('>>renderSecurityFields()');
     671:
     672:         global $config;
     673:
     674:         $html = '';
     675:
     676:         $fields = AlphaController::generateSecurityFields();
     677:
     678:         if($config->get('security.encrypt.http.fieldnames'))
     679:             $fieldname = base64_encode(AlphaSecurityUtils::encrypt('var1'));
     680:         else
     681:             $fieldname = 'var1';
     682:
     683:         $html .= '<input type="hidden" name="'.$fieldname.'" value="'.$fields[0].'"/>';
     684:
     685:         if($config->get('security.encrypt.http.fieldnames'))
     686:             $fieldname = base64_encode(AlphaSecurityUtils::encrypt('var2'));
     687:         else
     688:             $fieldname = 'var2';
     689:
     690:         $html .= '<input type="hidden" name="'.$fieldname.'" value="'.$fields[1].'"/>';
     691:
     692:         self::$logger->debug('<<renderSecurityFields ['.$html.']');
     693:         return $html;
     694:     }
     695:
     696:     /**
     697:      * (non-PHPdoc)
     698:      * @see alpha/view/renderers/AlphaRendererProviderInterface::renderIntegerField()
     699:      * @todo remove table tags and use Bootstrap CSS
     700:      */
     701:     public function renderIntegerField($name, $label, $mode, $value='') {
     702:         self::$logger->debug('>>renderIntegerField(name=['.$name.'], label=['.$label.'], mode=['.$mode.'], value=['.$value.'])');
     703:
     704:         global $config;
     705:
     706:         if($config->get('security.encrypt.http.fieldnames'))
     707:             $fieldname = base64_encode(AlphaSecurityUtils::encrypt($name));
     708:         else
     709:             $fieldname = $name;
     710:
     711:         $html = '<div class="form-group">';
     712:         $html .= '  <label for="'.$fieldname.'">'.$label.'</label>';
     713:
     714:         if ($mode == 'create') {
     715:             $html .= '<input type="text" style="width:100%;" name="'.$fieldname.'" value="'. (isset ($_POST[$name]) ? $_POST[$name] : '').'"/>';
     716:         }
     717:
     718:         if ($mode == 'edit') {
     719:             $html .= '<input type="text" style="width:100%;" name="'.$fieldname.'" value="'.$value.'"/>';
     720:         }
     721:
     722:         $html .= '</div>';
     723:
     724:         self::$logger->debug('<<renderIntegerField ['.$html.']');
     725:         return $html;
     726:     }
     727:
     728:     /**
     729:      * (non-PHPdoc)
     730:      * @see alpha/view/renderers/AlphaRendererProviderInterface::renderDoubleField()
     731:      * @todo remove table tags and use Bootstrap CSS
     732:      */
     733:     public function renderDoubleField($name, $label, $mode, $value='') {
     734:         self::$logger->debug('>>renderDoubleField(name=['.$name.'], label=['.$label.'], mode=['.$mode.'], value=['.$value.'])');
     735:
     736:         global $config;
     737:
     738:         if($config->get('security.encrypt.http.fieldnames'))
     739:             $fieldname = base64_encode(AlphaSecurityUtils::encrypt($name));
     740:         else
     741:             $fieldname = $name;
     742:
     743:         $html = '<div class="form-group">';
     744:         $html .= '  <label for="'.$fieldname.'">'.$label.'</label>';
     745:
     746:         if ($mode == 'create') {
     747:             $html .= '<input type="text" size="13" name="'.$fieldname.'" value="'. (isset ($_POST[$name]) ? $_POST[$name] : '').'"/>';
     748:         }
     749:
     750:         if ($mode == 'edit') {
     751:             $html .= '<input type="text" size="13" name="'.$fieldname.'" value="'.$value.'"/>';
     752:         }
     753:
     754:         $html .= '</div>';
     755:
     756:         self::$logger->debug('<<renderDoubleField ['.$html.']');
     757:         return $html;
     758:     }
     759:
     760:     /**
     761:      * (non-PHPdoc)
     762:      * @see alpha/view/renderers/AlphaRendererProviderInterface::renderBooleanField()
     763:      */
     764:     public function renderBooleanField($name, $label, $mode, $value='') {
     765:         self::$logger->debug('>>renderBooleanField(name=['.$name.'], label=['.$label.'], mode=['.$mode.'], value=['.$value.'])');
     766:
     767:         global $config;
     768:
     769:         if($config->get('security.encrypt.http.fieldnames'))
     770:             $fieldname = base64_encode(AlphaSecurityUtils::encrypt($name));
     771:         else
     772:             $fieldname = $name;
     773:
     774:         $html = '<div class="checkbox">';
     775:         $html .= '  <label>';
     776:
     777:         if ($mode == 'create') {
     778:             $html .= '      <input type="hidden" name="'.$fieldname.'" value="0">';
     779:             $html .= '      <input type="checkbox" name="'.$fieldname.'" id="'.$fieldname.'">';
     780:             $html .= '          '.$label;
     781:
     782:         }
     783:
     784:         if ($mode == 'edit') {
     785:             $html .= '      <input type="hidden" name="'.$fieldname.'" value="0">';
     786:             $html .= '      <input type="checkbox" name="'.$fieldname.'" id="'.$fieldname.'"'.($value == '1'? ' checked':'').' />';
     787:             $html .= '          '.$label;
     788:         }
     789:
     790:         $html .= '  </label>';
     791:         $html .= '</div>';
     792:
     793:         self::$logger->debug('<<renderBooleanField ['.$html.']');
     794:         return $html;
     795:     }
     796:
     797:     /**
     798:      * (non-PHPdoc)
     799:      * @see alpha/view/renderers/AlphaRendererProviderInterface::renderEnumField()
     800:      */
     801:     public function renderEnumField($name, $label, $mode, $options, $value='') {
     802:         self::$logger->debug('>>renderEnumField(name=['.$name.'], label=['.$label.'], mode=['.$mode.'], value=['.$value.'])');
     803:
     804:         global $config;
     805:
     806:         if($config->get('security.encrypt.http.fieldnames'))
     807:             $fieldname = base64_encode(AlphaSecurityUtils::encrypt($name));
     808:         else
     809:             $fieldname = $name;
     810:
     811:         $html = '<div class="form-group">';
     812:         $html .= '  <label for="'.$fieldname.'">'.$label.'</label>';
     813:
     814:         if ($mode == 'create') {
     815:             $html .= '  <select name="'.$fieldname.'" id="'.$fieldname.'" class="form-control"/>';
     816:             foreach ($options as $val) {
     817:                 $html .= '      <option value="'.$val.'">'.$val.'</option>';
     818:             }
     819:             $html .= '  </select>';
     820:         }
     821:
     822:         if ($mode == 'edit') {
     823:             $html .= '  <select name="'.$fieldname.'" id="'.$fieldname.'" class="form-control"/>';
     824:             foreach ($options as $val) {
     825:                 if ($value == $val)
     826:                     $html .= '      <option value="'.$val.'" selected>'.$val.'</option>';
     827:                 else
     828:                     $html .= '      <option value="'.$val.'">'.$val.'</option>';
     829:             }
     830:             $html .= '  </select>';
     831:         }
     832:
     833:         $html .= '</div>';
     834:
     835:         self::$logger->debug('<<renderEnumField ['.$html.']');
     836:         return $html;
     837:     }
     838:
     839:     /**
     840:      * (non-PHPdoc)
     841:      * @see alpha/view/renderers/AlphaRendererProviderInterface::renderDEnumField()
     842:      */
     843:     public function renderDEnumField($name, $label, $mode, $options, $value='') {
     844:         self::$logger->debug('>>renderDEnumField(name=['.$name.'], label=['.$label.'], mode=['.$mode.'], value=['.$value.'])');
     845:
     846:         global $config;
     847:
     848:         if($config->get('security.encrypt.http.fieldnames'))
     849:             $fieldname = base64_encode(AlphaSecurityUtils::encrypt($name));
     850:         else
     851:             $fieldname = $name;
     852:
     853:         $html = '<div class="form-group">';
     854:         $html .= '  <label for="'.$fieldname.'">'.$label.'</label>';
     855:
     856:         if ($mode == 'create') {
     857:             $html .= '  <select name="'.$fieldname.'" id="'.$fieldname.'" class="form-control"/>';
     858:             foreach (array_keys($options) as $index) {
     859:                 $html .= '<option value="'.$index.'">'.$options[$index].'</option>';
     860:             }
     861:             $html .= '  </select>';
     862:         }
     863:
     864:         if ($mode == 'edit') {
     865:             $html .= '  <select name="'.$fieldname.'" id="'.$fieldname.'" class="form-control"/>';
     866:             foreach (array_keys($options) as $index) {
     867:                 if ($value == $index)
     868:                     $html .= '<option value="'.$index.'" selected>'.$options[$index].'</option>';
     869:                 else
     870:                     $html .= '<option value="'.$index.'">'.$options[$index].'</option>';
     871:             }
     872:             $html .= '  </select>';
     873:         }
     874:
     875:         $html .= '</div>';
     876:
     877:         self::$logger->debug('<<renderDEnumField ['.$html.']');
     878:         return $html;
     879:     }
     880:
     881:     /**
     882:      * (non-PHPdoc)
     883:      * @see alpha/view/renderers/AlphaRendererProviderInterface::renderDefaultField()
     884:      */
     885:     public function renderDefaultField($name, $label, $mode, $value='') {
     886:         self::$logger->debug('>>renderDefaultField(name=['.$name.'], label=['.$label.'], mode=['.$mode.'], value=['.$value.'])');
     887:
     888:         global $config;
     889:
     890:         if($config->get('security.encrypt.http.fieldnames'))
     891:             $fieldname = base64_encode(AlphaSecurityUtils::encrypt($name));
     892:         else
     893:             $fieldname = $name;
     894:
     895:         $html = '';
     896:
     897:         if ($mode == 'create') {
     898:             $html .= '<textarea cols="100" rows="3" name="'.$fieldname.'">'. (isset ($_POST[$name]) ? $_POST[$name] : '').'</textarea>';
     899:         }
     900:
     901:         if ($mode == 'edit') {
     902:             $html .= '<textarea cols="100" rows="3" name="'.$fieldname.'">'.$value.'</textarea>';
     903:         }
     904:
     905:         if ($mode == 'view') {
     906:             $html .= '<p><strong>'.$label.':</strong> '.$value.'</p>';
     907:         }
     908:
     909:         self::$logger->debug('<<renderDefaultField ['.$html.']');
     910:         return $html;
     911:     }
     912:
     913:     /**
     914:      * (non-PHPdoc)
     915:      * @see alpha/view/renderers/AlphaRendererProviderInterface::renderTextField()
     916:      */
     917:     public function renderTextField($name, $label, $mode, $value='') {
     918:         self::$logger->debug('>>renderTextField(name=['.$name.'], label=['.$label.'], mode=['.$mode.'], value=['.$value.'])');
     919:
     920:         global $config;
     921:
     922:         $html = '';
     923:
     924:         if ($mode == 'create') {
     925:             // give 10 rows for content fields (other 5 by default)
     926:             if($name == 'content')
     927:                 $text = new TextBox($this->BO->getPropObject($name), $label, $name, 10);
     928:             else
     929:                 $text = new TextBox($this->BO->getPropObject($name), $label, $name);
     930:             $html .= $text->render();
     931:         }
     932:
     933:         if ($mode == 'edit') {
     934:             // give 10 rows for content fields (other 5 by default)
     935:             if($name == 'content') {
     936:                 $viewState = ViewState::getInstance();
     937:
     938:                 if($viewState->get('markdownTextBoxRows') == '')
     939:                     $text = new TextBox($this->BO->getPropObject($name), $label, $name, 10);
     940:                 else
     941:                     $text = new TextBox($this->BO->getPropObject($name), $label, $name, (integer)$viewState->get('markdownTextBoxRows'));
     942:
     943:                 $html .= $text->render();
     944:             }else{
     945:                 $text = new TextBox($this->BO->getPropObject($name), $label, $name);
     946:                 $html .= $text->render();
     947:             }
     948:         }
     949:
     950:         if ($mode == 'view') {
     951:             $html .= '<p><strong>';
     952:
     953:             $html .= $label;
     954:
     955:             $html .= ':</strong>';
     956:
     957:             // filter ouput to prevent malicious injection
     958:             $value = InputFilter::encode($value);
     959:
     960:             // ensures that line returns are rendered
     961:             $value = str_replace("\n", '<br>', $value);
     962:
     963:             $html .= '&nbsp;';
     964:
     965:             $html .= $value;
     966:
     967:             $html .= '</p>';
     968:         }
     969:
     970:         self::$logger->debug('<<renderTextField ['.$html.']');
     971:         return $html;
     972:     }
     973:
     974:     /**
     975:      * (non-PHPdoc)
     976:      * @see alpha/view/renderers/AlphaRendererProviderInterface::renderStringField()
     977:      */
     978:     public function renderStringField($name, $label, $mode, $value='') {
     979:         self::$logger->debug('>>renderStringField(name=['.$name.'], label=['.$label.'], mode=['.$mode.'], value=['.$value.'])');
     980:
     981:         global $config;
     982:
     983:         $html = '';
     984:
     985:         if ($mode == 'create' || $mode == 'edit') {
     986:             $string = new StringBox($this->BO->getPropObject($name), $label, $name);
     987:             $html .= $string->render();
     988:         }
     989:
     990:         if ($mode == 'view') {
     991:             $html .= '<p><strong>'.$label.':</strong> '.$value.'</p>';
     992:         }
     993:
     994:         self::$logger->debug('<<renderStringField ['.$html.']');
     995:         return $html;
     996:     }
     997:
     998:     /**
     999:      * (non-PHPdoc)
    1000:      * @see alpha/view/renderers/AlphaRendererProviderInterface::renderRelationField()
    1001:      */
    1002:     public function renderRelationField($name, $label, $mode, $value='', $expanded=false, $buttons=true) {
    1003:         self::$logger->debug('>>renderRelationField(name=['.$name.'], label=['.$label.'], mode=['.$mode.'], value=['.$value.'], expanded=['.$expanded.'], buttons=['.$buttons.'])');
    1004:
    1005:         global $config;
    1006:
    1007:         $html = '';
    1008:
    1009:         $rel = $this->BO->getPropObject($name);
    1010:
    1011:         if ($mode == 'create' || $mode == 'edit') {
    1012:             if($rel->getRelationType() == 'MANY-TO-MANY') {
    1013:                 try{
    1014:                     // check to see if the rel is on this class
    1015:                     $rel->getSide(get_class($this->BO));
    1016:                     $widget = new RecordSelector($rel, $label, $name, get_class($this->BO));
    1017:                     $html .= $widget->render($expanded, $buttons);
    1018:                 }catch (IllegalArguementException $iae) {
    1019:                     // the rel may be on a parent class
    1020:                     $parentClassName = ucfirst($this->BO->getTableName()).'Object';
    1021:                     $widget = new RecordSelector($rel, $label, $name, $parentClassName);
    1022:                     $html .= $widget->render($expanded, $buttons);
    1023:                 }
    1024:             }else{
    1025:                 $rel = new RecordSelector($rel, $label, $name);
    1026:                 $html .= $rel->render($expanded, $buttons);
    1027:             }
    1028:         }
    1029:
    1030:         if ($mode == 'view') {
    1031:             if($rel->getRelationType() == 'MANY-TO-ONE') {
    1032:                 $html .= $this->renderDefaultField($name, $label, 'view', $rel->getRelatedClassDisplayFieldValue());
    1033:             }elseif($rel->getRelationType() == 'MANY-TO-MANY') {
    1034:                 try{
    1035:                     // check to see if the rel is on this class
    1036:                     $rel->getSide(get_class($this->BO));
    1037:                     $html .= $this->renderDefaultField($name, $label, 'view', $rel->getRelatedClassDisplayFieldValue(get_class($this->BO)));
    1038:                 }catch (IllegalArguementException $iae) {
    1039:                     // the rel may be on a parent class
    1040:                     $parentClassName = ucfirst($this->BO->getTableName()).'Object';
    1041:                     $html .= $this->renderDefaultField($name, $label, 'view', $rel->getRelatedClassDisplayFieldValue($parentClassName));
    1042:                 }
    1043:             }else{
    1044:                 $rel = new RecordSelector($rel, $label, $name);
    1045:                 $html .= $rel->render($expanded, $buttons);
    1046:             }
    1047:         }
    1048:
    1049:         self::$logger->debug('<<renderRelationField ['.$html.']');
    1050:         return $html;
    1051:     }
    1052:
    1053:     /**
    1054:      * (non-PHPdoc)
    1055:      * @see alpha/view/renderers/AlphaRendererProviderInterface::renderAllFields()
    1056:      */
    1057:     public function renderAllFields($mode, $filterFields=array(), $readOnlyFields=array()) {
    1058:         self::$logger->debug('>>renderAllFields(mode=['.$mode.'], filterFields=['.var_export($filterFields, true).'], readOnlyFields=['.var_export($readOnlyFields, true).'])');
    1059:
    1060:         $html = '';
    1061:
    1062:         // get the class attributes
    1063:         $properties = array_keys($this->BO->getDataLabels());
    1064:
    1065:         $orignalMode = $mode;
    1066:
    1067:         foreach($properties as $propName) {
    1068:             if (!in_array($propName, $this->BO->getDefaultAttributes()) && !in_array($propName, $filterFields)) {
    1069:                 // render readonly fields in the supplied array
    1070:                 if(in_array($propName, $readOnlyFields))
    1071:                     $mode = 'view';
    1072:                 else
    1073:                     $mode = $orignalMode;
    1074:
    1075:                 if(!is_object($this->BO->getPropObject($propName)))
    1076:                     continue;
    1077:
    1078:                 $propClass = get_class($this->BO->getPropObject($propName));
    1079:
    1080:                 // exclude non-Relation transient attributes from create and edit screens
    1081:                 if($propClass != 'Relation' && ($mode == 'edit' || $mode == 'create') && in_array($propName, $this->BO->getTransientAttributes())) {
    1082:                     continue;
    1083:                 }
    1084:
    1085:                 switch (mb_strtoupper($propClass)) {
    1086:                     case 'INTEGER' :
    1087:                         if($mode == 'view') {
    1088:                             $html .= $this->renderDefaultField($propName, $this->BO->getDataLabel($propName), 'view', $this->BO->get($propName));
    1089:                         }else{
    1090:                             $html .= $this->renderIntegerField($propName, $this->BO->getDataLabel($propName), $mode, $this->BO->get($propName));
    1091:                         }
    1092:                     break;
    1093:                     case 'DOUBLE' :
    1094:                         if($mode == 'view') {
    1095:                             $html .= $this->renderDefaultField($propName, $this->BO->getDataLabel($propName), 'view', $this->BO->get($propName));
    1096:                         }else{
    1097:                             $html .= $this->renderDoubleField($propName, $this->BO->getDataLabel($propName), $mode, $this->BO->get($propName));
    1098:                         }
    1099:                     break;
    1100:                     case 'DATE' :
    1101:                         if($mode == 'view') {
    1102:                             $value = $this->BO->get($propName);
    1103:                             if ($value == '0000-00-00')
    1104:                                 $value = '';
    1105:                             $html .= $this->renderDefaultField($propName, $this->BO->getDataLabel($propName), 'view', $value);
    1106:                         }else{
    1107:                             $date = new DateBox($this->BO->getPropObject($propName), $this->BO->getDataLabel($propName), $propName);
    1108:                             $html .= $date->render();
    1109:                         }
    1110:                     break;
    1111:                     case 'TIMESTAMP' :
    1112:                         if($mode == 'view') {
    1113:                             $value = $this->BO->get($propName);
    1114:                             if ($value == '0000-00-00 00:00:00')
    1115:                                 $value = '';
    1116:                             $html .= $this->renderDefaultField($propName, $this->BO->getDataLabel($propName), 'view', $value);
    1117:                         }else{
    1118:                             $timestamp = new DateBox($this->BO->getPropObject($propName), $this->BO->getDataLabel($propName), $propName);
    1119:                             $html .= $timestamp->render();
    1120:                         }
    1121:                     break;
    1122:                     case 'STRING' :
    1123:                         $html .= $this->renderStringField($propName, $this->BO->getDataLabel($propName), $mode, $this->BO->get($propName));
    1124:                     break;
    1125:                     case 'TEXT' :
    1126:                         $html .= $this->renderTextField($propName, $this->BO->getDataLabel($propName), $mode, $this->BO->get($propName));
    1127:                     break;
    1128:                     case 'BOOLEAN' :
    1129:                         if($mode == 'view') {
    1130:                             $html .= $this->renderDefaultField($propName, $this->BO->getDataLabel($propName), 'view', $this->BO->get($propName));
    1131:                         }else{
    1132:                             $html .= $this->renderBooleanField($propName, $this->BO->getDataLabel($propName), $mode, $this->BO->get($propName));
    1133:                         }
    1134:                     break;
    1135:                     case 'ENUM' :
    1136:                         if($mode == 'view') {
    1137:                             $html .= $this->renderDefaultField($propName, $this->BO->getDataLabel($propName), 'view', $this->BO->get($propName));
    1138:                         }else{
    1139:                             $enum = $this->BO->getPropObject($propName);
    1140:                             $html .= $this->renderEnumField($propName, $this->BO->getDataLabel($propName), $mode, $enum->getOptions(), $this->BO->get($propName));
    1141:                         }
    1142:                     break;
    1143:                     case 'DENUM' :
    1144:                         if($mode == 'view') {
    1145:                             $html .= $this->renderDefaultField($propName, $this->BO->getDataLabel($propName), 'view', $this->BO->getPropObject($propName)->getDisplayValue());
    1146:                         }else{
    1147:                             $denum = $this->BO->getPropObject($propName);
    1148:                             $html .= $this->renderDEnumField($propName, $this->BO->getDataLabel($propName), $mode, $denum->getOptions(), $this->BO->get($propName));
    1149:                         }
    1150:                     break;
    1151:                     case 'RELATION' :
    1152:                         $html .= $this->renderRelationField($propName, $this->BO->getDataLabel($propName), $mode, $this->BO->get($propName));
    1153:                     break;
    1154:                     default :
    1155:                         $html .= $this->renderDefaultField($propName, $this->BO->getDataLabel($propName), $mode, $this->BO->get($propName));
    1156:                     break;
    1157:                 }
    1158:             }
    1159:         }
    1160:
    1161:         self::$logger->debug('<<renderAllFields ['.$html.']');
    1162:         return $html;
    1163:     }
    1164: }
    1165:
    1166: ?>