コード例 #1
0
ファイル: WorkflowState.php プロジェクト: sedurzu/ildeposito8
 public function setWorkflow(Workflow $workflow)
 {
     workflow_debug(__FILE__, __FUNCTION__, __LINE__);
     // @todo D8-port: still test this snippet.
     $this->wid = $workflow->id();
     $this->workflow = $workflow;
 }
コード例 #2
0
 /**
  * {@inheritdoc}
  */
 public function getWorkflow()
 {
     if (!$this->workflow && ($wid = $this->getWorkflowId())) {
         $this->workflow = Workflow::load($wid);
     }
     return $this->workflow;
 }
コード例 #3
0
 /**
  * {@inheritdoc}
  *
  * Be careful: Widget may be shown in very different places. Test carefully!!
  *  - On a entity add/edit page
  *  - On a entity preview page
  *  - On a entity view page
  *  - On a entity 'workflow history' tab
  *  - On a comment display, in the comment history
  *  - On a comment form, below the comment history
  *
  * @todo D8: change "array $items" to "FieldInterface $items"
  */
 public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state)
 {
     $wid = $this->getFieldSetting('workflow_type');
     if (!($workflow = Workflow::load($wid))) {
         // @todo: add error message.
         return $element;
     }
     /* @var $item \Drupal\workflowfield\Plugin\Field\FieldType\WorkflowItem */
     $item = $items[$delta];
     /* @var $field_config \Drupal\field\Entity\FieldConfig */
     $field_config = $item->getFieldDefinition();
     /* @var $field_storage \Drupal\field\Entity\FieldStorageConfig */
     $field_storage = $field_config->getFieldStorageDefinition();
     $field_name = $field_storage->get('field_name');
     $entity = $item->getEntity();
     $from_sid = workflow_node_current_state($entity, $field_name);
     // Create a transition, to pass to the form. No need to use setValues().
     /* @var $transition WorkflowTransition */
     $transition = WorkflowTransition::create([$from_sid, 'field_name' => $field_name]);
     $transition->setTargetEntity($entity);
     if (!$this->isDefaultValueWidget($form_state)) {
         // Here, not the $element is added, but the entity form.
         // Option 1: use the Element.
         $element['#default_value'] = $transition;
         $element += WorkflowTransitionElement::transitionElement($element, $form_state, $form);
         // Option 2: use the Form, in order to get extra fields.
         //$entity_form_builder = \Drupal::getContainer()->get('entity.form_builder');
         //$element += $entity_form_builder->getForm($transition, 'add');
         //// Remove the action button. The Entity itself has one.
         //unset($element['actions']);
         // Option 3: use the true Element.
         // $form = $this->element($form, $form_state, $transition);
         //$element['workflow_transition'] = array(
         //      '#type' => 'workflow_transition',
         //      '#title' => t('Workflow transition'),
         //      '#default_value' => $transition,
         // );
     } else {
         // @todo D8: add a default value, so people can set a default comment.
         // On the Field settings page, User may not set a default value
         // (this is done by the Workflow module).
         // @see WorkflowState::getOptions();
         // @see WorkflowDefaultWidget::formElement();
         $element = array();
         return $element;
         workflow_debug(__FILE__, __FUNCTION__, __LINE__, '', '');
         // @todo D8-port: still test this snippet.
         // @see workflowfield_form_field_config_edit_form_alter for other settings
         // The Workflow field must have a value, so set to required.
         // Unfortunately, we need hook_form_alter for this.
         //$form['required']['#default_value'] = 1;
         //$form['required']['#disabled'] = TRUE;
         // Explicitly set default value to 'creation' and show element,
         // so people can set a default comment.
         $transition->to_sid = $workflow->getCreationSid();
         $transition->setExecuted(TRUE);
         // @TODO D8-port: use a proper WorkflowTransitionElement call.
         $element['#default_value'] = $transition;
         $element += WorkflowTransitionElement::transitionElement($element, $form_state, $form);
         // No action buttons on default field settings page.
         // This is evaluated in hook_form_alter.
         _workflow_use_action_buttons(FALSE);
         // Make sure the options box is not hidden (when action buttons active).
         //$element['to_sid']['#type'] = 'select';
         $element['to_sid']['#title'] = 'Initial state';
         $element['to_sid']['#access'] = TRUE;
         unset($element['workflow_current_state']);
         return $element;
     }
     return $element;
 }
