Jump to content
Marvin Scharle

Page Bookmarks

Recommended Posts

Hello everybody,

It's another day - so it's time for a new module and this module is all about helping your site's visitors to store the pages they want to visit. 

Bookmarks is a module that delivers a straightforward API for storing pages, adding bookmark-comments and tags to them.

You can create a bookmark for the current user for a page with a single line of code:


You can also add comments and tags to it:

$page->bookmark->comment = 'Early in the morning';
$page->bookmark->tags = array('sleepy', 'bashful', 'sneezy');

After having stored some bookmarks, you can fetch a user's bookmarks in this way:


You can find a live demo of the module here: http://nickel-1vn.lightningpw.com/

You can find the module and additional APIs here: https://github.com/conclurer/PageBookmarks

The module is submitted for the module directory and should appear soon.

Please leave a comment below to add feedback and / or feature wishes.

Thanks in advance,


  • Like 12

Share this post

Link to post
Share on other sites

Thanks, Marvin, this is really nice. Are you are using sessions to store the guest's bookmarks? If so, have you considered a cookie solution too so that visitors can come back days later and find their bookmarks again?

  • Like 1

Share this post

Link to post
Share on other sites

Thanks for the Feedback!

@jacmaes: Yes, the module currently uses the session to store the necessary information. I will place your feature wish on our roadmap.

@Soma: Bookmarks supports Tagging and adding comments to the pages. Furthermore, it is not restricted to logged-on users. If you want to see the differences live, please check out our demo page.

Share this post

Link to post
Share on other sites

@Marvin, is there a configurable maximum amount of bookmarks and tags per person ? Can imagine a 'bot' continues tagging for an x amount of time.

Share this post

Link to post
Share on other sites

@Martijn Geerts: Currently the information for guest users is stored in the session (not in the database). Furthermore I believe, there is a max size for the session.

Share this post

Link to post
Share on other sites

I've encountered a bug :)

  • when entering multiple tags, the bookmark gets saved multiple times. and when I attempt to delete one of the duplicates, they are all deleted.
  • i accidentally saved a bookmark many times, how about disabling the Saved button after the first save?

SUPER COOL, I can easily use this for an upcoming project.

Would work ideal for a recipe type website.


  • Like 1

Share this post

Link to post
Share on other sites


Thanks for your report.

  • The module does not write duplicates, on the demo site the output of all bookmarks is grouped by tag. So if you assign multiple tags to one bookmark, the bookmark will show up multiple times. The reason why the bookmark is deleted when you remove it from one tag, is that I was lazy writing the demo, so that the entire bookmark is deleted instead of one tag. 
  • The white Save-Button is rather an "update" button than a save button. You can assign or remove tags and change your comment afterwards and then save the bookmark again.

Your example is a perfect use case for this module. Great idea!

  • Like 1

Share this post

Link to post
Share on other sites

I love the module, but it breaks the newest version of ProcessWire.. "Class cant be called again" or something. I guess its, because there is already a class called PageBookmarks integrated in ProcessWire (Bookmarks in the admin). You have a clue how to change this quickly? Would appreciate any help on this..!

Share this post

Link to post
Share on other sites

Hi Marvin,

does this work with processwire 3?

And, is there a demo online?


