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); }
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; }