updated i18n i10n_update workflwo imachecache_actions

This commit is contained in:
2020-06-23 12:41:21 +02:00
parent 8c39ab6f4a
commit 092758ecb0
134 changed files with 2894 additions and 1205 deletions
@@ -89,7 +89,7 @@ class Workflow extends Entity implements WorkflowInterface {
protected function preRebuild() {
// Remap roles. They can come from another system with shifted role IDs.
// See also https://drupal.org/node/1702626 .
$this->rebuildRoles($this->tab_roles);
$this->tab_roles = $this->rebuildRoles($this->tab_roles);
// After update.php or import feature, label might be empty. @todo: remove in D8.
if (empty($this->label)) {
@@ -160,30 +160,32 @@ class Workflow extends Entity implements WorkflowInterface {
$data = (array)$data;
if (is_numeric($name)) {
$start_state = $saved_states[$saved_state_names[$data['sid']]];
$end_state = $saved_states[$saved_state_names[$data['target_sid']]];
$name = WorkflowConfigTransition::machineName($start_state->getName(),
$end_state->getName());
if (isset($saved_states[$data['sid']]) && isset($saved_states[$data['target_sid']])) {
$start_state = $saved_states[$data['sid']]; // #2876303
$end_state = $saved_states[$data['target_sid']]; // #2876303
}
else {
$start_state = $this->getState($data['sid']);
$end_state = $this->getState($data['target_sid']);
}
}
else {
$start_state = $saved_states[$data['start_state']];
$end_state = $saved_states[$data['end_state']];
}
$name = WorkflowConfigTransition::machineName($start_state->getName(), $end_state->getName());
if (isset($db_transitions[$name])) {
$transition = $db_transitions[$name];
}
else {
$transition = $this->createTransition($start_state->sid,
$end_state->sid);
$transition = $this->createTransition($start_state->sid, $end_state->sid);
}
$transition->wid = $this->wid;
$transition->sid = $start_state->sid;
$transition->target_sid = $end_state->sid;
$transition->label = $data['label'];
$transition->roles = $data['roles'];
$this->rebuildRoles($transition->roles);
$transition->roles = $this->rebuildRoles($data['roles']);
$transition->save();
unset($db_transitions[$name]);
@@ -251,12 +253,14 @@ class Workflow extends Entity implements WorkflowInterface {
public function isValid() {
$is_valid = TRUE;
$workflow_name = $this->getName();
$wid = $this->getWorkflowId();
// Don't allow workflows with no states. There should always be a creation state.
$states = $this->getStates($all = FALSE);
if (count($states) < 1) {
// That's all, so let's remind them to create some states.
$message = t('Workflow %workflow has no states defined, so it cannot be assigned to content yet.',
array('%workflow' => $this->getName()));
array('%workflow' => $workflow_name));
drupal_set_message($message, 'warning');
// Skip allowing this workflow.
@@ -268,7 +272,7 @@ class Workflow extends Entity implements WorkflowInterface {
if (count($transitions) < 1) {
// That's all, so let's remind them to create some transitions.
$message = t('Workflow %workflow has no transitions defined, so it cannot be assigned to content yet.',
array('%workflow' => $this->getName()));
array('%workflow' => $workflow_name));
drupal_set_message($message, 'warning');
// Skip allowing this workflow.
@@ -281,7 +285,7 @@ class Workflow extends Entity implements WorkflowInterface {
$message = t('Please maintain Workflow %workflow on its <a href="@url">settings</a> page.',
array(
'%workflow' => $this->getName(),
'@url' => url('admin/config/workflow/workflow/manage/' . $this->wid),
'@url' => url(WORKFLOW_ADMIN_UI_PATH . "/manage/$wid"),
)
);
drupal_set_message($message, 'warning');
@@ -539,19 +543,7 @@ class Workflow extends Entity implements WorkflowInterface {
}
/**
* Loads all allowed ConfigTransitions for this workflow.
*
* @param mixed $tids
* Array of Transitions IDs. If FALSE, show all transitions.
* @param array $conditions
* $conditions['sid'] : if provided, a 'from' State ID.
* $conditions['target_sid'] : if provided, a 'to' state ID.
* $conditions['roles'] : if provided, an array of roles, or 'ALL'.
* @param bool $reset
* Indicator to reset the cache.
*
* @return array
* An array of keyed transitions.
* @inheritdoc
*/
public function getTransitions($tids = FALSE, array $conditions = array(), $reset = FALSE) {
$config_transitions = array();
@@ -690,21 +682,22 @@ class Workflow extends Entity implements WorkflowInterface {
}
protected function defaultLabel() {
return isset($this->label) ? $this->label : '';
return isset($this->label) ? t('@label', array('@label' => $this->label)) : '';
}
protected function defaultUri() {
return array('path' => 'admin/config/workflow/workflow/manage/' . $this->wid);
$wid = $this->wid;
return array('path' => WORKFLOW_ADMIN_UI_PATH . "/manage/$wid");
}
protected function rebuildRoles(array &$roles) {
$role_map = isset($this->system_roles) ? $this->system_roles : array();
if (!$role_map) {
return;
}
protected function rebuildRoles(array $roles) {
$new_roles = array();
// @todo: importing Roles is incomplete when user language is not English.
// function user_roles() translates DRUPAL_ANONYMOUS_RID, DRUPAL_AUTHENTICATED_RID
$role_map = workflow_get_roles(NULL);
// See also https://drupal.org/node/1702626 .
$new_roles = array();
foreach ($roles as $key => $rid) {
if ($rid == WORKFLOW_ROLE_AUTHOR_RID) {
$new_roles[$rid] = $rid;
@@ -715,7 +708,7 @@ class Workflow extends Entity implements WorkflowInterface {
}
}
}
$roles = $new_roles;
return $new_roles;
}
}
@@ -51,11 +51,12 @@ class WorkflowConfigTransition extends Entity {
}
protected function defaultLabel() {
return $this->label;
return isset($this->label) ? t('@label', array('@label' => $this->label)) : '';
}
protected function defaultUri() {
return array('path' => 'admin/config/workflow/workflow/manage/' . $this->wid . '/transitions/');
$wid = $this->wid;
return array('path' => WORKFLOW_ADMIN_UI_PATH . "/manage/$wid/transitions/");
}
/**
@@ -96,11 +97,16 @@ class WorkflowConfigTransition extends Entity {
* - In permissions;
* - By permission hooks, implemented by other modules.
*
* @param string|array $user_roles
* The string 'ALL' to force allowing the transition, or an array of role
* IDs to compare against the roles allowed for the transition.
*
* @return bool
* TRUE if OK, else FALSE.
* If the transition is allowed, this function returns TRUE. Otherwise, it
* returns FALSE.
*/
public function isAllowed($user_roles) {
if ($user_roles == 'ALL') {
if ($user_roles === 'ALL') {
// Superuser.
return TRUE;
}
@@ -132,6 +138,25 @@ class WorkflowConfigTransition extends Entity {
$workflow->save();
}
}
/**
* Helper debugging function to easily show the contents of a transition.
*/
public function dpm($function = 'not_specified') {
$transition = $this;
$time = NULL;
// Do this extensive $user_name lines, for some troubles with Action.
$t_string = get_class($this) . ' ' . $this->identifier() . " in function '$function'";
//$output[] = 'Entity = ' . ((!$entity) ? 'NULL' : ($entity_type . '/' . $entity_bundle . '/' . $entity_id));
//$output[] = 'Field = ' . $transition->getFieldName();
$output[] = 'From/To = ' . $transition->sid . ' > ' . $transition->target_sid . ' @ ' . $time;
//$output[] = 'Comment = ' . $user_name . ' says: ' . $transition->getComment();
//$output[] = 'Forced = ' . ($transition->isForced() ? 'yes' : 'no');
if (function_exists('dpm')) { dpm($output, $t_string); }
}
}
/**
@@ -154,11 +154,14 @@ interface WorkflowInterface {
/**
* Loads all allowed ConfigTransitions for this workflow.
*
* @param array|NULL $ids
* Array of Transitions IDs. If NULL, show all transitions.
* @param array|bool $tids
* Array of Transitions IDs. If FALSE, show all transitions.
* @param array $conditions
* $conditions['from_sid'] : if provided, a 'from' State ID.
* $conditions['to_sid'] : if provided, a 'to' state ID.
* $conditions['sid'] : if provided, a 'from' State ID.
* $conditions['target_sid'] : if provided, a 'to' state ID.
* $conditions['roles'] : if provided, an array of roles, or 'ALL'.
* @param bool $reset
* Indicator to reset the cache.
*
* @return \Drupal\workflow\Entity\WorkflowConfigTransition[]
*/
@@ -153,7 +153,7 @@ class WorkflowState extends Entity {
public static function loadByName($name, $wid = 0) {
/* @var $state WorkflowState */
foreach ($states = self::getStates($wid) as $state) {
if ($name == $state->getName()) {
if ($name == $state->name) {
return $state;
}
}
@@ -458,7 +458,7 @@ class WorkflowState extends Entity {
// We cannot use getTransitions, since there are no ConfigTransitions
// from State with ID 0, and we do not want to repeat States.
foreach ($workflow->getStates() as $state) {
$options[$state->value()] = $state->label(); // Translation is done later.
$options[$state->value()] = $state->label(); // Translation is done as part of defaultLabel().
}
}
else {
@@ -473,7 +473,7 @@ class WorkflowState extends Entity {
$label = $target_state ? $target_state->label() : '';
}
$new_sid = $transition->target_sid;
$options[$new_sid] = $label; // Translation is done later.
$options[$new_sid] = $label; // Translation is done as part of defaultLabel().
}
// Include current state for same-state transitions, except when $sid = 0.
@@ -481,16 +481,10 @@ class WorkflowState extends Entity {
// but only if the transitions have been saved at least one time.
if ($current_sid && ($current_sid != $workflow->getCreationSid())) {
if (!isset($options[$current_sid])) {
$options[$current_sid] = $this->label(); // Translation is done later.
$options[$current_sid] = $this->label(); // Translation is done as part of defaultLabel().
}
}
// Properly fix the labels.
// Translate, convert '&', make secure.
foreach($options as $key => $label) {
$options[$key] = html_entity_decode(check_plain(t($label)));
}
// Save to entity-specific cache.
$cache[$entity_type][$entity_index][$force][$current_sid] = $options;
}
@@ -538,7 +532,7 @@ class WorkflowState extends Entity {
* Mimics Entity API functions.
*/
protected function defaultLabel() {
return $this->state;
return isset($this->state) ? t('@state', array('@state' => $this->state)) : '';
}
public function getName() {
@@ -446,7 +446,7 @@ class WorkflowTransition extends Entity {
$args = array(
'@type' => $entity_type_info['label'],
'%label' => entity_label($entity_type, $entity),
'%state_name' => check_plain(t($new_state->label())),
'%state_name' => $new_state->label(),
);
$uri = entity_uri($entity_type, $entity);
watchdog('workflow', $message, $args, WATCHDOG_NOTICE, l('view', $uri['path']));
@@ -111,7 +111,7 @@ class WorkflowItem extends WorkflowD7Base {// D8: extends ConfigFieldItemBase im
'#default_value' => $wid,
'#required' => TRUE,
'#disabled' => $has_data,
'#description' => t('Choose the Workflow type. Maintain workflows !url.', array('!url' => l(t('here'), 'admin/config/workflow/workflow'))),
'#description' => t('Choose the Workflow type. Maintain workflows !url.', array('!url' => l(t('here'), WORKFLOW_ADMIN_UI_PATH))),
);
// Inform the user of possible states.
@@ -297,7 +297,7 @@ class WorkflowItem extends WorkflowD7Base {// D8: extends ConfigFieldItemBase im
$previous_wid = $state->wid;
$lines[] = $state->name . "'s states: ";
}
$label = check_plain(t($state->label()));
$label = $state->label();
$states[$state->sid] = $label;
$lines[] = $state->sid . ' | ' . $label;
}
@@ -317,12 +317,13 @@ class WorkflowItem extends WorkflowD7Base {// D8: extends ConfigFieldItemBase im
* @return array
* The array of allowed values. Keys of the array are the raw stored values
* (number or text), values of the array are the display labels.
* It contains all possible values, beause the result is cached,
* and used for all nodes on a page.
* It contains all possible values for the field, because the result is
* cached on a field basis, and used for all nodes on a page.
*/
public function getAllowedValues() {
// Get all state names, including inactive states.
$options = workflow_get_workflow_state_names(0, $grouped = FALSE, $all = TRUE);
$wid = isset($this->field['settings']['wid']) ? $this->field['settings']['wid'] : 0;
$options = workflow_get_workflow_state_names($wid, $grouped = FALSE, $all = TRUE);
return $options;
}
@@ -190,7 +190,7 @@ class WorkflowTransitionForm { // extends FormBase {
}
}
$workflow_label = $workflow ? check_plain(t($workflow->label())) : '';
$workflow_label = $workflow ? $workflow->label() : '';
// Change settings locally.
if (!$field_name) {
@@ -300,7 +300,7 @@ class WorkflowTransitionForm { // extends FormBase {
else {
$element['workflow'] += array(
'#type' => 'fieldset',
'#title' => t($workflow_label),
'#title' => $workflow_label,
'#collapsible' => TRUE,
'#collapsed' => ($settings_fieldset == 1) ? FALSE : TRUE,
);
@@ -312,13 +312,13 @@ class WorkflowTransitionForm { // extends FormBase {
$help_text = isset($instance['description']) ? $instance['description'] : '';
$element['workflow']['workflow_sid'] = array(
'#type' => $settings_options_type,
'#title' => $settings_title_as_name ? t('Change !name state', array('!name' => $workflow_label)) : t('Target state'),
'#title' => $settings_title_as_name ? t('Change @name state', array('@name' => $workflow_label)) : t('Target state'),
'#access' => TRUE,
'#options' => $options,
// '#name' => $workflow_label,
// '#parents' => array('workflow'),
'#default_value' => $default_value,
'#description' => $help_text,
'#description' => t('@help', array('@help' => $help_text)),
);
}
@@ -605,7 +605,7 @@ class WorkflowTransitionForm { // extends FormBase {
// content is not associated to a workflow, old_sid is now 0. This may
// happen in workflow_vbo, if you assign a state to non-relevant nodes.
$entity_id = entity_id($entity_type, $entity);
drupal_set_message(t('Error: content !id has no workflow attached. The data is not saved.', array('!id' => $entity_id)), 'error');
drupal_set_message(t('Error: content @id has no workflow attached. The data is not saved.', array('@id' => $entity_id)), 'error');
// The new state is still the previous state.
$new_sid = $old_sid;
return $new_sid;
@@ -617,7 +617,8 @@ class WorkflowTransitionForm { // extends FormBase {
// Try to execute the transition. Return $old_sid when error.
if (!$transition) {
// This should only happen when testing/developing.
drupal_set_message(t('Error: the transition from %old_sid to %new_sid could not be generated.'), 'error');
drupal_set_message(t('Error: the transition from @old_sid to @new_sid could not be generated.',
array('@old_sid' => $old_sid, '@new_sid' => $new_sid)), 'error');
// The current value is still the previous state.
$new_sid = $old_sid;
}
@@ -46,16 +46,14 @@ function workflow_get_workflows_by_name($name) {
* @deprecated: workflow_get_wid_label --> workflow_label
*/
function workflow_get_wid_label($wid) {
$label = t('Unknown workflow');
if (empty($wid)) {
$output = t('No workflow');
$label = t('No workflow');
}
elseif ($workflow = workflow_load_single($wid)) {
$output = $workflow->label();
$label = $workflow->label();
}
else {
$output = t('Unknown workflow');
}
return $output;
return $label;
}
/**
@@ -36,7 +36,7 @@ function workflow_entity_info() {
/*
// 'access callback' => 'workflow_access',
// 'admin ui' => array(
// 'path' => 'admin/config/workflow/workflow',
// 'path' => WORKFLOW_ADMIN_UI_PATH,
// 'file' => 'workflow_admin_ui/workflow_admin_ui.pages.inc',
// 'controller class' => 'EntityWorkflowUIController',
// 'menu wildcard' => '%workflow',
@@ -110,7 +110,7 @@ function workflow_entity_info() {
),
// 'admin ui' => array(
// 'path' => 'admin/config/workflow/workflow/manage/%workflow_transition/fields2',
// 'path' => WORKFLOW_ADMIN_UI_PATH . '/manage/%workflow_transition/fields2',
// 'menu wildcard' => '%workflow_transition',
// 'controller class' => 'EntityDefaultUIController',
// ),
@@ -147,12 +147,12 @@ function workflow_entity_info() {
}
// Build an array of bundles.
foreach ($types as $type => $info) {
$entities['WorkflowTransition']['bundles'][$type] = array(
foreach ($types as $wid => $info) {
$entities['WorkflowTransition']['bundles'][$wid] = array(
'label' => $info->label,
'admin' => array(
'path' => 'admin/config/workflow/workflow/manage/%workflow',
'real path' => 'admin/config/workflow/workflow/manage/' . $type,
'path' => WORKFLOW_ADMIN_UI_PATH . '/manage/%workflow',
'real path' => WORKFLOW_ADMIN_UI_PATH . "/manage/$wid",
'bundle argument' => 5,
// 'access callback' => 'workflow_access',
),
@@ -510,7 +510,7 @@ function workflow_label($workflow) {
$output = t('No workflow');
}
elseif ($workflow) {
$output = check_plain(t($workflow->label()));
$output = $workflow->label();
}
else {
// E.g., NULL.
@@ -31,8 +31,6 @@ class WorkflowFeaturesController extends EntityDefaultFeaturesController {
if (count($workflow->getTypeMap())) {
$export['dependencies']['workflownode'] = 'workflownode';
}
// Add dependency on workflow_field.
$export['features']['Workflow'][$workflow_name] = $workflow_name;
}
}
@@ -109,7 +107,21 @@ class WorkflowFeaturesController extends EntityDefaultFeaturesController {
// Add roles to translate role IDs on target system.
$permission = NULL;
// Get system roles.
$workflow->system_roles = workflow_get_roles($permission);
// Only export system roles for roles used by this workflow.
$roles = array();
foreach ($workflow->transitions as $id => $transition) {
foreach ($transition->roles as $rid) {
$roles[] = $rid;
}
}
$roles = array_unique($roles);
foreach ($workflow->system_roles as $id => $system_role) {
if (!in_array($id, $roles)) {
unset($workflow->system_roles[$id]);
}
}
$sid_to_name_map = $this->pack_states($workflow);
$this->pack_transitions($workflow, $sid_to_name_map);
@@ -198,8 +210,10 @@ class WorkflowFeaturesController extends EntityDefaultFeaturesController {
// Loads defaults from feature code.
$defaults = workflow_get_defaults($module);
foreach ($defaults as $machine_name => $entity) {
workflow_revert($defaults, $machine_name);
if (!empty($defaults)) {
foreach ($defaults as $machine_name => $entity) {
workflow_revert($defaults, $machine_name);
}
}
}
}
@@ -3,7 +3,7 @@ description = Workflow API. (Enable Workflow Node or Workflow Field to add arbit
package = Workflow
core = 7.x
dependencies[] = entity (>7.x-1.5)
dependencies[] = entity (>7.x-1.6)
dependencies[] = list
files[] = includes/Entity/Workflow.php
@@ -18,9 +18,8 @@ files[] = includes/Field/WorkflowDefaultWidget.php
files[] = includes/Form/WorkflowTransitionForm.php
files[] = workflow.features.inc
; Information added by Drupal.org packaging script on 2017-01-15
version = "7.x-2.9+10-dev"
; Information added by Drupal.org packaging script on 2019-05-23
version = "7.x-2.13"
core = "7.x"
project = "workflow"
datestamp = "1484510888"
datestamp = "1558597389"
@@ -790,7 +790,7 @@ function workflow_update_7016() {
}
/**
* Add a primary key to {workflow_scheduled_transition}.
* Add/correct a primary key to {workflow_scheduled_transition}.
*/
function workflow_update_7017() {
// Drop existing primary key.
@@ -799,11 +799,18 @@ function workflow_update_7017() {
// Add new primary key.
$spec = array(
'type' => 'serial',
'not null' => TRUE,
);
$keys_new = array(
'primary key' => array('tid'),
);
db_add_field('workflow_scheduled_transition', 'tid', $spec, $keys_new);
if (!db_field_exists('workflow_scheduled_transition', 'tid') ) {
db_add_field('workflow_scheduled_transition', 'tid', $spec, $keys_new);
}
else {
db_change_field('workflow_scheduled_transition', 'tid', 'tid', $spec, $keys_new);
}
return t('Added tid primary key to {workflow_scheduled_transition}');
}
@@ -13,6 +13,8 @@ define('WORKFLOW_CREATION_STATE_NAME', '(' . t('creation') . ')');
// #2657072 brackets are added later to indicate a special role, and distinguish from frequently used 'author' role.
define('WORKFLOW_ROLE_AUTHOR_NAME', 'author');
define('WORKFLOW_ROLE_AUTHOR_RID', '-1');
// The definition of the Admin UI pages.
define('WORKFLOW_ADMIN_UI_PATH', 'admin/config/workflow/workflow');
// The definition of the Field_info property type. Shared between 'workflow_field' and 'workflow_rules'.
define('WORKFLOWFIELD_PROPERTY_TYPE', 'text'); // @todo: 'list', 'text' or 'workflow'?
@@ -133,9 +135,10 @@ function workflow_menu_alter(&$items) {
// Add the workflow tab in the Entity Admin UI.
if (!empty($entity_info['admin ui']['path'])) {
$entity_position = substr_count($entity_info['admin ui']['path'], '/') + 2;
$admin_path = $entity_info['admin ui']['path'];
$entity_position = substr_count($admin_path, '/') + 2;
$wildcard = (isset($entity_info['admin ui']['menu wildcard']) ? $entity_info['admin ui']['menu wildcard'] : '%entity_object');
$items[$entity_info['admin ui']['path'] . '/manage/' . $wildcard . '/workflow'] = $menu_item + array(
$items["$admin_path/manage/$wildcard/workflow"] = $menu_item + array(
'page arguments' => array($type, $entity_position),
'access arguments' => array($type, $entity_position),
'load arguments' => array($type),
@@ -609,7 +612,11 @@ function workflow_get_workflow_state_names($wid = 0, $grouped = FALSE, $all = FA
// Since this function is only used in UI, it is save to use the global $user.
global $user;
foreach (workflow_load_multiple($wid ? array($wid) : FALSE) as $workflow) {
/* @var $workflows Workflow[] */
$workflows = workflow_load_multiple($wid ? array($wid) : FALSE);
// Do not group if only 1 Workflow is configured or selected.
$grouped = count($workflows) == 1 ? FALSE : $grouped;
foreach ($workflows as $workflow) {
$state = new WorkflowState(array('wid' => $workflow->wid));
$workflow_options = $state->getOptions('', NULL, '', $user, FALSE);
@@ -636,7 +643,7 @@ function workflow_get_workflow_state_names($wid = 0, $grouped = FALSE, $all = FA
function workflow_get_workflow_names() {
$options = array();
foreach (workflow_load_multiple() as $workflow) {
$options[$workflow->wid] = html_entity_decode(t($workflow->label()));
$options[$workflow->wid] = $workflow->label();
}
return $options;
@@ -655,7 +662,7 @@ function workflow_get_sid_label($sid) {
else {
$label = 'Unknown state';
}
return html_entity_decode(t($label));
return $label;
}
/**
@@ -61,7 +61,7 @@ function workflow_tab_page($entity_type, $entity = NULL) {
$new_state = $history->getNewState();
if ($new_state) {
$name = $new_state->getName();
$label = check_plain(t($new_state->label()));
$label = $new_state->label();
}
if (!$new_state) {
@@ -98,7 +98,7 @@ function workflow_tab_page($entity_type, $entity = NULL) {
$old_state = $history->getOldState();
if ($old_state) {
$name = $old_state->getName();
$label = check_plain(t($old_state->label()));
$label = $old_state->label();
}
if (!$old_state) {
@@ -184,7 +184,7 @@ function workflow_tokens($type, $tokens, array $data = array(), array $options =
switch (end($name_parts)) {
case 'comment':
if (isset($entity->workflow_transitions) && isset($entity->workflow_transitions[$name_parts[0]])) {
$replacements[$original] = $entity->workflow_transitions[$name_parts[0]]->$name_parts[1];
$replacements[$original] = $entity->workflow_transitions[$name_parts[0]]->{$name_parts[1]};
}
break;
}
@@ -317,7 +317,7 @@ function _workflow_token_get_token($wrapper, $options) {
// If there is a label for a property, e.g., defined by an options list or an
// entity label, make use of it.
if ($label = $wrapper->label()) {
return empty($options['sanitize']) ? $label : check_plain(t($label, array(), array('langcode' => $langcode)));
return $label;
}
switch ($wrapper->type()) {
@@ -1,12 +1,14 @@
name = Workflow access
description = Content access control based on workflows and roles. Depends on the node_access system, so only works for entities of type 'node'.
dependencies[] = workflow
package = Workflow
core = 7.x
; Information added by Drupal.org packaging script on 2017-01-15
version = "7.x-2.9+10-dev"
dependencies[] = workflow
configure = admin/config/workflow/workflow
; Information added by Drupal.org packaging script on 2019-05-23
version = "7.x-2.13"
core = "7.x"
project = "workflow"
datestamp = "1484510888"
datestamp = "1558597389"
@@ -7,16 +7,14 @@
/**
* Implements hook_menu().
*
* Uses pattern of EntityWorkflowUIController::hook_menu().
*/
function workflow_access_menu() {
$items = array();
$path = 'admin/config/workflow/workflow';
$id_count = count(explode('/', $path));
$admin_path = WORKFLOW_ADMIN_UI_PATH;
$id_count = count(explode('/', $admin_path));
$items[$path . '/access'] = array(
$items["$admin_path/access"] = array(
'title' => 'Access settings',
'file' => 'workflow_access.pages.inc',
'access arguments' => array('administer workflow'),
@@ -24,34 +22,64 @@ function workflow_access_menu() {
'page arguments' => array('workflow_access_priority_form'),
'type' => MENU_LOCAL_ACTION,
);
$items[$path . '/manage/%workflow/access'] = array(
$items["$admin_path/manage/%workflow/access"] = array(
'title' => 'Access',
'file' => 'workflow_access.pages.inc',
'access arguments' => array('administer workflow'),
'page callback' => 'drupal_get_form',
'page arguments' => array(
'workflow_access_form',
$id_count + 1,
$id_count + 2,
),
// 'type' => MENU_CALLBACK,
// 'type' => MENU_LOCAL_TASK,
'page arguments' => array('workflow_access_form', $id_count + 1),
'type' => MENU_CALLBACK,
);
return $items;
}
/**
* Implements hook_workflow_operations().
*/
function workflow_access_workflow_operations($op, $workflow = NULL, $state = NULL) {
$admin_path = WORKFLOW_ADMIN_UI_PATH;
switch ($op) {
case 'workflow':
$actions = array();
if ($workflow && $workflow->getStates()) {
$wid = $workflow->getWorkflowId();
$alt = t('Control content access for @wf', array('@wf' => $workflow->getName()));
$actions += array(
'workflow_access_form' => array(
'title' => t('Access'),
'href' => "$admin_path/manage/$wid/access",
'attributes' => array('alt' => $alt, 'title' => $alt),
),
);
}
else {
// Generate a dummy, if no states exist.
$actions = array(
'workflow_access_form' => array(
'title' => '',
'href' => '',
),
);
}
return $actions;
}
}
/**
* Implements hook_help().
*/
function workflow_access_help($path, $arg) {
$help = '';
switch ($path) {
case 'admin/config/workflow/workflow/manage/%/access':
case WORKFLOW_ADMIN_UI_PATH . '/manage/%/access':
$help = t("WARNING: Use of the 'Edit any', 'Edit own', and even 'View
published content' permissions for the content type may override these
access settings. You may need to <a href='!url'>alter the priority of
the Workflow access module</a>.", array('!url' => url('admin/config/workflow/workflow/access'))
the Workflow access module</a>.", array('!url' => url(WORKFLOW_ADMIN_UI_PATH . '/access'))
);
if (module_exists('og')) {
@@ -89,30 +117,6 @@ function workflow_access_features_api() {
);
}
/**
* Implements hook_workflow_operations().
*
* Create action link for access form on EntityWorkflowUIController::overviewForm.
*/
function workflow_access_workflow_operations($op, $workflow = NULL, $state = NULL) {
switch ($op) {
case 'workflow':
$actions = array();
$wid = $workflow->wid;
$alt = t('Control content access for @wf', array('@wf' => $workflow->getName()));
$actions += array(
'workflow_access_form' => array(
'title' => t('Access'),
'href' => "admin/config/workflow/workflow/manage/$wid/access",
'attributes' => array('alt' => $alt, 'title' => $alt),
),
);
return $actions;
}
}
/**
* Implements hook_node_grants().
*
@@ -36,7 +36,7 @@ function workflow_access_priority_form($form, $form_state) {
*/
function workflow_access_priority_form_submit($form, &$form_state) {
variable_set('workflow_access_priority', $form_state['values']['workflow_access']['workflow_access_priority']);
$form_state['redirect'] = 'admin/config/workflow/workflow';
$form_state['redirect'] = WORKFLOW_ADMIN_UI_PATH;
}
@@ -46,18 +46,18 @@ function workflow_access_priority_form_submit($form, &$form_state) {
* Add a "three dimensional" (state, role, permission type) configuration
* interface to the workflow edit form.
*/
function workflow_access_form($form, $form_state, $workflow, $op) {
if (!$workflow) {
// Leave this page immediately.
drupal_set_message(t('Unknown workflow'));
drupal_goto('admin/config/workflow/workflow');
function workflow_access_form($form, $form_state, Workflow $workflow) {
// If we don't have a workflow that goes with this, return to the admin pg.
if (!is_object($workflow)) {
drupal_set_message(t('Improper worklow ID provided.'), 'error');
drupal_goto(WORKFLOW_ADMIN_UI_PATH);
}
drupal_set_title(t('@name Access', array('@name' => $workflow->label()))); // No t() for Settings page.
// @todo: Let's get a better page title.
drupal_set_title(t('@name Access', array('@name' => $workflow->label())));
$form = array('#tree' => TRUE);
$form['#wid'] = $workflow->wid;
$form['#tree'] = TRUE;
$form['#wid'] = $wid = $workflow->getWorkflowId();
// A list of role names keyed by role ID, including the 'author' role.
$roles = workflow_get_roles('participate in workflow');
@@ -90,7 +90,7 @@ function workflow_access_form($form, $form_state, $workflow, $op) {
// @todo: better tables using a #theme function instead of direct #prefixing.
$form[$state->sid] = array(
'#type' => 'fieldset',
'#title' => check_plain($state->label()),
'#title' => $state->label(),
'#collapsible' => TRUE,
'#collapsed' => FALSE,
'#tree' => TRUE,
@@ -131,6 +131,8 @@ function workflow_access_form($form, $form_state, $workflow, $op) {
* Stores permission settings for workflow states.
*/
function workflow_access_form_submit($form, &$form_state) {
$wid = $form['#wid'];
foreach ($form_state['values'] as $sid => $access) {
// Ignore irrelevant keys.
if (!is_numeric($sid)) {
@@ -148,10 +150,10 @@ function workflow_access_form_submit($form, &$form_state) {
}
// Update all nodes having same workflow state to reflect new settings.
// just set a flag, which is working for both Workflow Field ánd Workflow Node.
// just set a flag, which is working for both Workflow Field ánd Workflow Node.
node_access_needs_rebuild(TRUE);
}
drupal_set_message(t('Workflow access permissions updated.'));
$form_state['redirect'] = 'admin/config/workflow/workflow/' . $form['#wid'];
$form_state['redirect'] = WORKFLOW_ADMIN_UI_PATH;
}
@@ -1,15 +1,15 @@
name = Workflow Trigger
description = Enables actions to be fired upon a Workflow State change.
dependencies[] = workflow
dependencies[] = trigger
package = Workflow
core = 7.x
; Information added by Drupal.org packaging script on 2017-01-15
version = "7.x-2.9+10-dev"
dependencies[] = trigger
dependencies[] = workflow
configure = admin/structure/trigger/workflow
; Information added by Drupal.org packaging script on 2019-05-23
version = "7.x-2.13"
core = "7.x"
project = "workflow"
datestamp = "1484510888"
datestamp = "1558597389"
@@ -1,4 +1,5 @@
<?php
/**
* @file
* Enables actions to be fired upon a Workflow State change.
@@ -13,17 +14,31 @@
/**
* Implements hook_workflow_operations().
*
* Menu callback, called in workflow.admin.inc to add actions for states.
*/
function workflow_actions_workflow_operations($level, $workflow = NULL, $state = NULL) {
if ($workflow) {
return array(
'workflow_overview_actions' => array(
'title' => t('Actions'),
'href' => 'admin/structure/trigger/workflow/' . $workflow->wid,
),
);
function workflow_actions_workflow_operations($op, $workflow = NULL, $state = NULL) {
switch ($op) {
case 'workflow':
$actions = array();
if ($workflow && $workflow->getStates()) {
$wid = $workflow->getWorkflowId();
$actions = array(
'workflow_overview_actions' => array(
'title' => t('Actions'),
'href' => "admin/structure/trigger/workflow/$wid",
),
);
}
else {
// Generate a dummy, if no states exist.
$actions = array(
'workflow_overview_actions' => array(
'title' => '',
'href' => '',
),
);
}
return $actions;
}
}
@@ -13,7 +13,8 @@ class EntityWorkflowUIController extends EntityDefaultUIController {
$items = parent::hook_menu();
// Set this on the object so classes that extend hook_menu() can use it.
$id_count = count(explode('/', $this->path));
$admin_path = $this->path;
$id_count = count(explode('/', $admin_path));
$wildcard = isset($this->entityInfo['admin ui']['menu wildcard']) ? $this->entityInfo['admin ui']['menu wildcard'] : '%entity_object';
$plural_label = isset($this->entityInfo['plural label']) ? $this->entityInfo['plural label'] : $this->entityInfo['label'] . 's';
$entityType = $this->entityInfo['entity class'];
@@ -27,7 +28,7 @@ class EntityWorkflowUIController extends EntityDefaultUIController {
'type' => MENU_LOCAL_TASK,
);
$items[$this->path . '/manage/' . $wildcard . '/states'] = $item + array(
$items["$admin_path/manage/$wildcard/states"] = $item + array(
'file' => 'workflow_admin_ui/workflow_admin_ui.page.states.inc',
'title' => 'States',
'weight' => '11',
@@ -35,7 +36,7 @@ class EntityWorkflowUIController extends EntityDefaultUIController {
'page arguments' => array('workflow_admin_ui_states_form', $id_count + 1, $id_count + 2),
);
$items[$this->path . '/manage/' . $wildcard . '/transitions'] = $item + array(
$items["$admin_path/manage/$wildcard/transitions"] = $item + array(
'file' => 'workflow_admin_ui/workflow_admin_ui.page.transitions.inc',
'title' => 'Transitions',
'weight' => '12',
@@ -43,7 +44,7 @@ class EntityWorkflowUIController extends EntityDefaultUIController {
'page arguments' => array('workflow_admin_ui_transitions_form', $id_count + 1, $id_count + 2),
);
$items[$this->path . '/manage/' . $wildcard . '/labels'] = $item + array(
$items["$admin_path/manage/$wildcard/labels"] = $item + array(
'file' => 'workflow_admin_ui/workflow_admin_ui.page.labels.inc',
'title' => 'Labels',
'weight' => '13',
@@ -51,7 +52,7 @@ class EntityWorkflowUIController extends EntityDefaultUIController {
'page arguments' => array('workflow_admin_ui_labels_form', $id_count + 1, $id_count + 2),
);
$items[$this->path . '/manage/' . $wildcard . '/permissions'] = $item + array(
$items["$admin_path/manage/$wildcard/permissions"] = $item + array(
'file' => 'workflow_admin_ui/workflow_admin_ui.page.permissions.inc',
'title' => 'Permission summary',
'weight' => '14',
@@ -146,10 +147,11 @@ class EntityWorkflowUIController extends EntityDefaultUIController {
* @see https://www.drupal.org/node/1043634
*/
public function applyOperation($op, $entity) {
$admin_path = $this->path;
$label = entity_label($this->entityType, $entity);
$vars = array('%entity' => $this->entityInfo['label'], '%label' => $label);
$id = entity_id($this->entityType, $entity);
$edit_link = l(t('edit'), $this->path . '/manage/' . $id . '/edit');
$wid = entity_id($this->entityType, $entity);
$edit_link = l(t('edit'), "$admin_path/manage/$wid/edit");
switch ($op) {
case 'revert':
@@ -7,18 +7,20 @@
/**
* Implements hook_workflow_operations().
*
* Menu callback; adds links on EntityWorkflowUIController::overviewForm.
*
* @param string $op
* 'top_actions': Allow modules to insert their own front page action links.
* 'operations': Allow modules to insert their own workflow operations.
* 'state': Allow modules to insert state operations.
* @param object $workflow
* @param Workflow $workflow
* The current workflow object.
* @param object $state
* @param WorkflowState $state
* The current state object.
*
* @return array
*/
function hook_workflow_operations($op, object $workflow, object $state) {
function hook_workflow_operations($op, Workflow $workflow, WorkflowState $state) {
switch ($op) {
case 'top_actions':
$actions = array();
@@ -1,17 +1,17 @@
name = Workflow UI
description = "Provides administrative UI for workflow."
description = Provides an administrative UI for workflows.
package = Workflow
core = 7.x
configure = admin/config/workflow/workflow
dependencies[] = workflow
files[] = includes/Entity/EntityWorkflowUIController.php
stylesheets[all][] = workflow_admin_ui.css
; Information added by Drupal.org packaging script on 2017-01-15
version = "7.x-2.9+10-dev"
configure = admin/config/workflow/workflow
; Information added by Drupal.org packaging script on 2019-05-23
version = "7.x-2.13"
core = "7.x"
project = "workflow"
datestamp = "1484510888"
datestamp = "1558597389"
@@ -19,10 +19,12 @@ define('WORKFLOW_ADMIN_UI_ARROW', '&#8594;');
* Adds Admin UI to entities, using EntityWorkflowUIController.
*/
function workflow_admin_ui_entity_info_alter(&$entity_info) {
$admin_path = WORKFLOW_ADMIN_UI_PATH;
$entity_info['Workflow'] += array(
'access callback' => 'workflow_access',
'admin ui' => array(
'path' => 'admin/config/workflow/workflow',
'path' => $admin_path,
// Do not add 'file', since each page has its own file.
// 'file' => 'workflow_admin_ui/workflow_admin_ui.pages.inc',
'controller class' => 'EntityWorkflowUIController',
@@ -38,8 +40,7 @@ function workflow_admin_ui_help($path, $arg) {
switch ($path) {
case 'admin/modules':
case 'admin/config/workflow/workflow':
// case 'admin/config/workflow/workflow/manage/%/states': // Already has its own text.
case WORKFLOW_ADMIN_UI_PATH:
if (module_exists('workflownode') && module_exists('workflowfield')) {
$m = t('Do not enable Workfow Node and Workflow Field submodules at the
same time (unless you are in a migration phase). Visit the <a href=
@@ -49,12 +50,12 @@ function workflow_admin_ui_help($path, $arg) {
}
return;
case 'admin/config/workflow/workflow/add':
case WORKFLOW_ADMIN_UI_PATH . '/add':
return t('To get started, provide a name for your workflow. This name
will be used as a label when the workflow status is shown during node
editing.');
case 'admin/config/workflow/workflow/manage/%/states':
case WORKFLOW_ADMIN_UI_PATH . '/manage/%/states':
return t("To create a new state, enter its name in the last row of the
'State' column. Check the 'Active' box to make it effective. You may
also drag it to the appropriate position.") . '<br />'
@@ -64,7 +65,7 @@ function workflow_admin_ui_help($path, $arg) {
not zero), then you need to select a state to which to reassign that
content.");
case 'admin/config/workflow/workflow/manage/%/transitions':
case WORKFLOW_ADMIN_UI_PATH . '/manage/%/transitions':
return t('You are currently viewing the possible transitions to and from
workflow states. The state is shown in the left column; the state to be
moved to is to the right. For each transition, check the box next to
@@ -79,7 +80,7 @@ function workflow_admin_ui_help($path, $arg) {
array('!url' => url('admin/people/permissions', array(
'fragment' => 'module-workflow'))));
case 'admin/config/workflow/workflow/manage/%/labels':
case WORKFLOW_ADMIN_UI_PATH . '/manage/%/labels':
return t('You can add labels to transitions if you don\'t like the
standard state labels. They will modify the Workflow form options, so
specific workflow transitions can have their own labels, relative to
@@ -161,9 +162,9 @@ function workflow_admin_ui_breadcrumbs($workflow, $extra = NULL) {
$bc = array(l(t('Home'), '<front>'));
$bc[] = l(t('Configuration'), 'admin/config');
$bc[] = l(t('Workflow'), 'admin/config/workflow');
$bc[] = l(t('Workflow'), 'admin/config/workflow/workflow');
$bc[] = l(t('Workflow'), WORKFLOW_ADMIN_UI_PATH);
if ($workflow) {
$bc[] = l($workflow->label(), "admin/config/workflow/workflow/$workflow->wid");
$bc[] = l($workflow->label(), WORKFLOW_ADMIN_UI_PATH . "/$workflow->wid");
}
if ($extra) {
$bc[] = $extra;
@@ -30,11 +30,11 @@
* @return array
* Array of form items for editing labels on transitions.
*/
function workflow_admin_ui_labels_form($form, $form_state, $workflow, $op) {
function workflow_admin_ui_labels_form($form, &$form_state, $workflow, $op) {
if (!is_object($workflow)) {
drupal_set_message(t('Improper worklow ID provided.'), 'error');
watchdog('workflow_named_transitions', 'Improper worklow ID provided.');
drupal_goto('admin/config/workflow/workflow');
drupal_goto(WORKFLOW_ADMIN_UI_PATH);
}
$headers = array(
@@ -17,9 +17,10 @@
function workflow_admin_ui_view_permissions_form($workflow, $op) {
// If we don't have a workflow at this point, go back to admin page.
if (!$workflow) {
drupal_goto('admin/config/workflow/workflow');
drupal_goto(WORKFLOW_ADMIN_UI_PATH);
}
$all = array();
$roles = workflow_get_roles();
foreach ($roles as $rid => $value) {
@@ -31,7 +32,7 @@ function workflow_admin_ui_view_permissions_form($workflow, $op) {
foreach ($transition->roles as $rid) {
$old_state = $transition->getOldState();
$new_state = $transition->getNewState();
$all[$rid]['transitions'][] = array(check_plain(t($old_state->label())), WORKFLOW_ADMIN_UI_ARROW, check_plain(t($new_state->label())));
$all[$rid]['transitions'][] = array($old_state->label(), WORKFLOW_ADMIN_UI_ARROW, $new_state->label());
}
}
@@ -59,7 +59,7 @@ function workflow_admin_ui_states_form($form, &$form_state, $workflow, $op) {
'#type' => 'textfield',
'#size' => 30,
'#maxlength' => 255,
'#default_value' => check_plain($label),
'#default_value' => $label,
),
'name' => array(
@@ -305,7 +305,7 @@ function workflow_admin_ui_states_form_submit($form, &$form_state) {
}
drupal_set_message(t('The workflow was updated.'));
// $form_state['redirect'] = 'admin/config/workflow/workflow';
// $form_state['redirect'] = WORKFLOW_ADMIN_UI_PATH;
}
/**
@@ -114,7 +114,7 @@ function theme_workflow_admin_ui_transitions_form($variables) {
$header = array(array('data' => t('From / To') . ' &nbsp;' . WORKFLOW_ADMIN_UI_ARROW));
$rows = array();
foreach ($states as $state) {
$label = check_plain($state->label());
$label = $state->label();
// Don't allow transition TO (creation).
if (!$state->isCreationState()) {
$header[] = array('data' => $label);
@@ -218,5 +218,5 @@ function workflow_admin_ui_transitions_form_submit($form, &$form_state) {
}
drupal_set_message(t('The workflow was updated.'));
// $form_state['redirect'] = 'admin/config/workflow/workflow';
// $form_state['redirect'] = WORKFLOW_ADMIN_UI_PATH;
}
@@ -221,7 +221,7 @@ function workflow_admin_ui_edit_form_validate($form, &$form_state) {
// Make sure workflow name is not a duplicate.
foreach (workflow_load_multiple() as $stored_workflow) {
if ($name == check_plain($stored_workflow->getName()) && $workflow->wid != $stored_workflow->wid) {
if ($name == $stored_workflow->name && $workflow->wid != $stored_workflow->wid) {
form_set_error('name', t('A workflow with the name %name already exists. Please enter another name for this workflow.',
array('%name' => $name)));
break;
@@ -248,6 +248,7 @@ function workflow_admin_ui_edit_form_submit($form, &$form_state) {
$workflow->tab_roles = array_filter($form_state['values']['tab_roles']);
$workflow->options = array(
'name_as_title' => $form_state['values']['name_as_title'],
'fieldset' => $form_state['values']['fieldset'],
'options' => $form_state['values']['options'],
'schedule' => $form_state['values']['schedule'],
'schedule_timezone' => $form_state['values']['schedule_timezone'],
@@ -262,7 +263,7 @@ function workflow_admin_ui_edit_form_submit($form, &$form_state) {
if ($insert) {
$args = array(
'%name' => $workflow->getName(),
'@url' => url('admin/config/workflow/workflow/edit/' . $workflow->wid),
'@url' => url(WORKFLOW_ADMIN_UI_PATH . "/edit/$workflow->wid"),
);
watchdog('workflow', 'Created workflow %name', $args);
drupal_set_message(t('The workflow %name was created. Please maintain the states and transitions.', $args), 'status');
@@ -272,5 +273,5 @@ function workflow_admin_ui_edit_form_submit($form, &$form_state) {
}
// This redirect is needed, when changing the workflow name, with name in URL.
// Also for cloning a workflow.
$form_state['redirect'] = 'admin/config/workflow/workflow/manage/' . $workflow->wid;
$form_state['redirect'] = WORKFLOW_ADMIN_UI_PATH . "/manage/$workflow->wid";
}
@@ -1,13 +1,14 @@
name = Workflow Clean Up
description = "Cleans up Workflow cruft."
dependencies[] = workflow
core = 7.x
description = Cleans up Workflow cruft.
package = Workflow
core = 7.x
dependencies[] = workflow
configure = admin/config/workflow/workflow/cleanup
; Information added by Drupal.org packaging script on 2017-01-15
version = "7.x-2.9+10-dev"
; Information added by Drupal.org packaging script on 2019-05-23
version = "7.x-2.13"
core = "7.x"
project = "workflow"
datestamp = "1484510888"
datestamp = "1558597389"
@@ -1,4 +1,5 @@
<?php
/**
* @file
* Cleans up Workflow cruft that may build up over time.
@@ -10,7 +11,9 @@
function workflow_cleanup_menu() {
$items = array();
$items['admin/config/workflow/workflow/cleanup'] = array(
$admin_path = WORKFLOW_ADMIN_UI_PATH;
$items["$admin_path/cleanup"] = array(
'title' => 'Clean up workflow',
'file' => 'workflow_cleanup.pages.inc',
'access arguments' => array('administer workflow'),
@@ -27,7 +30,7 @@ function workflow_cleanup_menu() {
*/
function workflow_cleanup_help($path, $arg) {
switch ($path) {
case 'admin/config/workflow/workflow/cleanup':
case WORKFLOW_ADMIN_UI_PATH . '/cleanup':
return t('This page allows you to delete orphaned and inactive states.
States can be deleted freely in a development environment, but be
careful if you have used a State in a production environment. The
@@ -1,13 +1,13 @@
<?php
/**
* @file
* Contains admin/config/workflow/workflow/cleanup page.
* Contains an Admin page to delete obsolete states and transitions.
*/
/**
* The main cleanup page.
*/
function workflow_cleanup_form($form, $form_state) {
function workflow_cleanup_form($form, &$form_state) {
$form = array();
// Get all of the states, indexed by sid.
@@ -143,6 +143,9 @@ function _workflowfield_metadata_property_set($entity, $name, $value, $langcode,
*/
function workflowfield_field_formatter_info_alter(&$info) {
$info['list_default']['field types'][] = 'workflow';
if (isset($info['i18n_list_default'])) {
$info['i18n_list_default']['field types'][] = 'workflow';
}
}
/**
@@ -312,3 +315,29 @@ function workflowfield_options_list($field, $instance, $entity_type, $entity) {
}
return $options;
}
/**
* Implements hook_i18n_field_info().
*/
function workflowfield_i18n_field_info() {
$info['workflow'] = array(
'translate_options' => 'workflowfield_i18n_field_translate_allowed_values',
);
return $info;
}
/**
* Returns the array of translated allowed values for a workflow (list) field.
*
* @param $field
* The field definition.
*
* @return
* The array of allowed values. Keys of the array are the raw stored values
* (number or text), values are the translated, sanitized labels.
*/
function workflowfield_i18n_field_translate_allowed_values($field) {
// State labels are already translated and sanitized.
$workflow_states = workflow_get_workflow_state_names($field['settings']['wid'], $grouped = FALSE, $all = TRUE);
return $workflow_states;
}
@@ -8,9 +8,8 @@ dependencies[] = field
dependencies[] = options
dependencies[] = workflow
; Information added by Drupal.org packaging script on 2017-01-15
version = "7.x-2.9+10-dev"
; Information added by Drupal.org packaging script on 2019-05-23
version = "7.x-2.13"
core = "7.x"
project = "workflow"
datestamp = "1484510888"
datestamp = "1558597389"
@@ -16,7 +16,7 @@ require_once dirname(__FILE__) . '/workflowfield.formatter.inc';
*/
function workflowfield_help($path, $arg) {
switch ($path) {
case 'admin/config/workflow/workflow':
case WORKFLOW_ADMIN_UI_PATH:
return t('This page allows you to maintain Workflows. Once a workflow is
created, you can maintain your entity type and add a Field of type
\'Workflow\'.');
@@ -5,9 +5,8 @@ core = 7.x
dependencies[] = workflow
; Information added by Drupal.org packaging script on 2017-01-15
version = "7.x-2.9+10-dev"
; Information added by Drupal.org packaging script on 2019-05-23
version = "7.x-2.13"
core = "7.x"
project = "workflow"
datestamp = "1484510888"
datestamp = "1558597389"
@@ -177,7 +177,7 @@ function workflownode_tokens($type, $tokens, array $data = array(), array $optio
foreach ($tokens as $name => $original) {
switch ($name) {
case 'workflow-name':
$replacements[$original] = $sanitize ? check_plain($workflow->label()) : $workflow->label();
$replacements[$original] = $workflow->label(); // Already sanitized.
break;
case 'workflow-current-state-name':
@@ -1,236 +0,0 @@
<?php
/**
* @file
* Admin UI to Notify roles for Workflow state transitions.
*/
/**
* Settings form.
*/
function workflow_notify_settings_form($form, $form_state, $workflow) {
// If we don't have a workflow that goes with this, return to the admin pg.
if ($workflow) {
// Let's get a better page title.
drupal_set_title(t('@name Notifications', array('@name' => ucwords($workflow->name))));
// Let's add some breadcrumbs.
workflow_admin_ui_breadcrumbs($workflow);
$noyes = array(t('No'), t('Yes'));
$form['wid'] = array('#type' => 'value', '#value' => $workflow->wid);
$form['#workflow'] = $workflow;
// Get all the states for this workflow, except the (creation) state.
// $states = workflow_get_workflow_states_by_wid($workflow->wid,
// array('status' => 1, 'sysid' => 0));
$states = array();
foreach ($workflow->states as $sid => $state) {
if (!$state->sysid) {
$states[$sid] = $state;
}
}
if (!$states) {
$form['error'] = array(
'#type' => 'markup',
'#value' => t('There are no states defined for this workflow.'),
);
return $form;
}
$form['#states'] = $states;
// Get all roles, except anonymous.
$roles = user_roles(TRUE);
$roles = array('-1' => t('Author')) + user_roles(TRUE);
// The module_invoke_all function does not allow passing by reference.
$args = array('roles' => $roles);
foreach (module_implements('workflow_notify') as $module) {
$function = $module . '_workflow_notify';
// Call the $op='roles' hooks so the list may be modified.
$function('roles', $args);
}
// Get the modified list.
$roles = $args['roles'];
// Setting for "from" address.
$form['from_address'] = array(
'#title' => t('Set "From" address to'),
'#type' => 'radios',
'#options' => array(
'site' => t('Site email address'),
'changer' => t('Current user'),
),
'#default_value' => variable_get('workflow_notify_from_address_' . $workflow->wid, 'site'),
'#attributes' => array('class' => array('container-inline')),
'#description' => t('Determines whether to use the site address or the address of the person
causing the state change.'),
);
// Get the list of input formats.
$formats = array();
foreach (filter_formats() as $fid => $filter) {
$formats[$fid] = $filter->name;
}
$form['filter'] = array(
'#title' => t('Filter format to use on message'),
'#type' => 'radios',
'#options' => $formats,
'#default_value' => variable_get('workflow_notify_filter_format_' . $workflow->wid, 'filtered_html'),
'#attributes' => array('class' => array('container-inline')),
'#description' => t('The message body will be processed using this filter format
in order to ensure security.'),
);
$form['tokens'] = array(
'#theme' => 'token_tree_link',
'#token_types' => array('node', 'workflow'),
);
// Column names for theme function.
$columns = array(
'state' => t('State'),
'roles' => t('Roles to notify'),
);
$args = array('columns' => $columns);
// The module_invoke_all function does not allow passing by reference.
foreach (module_implements('workflow_notify') as $module) {
$function = $module . '_workflow_notify';
$function('columns', $args);
}
$form['#columns'] = $args['columns'];
// We always want subject and body last.
$form['#columns']['subject'] = t('Subject');
$form['#columns']['body'] = t('Body');
$notify = variable_get('workflow_notify_roles', array());
foreach ($states as $sid => $state) {
// Allow modules to insert state operations.
$state_links = module_invoke_all('workflow_operations', 'state', $workflow, $state);
$form['states'][$sid] = array(
'state' => array(
'#type' => 'markup',
'#markup' => filter_xss($state->state),
),
'roles' => array(
'#type' => 'checkboxes',
'#options' => $roles,
'#default_value' => (isset($notify[$sid]) ? $notify[$sid] : array()),
'#attributes' => array('class' => array('state-roles')),
),
'subject' => array(
'#type' => 'textarea',
'#rows' => 5,
'#default_value' => variable_get('workflow_notify_subject_' . $sid,
'[node:title] is now "[node:field_workflow_state:new-state:label]"'),
'#attributes' => array('class' => array('subject')),
),
'body' => array(
'#type' => 'textarea',
'#rows' => 5,
'#default_value' => variable_get('workflow_notify_body_' . $sid,
'<a href="[node:url:absolute]">[node:title]</a> is now "[node:field_workflow_state:new-state:label]".'),
'#attributes' => array('class' => array('body')),
),
);
}
$form['#tree'] = TRUE;
$form['submit'] = array('#type' => 'submit', '#value' => 'Save notifications settings');
return $form;
}
else {
drupal_goto('admin/config/workflow/workflow');
}
}
/**
* Theme the settings form.
*/
function theme_workflow_notify_settings_form($variables) {
$form = $variables['form'];
$output = '';
$table_id = 'workflow-notify-settings';
$output .= drupal_render($form['from_address']);
$output .= drupal_render($form['filter']);
$output .= drupal_render($form['tokens']);
$table = array(
'rows' => array(),
'header' => array(), // To be filled in.
'attributes' => array('id' => $table_id, 'style' => 'width: 100%; margin-top: 1em;'),
);
$columns = $form['#columns'];
$colspan = count($columns);
foreach ($columns as $field => $title) {
$table['header'][] = $title;
}
// Iterate over each element in our $form['states'] array
foreach (element_children($form['states']) as $id) {
// We are now ready to add each element of our $form data to the rows
// array, so that they end up as individual table cells when rendered
// in the final table.
$row = array();
foreach ($columns as $field => $title) {
$row[] = array(
'data' => drupal_render($form['states'][$id][$field]),
'class' => array(drupal_html_class($field)),
);
}
// Put the data row into the table.
$table['rows'][] = array('data' => $row);
}
$output .= theme('table', $table);
$output .= drupal_render($form['explain']);
// And then render any remaining form elements (such as our submit button)
$output .= drupal_render_children($form);
return $output;
}
function workflow_notify_settings_form_submit($form, $form_state) {
$roles = variable_get('workflow_notify_roles', array());
$workflow = $form['#workflow'];
variable_set('workflow_notify_from_address_' . $workflow->wid , $form_state['values']['from_address']);
variable_set('workflow_notify_filter_format_' . $workflow->wid , $form_state['values']['filter']);
foreach ($form_state['values']['states'] as $sid => $values) {
$selected = array_filter($values['roles']);
// Are there any roles selected?
if ($selected) {
$roles[$sid] = $selected;
}
else {
// No, so make sure this state is gone.
unset($roles[$sid]);
}
variable_set("workflow_notify_subject_$sid", $values['subject']);
variable_set("workflow_notify_body_$sid", $values['body']);
}
variable_set('workflow_notify_roles', $roles);
drupal_set_message(t('The notification settings have been saved.'));
}
@@ -1,15 +1,15 @@
name = Workflow Notify
description = Notify roles of Workflow transitions.
dependencies[] = workflow
configure = admin/config/workflow/workflow
core = 7.x
package = Workflow
core = 7.x
dependencies[] = token
dependencies[] = workflow
; Information added by Drupal.org packaging script on 2017-01-15
version = "7.x-2.9+10-dev"
configure = admin/config/workflow/workflow
; Information added by Drupal.org packaging script on 2019-05-23
version = "7.x-2.13"
core = "7.x"
project = "workflow"
datestamp = "1484510888"
datestamp = "1558597389"
@@ -1,9 +1,65 @@
<?php
/**
* @file
* Notify roles for Workflow state transitions.
*/
/**
* Implements hook_menu().
*/
function workflow_notify_menu() {
$items = array();
$admin_path = WORKFLOW_ADMIN_UI_PATH;
$id_count = count(explode('/', $admin_path));
$items["$admin_path/manage/%workflow/notify"] = array(
'title' => 'Notifications',
'file' => 'workflow_notify.pages.inc',
'access arguments' => array('administer workflow'),
'page callback' => 'drupal_get_form',
'page arguments' => array('workflow_notify_settings_form', $id_count + 1),
'type' => MENU_CALLBACK,
);
return $items;
}
/**
* Implements hook_workflow_operations().
*/
function workflow_notify_workflow_operations($op, Workflow $workflow = NULL) {
$admin_path = WORKFLOW_ADMIN_UI_PATH;
switch ($op) {
case 'workflow':
$actions = array();
if ($workflow && $workflow->getStates()) {
$wid = $workflow->getWorkflowId();
$alt = t('Notify users about state changes.');
$actions = array(
'workflow_notify_settings' => array(
'title' => t('Notifications'),
'href' => "$admin_path/manage/$wid/notify",
'attributes' => array('alt' => $alt, 'title' => $alt),
),
);
}
else {
// Generate a dummy, if no states exist.
$actions = array(
'workflow_notify_settings' => array(
'title' => '',
'href' => '',
),
);
}
return $actions;
}
}
/**
* Implements hook_permission().
*/
@@ -21,29 +77,11 @@ function workflow_notify_permission() {
*/
function workflow_notify_help($path, $arg) {
switch ($path) {
case 'admin/config/workflow/workflow/notify/%':
case WORKFLOW_ADMIN_UI_PATH . '/notify/%':
return '<p>' . t('The selected roles will be notified of each state change selected.') . '</p>';
}
}
/**
* Implements hook_menu().
*/
function workflow_notify_menu() {
$items = array();
$items['admin/config/workflow/workflow/notify/%workflow'] = array(
'title' => 'Notifications',
'access arguments' => array('administer workflow'),
'page callback' => 'drupal_get_form',
'page arguments' => array('workflow_notify_settings_form', 5),
'type' => MENU_CALLBACK,
'file' => 'workflow_notify.admin.inc',
);
return $items;
}
/**
* Implements hook_theme().
*/
@@ -51,7 +89,7 @@ function workflow_notify_theme() {
return array(
'workflow_notify_settings_form' => array(
'render element' => 'form',
'file' => 'workflow_notify.admin.inc',
'file' => 'workflow_notify.pages.inc',
),
);
}
@@ -66,30 +104,6 @@ function workflow_notify_hook_info() {
return $hooks;
}
/**
* Implements hook_workflow_operations().
* Add an action link to this module.
*/
function workflow_notify_workflow_operations($op, $workflow = NULL) {
switch ($op) {
case 'workflow':
$wid = $workflow->getWorkflowId();
$actions = array(
'workflow_notify_settings' => array(
'title' => t('Notifications'),
'href' => "admin/config/workflow/workflow/notify/$wid",
'attributes' => array('alt' => t('Notify users about state changes.')),
),
);
$actions['workflow_notify_settings']['attributes']['title'] =
$actions['workflow_notify_settings']['attributes']['alt'];
return $actions;
}
}
/**
* Implements hook_workflow().
* Calls drupal_mail via _workflow_notify() for Workflow Field;
@@ -118,6 +132,17 @@ function workflow_notify_workflow($op, $old_state, $new_state, $entity, $force,
}
}
/**
* Implements hook_entity_insert().
* Calls drupal_mail via _workflow_notify() for Workflow Field;
*
* @param $entity
* @param $entity_type
*/
function workflow_notify_entity_insert($entity, $entity_type) {
_workflow_notify_entity_update($entity, $entity_type);
}
/**
* Implements hook_entity_update().
* Calls drupal_mail via _workflow_notify() for Workflow Field;
@@ -126,6 +151,16 @@ function workflow_notify_workflow($op, $old_state, $new_state, $entity, $force,
* @param $entity_type
*/
function workflow_notify_entity_update($entity, $entity_type) {
_workflow_notify_entity_update($entity, $entity_type);
}
/**
* Calls drupal_mail via _workflow_notify() for Workflow Field;
*
* @param $entity
* @param $entity_type
*/
function _workflow_notify_entity_update($entity, $entity_type) {
if (isset($entity->workflow_transitions)) {
$new_state = workflow_node_current_state($entity, $entity_type, $field_name);
foreach ($entity->workflow_transitions as $field_name => &$transition) {
@@ -146,6 +181,11 @@ function workflow_notify_mail($key, &$message, $params) {
$filter = $params['filter'];
$message['send'] = TRUE;
$entity_type = $params['data']['entity_type'];
$entity = isset($params['data']['entity']) ? $params['data']['entity'] : $params['data']['node'];
$entity_uri = entity_uri($entity_type, $entity);
list($entity_id, , $entity_bundle) = entity_extract_ids($entity_type, $entity);
$message['subject'] = filter_xss(token_replace($params['context']['subject'], $params['data'], $params));
$message['body'][] = check_markup(token_replace($params['context']['body'], $params['data'], $params), $filter);
@@ -156,12 +196,11 @@ function workflow_notify_mail($key, &$message, $params) {
'@to' => $message['to'],
'@from' => $message['from'],
),
WATCHDOG_INFO, l(t('view'), 'node/' . $params['data']['node']->nid));
WATCHDOG_INFO, l(t('view'), $entity_uri['path']));
return;
}
}
/**
* Calls drupal_mail() to notify users.
*
@@ -188,12 +227,13 @@ function _workflow_notify($new_state, $entity, $entity_type = '', $field_name =
// Okay, we are notifying someone of this change.
// So let's get the workflow object.
$entity_uri = entity_uri($entity_type, $entity);
list($entity_id, , $entity_bundle) = entity_extract_ids($entity_type, $entity);
/* @var $workflow Workflow */
$workflow = workflow_get_workflows_by_type($entity_bundle, $entity_type);
$wid = $workflow->getWorkflowId();
// And all the states.
// And all the states.
$states = $workflow->getStates(TRUE);
// Get the specific roles to notify.
@@ -212,7 +252,8 @@ function _workflow_notify($new_state, $entity, $entity_type = '', $field_name =
. "WHERE ur.rid IN (:rids) "
. "AND u.status = 1 ";
$users = db_query($query, array(':rids' => $notify))->fetchCol();
} else {
}
else {
$users = array();
}
@@ -227,13 +268,13 @@ function _workflow_notify($new_state, $entity, $entity_type = '', $field_name =
// Call all modules that want to limit the list.
$args = array(
'users' => $accounts,
'node' => $entity,
'entity' => $entity, // Preparing for entities, keeping backward compatibility.
'entity_type' => $entity_type,
'state' => $new_state,
'roles' => $notify,
'workflow' => $workflow,
);
// Preparing for entities, keeping backward compatibility.
$args += $entity_type == 'node' ? array('node' => $entity) : array('entity' => $entity);
foreach (module_implements('workflow_notify') as $module) {
$function = $module . '_workflow_notify';
$function('users', $args);
@@ -241,40 +282,42 @@ function _workflow_notify($new_state, $entity, $entity_type = '', $field_name =
// Retrieve the remaining list without duplicates.
$accounts = $args['users'];
$addr_list = array();
// Just quit if there are no users.
if (empty($accounts)) {
watchdog('workflow_notify', 'No recipients - email skipped.', array(),
WATCHDOG_DEBUG, l(t('view'), 'node/' . $entity_id)); // @todo: other entity types.
WATCHDOG_DEBUG, l(t('view'), $entity_uri['path']));
return;
}
$addr_list = array();
foreach ($accounts as $uid => $account) {
$addr_list[] = format_username($account) . '<' . $account->mail . '>';
$addr_list[] = format_username($account) . ' <' . $account->mail . '>';
}
// The to-parameter to drupal_mail is a string, not an array, separated by commas.
$to = implode(', ', $addr_list);
// Retrieve the params parameter for drupal_mail.
$params = array(
'clear' => TRUE,
'sanitize' => FALSE,
'data' => array(
'node' => $entity,
'entity' => $entity, // Preparing for entities, keeping backward compatibility.
'entity_type' => $entity_type,
'user' => $user,
'entity_type' => $entity_type,
),
'filter' => variable_get('workflow_notify_filter_format_' . $wid, 'filtered_html'),
);
// Preparing for entities, keeping backward compatibility.
$params['data'] += $entity_type == 'node' ? array('node' => $entity) : array('entity' => $entity);
// Build the subject and body of the mail.
// Token replacement occurs in hook_mail().
// @TODO: Currently no translation occurs.
// @todo: Currently no translation occurs.
$params['context']['subject'] = variable_get("workflow_notify_subject_$new_state",
'[node:title] is now "[workflow:workflow-current-state-name]"');
$params['context']['body'] = variable_get("workflow_notify_body_$new_state",
'<a href="[node:url:absolute]">[node:title]</a> is now "@state".');
// Retrieve the from-address.
switch (variable_get('workflow_notify_from_address_' . $wid, 'site')) {
case 'site':
$from = variable_get('site_mail', ini_get('sendmail_from'));
@@ -285,13 +328,21 @@ function _workflow_notify($new_state, $entity, $entity_type = '', $field_name =
break;
}
// Send the email.
drupal_mail('workflow_notify',
'workflow_notify',
implode(', ', $addr_list),
language_default(),
$params,
$from);
// Send the mail, and check for success. Note that this does not guarantee
// message delivery; only that there were no PHP-related issues encountered
// while sending.
$module = 'workflow_notify';
$key = 'workflow_notify';
$language = language_default();
// https://api.drupal.org/api/drupal/includes!mail.inc/function/drupal_mail/7.x
$result = drupal_mail($module, $key, $to, $language, $params, $from);
/*
if ($result['result'] == TRUE) {
drupal_set_message(t('Your message has been sent.'));
}
else {
drupal_set_message(t('There was a problem sending your message and it was not sent.'), 'error');
}
*/
return;
}
@@ -0,0 +1,230 @@
<?php
/**
* @file
* Admin UI to Notify roles for Workflow state transitions.
*/
/**
* Settings form.
*/
function workflow_notify_settings_form($form, &$form_state, Workflow $workflow) {
// If we don't have a workflow that goes with this, return to the admin pg.
if (!is_object($workflow)) {
drupal_set_message(t('Improper worklow ID provided.'), 'error');
drupal_goto(WORKFLOW_ADMIN_UI_PATH);
}
// @todo: Let's get a better page title.
drupal_set_title(t('@name Notifications', array('@name' => $workflow->label())));
// Let's add some breadcrumbs.
// workflow_admin_ui_breadcrumbs($workflow);
$form['#tree'] = TRUE;
$form['#wid'] = $wid = $workflow->getWorkflowId();
$form['#workflow'] = $workflow;
$noyes = array(t('No'), t('Yes'));
// Get all the states for this workflow, except the (creation) state.
$states = $workflow->getStates();
$form['#states'] = $states;
if (!$states) {
$form['#columns'] = array();
$form['error'] = array(
'#type' => 'markup',
'#value' => t('There are no states defined for this workflow.'),
);
return $form;
}
// A list of role names keyed by role ID, including the 'author' role.
$roles = workflow_get_roles('participate in workflow');
// The module_invoke_all function does not allow passing by reference.
$args = array('roles' => $roles);
foreach (module_implements('workflow_notify') as $module) {
$function = $module . '_workflow_notify';
// Call the $op='roles' hooks so the list may be modified.
$function('roles', $args);
}
// Get the modified list.
$roles = $args['roles'];
// Setting for "from" address.
$form['from_address'] = array(
'#title' => t('Set "From" address to'),
'#type' => 'radios',
'#options' => array(
'site' => t('Site email address'),
'changer' => t('Current user'),
),
'#default_value' => variable_get("workflow_notify_from_address_$wid", 'site'),
'#attributes' => array('class' => array('container-inline')),
'#description' => t('Determines whether to use the site address or the address of the person
causing the state change.'),
);
// Get the list of input formats.
$formats = array();
foreach (filter_formats() as $fid => $filter) {
$formats[$fid] = $filter->name;
}
$form['filter'] = array(
'#title' => t('Filter format to use on message'),
'#type' => 'radios',
'#options' => $formats,
'#default_value' => variable_get("workflow_notify_filter_format_$wid", 'filtered_html'),
'#attributes' => array('class' => array('container-inline')),
'#description' => t('The message body will be processed using this filter format
in order to ensure security.'),
);
$form['tokens'] = array(
'#theme' => 'token_tree_link',
'#token_types' => array('node', 'workflow'),
);
// Column names for theme function.
$columns = array(
'state' => t('State'),
'roles' => t('Roles to notify'),
);
$args = array('columns' => $columns);
// The module_invoke_all function does not allow passing by reference.
foreach (module_implements('workflow_notify') as $module) {
$function = $module . '_workflow_notify';
$function('columns', $args);
}
$form['#columns'] = $args['columns'];
// We always want subject and body last.
$form['#columns']['subject'] = t('Subject');
$form['#columns']['body'] = t('Body');
$notify = variable_get('workflow_notify_roles', array());
foreach ($states as $sid => $state) {
// Allow modules to insert state operations.
$state_links = module_invoke_all('workflow_operations', 'state', $workflow, $state);
$form['states'][$sid] = array(
'state' => array(
'#type' => 'markup',
'#markup' => filter_xss($state->state),
),
'roles' => array(
'#type' => 'checkboxes',
'#options' => $roles,
'#default_value' => (isset($notify[$sid]) ? $notify[$sid] : array()),
'#attributes' => array('class' => array('state-roles')),
),
'subject' => array(
'#type' => 'textarea',
'#rows' => 5,
'#default_value' => variable_get('workflow_notify_subject_' . $sid,
'[node:title] is now "[node:field_workflow_state:new-state:label]"'),
'#attributes' => array('class' => array('subject')),
),
'body' => array(
'#type' => 'textarea',
'#rows' => 5,
'#default_value' => variable_get('workflow_notify_body_' . $sid,
'<a href="[node:url:absolute]">[node:title]</a> is now "[node:field_workflow_state:new-state:label]".'),
'#attributes' => array('class' => array('body')),
),
);
}
$form['submit'] = array('#type' => 'submit', '#value' => t('Save configuration'));
return $form;
}
/**
* Theme the settings form.
*/
function theme_workflow_notify_settings_form($variables) {
$form = $variables['form'];
$output = '';
$table_id = 'workflow-notify-settings';
$output .= drupal_render($form['from_address']);
$output .= drupal_render($form['filter']);
$output .= drupal_render($form['tokens']);
$table = array(
'rows' => array(),
'header' => array(), // To be filled in.
'attributes' => array('id' => $table_id, 'style' => 'width: 100%; margin-top: 1em;'),
);
$columns = $form['#columns'];
$colspan = count($columns);
foreach ($columns as $field => $title) {
$table['header'][] = $title;
}
// Iterate over each element in our $form['states'] array
foreach (element_children($form['states']) as $id) {
// We are now ready to add each element of our $form data to the rows
// array, so that they end up as individual table cells when rendered
// in the final table.
$row = array();
foreach ($columns as $field => $title) {
$row[] = array(
'data' => drupal_render($form['states'][$id][$field]),
'class' => array(drupal_html_class($field)),
);
}
// Put the data row into the table.
$table['rows'][] = array('data' => $row);
}
$output .= theme('table', $table);
$output .= drupal_render($form['explain']);
// And then render any remaining form elements (such as our submit button)
$output .= drupal_render_children($form);
return $output;
}
function workflow_notify_settings_form_submit($form, &$form_state) {
$wid = $form['#wid'];
$workflow = $form['#workflow'];
$roles = variable_get('workflow_notify_roles', array());
$form_state['redirect'] = WORKFLOW_ADMIN_UI_PATH;
variable_set("workflow_notify_from_address_$wid" , $form_state['values']['from_address']);
variable_set("workflow_notify_filter_format_$wid" , $form_state['values']['filter']);
foreach ($form_state['values']['states'] as $sid => $values) {
$selected = array_filter($values['roles']);
// Are there any roles selected?
if ($selected) {
$roles[$sid] = $selected;
}
else {
// No, so make sure this state is gone.
unset($roles[$sid]);
}
variable_set("workflow_notify_subject_$sid", $values['subject']);
variable_set("workflow_notify_body_$sid", $values['body']);
}
variable_set('workflow_notify_roles', $roles);
drupal_set_message(t('The notification settings have been saved.'));
}
@@ -1,12 +1,14 @@
name = Workflow Notify OG
description = Notify roles by OG groups of Workflow transitions.
dependencies[] = workflow_notify
core = 7.x
package = Workflow
core = 7.x
; Information added by Drupal.org packaging script on 2017-01-15
version = "7.x-2.9+10-dev"
dependencies[] = workflow_notify
configure = admin/config/workflow/workflow
; Information added by Drupal.org packaging script on 2019-05-23
version = "7.x-2.13"
core = "7.x"
project = "workflow"
datestamp = "1484510888"
datestamp = "1558597389"
@@ -1,4 +1,5 @@
<?php
/**
* @file
* Notify roles by OG Groups for Workflow state transitions.
@@ -6,6 +7,7 @@
/**
* Implements hook_workflow_notify().
*
* @param $op - The operation (columns, users).
* @param $args - The arguments for this call.
* - may be:
@@ -73,25 +75,26 @@ function workflow_notify_og_workflow_notify($op, &$args) {
/**
* Implements hook_form_alter().
*
* Add a column for limiting user groups by OG group.
*/
function workflow_notify_og_form_alter(&$form, &$form_state, $form_id) {
switch($form_id) {
case 'workflow_notify_settings_form':
$limit = variable_get('workflow_notify_og', array());
// Add a group limit flag to each state.
foreach ($form['states'] as $sid => $element) {
$form['states'][$sid]['limit_by_group'] = array(
'#type' => 'radios',
'#options' => array(t('No'), t('Yes')),
'#attributes' => array('class' => array('limit-by-group')),
'#default_value' => (isset($limit[$sid]) ? $limit[$sid] : 0),
if (!empty($form['states'])) {
// Add a group limit flag to each state.
foreach ($form['states'] as $sid => $element) {
$form['states'][$sid]['limit_by_group'] = array(
'#type' => 'radios',
'#options' => array(t('No'), t('Yes')),
'#attributes' => array('class' => array('limit-by-group')),
'#default_value' => (isset($limit[$sid]) ? $limit[$sid] : 0),
);
}
// Add our submission handler.
$form['#submit'][] = 'workflow_notify_og_form_submit';
}
// Add our submission handler.
$form['#submit'][] = 'workflow_notify_og_form_submit';
}
}
@@ -109,6 +112,4 @@ function workflow_notify_og_form_submit(&$form, &$form_state) {
// Save the new limit flags.
variable_set('workflow_notify_og', $limit);
$form_state['redirect'] = "admin/config/workflow/workflow/$workflow->wid";
}
@@ -1,12 +1,12 @@
name = Workflow Revert
description = "Adds a 'Revert' link to the first workflow history row."
dependencies[] = workflow
core = 7.x
description = Adds a 'Revert' link to the first workflow history row.
package = Workflow
core = 7.x
; Information added by Drupal.org packaging script on 2017-01-15
version = "7.x-2.9+10-dev"
dependencies[] = workflow
; Information added by Drupal.org packaging script on 2019-05-23
version = "7.x-2.13"
core = "7.x"
project = "workflow"
datestamp = "1484510888"
datestamp = "1558597389"
@@ -9,7 +9,7 @@
*
* @todo: add support for Field in workflow_revert.
*/
function workflow_revert_form($form, $form_state, $entity_type, $id, $field_name, $previous_sid = NULL) {
function workflow_revert_form($form, &$form_state, $entity_type, $id, $field_name, $previous_sid = NULL) {
$entity = entity_load_single($entity_type, $id);
$uri = entity_uri($entity_type, $entity);
$return_uri = $uri['path'] . '/workflow';
@@ -45,7 +45,7 @@ function workflow_revert_form($form, $form_state, $entity_type, $id, $field_name
*
* The function is magically called, due to its name <form>_submit.
*/
function workflow_revert_form_submit($form, $form_state) {
function workflow_revert_form_submit($form, &$form_state) {
global $user;
$previous_sid = $form['#previous_sid'];
@@ -1,16 +1,15 @@
name = Workflow Rules
description = Provides additional, workflow-specific Rules integration.
core = 7.x
package = Workflow
core = 7.x
dependencies[] = workflow
dependencies[] = rules
dependencies[] = workflow
configure = admin/config/workflow/rules
; Information added by Drupal.org packaging script on 2017-01-15
version = "7.x-2.9+10-dev"
; Information added by Drupal.org packaging script on 2019-05-23
version = "7.x-2.13"
core = "7.x"
project = "workflow"
datestamp = "1484510888"
datestamp = "1558597389"
@@ -1,14 +1,14 @@
name = Workflow Node Search API
description = "Adds Workflow Node's state information to Search API index."
description = Adds Workflow Node's state information to Search API index.
package = Workflow
core = 7.x
dependencies[] = entity
dependencies[] = workflow
dependencies[] = workflownode
dependencies[] = entity
core = 7.x
package = Workflow
; Information added by Drupal.org packaging script on 2017-01-15
version = "7.x-2.9+10-dev"
; Information added by Drupal.org packaging script on 2019-05-23
version = "7.x-2.13"
core = "7.x"
project = "workflow"
datestamp = "1484510888"
datestamp = "1558597389"
@@ -2,15 +2,13 @@ name = Workflow Actions
description = "Provides actions that can be associated to triggers, or
used as VBO-action. Provided actions are 'set to next state'
and 'set to specific state'."
dependencies[] = workflow
package = Workflow
core = 7.x
; Information added by Drupal.org packaging script on 2017-01-15
version = "7.x-2.9+10-dev"
dependencies[] = workflow
; Information added by Drupal.org packaging script on 2019-05-23
version = "7.x-2.13"
core = "7.x"
project = "workflow"
datestamp = "1484510888"
datestamp = "1558597389"
@@ -11,7 +11,7 @@
class workflow_views_handler_field_state extends views_handler_field {
function render($values) {
return t($values->{$this->field_alias});
return t('@alias', array('@alias' => $values->{$this->field_alias}));
}
}
@@ -14,9 +14,8 @@ files[] = handlers/workflow_views_handler_field_node_link_workflow.inc
files[] = handlers/workflow_views_handler_field_comment_link_edit.inc
files[] = handlers/workflow_views_handler_argument_state.inc
; Information added by Drupal.org packaging script on 2017-01-15
version = "7.x-2.9+10-dev"
; Information added by Drupal.org packaging script on 2019-05-23
version = "7.x-2.13"
core = "7.x"
project = "workflow"
datestamp = "1484510888"
datestamp = "1558597389"