Deaktivieren Sie die Bearbeitung eines Knotens, nachdem dieser veröffentlicht wurde


7

Szenario:

Ein Benutzer kann einen Knoten erstellen (Inhaltstyp "Geschichte"). Alle erstellten Story-Knoten werden standardmäßig nicht veröffentlicht.

Ich habe ein boolesches Feld namens "Publish my Story". Sobald dies überprüft und gespeichert wurde, wird der Knoten mithilfe von Regeln veröffentlicht.

Frage:

Ist es möglich, einem Benutzer die Möglichkeit zu entziehen , veröffentlichte Knoten mithilfe von Regeln zu bearbeiten, da ich nicht möchte, dass er die Story danach ändert?

Antworten:


7

Ja, Sie können dynamische Regeln in einem benutzerdefinierten Modul definieren. Sehenhook_node_access

Hier ist eine Beispielimplementierung:

/**
 * Implements hook_node_access().
 */
function MYMODULE_node_access($node, $op, $account) {
  if (
    // The $node argument can be either a $node object or a machine name of
    // node's content type. It is called multiple times during a page load
    // so it is enough if you perform the check once you get the object.
    is_object($node) && $node->type == 'story' &&
    // Operation on which you want to act: "create", "delete", "update", "view".
    $op == 'update'
  ) {
    // Check if the node is published.
    if ($node->field_published[LANGUAGE_NONE][0]['value'] == 1) {
      return NODE_ACCESS_DENY;
    }
  }
}

Ich hatte gehofft, es mit Regeln zu tun, aber das funktioniert großartig, danke!
Q10

2
> if ($ node-> field_published [LANGUAGE_NONE] [0] ['value'] == 1) {könnte besser sein, wenn field_get_item wie> field_get_items ('node', $ node, 'field_published') verwendet wird, um Sprachfehler zu vermeiden
Clemens Tolboom

1

Hier ist ein vollständiges Modul zum Ausführen der Aufgabe sowie das Zuweisen einer Rolle, um dieses Verhalten damit auszuführen:

saidbakr_tools.info::

name = SaidBakr Tools
description = Tools offered by Said Bakr said.fox@gmail.com
core = 7.x 

configure = admin/config/administration/saidbakr_tools

saidbakr_tools.module::

<?php
/**
 * Implements hook_node_access().
 */
function saidbakr_tools_node_access($node, $op, $account) {
   global $user;
  if (
    // The $node argument can be either a $node object or a machine name of
    // node's content type. It is called multiple times during a page load
    // so it is enough if you perform the check once you get the object.
    is_object($node) && $node->type == 'article' &&
    // Operation on which you want to act: "create", "delete", "update", "view".
    $op == 'update'
  ) {
    // Check if the node is published.
  //  var_dump($node);
    if ($node->status == 1 && in_array(variable_get('saidbakr_tools_role','author'), $user->roles)) {
      return NODE_ACCESS_DENY;
    }
  }
}

/**
 * Implements hook_menu().
 */
function saidbakr_tools_menu() {
  $items = array();

  $items['admin/config/administration/saidbakr_tools'] = array(
    'title' => 'SaidBakr Tools',
    'description' => 'Settings for SaidBakr Tools!',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('saidbakr_tools_form'),
    'access arguments' => array('access administration pages'),
    'type' => MENU_NORMAL_ITEM,
  );

  return $items;
}

/**
 * Page callback: Current posts settings
 *
 * @see saidbakr_tools_menu()
 */
function saidbakr_tools_form($form, &$form_state) {
  $form['saidbakr_tools_role'] = array(
    '#type' => 'textfield',
    '#title' => t('The role name'),
    '#default_value' => variable_get('saidbakr_tools_role', 'author'),
    '#size' => 20,
    '#maxlength' => 24,
    '#description' => t('Enter the role name that its users should not be able to edit published contents.'),
    '#required' => TRUE,
  );

  return system_settings_form($form);
}

Erstellen Sie die beiden oben genannten Dateien in einem Ordner, benennen Sie ihn saidbakr_toolsund laden Sie ihn dann in Ihre Drupal-Installation unter hoch sites/all/modules.

In dieser Lösung zum Testen des Veröffentlichungsstatus von Knoten habe ich verwendet $node->status


1
Dies ist eine schöne, saubere Lösung, die auch in Verbindung mit dem Modul "Entwurf speichern" für mich gut funktioniert hat.
Danny Browne
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.