Follow-up for #2001190: Use derivatives for action plugins

+class SaveComment extends ActionBase {
+  public function execute($comment) {
+    $comment->save();
+    Cache::invalidateTags(array('content' => TRUE));
+  }
+}
Sounds like we want a postExecute() method that would run after all of the passed entities have been processed (for invalidating tags or doing any other cleanup).
Support from Acquia helps fund testing for Drupal Acquia logo

Comments

andypost’s picture

Suppose save() should be configurable with argument at least

class ActionBase
  protected function invalidateTags(array $tags)

cache invalidation should be moved to separate method at least but better to leave this for entity class

tim.plunkett’s picture

Status: Postponed » Active
tim.plunkett’s picture

Assigned: tim.plunkett » Unassigned

So I'm not 100% sure how this would work.
In theory, you could write a config entity that uses multiple action plugins, like Rules does.

If you have both PromoteNode and StickyNode, both want to try to save the node.
How do we not save it twice?

Or is that out of the scope of this issue?

bojanz’s picture

#3 sounds out of scope. Opened #2030291: Allow actions to postpone saving the modified entity and posted a patch for discussion.

bojanz’s picture

Status: Active » Needs review
FileSize
2.26 KB

This patch adds an empty postExecute() method to a plugin base class, calls it from executeMultiple(), converts the SaveComment action to use it.

Should postExecute also be added to the ActionInterface?

bojanz’s picture

Here is an updated patch that adds the postExecute to all node actions, and removes the cache clear from the views form handler.
I believe that is a more logical way to do it, the views form handler shouldn't be responsible for clearing caches since the action might be executed some other way too (rules, vbo's field, etc). It also removes some of the special casing in NodeBulkForm, bringing us closer to just making the BulkForm field generic and available to all entity types.

