function saveWorkflow($values, $action, &$asset_controller)
 {
     if (!isset($values['page_content_id']) || !$values['page_content_id'] || !isset($values['workflow_group_id']) || !$values['workflow_group_id']) {
         return false;
     }
     // instantiate workflow model
     $model =& $this->getDefaultModel();
     $table = $model->table();
     // load values
     $page_content_id = $values['page_content_id'];
     $page_content_model =& NModel::factory('page_content');
     $page_content_model->get($page_content_id);
     $page_id = (int) $page_content_model->page_id;
     unset($page_content_model);
     $workflow_group_id = $values['workflow_group_id'];
     // timed content
     $timed_start = isset($values['timed_start']) && $values['timed_start'] ? $values['timed_start'] : null;
     $timed_end = isset($values['timed_end']) && $values['timed_end'] ? $values['timed_end'] : null;
     if ($timed_start == 'null') {
         $timed_start = null;
     }
     if ($timed_end == 'null') {
         $timed_end = null;
     }
     if ($timed_start && is_array($timed_start)) {
         $def = $table['timed_start'];
         $timed_start = NDate::arrayToDate($timed_start);
         if (!($def & N_DAO_NOTNULL)) {
             if (!NDate::validDateTime($timed_start)) {
                 $timed_start = false;
             }
         }
     }
     if ($timed_end && is_array($timed_end)) {
         $def = $table['timed_end'];
         $timed_end = NDate::arrayToDate($timed_end);
         if (!($def & N_DAO_NOTNULL)) {
             if (!NDate::validDateTime($timed_end)) {
                 $timed_end = false;
             }
         }
     }
     // load asset
     if (!$asset_controller) {
         return false;
     }
     $asset_model =& $asset_controller->getDefaultModel();
     if (!$asset_model) {
         return false;
     }
     $pk = $asset_model->primaryKey();
     $fields = $asset_model->fields();
     $values = array();
     foreach ($fields as $field) {
         if ($field != $pk && !preg_match('|^cms_|', $field)) {
             // don't save any of the meta content
             $values[$field] = $asset_model->{$field};
         }
     }
     $model->reset();
     $model->page_id = $page_id;
     $model->page_content_id = $page_content_id;
     $model->workflow_group_id = $workflow_group_id;
     $model->asset = $asset_controller->name;
     $model->asset_id = $asset_model->{$pk};
     $model->submitted = 0;
     $model->completed = 0;
     if ($timed_start) {
         $model->timed_start = $timed_start;
     }
     if ($timed_end) {
         $model->timed_end = $timed_end;
     }
     $model->cms_modified_by_user = $asset_controller->_auth->currentUserID();
     if ($model->find(null, true)) {
         $model->cms_modified = $model->now();
         $model->draft = serialize($values);
         $ret = $model->update();
     } else {
         $model->action = (int) $action;
         $model->draft = serialize($values);
         $model->cms_created = $model->now();
         $model->cms_modified = $model->now();
         $ret = $model->insert();
     }
     if (defined('SITE_AUDIT_TRAIL') && SITE_AUDIT_TRAIL) {
         $audit_trail =& NController::factory('audit_trail');
         $audit_trail->insert(array('asset' => $asset_controller->name, 'asset_id' => $asset_model->{$pk}, 'action_taken' => AUDIT_ACTION_WORKFLOW_START, 'workflow_id' => $model->{$model->primaryKey()}, 'workflow_group_id' => $workflow_group_id, 'page_id' => $page_id, 'page_content_id' => $page_content_id));
         unset($audit_trail);
     }
     unset($auth);
     unset($model);
     return $ret;
 }
 function addExistingContent($parameter)
 {
     $page_model =& $this->loadModel('page');
     $page_model->get($parameter);
     $template_container_id = isset($this->params['template_container_id']) ? $this->params['template_container_id'] : false;
     $asset = isset($this->params['asset']) ? $this->params['asset'] : false;
     // instantiate form
     include_once 'n_quickform.php';
     $form = new NQuickForm();
     $values = $form->getSubmitValues();
     $form->addElement('header', null, 'Add "' . Inflector::humanize($asset) . '" content to the "' . $page_model->title . '" page');
     $asset_controller =& NController::factory($asset);
     $asset_model =& NModel::factory($asset);
     $pk = $asset_model->primaryKey();
     $records = array();
     if ($asset_model->find()) {
         while ($asset_model->fetch()) {
             $records[$asset_model->{$pk}] = $asset_model->cms_headline;
         }
     }
     unset($asset_model);
     // add asset select
     $options = defined('SITE_WORKFLOW') && SITE_WORKFLOW ? array() : array('size' => 10, 'multiple' => 'multiple');
     $form->addElement('select', 'asset_id', Inflector::humanize($asset), $records, $options);
     // hidden fields
     $form->addElement('hidden', 'asset', $asset);
     $form->addElement('hidden', 'template_container_id', $template_container_id);
     if (isset($this->params['_referer'])) {
         $form->addElement('hidden', '_referer', urlencode($this->params['_referer']));
     }
     // finish up
     $form->addElement('submit', '__submit__', 'Add Content');
     // rules
     defined('SITE_WORKFLOW') && SITE_WORKFLOW ? $form->addRule('asset_id', 'You must select a record.', 'required') : $form->addGroupRule('asset_id', 'You must select a record.', 'required');
     $form->addRule('asset', '', 'required');
     $form->addRule('template_container_id', '', 'required');
     // check for workflow
     $user_rights = 0;
     if (SITE_WORKFLOW) {
         // get the users rights and bit compare them below
         $workflow =& NController::factory('workflow');
         $user_rights = $workflow->getWorkflowUserRights($page_model);
         if ($workflow_group_model =& $workflow->getWorkflowGroup($page_model)) {
             if (!($user_rights & WORKFLOW_RIGHT_EDIT)) {
                 // they don't belong here - go to the dashboard
                 header('Location:/' . APP_DIR . '/dashboard');
             } else {
                 if ($user_rights & WORKFLOW_RIGHT_EDIT) {
                     $form->insertElementBefore(NQuickForm::createElement('submit', '__submit_workflow__', 'Start Workflow'), '__submit__');
                     $form->removeElement('__submit__');
                 }
             }
         }
         unset($workflow);
     }
     $form->addElement('header', null, 'Make it timed content?');
     $timed_options = array('format' => 'Y-m-d H:i', 'minYear' => date('Y'), 'maxYear' => date('Y') + 4, 'addEmptyOption' => true);
     $form->addElement('date', 'timed_start', 'Timed Start', $timed_options);
     $form->addElement('date', 'timed_end', 'Timed End', $timed_options);
     if (!$user_rights) {
         $form->addElement('submit', '__submit_timed__', 'Add Scheduled Content');
     } else {
         $form->addElement('submit', '__submit_workflow__', 'Start Workflow with Scheduled Content');
     }
     if ($form->validate()) {
         $values = $form->exportValues();
         $model =& $this->loadModel($this->name);
         $workflow_active = false;
         if (SITE_WORKFLOW) {
             $workflow =& NController::factory('workflow');
             // check if this content is on any other page.
             // if it is, if either pages are part of a workflow group, we need to copy the content (go to addnewcontent with notice)
             // if neither do, then go ahead
             $asset_model =& $asset_controller->loadModel($asset_controller->name);
             $asset_model->get($values['asset_id']);
             $other_page =& $this->getContentPage($asset_controller);
             if ($other_page) {
                 $owned_content = false;
                 if ($workflow_group_model =& $workflow->getWorkflowGroup($page_model)) {
                     $owned_content = true;
                 } else {
                     if ($workflow_group_model =& $workflow->getWorkflowGroup($other_page)) {
                         $owned_content = true;
                     }
                 }
                 // if the content is already connected somewhere and one of the pages belongs to a workflow_group, then addNewContent with preloaded content
                 if ($owned_content) {
                     if (isset($values['__submit__'])) {
                         unset($values['__submit__']);
                     }
                     if (isset($values['__submit_workflow__'])) {
                         unset($values['__submit_workflow__']);
                     }
                     $this->redirectTo('copy_existing_content', $parameter, $values);
                     exit;
                 }
             }
             if (isset($values['__submit_workflow__']) && $values['__submit_workflow__']) {
                 $workflow =& NController::factory('workflow');
                 if ($workflow_group_model = $workflow->getWorkflowGroup($page_model)) {
                     $workflow_active = true;
                 }
             }
         }
         $model->page_id = $parameter;
         if (SITE_WORKFLOW && isset($values['__submit_workflow__']) && $values['__submit_workflow__']) {
             $model->cms_workflow = 1;
         }
         $model->page_template_container_id = $values['template_container_id'];
         $model->content_asset = $values['asset'];
         // set the timed values
         $timed_start = null;
         $timed_end = null;
         include_once 'n_date.php';
         if (isset($values['timed_start'])) {
             $timed_start = NDate::arrayToDate($values['timed_start']);
             $timed_start = NDate::convertTimeToUTC($timed_start);
             unset($values['timed_start']);
         }
         if (isset($values['timed_end'])) {
             $timed_end = NDate::arrayToDate($values['timed_end']);
             $timed_end = NDate::convertTimeToUTC($timed_end);
             unset($values['timed_end']);
         }
         if (!$workflow_active) {
             $table = $model->table();
             $def = $table['timed_start'];
             if (NDate::validDateTime($timed_start, $def)) {
                 $model->timed_start = $timed_start;
             } else {
                 $model->timed_start = N_DAO_NOTNULL & $def ? $timed_start : 'null';
             }
             $def = $table['timed_end'];
             if (NDate::validDateTime($timed_end, $def)) {
                 $model->timed_end = $timed_end;
             } else {
                 $model->timed_end = N_DAO_NOTNULL & $def ? $timed_end : 'null';
             }
         }
         $model->cms_created = $model->now();
         $model->cms_modified = $model->now();
         $model->cms_modified_by_user = $this->_auth->currentUserID();
         if (!is_array($values['asset_id'])) {
             $values['asset_id'] = array($values['asset_id']);
         }
         foreach ($values['asset_id'] as $asset_id) {
             $model->content_asset_id = $asset_id;
             $model->insert();
             if (defined('SITE_AUDIT_TRAIL') && SITE_AUDIT_TRAIL) {
                 // audit trail
                 $audit_trail =& NController::factory('audit_trail');
                 $audit_trail->insert(array('asset' => $asset_controller->name, 'asset_id' => $asset_id, 'action_taken' => AUDIT_ACTION_CONTENT_ADDEXISTING, 'page_content_id' => $model->{$model->primaryKey()}, 'page_id' => $model->page_id));
                 unset($audit_trail);
             }
         }
         if ($workflow_active) {
             $asset_controller =& NController::factory($values['asset']);
             $asset_controller->_auth = new NAuth();
             $asset_model =& $asset_controller->getDefaultModel();
             $asset_model->get($values['asset_id'][0]);
             $workflow_values = array();
             $workflow_values['page_content_id'] = $model->{$model->primaryKey()};
             $workflow_values['workflow_group_id'] = $workflow_group_model->{$workflow_group_model->primaryKey()};
             // add timed content
             $workflow_values['timed_start'] = $timed_start;
             $workflow_values['timed_end'] = $timed_end;
             $workflow->saveWorkflow($workflow_values, WORKFLOW_ACTION_ADDEXISTING, $asset_controller);
         }
         // delete the page cache
         $page =& NController::singleton('page');
         $page->deletePageCache($model->page_id);
         unset($page);
         // set up the referer
         if (isset($this->params['_referer']) && $this->params['_referer']) {
             $referer = urldecode($this->params['_referer']);
         } else {
             include_once 'view/helpers/url_helper.php';
             $referer = urlHelper::urlFor($this, array('controller' => 'page', 'action' => 'surftoedit', 'id' => $parameter));
         }
         header('Location:' . $referer);
         exit;
     }
     $this->auto_render = false;
     $this->page_title = 'Add Existing Content to "' . $page_model->title . '"';
     $this->set(array('title' => 'Select Content', 'form' => $form->toHTML()));
     $this->render(array('action' => 'form', 'layout' => 'plain'));
     unset($page_model);
 }