コード例 #4
0
 /**
  * Gets the creation sid for a given $entity and $field_name.
  *
  * Is a helper function for:
  * - workflow_node_current_state()
  * - workflow_node_previous_state()
  *
  * @param \Drupal\Core\Entity\EntityInterface $entity
  * @param string $field_name
  *
  * @return string $sid
  *   The ID of the creation State for the Workflow of the field.
  */
 private static function getCreationStateId($entity, $field_name)
 {
     $sid = '';
     $field_config = $entity->get($field_name)->getFieldDefinition();
     $field_storage = $field_config->getFieldStorageDefinition();
     $wid = $field_storage->getSetting('workflow_type');
     $workflow = Workflow::load($wid);
     if ($workflow) {
         $sid = $workflow->getCreationSid();
     } else {
         drupal_set_message(t('Workflow !wid cannot be loaded. Contact your system administrator.', array('!wid' => $wid)), 'error');
     }
     return $sid;
 }
コード例 #5
0
 /**
  * {@inheritdoc}
  */
 public function buildConfigurationForm(array $form, FormStateInterface $form_state)
 {
     $form = [];
     // If we are on admin/config/system/actions and use CREATE AN ADVANCED ACTION
     // Then $context only contains:
     // - $context['actions_label'] = "Change workflow state of post to new state"
     // - $context['actions_type'] = "entity"
     //
     // If we are on a VBO action form, then $context only contains:
     // - $context['entity_type'] = "node"
     // - $context['view'] = "(Object) view"
     // - $context['settings'] = "array()"
     // @todo: test with multiple workflows per entity.
     $wids = workflow_get_workflow_names();
     $wid = array_keys($wids)[0];
     // Get the common Workflow, or create a dummy Workflow.
     $workflow = $wid ? Workflow::load($wid) : Workflow::create(['id' => 'dummy_action', 'label' => 'dummy_action']);
     $current_state = $workflow->getCreationState();
     /* // @TODO D8-port
         // Show the current state and the Workflow form to allow state changing.
         // N.B. This part is replicated in hook_node_view, workflow_tab_page, workflow_vbo.
         if ($workflow) {
           $field = _workflow_info_field($field_name, $workflow);
           $field_name = $field['field_name'];
           $field_id = $field['id'];
           $instance = field_info_instance($entity_type, $field_name, $entity_bundle);
     
           // Hide the submit button. VBO has its own 'next' button.
           $instance['widget']['settings']['submit_function'] = '';
           if (!$field_id) {
             // This is a Workflow Node workflow. Set widget options as in v7.x-1.2
             $field['settings']['widget']['comment'] = isset($workflow->options['comment_log_tab']) ? $workflow->options['comment_log_tab'] : 1; // vs. ['comment_log_node'];
             $field['settings']['widget']['current_status'] = TRUE;
             // As stated above, the options list is probably very long, so let's use select list.
             $field['settings']['widget']['options'] = 'select';
             // Do not show the default [Update workflow] button on the form.
             $instance['widget']['settings']['submit_function'] = '';
           }
         }
     
         // Add the form/widget to the formatter, and include the nid and field_id in the form id,
         // to allow multiple forms per page (in listings, with hook_forms() ).
         // Ultimately, this is a wrapper for WorkflowDefaultWidget.
         // $form['workflow_current_state'] = workflow_state_formatter($entity_type, $entity, $field, $instance);
         $form_id = implode('_', array(
           'workflow_transition_form',
           $entity_type,
           $entity_id,
           $field_id
         ));
     */
     $transition = $this->getTransitionForConfiguration($current_state);
     // Add the WorkflowTransitionForm to the page.
     // Here, not the $element is added, but the entity form.
     $element = [];
     // Just to be explicit.
     $element['#default_value'] = $transition;
     $form += WorkflowTransitionElement::transitionElement($element, $form_state, $form);
     // Remove the transition: generates an error upon saving the action definition.
     unset($form['workflow_transition']);
     // Todo D8: add the entity form.
     //$form = \Drupal::getContainer()->get('entity.form_builder')->getForm($transition, 'add');
     // Remove the action button. The Entity itself has one.
     //unset($element['actions']);
     // Make adaptations for VBO-form:
     $entity = $transition->getTargetEntity();
     $field_name = $transition->getFieldName();
     $force = $this->configuration['force'];
     // Override the options widget.
     $form['to_sid']['#description'] = t('Please select the state that should be assigned when this action runs.');
     // Add Field_name. @todo?? Add 'field_name' to WorkflowTransitionElement?
     $form['field_name'] = array('#type' => 'select', '#title' => t('Field name'), '#description' => t('Choose the field name.'), '#options' => _workflow_info_field_names($entity), '#default_value' => $field_name, '#required' => TRUE, '#weight' => -20);
     // Add Force. @todo?? Add 'force' to WorkflowTransitionElement?
     $form['force'] = array('#type' => 'checkbox', '#title' => t('Force transition'), '#description' => t('If this box is checked, the new state will be assigned even if workflow permissions disallow it.'), '#default_value' => $force, '#weight' => -19);
     // Change comment field.
     $form['comment'] = array('#title' => t('Message'), '#description' => t('This message will be written into the workflow history log when the action
   runs. You may include the following variables: %state, %title, %user.')) + $form['comment'];
     return $form;
 }
コード例 #6
0
ファイル: WorkflowItem.php プロジェクト: sedurzu/ildeposito8
 /**
  * Implements hook_field_settings_form() -> ConfigFieldItemInterface::settingsForm().
  */
 public function storageSettingsForm(array &$form, FormStateInterface $form_state, $has_data)
 {
     $element = array();
     // Create list of all Workflow types. Include an initial empty value.
     // Validate each workflow, and generate a message if not complete.
     $workflows = workflow_get_workflow_names(FALSE);
     // @todo D8: add this to WorkflowFieldConstraintValidator.
     // Set message, if no 'validated' workflows exist.
     if (count($workflows) == 1) {
         drupal_set_message(t('You must create at least one workflow before content can be
       assigned to a workflow.'), 'warning');
     }
     // Validate via annotation WorkflowFieldConstraint. Show a message for each error.
     $violation_list = $this->validate();
     foreach ($violation_list->getIterator() as $violation) {
         switch ($violation->getPropertyPath()) {
             case 'fieldnameOnComment':
                 // A 'comment' field name MUST be equal to content field name.
                 // @todo: Still not waterproof. You could have a field on a non-relevant entity_type.
                 drupal_set_message($violation->getMessage(), 'error');
                 $workflows = array();
                 break;
             default:
                 break;
         }
     }
     // Set the required workflow_type on 'comment' fields.
     // N.B. the following must BELOW the (count($workflows) == 1) snippet.
     $field_storage = $this->getFieldDefinition()->getFieldStorageDefinition();
     if (!$this->getSetting('workflow_type') && $field_storage->getTargetEntityTypeId() == 'comment') {
         $field_name = $field_storage->get('field_name');
         $workflows = array();
         foreach (_workflow_info_fields($entity = NULL, $entity_type = '', $entity_bundle = '', $field_name) as $key => $info) {
             if ($info->getName() == $field_name && $info->getTargetEntityTypeId() !== 'comment') {
                 $wid = $info->getSetting('workflow_type');
                 $workflow = Workflow::load($wid);
                 $workflows[$wid] = $workflow->label();
             }
         }
     }
     // Let the user choose between the available workflow types.
     $wid = $this->getSetting('workflow_type');
     $url = \Drupal\Core\Url::fromRoute('entity.workflow_type.collection');
     $element['workflow_type'] = array('#type' => 'select', '#title' => t('Workflow type'), '#options' => $workflows, '#default_value' => $wid, '#required' => TRUE, '#disabled' => $has_data, '#description' => t('Choose the Workflow type. Maintain workflows
      <a href=":url">here</a>.', array(':url' => $url->toString())));
     // Get a string representation to show all options.
     /*
      * Overwrite ListItemBase::storageSettingsForm().
      */
     $allowed_values = WorkflowState::loadMultiple([], $wid);
     $allowed_values_function = $this->getSetting('allowed_values_function');
     $element['allowed_values'] = array('#type' => 'textarea', '#title' => t('Allowed values for the selected Workflow type'), '#default_value' => $wid ? $this->allowedValuesString($allowed_values) : [], '#rows' => count($allowed_values), '#access' => $wid ? TRUE : FALSE, '#disabled' => TRUE, '#element_validate' => array(array(get_class($this), 'validateAllowedValues')), '#field_has_data' => $has_data, '#field_name' => $this->getFieldDefinition()->getName(), '#entity_type' => $this->getEntity()->getEntityTypeId(), '#allowed_values' => $allowed_values);
     $element['allowed_values']['#description'] = $this->allowedValuesDescription();
     return $element;
 }
コード例 #7
0
 /**
  * Returns a list of workflow permissions for a given workflow type.
  *
  * @param \Drupal\workflow\Entity\WorkflowType $type
  *   The workflow type.
  *
  * @return array
  *   An associative array of permission names and descriptions.
  */
 protected function buildPermissions(\Drupal\workflow\Entity\Workflow $type)
 {
     $type_id = $type->id();
     $type_params = array('%type_name' => $type->label());
     return array("edit own {$type_id} workflow_transition" => array('title' => $this->t('%type_name: Edit own comments', $type_params), 'description' => t('Edit the comment of own executed state transitions.'), 'restrict access' => TRUE), "edit any {$type_id} workflow_transition" => array('title' => $this->t('%type_name: Edit any comments', $type_params), 'description' => t('Edit the comment of any executed state transitions.'), 'restrict access' => TRUE), "revert own {$type_id} workflow_transition" => array('title' => $this->t('%type_name: Revert own state transition', $type_params), 'description' => t('Allow user to revert own last executed state transition on entity.'), 'restrict access' => TRUE), "revert any {$type_id} workflow_transition" => array('title' => $this->t('%type_name: Revert any state transition', $type_params), 'description' => t('Allow user to revert any last executed state transition on entity.'), 'restrict access' => TRUE));
 }
コード例 #8
0
 /**
  * Returns a list of workflow permissions for a given workflow type.
  *
  * @param \Drupal\workflow\Entity\WorkflowType $type
  *   The workflow type.
  *
  * @return array
  *   An associative array of permission names and descriptions.
  */
 protected function buildPermissions(Workflow $type)
 {
     $type_id = $type->id();
     $type_params = array('%type_name' => $type->label());
     return array("bypass {$type_id} workflow_transition access" => array('title' => $this->t('%type_name: Bypass transition access control', $type_params), 'description' => t('View, edit and delete all transitions regardless of permission restrictions.'), 'restrict access' => TRUE), "create {$type_id} workflow_transition" => array('title' => $this->t('%type_name: Participate in workflow', $type_params), 'description' => t('Role is enabled to create state transitions. (Determine transition-specific permission on the workflow admin page.)')), "schedule {$type_id} workflow_transition" => array('title' => $this->t('%type_name: Schedule state transition', $type_params), 'description' => t('Role is enabled to schedule state transitions.')), "access own {$type_id} workflow_transion overview" => array('title' => $this->t('%type_name: Access Workflow history tab of own content', $type_params), 'description' => t('Role is enabled to view the "Workflow state transition history" tab on own entity.')), "access any {$type_id} workflow_transion overview" => array('title' => $this->t('%type_name: Access Workflow history tab of any content', $type_params), 'description' => t('Role is enabled to view the "Workflow state transition history" tab on any entity.')), "access {$type_id} workflow_transition form" => array('title' => $this->t('%type_name: Access the Workflow state transition form on entity view page', $type_params), 'description' => t('Role is enabled to view a "Workflow state transition" block/widget and add a state transition on the entity page.')));
 }
コード例 #9
0
 /**
  * {@inheritdoc}
  *
  * This is called from submitForm().
  */
 public function save(array $form, FormStateInterface $form_state)
 {
     // Execute transition and update the attached entity.
     $entity = $this->getEntity();
     return Workflow::workflowManager()->executeTransition($entity);
 }