tmgmt_local.pages.inc in Translation Management Tool 7
Provides page and forms callbacks.
File
translators/tmgmt_local/includes/tmgmt_local.pages.incView source
<?php
/**
* @file
* Provides page and forms callbacks.
*/
/**
* Simple page callback for viewing a task.
*
* @param TMGMTJob $task
* The viewed task.
*
* @return array
* A renderable array.
*/
function tmgmt_local_task_view(TMGMTLocalTask $task) {
return entity_view($task
->entityType(), array(
$task,
), 'full', NULL, TRUE);
}
/**
* Entity API form the local task entity.
*/
function tmgmt_local_task_form($form, &$form_state, TMGMTLocalTask $task, $op = 'edit') {
$wrapper = entity_metadata_wrapper('tmgmt_local_task', $task);
// Set the title of the page to the label and the current status of the task.
drupal_set_title(t('@label (@status)', array(
'@label' => $task
->label(),
'@status' => $wrapper->status
->label(),
)));
// Check if the translator entity is completely new or not.
$old = empty($task->is_new) && $op != 'clone';
$form['title'] = array(
'#type' => 'textfield',
'#title' => t('Title'),
'#default_value' => $task->title,
'#access' => user_access('administer tmgmt') || user_access('administer translation tasks'),
);
$form['status'] = array(
'#type' => 'select',
'#title' => t('Status'),
'#options' => tmgmt_local_task_statuses(),
'#default_value' => $wrapper->status
->value(),
'#access' => user_access('administer tmgmt') || user_access('administer translation tasks'),
);
$translators = tmgmt_local_translators($task
->getJob()->source_language, array(
$task
->getJob()->target_language,
));
$form['tuid'] = array(
'#title' => t('Assigned'),
'#type' => 'select',
'#options' => $translators,
'#empty_option' => t('- Select user -'),
'#default_value' => $task->tuid,
'#access' => user_access('administer tmgmt') || user_access('administer translation tasks'),
);
if ($view = views_get_view('tmgmt_local_task_items')) {
$form['items'] = array(
'#type' => 'item',
'#title' => $view
->get_title(),
'#prefix' => '<div class="tmgmt-local-task-items">',
'#markup' => $view
->preview('block', array(
$task->tltid,
)),
'#attributes' => array(
'class' => array(
'tmgmt-local-task-items',
),
),
'#suffix' => '</div>',
'#weight' => 10,
);
}
// Add the buttons and action links.
$form['actions']['#type'] = 'actions';
$form['actions']['#access'] = user_access('administer tmgmt') || user_access('administer translation tasks');
$form['actions']['submit'] = array(
'#type' => 'submit',
'#value' => t('Save task'),
);
if ($old) {
$form['actions']['delete'] = array(
'#type' => 'submit',
'#value' => t('Delete'),
'#redirect' => 'translate/' . $task->tltid . '/delete',
// Don't run validations, so the user can always delete the job.
'#limit_validation_errors' => array(),
);
}
return $form;
}
/**
* Submit callback for the local task form.
*/
function tmgmt_local_task_form_submit($form, &$form_state) {
$task = entity_ui_form_submit_build_entity($form, $form_state);
// If the task isn't assigned to anyone but doesn't have the unassigned status
// update it.
if ($task->tuid == 0 && !$task
->isUnassigned()) {
$task
->unassign();
}
$task
->save();
}
/**
* Simple page callback for viewing a task.
*
* @param TMGMTLocalTaskItem $item
* The viewed task item
*
* @return array
* A renderable array.
*/
function tmgmt_local_task_item_view(TMGMTLocalTaskItem $item) {
return entity_view($item
->entityType(), array(
$item,
), 'full', NULL, TRUE);
}
/**
* Assign task to current user.
*
* @param TMGMTLocalTask $task
*/
function tmgmt_local_translation_assign_to_me(TMGMTLocalTask $task) {
$task
->assign($GLOBALS['user']);
$task
->save();
drupal_goto('translate');
}
/**
* Form callback for translating a job item.
*/
function tmgmt_local_translation_form($form, &$form_state, TMGMTLocalTaskItem $task_item) {
$form_state['task'] = $task_item
->getTask();
$form_state['task_item'] = $task_item;
$form_state['job_item'] = $job_item = $task_item
->getJobItem();
$job = $job_item
->getJob();
if ($job
->getSetting('job_comment')) {
$form['job_comment'] = array(
'#type' => 'item',
'#title' => t('Job comment'),
'#markup' => filter_xss($job
->getSetting('job_comment')),
);
}
$form['translation'] = array(
'#type' => 'container',
);
// Build the translation form.
$data = $job_item
->getData();
// Need to keep the first hierarchy. So flatten must take place inside
// of the foreach loop.
$zebra = 'even';
// Reverse the order to get the correct order.
foreach (array_reverse(element_children($data)) as $key) {
$flattened = tmgmt_flatten_data($data[$key], $key);
$form['translation'][$key] = tmgmt_local_translation_form_element($flattened, $task_item, $zebra);
}
// Add the form actions as well.
$form['actions']['#type'] = 'actions';
$form['actions']['save_as_completed'] = array(
'#type' => 'submit',
'#validate' => array(
'tmgmt_local_translation_form_save_as_completed_validate',
),
'#submit' => array(
'tmgmt_local_translation_form_save_submit',
'tmgmt_local_translation_form_save_as_completed_submit',
),
'#value' => t('Save as completed'),
);
$form['actions']['save'] = array(
'#type' => 'submit',
'#submit' => array(
'tmgmt_local_translation_form_save_submit',
),
'#value' => t('Save'),
);
return $form;
}
/**
* Form validate callback for save as completed submit action.
*
* Verify that all items are translated.
*/
function tmgmt_local_translation_form_save_as_completed_validate($form, &$form_state) {
// Loop over all data items and verify that there is a translation in there.
foreach ($form_state['values'] as $key => $value) {
if (is_array($value) && isset($value['translation'])) {
if (empty($value['translation'])) {
form_set_error($key . '[translation]', t('Missing translation.'));
}
}
}
}
/**
* Form submit callback for save as completed submit action.
*
* Change items to needs review state and task to completed status.
*/
function tmgmt_local_translation_form_save_as_completed_submit($form, &$form_state) {
/**
* @var TMGMTLocalTask $task.
*/
$task = $form_state['task'];
/**
* @var TMGMTLocalTaskItem $task_item.
*/
$task_item = $form_state['task_item'];
$task_item
->completed();
$task_item
->save();
// Mark the task as completed if all assigned job items are at needs done.
$all_done = TRUE;
foreach ($task
->getItems() as $item) {
if ($item
->isPending()) {
$all_done = FALSE;
break;
}
}
if ($all_done) {
$task
->setStatus(TMGMT_LOCAL_TASK_STATUS_COMPLETED);
// If the task is now completed, redirect back to the overview.
$form_state['redirect'] = 'translate';
}
else {
// If there are more task items, redirect back to the task.
$uri = $task
->uri();
$form_state['redirect'] = $uri['path'];
}
/**
* @var TMGMTJobItem $job_item.
*/
$job_item = $form_state['job_item'];
// Add the translations to the job item.
$job_item
->addTranslatedData($task_item
->getData());
}
/**
* Form submit callback for save action.
*
* Saves all items.
*/
function tmgmt_local_translation_form_save_submit($form, &$form_state) {
/**
* @var TMGMTTaskItem $task_item.
*/
$task_item = $form_state['task_item'];
// Write the translated data into the task item.
form_state_values_clean($form_state);
foreach ($form_state['values'] as $key => $value) {
if (is_array($value) && isset($value['translation'])) {
$update['#text'] = $value['translation'];
$task_item
->updateData($key, $update);
}
}
$task_item
->save();
$task = $form_state['task'];
$uri = $task
->uri();
$form_state['redirect'] = $uri['path'];
}
/**
* Builds a translation form element.
*/
function tmgmt_local_translation_form_element($data, TMGMTLocalTaskItem $item, &$zebra) {
static $flip = array(
'even' => 'odd',
'odd' => 'even',
);
$form = array();
$job = $item
->getJobItem()
->getJob();
$language_list = language_list();
foreach (element_children($data) as $key) {
if (isset($data[$key]['#text']) && _tmgmt_filter_data($data[$key])) {
// The char sequence '][' confuses the form API so we need to replace it.
$target_key = str_replace('][', '|', $key);
$zebra = $flip[$zebra];
$form[$target_key] = array(
'#tree' => TRUE,
'#ajaxid' => drupal_html_id('tmgmt-local-element-' . $key),
'#theme' => 'tmgmt_local_translation_form_element',
'#parent_label' => $data[$key]['#parent_label'],
'#zebra' => $zebra,
);
$source_language = $language_list[$job->source_language];
$target_language = $language_list[$job->target_language];
$form[$target_key]['source'] = array(
'#type' => 'textarea',
'#title' => $source_language->name,
'#value' => $data[$key]['#text'],
'#disabled' => TRUE,
'#allow_focus' => TRUE,
);
$form[$target_key]['translation'] = array(
'#type' => 'textarea',
'#title' => $target_language->name,
'#default_value' => $item
->getData(tmgmt_ensure_keys_array($key), '#text'),
);
$form[$target_key]['actions'] = array(
'#type' => 'container',
);
$status = $item
->getData(tmgmt_ensure_keys_array($key), '#status');
$completed = $status == TMGMT_DATA_ITEM_STATE_TRANSLATED;
if ($completed) {
$form[$target_key]['actions']['reject-' . $target_key] = array(
'#type' => 'submit',
// Unicode character ✗ BALLOT X
'#value' => '✗',
'#attributes' => array(
'title' => t('Reject'),
),
'#name' => 'reject-' . $target_key,
'#submit' => array(
'tmgmt_local_translation_form_update_state_submit',
),
'#ajax' => array(
'callback' => 'tmgmt_local_translation_form_update_state_ajax',
'wrapper' => $form[$target_key]['#ajaxid'],
),
'#tmgmt_local_action' => 'reject',
'#tmgmt_local_key' => str_replace('][', '|', $key),
);
}
else {
$form[$target_key]['actions']['finish-' . $target_key] = array(
'#type' => 'submit',
// Unicode character ✓ CHECK MARK
'#value' => '✓',
'#attributes' => array(
'title' => t('Finish'),
),
'#name' => 'finish-' . $target_key,
'#submit' => array(
'tmgmt_local_translation_form_update_state_submit',
),
'#ajax' => array(
'callback' => 'tmgmt_local_translation_form_update_state_ajax',
'wrapper' => $form[$target_key]['#ajaxid'],
),
'#tmgmt_local_action' => 'finish',
'#tmgmt_local_key' => str_replace('][', '|', $key),
);
}
}
}
return $form;
}
/**
* Form submit callback for the translation state update button.
*/
function tmgmt_local_translation_form_update_state_submit($form, &$form_state) {
$values = $form_state['values'];
/**
* @var TMGMTLocalTaskItem $item.
*/
$item = $form_state['task_item'];
$action = $form_state['triggering_element']['#tmgmt_local_action'];
$key = $form_state['triggering_element']['#tmgmt_local_key'];
// Write the translated data into the job item.
if (isset($values[$key]) && is_array($values[$key]) && isset($values[$key]['translation'])) {
$update['#status'] = $action == 'finish' ? TMGMT_DATA_ITEM_STATE_TRANSLATED : TMGMT_DATA_ITEM_STATE_PENDING;
$update['#text'] = $values[$key]['translation'];
$item
->updateData($key, $update);
$item
->save();
// We need to rebuild form so we get updated action button state.
$form_state['rebuild'] = TRUE;
}
}
/**
* Ajax callback for the job item review form.
*/
function tmgmt_local_translation_form_update_state_ajax($form, &$form_state) {
$key = array_slice($form_state['triggering_element']['#array_parents'], 0, 3);
$commands = array();
$render_data = drupal_array_get_nested_value($form, $key);
$commands[] = ajax_command_replace(NULL, drupal_render($render_data));
tmgmt_ui_write_request_messages($form_state['job_item']
->getJob());
$commands[] = ajax_command_html('#tmgmt-status-messages-' . strtolower($render_data['#parent_label'][0]), theme('status_messages'));
return array(
'#type' => 'ajax',
'#commands' => $commands,
);
}
/**
* Form for assigning multiple tasks to translator.
*
* @param array $form
* @param array $form_state
* @param string $tasks
* Comma separated tasks ids.
*
* @return array
* Drupal form definition.
*/
function tmgmt_local_translation_assign_form($form, &$form_state, $tasks) {
$form_state['tasks'] = explode(',', $tasks);
$roles = tmgmt_local_translator_roles();
if (empty($roles)) {
drupal_set_message(t('No user role has the "provide translation services" permission. <a href="@url">Configure permissions</a> for the Local translator module.', array(
'@url' => url('admin/people/permissions'),
)), 'warning');
}
$form['tuid'] = array(
'#title' => t('Assign to'),
'#type' => 'select',
'#empty_option' => t('Select user'),
'#options' => tmgmt_local_get_translators_for_tasks($form_state['tasks']),
'#required' => TRUE,
);
$form['actions']['#type'] = 'actions';
$form['actions']['submit'] = array(
'#type' => 'submit',
'#value' => t('Assign tasks'),
);
return $form;
}
/**
* Submit handler for form for assigning multiple tasks to translator.
*/
function tmgmt_local_translation_assign_form_submit($form, &$form_state) {
$translator = user_load($form_state['values']['tuid']);
$how_many = 0;
foreach ($form_state['tasks'] as $task_id) {
$task = tmgmt_local_task_load($task_id);
if ($task) {
$task
->assign($translator);
$task
->save();
++$how_many;
}
}
drupal_set_message(t('Assigned @how_many to translator @translator_name.', array(
'@how_many' => $how_many,
'@translator_name' => $translator->name,
)));
$form_state['redirect'] = 'manage-translate';
}
/**
* Similar to form for assigning multiple tasks to translator, but here we also
* allow no user selection.
*
* @see tmgmt_local_translation_assign_form().
*/
function tmgmt_local_translation_reassign_form($form, &$form_state, $tasks) {
$form_state['tasks'] = explode(',', $tasks);
$roles = tmgmt_local_translator_roles();
if (empty($roles)) {
drupal_set_message(t('No user role has the "provide translation services" permission. <a href="@url">Configure permissions</a> for the Local translator module.', array(
'@url' => url('admin/people/permissions'),
)), 'warning');
}
$form['tuid'] = array(
'#title' => t('Assign to'),
'#type' => 'select',
'#empty_option' => t('Select user'),
'#options' => tmgmt_local_get_translators_for_tasks($form_state['tasks']),
);
$form['actions']['#type'] = 'actions';
$form['actions']['submit'] = array(
'#type' => 'submit',
'#value' => t('Reassign tasks'),
);
return $form;
}
/**
* Submit handler for form for reassigning multiple tasks to translator.
*/
function tmgmt_local_translation_reassign_form_submit($form, &$form_state) {
if (!empty($form_state['values']['tuid'])) {
$translator = user_load($form_state['values']['tuid']);
}
else {
$translator = (object) array(
'uid' => 0,
'name' => t('none'),
);
}
$how_many = 0;
foreach ($form_state['tasks'] as $task_id) {
$task = tmgmt_local_task_load($task_id);
if ($task) {
if ($translator->uid) {
$task
->assign($translator);
}
else {
$task
->unassign();
}
$task
->save();
++$how_many;
}
}
drupal_set_message(t('Reassigned @how_many to translator @translator_name.', array(
'@how_many' => $how_many,
'@translator_name' => $translator->name,
)));
$form_state['redirect'] = 'manage-translate';
}
Functions
Name | Description |
---|---|
tmgmt_local_task_form | Entity API form the local task entity. |
tmgmt_local_task_form_submit | Submit callback for the local task form. |
tmgmt_local_task_item_view | Simple page callback for viewing a task. |
tmgmt_local_task_view | Simple page callback for viewing a task. |
tmgmt_local_translation_assign_form | Form for assigning multiple tasks to translator. |
tmgmt_local_translation_assign_form_submit | Submit handler for form for assigning multiple tasks to translator. |
tmgmt_local_translation_assign_to_me | Assign task to current user. |
tmgmt_local_translation_form | Form callback for translating a job item. |
tmgmt_local_translation_form_element | Builds a translation form element. |
tmgmt_local_translation_form_save_as_completed_submit | Form submit callback for save as completed submit action. |
tmgmt_local_translation_form_save_as_completed_validate | Form validate callback for save as completed submit action. |
tmgmt_local_translation_form_save_submit | Form submit callback for save action. |
tmgmt_local_translation_form_update_state_ajax | Ajax callback for the job item review form. |
tmgmt_local_translation_form_update_state_submit | Form submit callback for the translation state update button. |
tmgmt_local_translation_reassign_form | Similar to form for assigning multiple tasks to translator, but here we also allow no user selection. |
tmgmt_local_translation_reassign_form_submit | Submit handler for form for reassigning multiple tasks to translator. |