示例#3
0
 function processForm($values)
 {
     $this->controller->preProcessForm($values);
     $model =& $this->model;
     $pk = $model->primaryKey();
     if (!$pk) {
         // TODO: raise error - can't store data if there's no primary key
         return false;
     }
     $table = $model->table();
     $fields = $model->fields();
     $action = 'update';
     if (!isset($model->{$pk}) || !strlen($model->{$pk})) {
         $action = 'insert';
     }
     // setup for file uploads
     $cms_files = array();
     $files = array();
     if (isset($_FILES) && is_array($_FILES)) {
         $form =& $this->form;
         foreach ($_FILES as $field => $value) {
             $el =& $form->getElement($field);
             if ($el->getType() == 'file' || $el->getType() == 'cms_file') {
                 $values[$field] = null;
                 if ($el->getType() == 'cms_file') {
                     $cms_files[$field] =& $el;
                 }
                 if (isset($_FILES[$field]['tmp_name']) && is_uploaded_file($_FILES[$field]['tmp_name'])) {
                     $files[$field] = array('type' => $el->getType(), 'upload_dir' => isset($el->_options['upload_dir']) ? $el->_options['upload_dir'] : UPLOAD_DIR, 'value' => $value);
                 } else {
                     $values[$field] = isset($this->_do->{$field}) ? $this->_do->{$field} : '';
                 }
             }
         }
     }
     foreach ($cms_files as $field => $el) {
         if (isset($values[$field . '__remove']) && $values[$field . '__remove']) {
             $values[$field] = '';
             if (isset($files[$field])) {
                 unset($files[$field]);
                 // so it doesn't get processed and uploaded after the fact
             }
         } else {
             if (isset($values[$field . '__current']) && $values[$field . '__current']) {
                 $values[$field] = $values[$field . '__current'];
             }
         }
     }
     // pull in any boolean fields that weren't passed and should therefore be 0
     foreach ($table as $field => $def) {
         if ($def & N_DAO_BOOL && !preg_match('/^cms_/', $field)) {
             // if the field is being ignored, then leave the value as what it is
             if (in_array($field, $model->form_ignore_fields)) {
                 continue;
             }
             $values[$field] = isset($values[$field]) ? 1 : 0;
         }
     }
     // deal with general values
     foreach ($values as $field => $val) {
         if (!in_array($field, $fields)) {
             continue;
         }
         $def = $table[$field];
         switch (true) {
             case ($def & N_DAO_DATE || $def & N_DAO_TIME) && is_array($val):
                 $val = NDate::arrayToDate($val);
                 if (!($def & N_DAO_NOTNULL)) {
                     if ($def & N_DAO_DATE || $def & N_DAO_TIME) {
                         if (!NDate::validDateTime($val)) {
                             $val = 'null';
                         }
                     }
                 }
                 break;
         }
         $model->{$field} = $val;
     }
     // set the autoheadline if it exists and wasn't set manually
     if (in_array('cms_headline', $fields) && !$values['cms_headline'] && $model->getHeadline()) {
         $model->cms_headline = $model->makeHeadline('-');
     }
     if ($action == 'update') {
         $this->processFiles($values, $files);
         foreach ($files as $field => $val) {
             if (!in_array($field, $fields)) {
                 continue;
             }
             $model->{$field} = $values[$field];
         }
         $page_content_id = $this->controller->getParam('page_content_id') ? $this->controller->getParam('page_content_id') : false;
         if ($page_content_id) {
             $page_content =& NController::singleton('page_content');
             $page_content_model =& $page_content->getDefaultModel();
             $page_content_model->get($page_content_id);
         }
         // set up timed contnt values if they are there
         if (isset($values['timed_start'])) {
             $values['timed_start'] = NDate::arrayToDate($values['timed_start']);
             if (!NDate::validDateTime($values['timed_start'])) {
                 $values['timed_start'] = 'null';
             }
         }
         if (isset($values['timed_end'])) {
             $values['timed_end'] = NDate::arrayToDate($values['timed_end']);
             if (!NDate::validDateTime($values['timed_end'])) {
                 $values['timed_end'] = 'null';
             }
         }
         // check for workflow
         if (SITE_WORKFLOW && isset($values['__submit_workflow__'])) {
             $page_content =& NController::factory('page_content');
             if (!$page_content_id) {
                 // then find the page we're attached to
                 $page_content_model =& $page_content->getDefaultModel();
                 $page_content_model->content_asset = $this->controller->name;
                 $page_content_model->content_asset_id = $model->{$pk};
                 if ($page_content_model->find(null, true)) {
                     $page_content_id = $page_content_model->{$page_content_model->primaryKey()};
                 }
             }
             if ($page_content_id) {
                 $page_model = $page_content_model->getLink('page_id', 'page');
                 $page_id = $page_model->{$page_model->primaryKey()};
                 // remove the draft and update the content
                 // delete the draft record
                 $this->controller->deleteDraft();
                 // Pull a fresh copy of the asset model and set the draft to 0
                 // so we don't update with the new content yet
                 $asset_model =& NModel::factory($this->controller->name);
                 $asset_model->get($model->{$pk});
                 $asset_model->cms_draft = 0;
                 $asset_model->update();
             }
             unset($page_content);
             // save the workflow
             $workflow =& NController::factory('workflow');
             $workflow_group_model = $workflow->getWorkflowGroup($page_model);
             // set values for saveWorkflow()
             $workflow_values = array();
             $workflow_values['page_content_id'] = $page_content_model->{$page_content_model->primaryKey()};
             $workflow_values['workflow_group_id'] = $workflow_group_model->{$workflow_group_model->primaryKey()};
             // add timed content
             $workflow_values['timed_start'] = $values['timed_start'];
             $workflow_values['timed_end'] = $values['timed_end'];
             // unset the timed content values so they don't get pushed into page_content
             unset($values['timed_start'], $values['timed_end']);
             $ret = $workflow->saveWorkflow($workflow_values, WORKFLOW_ACTION_EDIT, $this->controller);
         } else {
             if ($page_content_id) {
                 $page_content_model->timed_start = $values['timed_start'];
                 $page_content_model->timed_end = $values['timed_end'];
                 $page_content_model->col_xs = $values['col_xs'];
                 $page_content_model->col_sm = $values['col_sm'];
                 $page_content_model->col_md = $values['col_md'];
                 $page_content_model->col_lg = $values['col_lg'];
                 $page_content_model->row_xs = $values['row_xs'];
                 $page_content_model->row_sm = $values['row_sm'];
                 $page_content_model->row_md = $values['row_md'];
                 $page_content_model->row_lg = $values['row_lg'];
                 $page_content_model->offset_col_xs = $values['offset_col_xs'];
                 $page_content_model->offset_col_sm = $values['offset_col_sm'];
                 $page_content_model->offset_col_md = $values['offset_col_md'];
                 $page_content_model->offset_col_lg = $values['offset_col_lg'];
                 $page_content_model->offset_row_xs = $values['offset_row_xs'];
                 $page_content_model->offset_row_sm = $values['offset_row_sm'];
                 $page_content_model->offset_row_md = $values['offset_row_md'];
                 $page_content_model->offset_row_lg = $values['offset_row_lg'];
                 $page_content_model->pull_xs = $values['pull_xs'];
                 $page_content_model->pull_sm = $values['pull_sm'];
                 $page_content_model->pull_md = $values['pull_md'];
                 $page_content_model->pull_lg = $values['pull_lg'];
                 $page_content_model->gutter_xs = $values['gutter_xs'];
                 $page_content_model->gutter_sm = $values['gutter_sm'];
                 $page_content_model->gutter_md = $values['gutter_md'];
                 $page_content_model->gutter_lg = $values['gutter_lg'];
                 $page_content_model->update();
             }
         }
         // check for drafts
         if (SITE_DRAFTS) {
             if (isset($table['cms_draft']) && isset($values['__submit_draft__'])) {
                 $ret = $this->controller->saveDraft();
                 // update the headline immediately if it exists
                 if (isset($table['cms_headline'])) {
                     $tmp_model =& NModel::factory($this->controller->name);
                     if ($tmp_model && $tmp_model->get($values[$pk])) {
                         $tmp_model->cms_headline = $values['cms_headline'];
                         $tmp_model->update();
                     }
                     unset($tmp_model);
                 }
             }
         }
         if (isset($values['__submit__'])) {
             if ($this->controller->versioning == true) {
                 if (!isset($values['__skip_versioning__'])) {
                     $this->controller->debug('Inserting new version for ' . $model->tableName() . ': ' . $model->{$pk}, 'VERSION');
                     $version_id = $this->controller->insertVersion();
                 }
             }
             // if it's being saved normally (no draft), make sure it's not marked as a draft
             $model->cms_draft = 0;
             $ret = $model->update();
             if (defined('SITE_AUDIT_TRAIL') && SITE_AUDIT_TRAIL && isset($this->controller->_auth)) {
                 // audit trail
                 $audit_trail =& NController::factory('audit_trail');
                 $audit_trail_values = array();
                 $audit_trail_values['asset'] = $this->controller->name;
                 $audit_trail_values['asset_id'] = $model->{$pk};
                 $audit_trail_values['action_taken'] = AUDIT_ACTION_UPDATE;
                 if (isset($page_content_id)) {
                     $audit_trail_values['page_content_id'] = $page_content_id;
                 }
                 if (isset($page_id)) {
                     $audit_trail_values['page_id'] = $page_id;
                 }
                 $audit_trail->insert($audit_trail_values);
                 unset($audit_trail);
             }
             if (SITE_DRAFTS) {
                 // delete any draft records
                 $this->controller->deleteDraft();
             }
             // remove all linked page caches
             $page =& NController::factory('page');
             $page_content_model =& NModel::factory('page_content');
             $page_content_model->content_asset = $this->controller->name;
             $page_content_model->content_asset_id = $values[$pk];
             if ($page_content_model->find()) {
                 while ($page_content_model->fetch()) {
                     $page->deletePageCache($page_content_model->page_id);
                 }
             }
             unset($page);
             unset($page_content_model);
         }
     } else {
         $draft = false;
         if (SITE_DRAFTS && isset($table['cms_draft']) && isset($values['__submit_draft__'])) {
             $model->cms_draft = 1;
         }
         $id = $model->insert();
         $this->processFiles($values, $files);
         foreach ($files as $field => $val) {
             if (!in_array($field, $fields)) {
                 continue;
             }
             $model->{$field} = $values[$field];
         }
         if (SITE_DRAFTS && isset($table['cms_draft']) && isset($values['__submit_draft__'])) {
             // set draft to true after the draft is saved
             $draft = $this->controller->saveDraft();
         }
         $model->update();
         if (defined('SITE_AUDIT_TRAIL') && SITE_AUDIT_TRAIL && isset($this->controller->_auth)) {
             // audit trail
             $audit_trail =& NController::factory('audit_trail');
             $audit_trail_values = array();
             $audit_trail_values['asset'] = $this->controller->name;
             $audit_trail_values['asset_id'] = $model->{$pk};
             $audit_trail_values['action_taken'] = AUDIT_ACTION_INSERT;
             if (isset($page_content_id)) {
                 $audit_trail_values['page_content_id'] = $page_content_id;
             }
             if (isset($page_id)) {
                 $audit_trail_values['page_id'] = $page_id;
             }
             $audit_trail->insert($audit_trail_values);
             unset($audit_trail);
         }
         $ret = $id;
     }
     if ($ret) {
         $this->controller->postProcessForm($values);
     }
     if (isset($values['_referer'])) {
         header('Location:' . urldecode($values['_referer']));
         exit;
     }
     return $ret;
 }