web-dev-qa-db-fra.com

Comment changer l'état de modération du contenu dans un gestionnaire d'envoi personnalisé?

J'essaie de changer l'état de modération du contenu de draft à submitted par programmation. Le module de modération de contenu ajoute un champ aux types de contenu avec une liste déroulante pour modifier l'état, mais je souhaite masquer ce champ aux utilisateurs et afficher à la place un gestionnaire de soumission personnalisé qui modifie l'état du formulaire.

Je peux changer la valeur par défaut du champ de modération avec un code comme celui-ci:

  $form['moderation_state']['widget'][0]['state']['#default_value'] = "submitted";

Mais, comment puis-je modifier la valeur du champ de modération de contenu à l'aide de $form_state Dans le gestionnaire de soumission?

  $form_state->setValue('moderation_state', 'submitted');`

ne fonctionne pas comme pour les champs.

Voici la sortie de débogage pour kint($form['moderation_state']['widget'][0]):

kint debug output

2
Patrick Kenny

Pour modifier l'état de modération, vous devez d'abord obtenir l'entité:

$entity = $form_state->getFormObject()->getEntity();

puis changez l'état:

$entity->set('moderation_state', 'submitted');

et enregistrer:

$entity->save();

Tout le code:

/**
 * Submit callback to submit for approval
 */
function draft2submit_callback(array &$form, FormStateInterface &$form_state) {
  // Getting the entity.
  $entity = $form_state->getFormObject()->getEntity();
  // Changing the moderation state.
  $entity->set('moderation_state', 'submitted');
  // Saving the entity.
  $entity->save();
}
2

J'ai aussi dû résoudre ce problème et j'ai trouvé deux façons de le faire:

Option 1:

Définissez le type de widget sur valeur et définissez la valeur par défaut sur submitted. J'ai également supprimé le message d'état actuel affiché sur le formulaire

/**
 * Implements hook_form_alter().
 */
function your_module_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {

  // may want to do some checks here ...

  $form['moderation_state']['widget'][0]['current']['#access'] = false;
  $form['moderation_state']['widget'][0]['state']['#type'] = 'value';
  $form['moderation_state']['widget'][0]['state']['#default_value'] = 'submitted';
}

L'utilisation de l'option 1 pourrait échouer la validation si l'état de modération actuel n'a pas de transition vers submitted pour l'utilisateur actuel.

Option 2:

Ajoutez une fonction de rappel de validation et définissez-y la valeur:

/**
 * Implements hook_form_alter().
 */
function your_module_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {

  // may want to do some checks here ...

  $form['moderation_state']['#access'] = false;

  if (isset($form['#validate'])) {
    array_unshift($form['#validate'], '_your_module_set_moderation_state_to_submitted');
  } else {
    $form['#validate'][] = '_your_module_set_moderation_state_to_submitted';
  }
}

/**
 * @param $form
 *   Nested array of form elements that comprise the form.
 * @param $form_state
 *   The current state of the form.
 */
function _your_module_set_moderation_state_to_submitted(array &$form, \Drupal\Core\Form\FormStateInterface $form_state) {
  $form_state->setValue(['moderation_state', '0', 'value'], 'submitted');
}

J'ai trouvé que je devais utiliser un rappel de validation, sinon il exécuterait la validation avant d'essayer de définir la valeur, cela échouerait la validation si je n'avais pas de transition configurée pour qu'elle reste au même état de modération.

L'autre chose à noter avec l'option 2 est qu'en utilisant setValue vous ajoutez une valeur validée. Par conséquent, selon la façon dont vous avez configuré vos flux de travail, il peut ne pas s'agir d'une transition qui serait autrement autorisée.

2
andy-morgan