Share this post

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By bernhard
      --- Please use RockFinder3 ---
    • By MoritzLost
      Cacheable Placeholders
      This module allows you to have pieces of dynamic content inside cached output. This aims to solve the common problem of having a mostly cacheable site, but with pieces of dynamic output here and there.  Consider this simple example, where you want to output a custom greeting to the current user:
      <h1>Good morning, <?= ucfirst($user->name) ?></h1> This snippet means you can't use the template cache (at least for logged-in users), because each user has a different name. Even if 99% of your output is static, you can only cache the pieces that you know won't include this personal greeting. A more common example would be CSRF tokens for HTML forms - those need to be unique by definition, so you can't cache the form wholesale.
      This module solves this problem by introducing cacheable placeholders - small placeholder tokens that get replaced during every request. The replacement is done inside a Page::render hook so it runs during every request, even if the response is served from the template cache. So you can use something like this:
      <h1>Good morning, {{{greeting}}}</h1> Replacement tokens are defined with a callback function that produces the appropriate output and added to the module through a simple hook:
      // site/ready.php wire()->addHookAfter('CachePlaceholders::getTokens', function (HookEvent $e) { $tokens = $e->return; $tokens['greeting'] = [ 'callback' => function (array $tokenData) { return ucfirst(wire('user')->name); } ]; $e->return = $tokens; }); Tokens can also include parameters that are parsed and passed to the callback function. There are more fully annotated examples and step-by-step instructions in the README on Github!
      A simple and fast token parser that calls the appropriate callback and runs automatically. Tokens may include multiple named or positional parameters, as well as multi-value parameters. A manual mode that allows you to replace tokens in custom pieces of cached content (useful if you're using the $cache API). Some built-in tokens for common use-cases: CSRF-Tokens, replacing values from superglobals and producing random hexadecimal strings. The token format is completely customizable, all delimiters can be changed to avoid collisions with existing tag parsers or template languages. Links
      Github Repository & documentation Module directory (pending approval) If you are interested in learning more, the README is very extensive, with more usage examples, code samples and usage instructions!
    • By Craig
      I've been using Fathom Analytics for a while now and on a growing number of sites, so thought it was about time there was a PW module for it.
      WayFathomAnalytics is a group of modules which will allow you to view your Fathom Analytics dashboard in the PW admin panel and (optionally) automatically add and configure the tracking code on front-end pages.
      GitHub Readme & documentation Download Zip Modules directory Module settings screenshot What is Fathom Analytics?
      Fathom Analytics is a simple, privacy-focused website analytics tool for bloggers and businesses.

      Stop scrolling through pages of reports and collecting gobs of personal data about your visitors, both of which you probably don't need. Fathom is a simple and private website analytics platform that lets you focus on what's important: your business.
      Privacy focused Fast-loading dashboards, all data is on a single screen Easy to get what you need, no training required Unlimited email reports Private or public dashboard sharing Cookie notices not required (it doesn't use cookies or collect personal data) Displays: top content, top referrers, top goals and more
    • By daniels
      This is a lightweight alternative to other newsletter & newsletter-subscription modules.
      You can find the Module in the Modules directory and on Github
      It can subscribe, update, unsubscribe & delete a user in a list in Mailchimp with MailChimp API 3.0. It does not provide any forms or validation, so you can feel free to use your own. To protect your users, it does not save any user data in logs or sends them to an admin.
      This module fits your needs if you...
      ...use Mailchimp as your newsletter / email-automation tool ...want to let users subscribe to your newsletter on your website ...want to use your own form, validation and messages (with or without the wire forms) ...don't want any personal user data saved in any way in your ProcessWire environment (cf. EU data regulation terms) ...like to subscribe, update, unsubscribe or delete users to/from different lists ...like the Mailchimp UI for creating / sending / reviewing email campaigns *I have only tested it with PHP 7.x so far, so use on owners risk
      Since 0.0.4, instructions and changelog can be found in the README only. You can find it here  🙂
      If you have questions or like to contribute, just post a reply or create an issue or pr on github, thanks!
    • By MoritzLost
      Sorry for the convoluted title. I have a problem with Process modules that define a custom page using the page key through getModuleInfo (as demonstrated in this excellent tutorial by @bernhard). Those pages are created automatically when the module is installed. The problem is that the title of the page only gets set in the current language. That's not a problem if the current language (language of the superuser who is installing the module) is the default language; if it isn't, the Process page is missing a title in the default language. This has the very awkward effect that a user using the backend in the default language (or any other language) will see an empty entry in the setup menu:

      This screenshot comes from my Cache Control module which includes a Process page. Now I realize the description sounds obscure, but for us it's a common setup: We a multiple bilingual sites where the default language is German and the second language is English. While the clients use the CMS in German, as a developer I prefer the English interface, so whenever I install a Process module I get this problem.
      As a module author, is there a way to handle this situation? I guess it would be possible to use post-installation hooks or create the pages manually, but I very much prefer the declarative approach. The page title is already translatable (through the __ function), but of course at the time of installation there is no translation, and as far as I'm aware it's not possible to ship translations with a module so they are used automatically. Could this situation be handled better in the core? I would prefer if the module installation process would always set the title of the Process page in the default language, instead of the language of the current user.
  • Create New...