path));
$front_id_count = count(explode('/', $this->entityInfo['admin ui']["front path"]));
$wildcard = isset($this->entityInfo['admin ui']['menu wildcard']) ? $this->entityInfo['admin ui']['menu wildcard'] : '%' . $this->entityType;
$items[$this->path] = array(
'title' => 'Entityforms',
'description' => 'Add edit and update entityforms.',
'page callback' => 'system_admin_menu_block_page',
'access arguments' => array('access administration pages'),
'file path' => drupal_get_path('module', 'system'),
'file' => 'system.admin.inc',
);
// Change the overview menu type for the list of entityforms.
$items[$this->path]['type'] = MENU_LOCAL_TASK;
$items['eform/submit/%entityform_empty'] = array(
'title callback' => 'entityform_page_title',
'title arguments' => array(2, 1),
'page callback' => 'entityform_form_wrapper',
'page arguments' => array(2, 'submit'),
'access callback' => 'entityform_access',
'access arguments' => array('submit', 2),
'file' => 'entityform.admin.inc',
'file path' => drupal_get_path('module', $this->entityInfo['module']),
'type' => MENU_CALLBACK,
);
$items['eform/%entityform_type/confirm'] = array(
'title callback' => 'entityform_type_page_title',
'title arguments' => array(1, 'confirm'),
'description' => '',
'page callback' => 'entityform_confirm_page',
'page arguments' => array(1, 3),
'access callback' => 'entityform_access',
'access arguments' => array('confirm', 1),
);
$items['eform/%entityform_type/draft'] = array(
'title' => 'Form Saved',
'description' => '',
'page callback' => 'entityform_draft_page',
'page arguments' => array(1),
'access callback' => TRUE,
'access arguments' => array('draft_save', 1),
);
$items['eform/%entityform_type/submissions'] = array(
'title callback' => 'entityform_type_page_title',
'title arguments' => array(1, 'view submissions'),
'description' => '',
'page callback' => 'entityform_submission_page',
'page arguments' => array(1, 3, 'user'),
'access arguments' => array('view own entityform'),
);
$types = array_keys(entityform_get_types());
$controller = entity_ui_controller('entityform');
// Loading and editing entityform entities.
$items['entityform/' . $wildcard] = array(
'page callback' => 'entityform_form_wrapper',
'page arguments' => array($id_count + 1),
'access callback' => 'entityform_access',
'access arguments' => array('edit', $id_count + 1),
'weight' => 0,
'context' => MENU_CONTEXT_PAGE | MENU_CONTEXT_INLINE,
'file' => 'entityform.admin.inc',
'file path' => drupal_get_path('module', $this->entityInfo['module']),
);
$items['entityform/' . $wildcard . '/edit'] = array(
'title' => 'Edit',
'page callback' => 'entityform_form_wrapper',
'page arguments' => array(1, 'edit'),
'access callback' => 'entityform_access',
'access arguments' => array('edit', 1),
'weight' => 0,
'type' => MENU_LOCAL_TASK,
'context' => MENU_CONTEXT_PAGE | MENU_CONTEXT_INLINE,
'file' => 'entityform.admin.inc',
'file path' => drupal_get_path('module', $this->entityInfo['module']),
);
$items['entityform/' . $wildcard . '/delete'] = array(
'title' => 'Delete',
'page callback' => 'entityform_delete_form_wrapper',
'page arguments' => array(1),
'access callback' => 'entityform_access',
'access arguments' => array('delete', 1),
'type' => MENU_LOCAL_TASK,
'context' => MENU_CONTEXT_PAGE | MENU_CONTEXT_INLINE,
'weight' => 10,
'file' => 'entityform.admin.inc',
'file path' => drupal_get_path('module', $this->entityInfo['module']),
);
// Menu item for viewing entityforms.
$items['entityform/' . $wildcard] = array(
//'title' => 'Title',
'title callback' => 'entityform_page_title',
'title arguments' => array(1),
'page callback' => 'entityform_page_view',
'page arguments' => array(1),
'access callback' => 'entityform_access',
'access arguments' => array('view', 1),
'type' => MENU_CALLBACK,
);
$items['entityform/' . $wildcard . '/view'] = array(
'title' => 'View',
'type' => MENU_DEFAULT_LOCAL_TASK,
'weight' => -10,
);
return $items;
}
/**
* Create the markup for the add Entityform Entities page within the class
* so it can easily be extended/overriden.
*/
public function addPage() {
$item = menu_get_item();
$content = system_admin_menu_block($item);
if (count($content) == 1) {
$item = array_shift($content);
drupal_goto($item['href']);
}
return theme('entityform_add_list', array('content' => $content));
}
public function confirm_path($bundle, $entityform_id = NULL) {
module_load_include('inc', 'entityform', 'entityform_type.admin');
$entityform_type = entityform_type_load($bundle);
if (!empty($entityform_id)) {
$redirect_path = $entityform_type->get_path_property('redirect_path', entityform_load($entityform_id));
}
else {
$redirect_path = $entityform_type->get_path_property('redirect_path');
}
if (!empty($redirect_path)) {
return $redirect_path;
}
$path = _entityform_type_get_confirm_url($bundle);
$path = drupal_get_path_alias($path);
if ($entityform_id) {
return array(
$path,
array(
'query' => array(
'entityform_id' => $entityform_id,
),
),
);
}
return array($path);
}
public function draft_path($bundle) {
$bundle = str_replace('_', '-', $bundle);
return "eform/$bundle/draft";
}
public function submit_path($bundle) {
module_load_include('inc', 'entityform', 'entityform_type.admin');
$path = _entityform_type_get_submit_url($bundle);
$path = drupal_get_path_alias($path);
return $path;
}
}
/**
* Form callback wrapper: create or edit a entityform.
*
* @param $entityform
* The entityform object being edited by this form.
* @param $mode
* Current mode for this form
* Submit - user is submitting the form
* Edit - user with permission is editingform
* @param $form_context
* How is form being used shown?
* 'page' - on submit page
* 'embedded' - called form EntityformTypeController->view()
* 'preview' - Preview on Entityform type management
* @see entityform_edit_form()
*/
function entityform_form_wrapper($entityform, $mode = 'submit', $form_context = 'page') {
$make_form = TRUE;
$entityform_type = entityform_type_load($entityform->type);
if ($form_context == 'page') {
drupal_set_title($entityform_type->label);
}
if (!empty($entityform->is_new)) {
$draft = FALSE;
if ($entityform_type->data['draftable']) {
$draft = entityform_user_draft($entityform->type);
if (!empty($draft)) {
$entityform = $draft;
}
}
if (!$draft) {
// @todo add logic or other resubmit action.
$old_submission = entityform_user_previous_submission($entityform_type->type);
if ($old_submission) {
switch ($entityform_type->data['resubmit_action']) {
case 'old':
$entityform = $old_submission;
break;
case 'confirm':
$confirm_path = entity_ui_controller('entityform')->confirm_path($old_submission->type, $old_submission->entityform_id);
drupal_goto($confirm_path[0], $confirm_path[1]);
break;
case 'disallow':
// @todo how should this be handled.
$entityform_type->get_prop('disallow_resubmit_msg');
$make_form = FALSE;
break;
}
}
}
}
$output = array();
if ($mode == 'submit' && (user_access('view own entityform') || user_access('view any entityform'))) {
// Only show link if this user has a submission that will show up in the selected View.
if (!empty($entityform_type->data['user_submissions_view'])) {
$results = views_get_view_result($entityform_type->data['user_submissions_view'], NULL, $entityform_type->type);
if (!empty($results)) {
$output['submissions_link'] = array(
'#type' => 'markup',
'#markup' => "
" . l(t('View your previous submissions'), "eform/{$entityform_type->type}/submissions") . "
",
'#weight' => -100,
);
}
}
}
// Instructions get printed even if form is not created.
if (!empty($entityform_type->data['instruction_pre'])) {
$output['intro'] = array(
'#type' => 'markup',
'#markup' => "" . _entityform_format_text($entityform_type->data['instruction_pre'], array('entityform_type' => $entityform_type)) . "
",
'#weight' => -100,
);
}
if ($make_form) {
$form = drupal_get_form($entityform->type . '_entityform_edit_form', $entityform, $mode, $form_context);
$form['#attributes']['class'][] = 'entityform';
if (!empty($entityform->type)) {
$form['#attributes']['class'][] = 'entitytype-' . $entityform->type . '-form';
}
$output += $form;
}
if (user_access('administer entityform types')) {
// Make contextual links if user has access.
$contextual_links = array();
$contextual_links['entityform_edit'] = array(
'admin/structure/entityform_types/manage',
array($entityform_type->type),
);
$output['#contextual_links'] = $contextual_links;
}
return $output;
}
/**
* Form callback wrapper: delete a entityform.
*
* @param $entityform
* The entityform object being edited by this form.
*
* @see entityform_edit_form()
*/
function entityform_delete_form_wrapper($entityform) {
return drupal_get_form('entityform_delete_form', $entityform);
}
/**
* Form callback: create or edit a entityform.
*
* @param $entityform
* The entityform object to edit or for a create form an empty entityform object
* with only a entityform type defined.
*/
function entityform_edit_form($form, &$form_state, $entityform, $mode = 'submit', $form_context = 'page') {
global $user;
$entityform_type = entityform_type_load($entityform->type);
$is_review = FALSE;
if (!empty($form_state['values']['op']) && $form_state['values']['op'] == t('Change')) {
$entityform = $form_state['entityform_preview_entity'];
unset($form_state['entityform_preview_entity']);
}
else {
if (!empty($entityform_type->data['preview_page']) && !empty($form_state['entityform_preview_entity'])) {
$entityform = $form_state['entityform_preview_entity'];
$entityform->uid = $user->uid;
$is_review = TRUE;
$form['review'] = entity_get_controller('entityform')->view(array($entityform->entityform_id => $entityform), 'review', NULL, TRUE);
drupal_set_message(t('Please review your submission'));
}
}
// Add the field related form elements.
$form_state['entityform'] = $entityform;
$form_state['entityform_form_mode'] = $mode;
if (!$is_review) {
field_attach_form('entityform', $entityform, $form, $form_state);
}
$form['actions'] = array(
'#type' => 'container',
'#attributes' => array('class' => array('form-actions')),
'#weight' => 400,
);
// We add the form's #submit array to this button along with the actual submit
// handler to preserve any submit handlers added by a form callback_wrapper.
$submit = array();
if (!empty($form['#submit'])) {
$submit += $form['#submit'];
}
if ($mode == 'submit') {
// Determine if we are on Preview Form page.
$entity_info = entity_get_info('entityform_type');
// Create Draft button so that other modules can activate but don't give access by default.
$form['actions']['save'] = array(
'#type' => 'submit',
'#value' => $entityform_type->get_prop('draft_button_text'),
// Causes errors.
//'#limit_validation_errors' => array(),
'#entityform_draft' => '1',
'#submit' => $submit + array('entityform_edit_form_submit'),
'#access' => FALSE,
);
// If form is draftable and user is logged in add draft button.
if ($entityform_type->data['draftable'] && !empty($user->uid)) {
if (!$is_review) {
$form['actions']['save']['#access'] = TRUE;
}
}
if ($is_review) {
$form['actions']['change'] = array(
'#type' => 'submit',
'#value' => t('Change'),
'#entityform_draft' => 0,
'#entityform_change' => 1,
'#submit' => $submit + array('entityform_edit_form_submit'),
);
}
$form['actions']['submit'] = array(
'#type' => 'submit',
'#value' => $entityform_type->get_prop('submit_button_text'),
'#entityform_draft' => 0,
'#submit' => $submit + array('entityform_edit_form_submit'),
'#entityform_after_review' => $is_review,
);
}
else {
$form['user_info'] = array(
'#type' => 'markup',
'#markup' => _entityform_get_submit_info($entityform),
'#weight' => -200,
'#prefix' => '',
'#suffix' => '
',
);
$form['actions']['save'] = array(
'#type' => 'submit',
'#value' => t('Save Changes'),
'#entityform_draft' => '0',
'#submit' => $submit + array('entityform_edit_form_submit'),
);
}
if (!empty($entityform->name)) {
$form['actions']['delete'] = array(
'#type' => 'submit',
'#value' => t('Delete entityform'),
'#suffix' => l(t('Cancel'), 'admin/structure/entityforms'),
'#submit' => $submit + array('entityform_form_submit_delete'),
'#weight' => 45,
);
}
// We append the validate handler to #validate in case a form callback_wrapper
// is used to add validate handlers earlier.
$form['#validate'][] = 'entityform_edit_form_validate';
// Make sure the proper files are loaded if the form has an ajax callback.
// This happens in image field upload for instance.
$form['#after_build'][] = 'entityform_load_required_entityform_admin';
$form['#after_build'][] = 'entityform_clear_required';
$form['#validate'][] = 'entityform_set_required';
if ($form_context == 'preview') {
_entityform_type_modify_preview_form($form);
}
return $form;
}
/**
* Modify an Entityform add/edit form to use as a preview.
* @param $form
*/
function _entityform_type_modify_preview_form(&$form) {
foreach (element_children($form['actions']) as $child_key) {
if ($form['actions'][$child_key]['#type'] == 'submit') {
$form['actions'][$child_key]['#disabled'] = TRUE;
$form['actions'][$child_key]['#executes_submit_callback'] = FALSE;
unset($form['actions'][$child_key]['#submit']);
}
}
}
/**
* Called via after_build on entityforms.
* This makes sure that required fields aren't required when saving a Draft.
* A Draft is not complete so it shouldn't enforce required fields.
*
* @param array $form
* @param array $form_state
* @return array
*/
function entityform_clear_required($form, &$form_state) {
if (!empty($form_state['triggering_element']['#entityform_draft'])) {
_entityform_set_all_nested_props($form, array('#required' => FALSE));
}
return $form;
}
/**
* @param array $form
* @param array $props
* properties to set
* @param boolean $must_match
*/
function _entityform_set_all_nested_props(&$form, $props, $must_match = FALSE) {
$matched = TRUE;
if ($must_match) {
$matched = isset($form['#entityform_required']);
}
if ($matched) {
foreach ($props as $key => $value) {
if (isset($form[$key]) && $form[$key] != $value) {
$form[$key] = $value;
if (!$must_match) {
$form['#entityform_required'] = TRUE;
}
else {
unset($form['#entityform_required']);
}
}
}
}
foreach (element_children($form) as $key) {
if (is_array($form[$key])) {
_entityform_set_all_nested_props($form[$key], $props, $must_match);
}
}
}
/*
* Set form elements back to required.
*/
function entityform_set_required(&$form, &$form_state) {
_entityform_set_all_nested_props($form, array('#required' => TRUE), TRUE);
}
/**
* Form API validate callback for the entityform form.
*/
function entityform_edit_form_validate(&$form, &$form_state) {
$entityform = $form_state['entityform'];
// Notify field widgets to validate their data.
field_attach_form_validate('entityform', $entityform, $form, $form_state);
}
/**
* Form API submit callback for the entityform form.
*
* @todo remove hard-coded link
*/
function entityform_edit_form_submit(&$form, &$form_state) {
$entityform = entity_ui_controller('entityform')->entityFormSubmitBuildEntity($form, $form_state);
// Add in created and changed times. This must be added before preview to get time.
if ($entityform->is_new = isset($entityform->is_new) ? $entityform->is_new : 0) {
global $user;
$entityform->created = time();
$entityform->uid = !empty($user->uid) ? $user->uid : 0;
}
$entityform->changed = time();
$entityform->draft = $form_state['clicked_button']['#entityform_draft'];
// Save the entityform and go back to the list of entityforms.
$entityform_type = entityform_type_load($entityform->type);
if (!empty($form_state['clicked_button']['#entityform_change'])) {
$form_state['entityform_preview_entity'] = $entityform;
$form_state['rebuild'] = TRUE;
drupal_set_message(t('Re-enter'));
return;
}
else {
// If this entityform type has preview mode and we are in submit store preview.
if (empty($form_state['clicked_button']['#entityform_after_review'])
&& !$entityform->draft
&& !empty($entityform_type->data['preview_page'])
&& $form_state['entityform_form_mode'] == 'submit') {
$form_state['entityform_preview_entity'] = $entityform;
$form_state['rebuild'] = TRUE;
return;
}
}
$entityform->save();
if ($form_state['entityform_form_mode'] == 'submit' || !user_access('edit any entityform')) {
if (empty($entityform->draft)) {
$redirect_path = $entityform_type->get_path_property('redirect_path', $entityform);
if (!empty($redirect_path)) {
$form_state['redirect'] = $redirect_path;
}
else {
global $user;
if (empty($user->uid)) {
// For anonymous users we must store the id of their submission in the session.
drupal_session_start();
$_SESSION['entityform_submission'] = $entityform->entityform_id;
}
$confirm_path = entity_ui_controller('entityform')->confirm_path($entityform->type, $entityform->entityform_id);
$form_state['redirect'] = array($confirm_path[0], $confirm_path[1]);
}
drupal_set_message($entityform_type->get_prop('submit_confirm_msg', $entityform));
}
else {
// Saving a Draft.
$form_state['redirect'] = $entityform_type->get_path_property('draft_redirect_path', $entityform);
if (empty($form_state['redirect'])) {
// Redirect to standard draft page.
drupal_set_message(t('Your draft submission has been saved.'));
$form_state['redirect'] = entity_ui_controller('entityform')->draft_path($entityform->type);
}
else {
// Redirecting away from standard draft page. Show text as message.
drupal_set_message($entityform_type->get_prop('draft_save_text', $entityform));
}
}
}
else {
$info = entity_get_info('entityform_type');
$form_state['redirect'] = $info['admin ui']['path'] . "/manage/{$entityform_type->type}/submissions";
drupal_set_message($entityform_type->get_prop('submit_confirm_msg', $entityform));
}
}
/**
* Form API submit callback for the delete button.
*
* @todo Remove hard-coded path
*/
function entityform_form_submit_delete(&$form, &$form_state) {
$form_state['redirect'] = 'admin/structure/entityforms/entityform/' . $form_state['entityform']->entityform_id . '/delete';
}
/**
* Form callback: confirmation form for deleting a entityform.
*
* @param $entityform
* The entityform to delete
*
* @see confirm_form()
*/
function entityform_delete_form($form, &$form_state, $entityform) {
$form_state['entityform'] = $entityform;
$form['#submit'][] = 'entityform_delete_form_submit';
$entityform_type = entityform_type_load($entityform->type);
// @todo Where should a non-admin go when canceling?
$form = confirm_form($form,
$entityform_type->get_prop('delete_confirm_msg', $entityform),
"admin/structure/entityform_types/manage/{$entityform->type}/submissions",
'' . t('This action cannot be undone.') . '
',
t('Delete'),
t('Cancel'),
'confirm'
);
return $form;
}
/**
* Submit callback for entityform_delete_form.
*/
function entityform_delete_form_submit($form, &$form_state) {
$entityform = $form_state['entityform'];
entityform_delete($entityform);
drupal_set_message(t('The Submission for %name has been deleted.', array('%name' => $entityform->getTypeName())));
watchdog('entityform', 'Deleted Submission for %name.', array('%name' => $entityform->getTypeName()));
$form_state['redirect'] = "admin/structure/entityform_types/manage/{$entityform->type}/submissions";
}
/**
* Page to add Entityform Entities.
*
* @todo Pass this through a proper theme function
*/
function entityform_add_page() {
$controller = entity_ui_controller('entityform');
return $controller->addPage();
}
/**
* Displays the list of available entityform types for entityform creation.
*
* @ingroup themeable
*/
function theme_entityform_add_list($variables) {
$content = $variables['content'];
$output = '';
if ($content) {
$output = '';
foreach ($content as $item) {
$output .= '- ' . l($item['title'], $item['href']) . '
';
$output .= '- ' . filter_xss_admin($item['description']) . '
';
}
$output .= '
';
}
else {
if (user_access('administer entityform types')) {
$output = '' . t('Entityform Entities cannot be added because you have not created any entityform types yet. Go to the entityform type creation page to add a new entityform type.', array('@create-entityform-type' => url('admin/structure/entityform_types/add'))) . '
';
}
else {
$output = '' . t('No entityform types have been created yet for you to use.') . '
';
}
}
return $output;
}