      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 edit an existing article
     14:  *
     15:  * @package alpha::controller
     16:  * @since 1.0
     17:  * @author John Collins <dev@alphaframework.org>
     18:  * @version $Id: EditArticle.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 EditArticle extends AlphaController implements AlphaControllerInterface {
     57:     /**
     58:      * The new article to be edited
     59:      *
     60:      * @var ArticleObject
     61:      * @since 1.0
     62:      */
     63:     protected $BO;
     64:
     65:     /**
     66:      * Trace logger
     67:      *
     68:      * @var Logger
     69:      * @since 1.0
     70:      */
     71:     private static $logger = null;
     72:
     73:     /**
     74:      * constructor to set up the object
     75:      *
     76:      * @since 1.0
     77:      */
     78:     public function __construct() {
     79:         self::$logger = new Logger('EditArticle');
     80:         self::$logger->debug('>>__construct()');
     81:
     82:         global $config;
     83:
     84:         // ensure that the super class constructor is called, indicating the rights group
     85:         parent::__construct('Standard');
     86:
     87:         $this->BO = new ArticleObject();
     88:
     89:         self::$logger->debug('<<__construct');
     90:     }
     91:
     92:     /**
     93:      * Handle GET requests
     94:      *
     95:      * @param array $params
     96:      * @since 1.0
     97:      */
     98:     public function doGET($params) {
     99:         self::$logger->debug('>>doGET(params=['.var_export($params, true).'])');
    100:
    101:         try{
    102:             // load the business object (BO) definition
    103:             if (isset($params['oid'])) {
    104:                 if(!AlphaValidator::isInteger($params['oid']))
    105:                     throw new IllegalArguementException('Article ID provided ['.$params['oid'].'] is not valid!');
    106:
    107:                 $this->BO->load($params['oid']);
    108:
    109:                 AlphaDAO::disconnect();
    110:
    111:                 $BOView = AlphaView::getInstance($this->BO);
    112:
    113:                 // set up the title and meta details
    114:                 $this->setTitle($this->BO->get('title').' (editing)');
    115:                 $this->setDescription('Page to edit '.$this->BO->get('title').'.');
    116:                 $this->setKeywords('edit,article');
    117:
    118:                 echo AlphaView::displayPageHead($this);
    119:
    120:                 echo $BOView->editView();
    121:             }else{
    122:                 throw new IllegalArguementException('No valid article ID provided!');
    123:             }
    124:         }catch(IllegalArguementException $e) {
    125:             self::$logger->error($e->getMessage());
    126:         }catch(BONotFoundException $e) {
    127:             self::$logger->warn($e->getMessage());
    128:             echo '<div class="ui-state-error ui-corner-all" style="padding: 0pt 0.7em;">
    129:                 <p><span class="ui-icon ui-icon-alert" style="float: left; margin-right: 0.3em;"></span>
    130:                 <strong>Error:</strong> Failed to load the requested article from the database!</p></div>';
    131:         }
    132:
    133:         echo AlphaView::renderDeleteForm();
    134:
    135:         echo AlphaView::displayPageFoot($this);
    136:
    137:         self::$logger->debug('<<doGET');
    138:     }
    139:
    140:     /**
    141:      * Method to handle POST requests
    142:      *
    143:      * @param array $params
    144:      * @since 1.0
    145:      */
    146:     public function doPOST($params) {
    147:         self::$logger->debug('>>doPOST(params=['.var_export($params, true).'])');
    148:
    149:         global $config;
    150:
    151:         try {
    152:             // check the hidden security fields before accepting the form POST data
    153:             if(!$this->checkSecurityFields()) {
    154:                 throw new SecurityException('This page cannot accept post data from remote servers!');
    155:                 self::$logger->debug('<<doPOST');
    156:             }
    157:
    158:             if(isset($params['markdownTextBoxRows']) && $params['markdownTextBoxRows'] != '') {
    159:                 $viewState = ViewState::getInstance();
    160:                 $viewState->set('markdownTextBoxRows', $params['markdownTextBoxRows']);
    161:             }
    162:
    163:             if (isset($params['oid'])) {
    164:                 if(!AlphaValidator::isInteger($params['oid']))
    165:                     throw new IllegalArguementException('Article ID provided ['.$params['oid'].'] is not valid!');
    166:
    167:                 $this->BO->load($params['oid']);
    168:
    169:                 $BOView = AlphaView::getInstance($this->BO);
    170:
    171:                 // set up the title and meta details
    172:                 $this->setTitle($this->BO->get('title').' (editing)');
    173:                 $this->setDescription('Page to edit '.$this->BO->get('title').'.');
    174:                 $this->setKeywords('edit,article');
    175:
    176:                 echo AlphaView::displayPageHead($this);
    177:
    178:                 if (isset($params['saveBut'])) {
    179:
    180:                     // populate the transient object from post data
    181:                     $this->BO->populateFromPost();
    182:
    183:                     try {
    184:                         $success = $this->BO->save();
    185:                         echo AlphaView::displayUpdateMessage('Article '.$this->BO->getID().' saved successfully.');
    186:                     }catch (LockingException $e) {
    187:                         $this->BO->reload();
    188:                         echo AlphaView::displayErrorMessage($e->getMessage());
    189:                     }
    190:
    191:                     AlphaDAO::disconnect();
    192:                     echo $BOView->editView();
    193:                 }
    194:
    195:                 if (!empty($params['deleteOID'])) {
    196:
    197:                     $this->BO->load($params['deleteOID']);
    198:
    199:                     try {
    200:                         $this->BO->delete();
    201:
    202:                         AlphaDAO::disconnect();
    203:
    204:                         echo AlphaView::displayUpdateMessage('Article '.$params['deleteOID'].' deleted successfully.');
    205:
    206:                         echo '<center>';
    207:
    208:                         $temp = new Button("document.location = '".FrontController::generateSecureURL('act=ListAll&bo='.get_class($this->BO))."'",
    209:                             'Back to List','cancelBut');
    210:                         echo $temp->render();
    211:
    212:                         echo '</center>';
    213:                     }catch(AlphaException $e) {
    214:                         self::$logger->error($e->getTraceAsString());
    215:                         echo AlphaView::displayErrorMessage('Error deleting the article, check the log!');
    216:                     }
    217:                 }
    218:
    219:                 if(isset($params['uploadBut'])) {
    220:
    221:                     // upload the file to the attachments directory
    222:                     $success = move_uploaded_file($_FILES['userfile']['tmp_name'], $this->BO->getAttachmentsLocation().'/'.$_FILES['userfile']['name']);
    223:
    224:                     if(!$success)
    225:                         throw new AlphaException('Could not move the uploaded file ['.$_FILES['userfile']['name'].']');
    226:
    227:                     // set read/write permissions on the file
    228:                     $success = chmod($this->BO->getAttachmentsLocation().'/'.$_FILES['userfile']['name'], 0666);
    229:
    230:                     if (!$success)
    231:                         throw new AlphaException('Unable to set read/write permissions on the uploaded file ['.$this->BO->getAttachmentsLocation().'/'.$_FILES['userfile']['name'].'].');
    232:
    233:                     if($success) {
    234:                         echo AlphaView::displayUpdateMessage('File uploaded successfully.');
    235:                     }
    236:
    237:                     $view = AlphaView::getInstance($this->BO);
    238:
    239:                     echo $view->editView();
    240:                 }
    241:
    242:                 if (!empty($params['file_to_delete'])) {
    243:
    244:                     $success = unlink($this->BO->getAttachmentsLocation().'/'.$params['file_to_delete']);
    245:
    246:                     if(!$success)
    247:                         throw new AlphaException('Could not delete the file ['.$params['file_to_delete'].']');
    248:
    249:                     if($success) {
    250:                         echo AlphaView::displayUpdateMessage($params['file_to_delete'].' deleted successfully.');
    251:                     }
    252:
    253:                     $view = AlphaView::getInstance($this->BO);
    254:
    255:                     echo $view->editView();
    256:                 }
    257:             }else{
    258:                 throw new IllegalArguementException('No valid article ID provided!');
    259:             }
    260:         }catch(SecurityException $e) {
    261:             echo AlphaView::displayErrorMessage($e->getMessage());
    262:             self::$logger->warn($e->getMessage());
    263:         }catch(IllegalArguementException $e) {
    264:             echo AlphaView::displayErrorMessage($e->getMessage());
    265:             self::$logger->error($e->getMessage());
    266:         }catch(BONotFoundException $e) {
    267:             self::$logger->warn($e->getMessage());
    268:             echo AlphaView::displayErrorMessage('Failed to load the requested article from the database!');
    269:         }catch(AlphaException $e) {
    270:             echo AlphaView::displayErrorMessage($e->getMessage());
    271:             self::$logger->error($e->getMessage());
    272:         }
    273:
    274:         echo AlphaView::renderDeleteForm();
    275:
    276:         echo AlphaView::displayPageFoot($this);
    277:
    278:         self::$logger->debug('<<doPOST');
    279:     }
    280:
    281:     /**
    282:      * Renders the Javascript required in the header by markItUp!
    283:      *
    284:      * @return string
    285:      * @since 1.0
    286:      */
    287:     public function during_displayPageHead_callback() {
    288:         global $config;
    289:
    290:         $html = '
    291:             <script type="text/javascript">
    292:             var previewURL = "'.FrontController::generateSecureURL('act=PreviewArticle&bo=ArticleObject&oid='.$this->BO->getOID()).'";
    293:             </script>
    294:             <script type="text/javascript" src="'.$config->get('app.url').'alpha/lib/markitup/jquery.markitup.js"></script>
    295:             <script type="text/javascript" src="'.$config->get('app.url').'alpha/lib/markitup/sets/markdown/set.js"></script>
    296:             <link rel="stylesheet" type="text/css" href="'.$config->get('app.url').'alpha/lib/markitup/skins/simple/style.css" />
    297:             <link rel="stylesheet" type="text/css" href="'.$config->get('app.url').'alpha/lib/markitup/sets/markdown/style.css" />
    298:             <script type="text/javascript">
    299:             $(document).ready(function() {
    300:                 $("#text_field_content_0").markItUp(mySettings);
    301:
    302:                 var dialogCoords = [(screen.width/2)-400, (screen.height/2)-300];
    303:
    304:                 var dialogOpts = {
    305:                     title: "Help Page",
    306:                     modal: true,
    307:                     resizable: false,
    308:                     draggable: false,
    309:                     autoOpen: false,
    310:                     height: 400,
    311:                     width: 800,
    312:                     position: dialogCoords,
    313:                     buttons: {},
    314:                     open: function() {
    315:                         //display correct dialog content
    316:                         $("#helpPage").load("'.FrontController::generateSecureURL('act=ViewArticleFile&file=Markdown_Help.text').'");
    317:                     },
    318:                     close: function() {
    319:
    320:                         $("#helpPage").dialog(dialogOpts);
    321:
    322:                         $(".markItUpButton15").click(
    323:                             function (){
    324:                                 $("#helpPage").dialog("open");
    325:                                 return false;
    326:                             }
    327:                         );
    328:                     }
    329:                 };
    330:
    331:                 $("#helpPage").dialog(dialogOpts);
    332:
    333:                 $(".markItUpButton15").click(
    334:                     function (){
    335:                         $("#helpPage").dialog("open");
    336:                         return false;
    337:                     }
    338:                 );
    339:             });
    340:             </script>';
    341:
    342:         return $html;
    343:     }
    344:
    345:     /**
    346:      * Use this callback to inject in the admin menu template fragment for admin users of
    347:      * the backend only.
    348:      *
    349:      * @since 1.2
    350:      */
    351:     public function after_displayPageHead_callback() {
    352:         $menu = '';
    353:
    354:         if (isset($_SESSION['currentUser']) && AlphaDAO::isInstalled() && $_SESSION['currentUser']->inGroup('Admin') && strpos($_SERVER['REQUEST_URI'], '/tk/') !== false) {
    355:             $menu .= AlphaView::loadTemplateFragment('html', 'adminmenu.phtml', array());
    356:         }
    357:
    358:         return $menu;
    359:     }
    360: }
    361:
    362: // now build the new controller
    363: if(basename($_SERVER['PHP_SELF']) == 'EditArticle.php') {
    364:     $controller = new EditArticle();
    365:
    366:     if(!empty($_POST)) {
    367:         $controller->doPOST($_REQUEST);
    368:     }else{
    369:         $controller->doGET($_GET);
    370:     }
    371: }
    372:
    373: ?>