Posso criar programaticamente uma nova revisão de nó, sem que a nova revisão se torne a "atual"?

9

Sempre que minha importação de feeds encontra uma nova versão de um conteúdo existente, ela cria uma nova revisão desse nó, em vez de substituir os dados.

Normalmente, a nova revisão se torna a "atual" imediatamente. No entanto, gostaria que a revisão exibida no momento permanecesse a mesma e permita que um moderador decida mais tarde se a nova deve ser publicada.

Letharion
fonte
11
Você já tentou usar Moderação do Workbench, Fluxo de Trabalho ou qualquer um dos módulos que fazem a mesma coisa?
mpdonadio
Eu não tenho. Inicialmente, assumi que, por criar o nó no código, eles não se aplicavam. Talvez não seja esse o caso.
Letharion

Respostas:

13

Uma instalação padrão do Drupal não permite que você crie uma revisão "Pendente". Você tem duas opções:

  1. Crie programaticamente uma nova revisão, mas reverta programaticamente de volta à revisão original (que cria uma revisão ainda mais nova, mas possui o conteúdo original)
  2. (Recomendado) Use moderação, revisão ou fluxo de trabalho do Workbench, soluções bem pensadas para controle de versão e / ou controle de acesso.

Para a opção 1: você pode adicionar esse código como uma nova regra ou usá-lo em um novo módulo

<?php
  // Programatically load the existing revision and save it
  // Taken from http://api.drupal.org/api/drupal/modules!node!node.module/function/node_save/7
  // Load the revision
  $original_revision = node_load($nid);
  $original_revision->revision = 1;
  $original_revision->log = t('Copy of the revision from %date.', array('%date' => format_date($original_revision->revision_timestamp)));

  $new_revision = node_load($nid);
  // Make any changes to the new revision here...
  $new_revision->revision = 1;
  $new_revision->log = t('Summarize your changes here');

  // Save the new revision first
  node_save($new_revision);

  // Save the original one again so that it is still the current revision
  node_save($original_revision);

  watchdog('content', '@type: reverted %title revision %revision.', array('@type' => $node_revision->type, '%title' => $node_revision->title, '%revision' => $node_revision->vid));
  drupal_set_message(t('@type %title was saved with a new revision, but reverting to original revision from %revision-date.', array('@type' => node_type_get_name($node_revision), '%title' => $node_revision->title, '%revision-date' => format_date($node_revision->revision_timestamp))));
  drupal_goto('node/' . $node_revision->nid . '/revisions');
?>

Para a opção 2: eu recomendaria o Workbench em vez de revisão ou fluxo de trabalho, mas cada um é diferente dependendo de suas necessidades. O Workbench é o sucessor do Revisioning, e o Workflow é muito mais do que apenas controle de versão, portanto pode ou não ser um bom ajuste para suas necessidades.

Aqui está um rápido resumo das diferenças entre o Workbench e o Workflow.

Johnathan Elmore
fonte
A primeira opção seria ótima, mas como faço a reversão?
Letharion
Adicionado o código para a opção 1, mas realmente a opção 2 é provavelmente a sua melhor aposta, pois adiciona funcionalidade para o manuseio qual versão é atual, em vez de apenas duplicar o mais original e mais uma vez
Johnathan Elmore
o link está quebrado
digitgopher
Onde escrever em hook_form_alter?
KTM
link fixo. @IcecreamJelly, tente hook_node_update.
Johnathan Elmore
2

Isso é um palpite, mas eu daria uma chance ao submódulo de moderação do Workbench no módulo Workbench . Achei isso muito mais fácil de configurar do que o Workflow .

O fato de você estar criando nós no código não deve importar, desde que seja node_save()executado como um usuário com as configurações adequadas para o tipo de conteúdo (os estados de moderação são tratados com a API do nó). No entanto, isso pode significar que você precisa fazer algumas travessuras de sessão para fazer as coisas como o usuário adequado quando o Feeds é executado.

mpdonadio
fonte
2
A moderação de +1 na bancada de trabalho é um excelente módulo que eu já o uso há algum tempo
Clive