If this issue gets in first, we will probably want to modify postExecute() in [##2030291] to accept the $needs_save parameter too.

Status: Needs review » Needs work

The last submitted patch, 2001196-actions-add-post-execute-6.patch, failed testing.

dawehner’s picture

+++ b/core/modules/node/lib/Drupal/node/Plugin/Action/AssignOwnerNode.phpundefined
@@ -69,6 +69,13 @@ public function execute($entity = NULL) {
   /**
    * {@inheritdoc}
    */
+  public function postExecute() {
+    Cache::invalidateTags(array('content' => TRUE));

+++ b/core/modules/node/lib/Drupal/node/Plugin/Action/DeleteNode.phpundefined
@@ -71,4 +72,11 @@ public function execute($object = NULL) {
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function postExecute() {
+    Cache::invalidateTags(array('content' => TRUE));

+++ b/core/modules/node/lib/Drupal/node/Plugin/Action/DemoteNode.phpundefined
@@ -30,4 +30,11 @@ public function execute($entity = NULL) {
+  /**
+   * {@inheritdoc}
+   */
+  public function postExecute() {
+    Cache::invalidateTags(array('content' => TRUE));

+++ b/core/modules/node/lib/Drupal/node/Plugin/Action/PromoteNode.phpundefined
@@ -31,4 +31,11 @@ public function execute($entity = NULL) {
+  /**
+   * {@inheritdoc}
+   */
+  public function postExecute() {
+    Cache::invalidateTags(array('content' => TRUE));

+++ b/core/modules/node/lib/Drupal/node/Plugin/Action/PublishNode.phpundefined
@@ -30,4 +30,11 @@ public function execute($entity = NULL) {
+  /**
+   * {@inheritdoc}
+   */
+  public function postExecute() {
+    Cache::invalidateTags(array('content' => TRUE));
+  }

+++ b/core/modules/node/lib/Drupal/node/Plugin/Action/SaveNode.phpundefined
@@ -29,4 +29,11 @@ public function execute($entity = NULL) {
+  /**
+   * {@inheritdoc}
+   */
+  public function postExecute() {
+    Cache::invalidateTags(array('content' => TRUE));

+++ b/core/modules/node/lib/Drupal/node/Plugin/Action/UnpublishNode.phpundefined
@@ -30,4 +30,11 @@ public function execute($entity = NULL) {
 
+  /**
+   * {@inheritdoc}
+   */
+  public function postExecute() {
+    Cache::invalidateTags(array('content' => TRUE));

+++ b/core/modules/node/lib/Drupal/node/Plugin/Action/UnstickyNode.phpundefined
@@ -30,4 +30,11 @@ public function execute($entity = NULL) {
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function postExecute() {
+    Cache::invalidateTags(array('content' => TRUE));

There could be just a base class for all node plugins.

bojanz’s picture

True. Where to place the postExecute type of logic though? An ActionManager per entity type?

dawehner’s picture

What about just a NodeActionBase or something like this?

Version: 8.0.x-dev » 8.1.x-dev

Drupal 8.0.6 was released on April 6 and is the final bugfix release for the Drupal 8.0.x series. Drupal 8.0.x will not receive any further development aside from security fixes. Drupal 8.1.0-rc1 is now available and sites should prepare to update to 8.1.0.

Bug reports should be targeted against the 8.1.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.2.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.1.x-dev » 8.2.x-dev

Drupal 8.1.9 was released on September 7 and is the final bugfix release for the Drupal 8.1.x series. Drupal 8.1.x will not receive any further development aside from security fixes. Drupal 8.2.0-rc1 is now available and sites should prepare to upgrade to 8.2.0.

Bug reports should be targeted against the 8.2.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.3.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.2.x-dev » 8.3.x-dev

Drupal 8.2.6 was released on February 1, 2017 and is the final full bugfix release for the Drupal 8.2.x series. Drupal 8.2.x will not receive any further development aside from critical and security fixes. Sites should prepare to update to 8.3.0 on April 5, 2017. (Drupal 8.3.0-alpha1 is available for testing.)

Bug reports should be targeted against the 8.3.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.4.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.3.x-dev » 8.4.x-dev

Drupal 8.3.6 was released on August 2, 2017 and is the final full bugfix release for the Drupal 8.3.x series. Drupal 8.3.x will not receive any further development aside from critical and security fixes. Sites should prepare to update to 8.4.0 on October 4, 2017. (Drupal 8.4.0-alpha1 is available for testing.)

Bug reports should be targeted against the 8.4.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.5.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.4.x-dev » 8.5.x-dev

Drupal 8.4.4 was released on January 3, 2018 and is the final full bugfix release for the Drupal 8.4.x series. Drupal 8.4.x will not receive any further development aside from critical and security fixes. Sites should prepare to update to 8.5.0 on March 7, 2018. (Drupal 8.5.0-alpha1 is available for testing.)

Bug reports should be targeted against the 8.5.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.6.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

andypost’s picture

Version: 8.5.x-dev » 8.6.x-dev
Issue summary: View changes
Issue tags: +Needs issue summary update

Looks this could be closed, cache invalidation now lives in entities itself

Version: 8.6.x-dev » 8.7.x-dev

Drupal 8.6.0-alpha1 will be released the week of July 16, 2018, which means new developments and disruptive changes should now be targeted against the 8.7.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.7.x-dev » 8.8.x-dev

Drupal 8.7.0-alpha1 will be released the week of March 11, 2019, which means new developments and disruptive changes should now be targeted against the 8.8.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.8.x-dev » 8.9.x-dev

Drupal 8.8.0-alpha1 will be released the week of October 14th, 2019, which means new developments and disruptive changes should now be targeted against the 8.9.x-dev branch. (Any changes to 8.9.x will also be committed to 9.0.x in preparation for Drupal 9’s release, but some changes like significant feature additions will be deferred to 9.1.x.). For more information see the Drupal 8 and 9 minor version schedule and the Allowed changes during the Drupal 8 and 9 release cycles.

Version: 8.9.x-dev » 9.1.x-dev

Drupal 8.9.0-beta1 was released on March 20, 2020. 8.9.x is the final, long-term support (LTS) minor release of Drupal 8, which means new developments and disruptive changes should now be targeted against the 9.1.x-dev branch. For more information see the Drupal 8 and 9 minor version schedule and the Allowed changes during the Drupal 8 and 9 release cycles.

Version: 9.1.x-dev » 9.2.x-dev

Drupal 9.1.0-alpha1 will be released the week of October 19, 2020, which means new developments and disruptive changes should now be targeted for the 9.2.x-dev branch. For more information see the Drupal 9 minor version schedule and the Allowed changes during the Drupal 9 release cycle.

Version: 9.2.x-dev » 9.3.x-dev

Drupal 9.2.0-alpha1 will be released the week of May 3, 2021, which means new developments and disruptive changes should now be targeted for the 9.3.x-dev branch. For more information see the Drupal core minor version schedule and the Allowed changes during the Drupal core release cycle.

Version: 9.3.x-dev » 9.4.x-dev

Drupal 9.3.0-rc1 was released on November 26, 2021, which means new developments and disruptive changes should now be targeted for the 9.4.x-dev branch. For more information see the Drupal core minor version schedule and the Allowed changes during the Drupal core release cycle.

Version: 9.4.x-dev » 9.5.x-dev

Drupal 9.4.0-alpha1 was released on May 6, 2022, which means new developments and disruptive changes should now be targeted for the 9.5.x-dev branch. For more information see the Drupal core minor version schedule and the Allowed changes during the Drupal core release cycle.

Version: 9.5.x-dev » 10.1.x-dev

Drupal 9.5.0-beta2 and Drupal 10.0.0-beta2 were released on September 29, 2022, which means new developments and disruptive changes should now be targeted for the 10.1.x-dev branch. For more information see the Drupal core minor version schedule and the Allowed changes during the Drupal core release cycle.

quietone’s picture

Status: Needs work » Postponed

Action module is approved for removal. See #3266458: [Policy] Deprecate Action (UI) module in D10 and move to contrib in D11

This is now Postponed. The status is set according to two policies. The Remove a core extension and move it to a contributed project and the Extensions approved for removal policies.

It will be moved to the contributed Action project when the Drupal 11 branch is open.

quietone’s picture

Status: Postponed » Needs work

I was on 'autopilot' and the above comment is wrong. It is the Action UI that is being removed. Restoring status.

Sorry for the noise.

Version: 10.1.x-dev » 11.x-dev

Drupal core is moving towards using a “main” branch. As an interim step, a new 11.x branch has been opened, as Drupal.org infrastructure cannot currently fully support a branch named main. New developments and disruptive changes should now be targeted for the 11.x branch, which currently accepts only minor-version allowed changes. For more information, see the Drupal core minor version schedule and the Allowed changes during the Drupal core release cycle.

quietone’s picture

Component: action.module » base system

But move to base system. This is not about the UI.