2

My site with existing content needs a field that shows the number of nodes of a certain content type that have been created by the current user.

I can't use Views because the field needs to be able to be used in a Rules condition.

Nor can I use Rules Actions and Flag at the time of adding nodes because so many nodes are pre-existing.

Nor can I use Display Suite code fields because I don't think they are able to be used in Rules either.

Is a computed field and a custom query the best option?

I have so far failed to find a code snippet and I am not experienced in PHP.

3
  • Adrian Cid Almaguer's answer sounds perfect. But if it's a very simple rule condition where a user must have created X amount of nodes, then this is easy with VBO. It has a "Check number of results returned by a VBO view" condition. That just means you wouldn't need a field at all. Jul 15, 2016 at 14:58
  • @NiallMurphy your point is interesting, can you create a answer with all the steps to accomplish this? Jul 15, 2016 at 15:18
  • 1
    Added it below. It has saved me a few times! Jul 15, 2016 at 15:59

3 Answers 3

3

A method of using VBO+Rules to have a minimum number of results rule condition. It's a commonly used module and this can be really useful for a lot of things.

  1. Create a standard view and add the author: uid as a contextual filter. The default value must be Raw: Path Component 2.
  2. Add the VBO field, Bulk Operations.

Step 1

Next, we add the condition to the rule.

  1. Add Check number of results returned by a VBO view condition.
  2. Select the VBO view we just created. Master is fine.. It just needs the Bulk Operations field to show up here.
  3. Pass the current user's uid as an argument to the view. This gets sent as path component 2 which is why we had to choose it in the view.
  4. Set your minimum number of nodes / users / comments etc. that your view is counting.

Step 2

And done.

4
  • I will test this later, seems interesting Jul 15, 2016 at 16:20
  • This works and the Views+VBO+Rules instructions were very helpful.
    – JohnD
    Jul 19, 2016 at 9:49
  • What's the purpose of the "250" (for "minimum number of results") in this answer? Nowhere in the question (or comments) I find anything that talks about that "250". PS: can't upvote this answer "anymore" ... Aug 17, 2016 at 10:35
  • In the comments, he showed interest in this method but didn't give a number. I used 250 as my own test as the number of vbo results was 246 or something. Point 4 in this answer instructs him to add his own minimum number. Aug 17, 2016 at 10:46
5

You can use the Computed Field module but you need to consider this:

When is the field actually computed?

If you wish to store the values in the database then you have to update or re-submit the node to compute the value of the field.

If it is not stored in the database then the value computes when the node loads and only when the node is loaded. The field will not work in views nor will it function properly if it depends on other non-stored computed fields.

This is the code of your field:

global $user;
$type = 'article';

$query = new EntityFieldQuery;
$result = $query
->entityCondition('entity_type', 'node')
->propertyCondition('status', 1)
->propertyCondition('type', $type)
->propertyCondition('uid', $user->uid)
->execute();

$cant = count($result['node']);
$entity_field[0]['value'] = $cant;

Another way that come to my mind is have a variable to store this value, and you will edit this var each time a new node is created (hook_node_insert) or deleted (hook_node_delete), so in this case you will have always the real value.

Rerefences:

Computed Field

3
  • Could one use your code snippet in a computed field and then use Computed Field Tools to keep the count up to date?
    – JohnD
    Jul 19, 2016 at 9:59
  • @JohnD I think that with this module all will be ok, but is better if you make some test and write here your results. It's the first time that I read about the Computed Field Tools module. Jul 19, 2016 at 19:45
  • a very good answer, using php May 14, 2019 at 22:11
2

You could try using the Token Embed Views module, and then use this token on that field. I have not tried this method, but you could give it a try.

So, I suggest to create a view that does this counting, and embed this view into your field, using the module above.

1
  • Interesting idea, which I may come back to in the future. The problem is that it needs a text field - tokens won't work in an integer field because they can only contain numbers.
    – JohnD
    Jul 19, 2016 at 9:52

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.