Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation since 01/27/2026 in all areas

  1. Thank you for sharing your invaluable work and contributions @bernhard! You had a lot of options with how to move forward and I believe that open sourcing your modules ensures that your work carries on into the future and continues to benefit both ProcessWire developers and users alike. I do want to share some thoughts and contribute to what @bernhard said about "feature complete". Most of the modules you have built are indeed robust and offer a large number of features that are implemented well and will continue to bring value long into the future. Modules like RockPageBuilder offer a solid set of features and are built in a very extensible and customizable way that puts a lot of power in the hands of developers. If any are reading this and are just finding out about it or have not yet had a reason to use it yet, I highly recommend taking a look! Other modules like RockMigrations have become staples in my workflow and will continue to be. Whether new features are added or not, the utility and quality of these contributions stand on their own. I also want to share some thoughts with the greater community. ProcessWire is a powerful tool that is developer-focused and easy to use for beginners while being powerful enough for advanced applications and more senior developers. It's one of the reasons we all love working with this platform. It also means that this community is comprised of people of many levels of skill and creative abilities. These are the factors that make open source software work. Whether you're working with the core or a module from any developer that is open source, your contributions matter and they are a way to "pay it forward" and give back to the community that makes your work possible. The vast majority of modules are free to download and use, and that "free" to you comes at a cost to module and core developers in both programming and support time. These are hours spent beyond our professional life. Nights and weekends, and breaks from our jobs to respond when something is urgent. Keep the developers in mind and remember that burnout is a real thing in the open source community. Greater involvement and contribution helps that greatly and also helps the developers you rely on for quality code you use stay engaged and make offering their work to the community enjoyable. Many hands make for light work. If you're using a module and run across an item that can be improved, a bug that hasn't been reported yet, or have an idea for a new feature then please consider forking, contributing, and pushing upstream via PRs on Github. If you are able to see something, take a moment to try and find a solution- I guarantee it will always be greatly appreciated and your efforts will not go unnoticed. You'll find some of mine coming to @bernhard modules in coming weeks. If you haven't contributed to open source before or find the process intimidating, please consider a module contribution for your first time out. The thoughtfulness and helpful attitudes here in the forums continue on module Github repositories. Those repository owners and module maintainers are the same people who are members of one of the greatest developer communities around. Never forked a repository or opened a PR before? Anyone with experience here is ready to help. You'll level up your skills, increase your confidence, and the satisfaction you'll feel cannot be overstated. These can be as simple as small changes to make a code base compatible with a new version of PHP, or a little tweak to some JS! I wanted to take a moment to mention this here because the release of these modules, much like those that were open-sourced by @kongondo and others, have a future through contribution. I don't mean to hijack your thread @bernhard but I think what you have shared offers a great opportunity to communicate these ideas in appreciation and encouragement to others. Thank you again @bernhard for the wealth of knowledge you openly share here and the guidance that you have offered to others. It is inspiring and, on a personal note, has immeasurably advanced my knowledge and confidence as a ProcessWire developer. @Jim Bailie The concept of a paid platform for modules has been discussed by many both in public and private. I don't know that there's a single answer to that question. Hopefully that may come about one day, it would mean a lot to the sustainability of ProcessWire. When it comes to taking a shop from concept to reality from a community standpoint it always comes down to "if not me, then who?". Should Ryan take time from the core to build it? Maybe it would be better for a team to collaborate and offer help to create an official channel. I think what I mentioned above underscores the importance of not relying on one person to solve the problem. I'm sure Craft had a team of people working together to make their shop come to life and also requires work to keep it going. If one person did all of it for Craft I would be truly shocked. Hey- RockCommerce is open source... maybe it's a starting point 😎
    7 points
  2. You would need to use an SQL query to first get the IDs of matching pages, then use those IDs in a PW selector. MySQL has a DAYOFWEEK() function but it starts the numbering on Sunday which is easy to forget. So probably better to use the DAYNAME() function instead. // Get the IDs of all pages where the day name of the date value is Monday $fieldName = 'event_date'; // The name of your date field $tableName = "field_$fieldName"; // The table name is the field name prefixed with "field_" $weekday = 'Monday'; // The day of the week you want to match $stmt = $database->prepare("SELECT pages_id from $tableName WHERE DAYNAME(data) = :weekday"); $stmt->bindValue(':weekday', $weekday); $stmt->execute(); $ids = $stmt->fetchAll(\PDO::FETCH_COLUMN); $idsStr = implode('|', $ids); // Find PW pages $items = $pages->find("template=event, id=$idsStr");
    4 points
  3. I wanted a way to chat with my Processwire site and built a Module (PW MCP) and an MCP server to connect into it. It's a private repo at the moment but it can be public if anyone finds it useful. It's basically a way to use the Cursor Chat Ui to query my site, fields, templates and content. Here's part of the readme which explains it better. What Is It? ProcessWire MCP is a bridge between ProcessWire and Cursor IDE (the AI-powered code editor). It lets you query your ProcessWire site's structure and content directly from Cursor's chat interface using natural language. Instead of writing selectors or browsing the admin, you can just ask: "What templates does this site have?" "Show me the fields on the blog-post template" "Search for pages containing 'summer'" "Find all images with 'lake' in the filename" Why I Built It Cursor can see your template files and code in the local directory, but it can't see what's actually in your ProcessWire database β€” which templates and fields are registered, what pages exist, or what content they contain. With ProcessWire MCP, the AI can: Query the actual database schema (not just parse template files) Look up page content by ID, path, or selector Understand field configurations (types, settings, which templates use them) Search across all text content and find files/images Get RepeaterMatrix content with type labels See file metadata (dimensions, descriptions, URLs) It's the difference between seeing $page->body in code vs. knowing what that page's body actually contains. Architecture Cursor Chat β†’ MCP Server (Node.js) β†’ PHP CLI β†’ ProcessWire API The module consists of: PwMcp β€” A ProcessWire module with a CLI interface mcp-server β€” A Node.js server that speaks the Model Context Protocol The CLI can also be used standalone for quick queries from terminal. Available Commands Command Description health Check connection and get site info list-templates List all templates with field counts get-template [name] Get template details and fields list-fields List all fields with types get-field [name] Get field details and usage get-page [id\|path] Get page by ID or path with all field values query-pages [selector] Query pages using PW selectors search [query] Search content across all text fields search-files [query] Search files by name/extension export-schema Export complete site schema Example: Health Check php site/modules/PwMcp/bin/pw-mcp.php health --pretty { "status": "ok", "pwVersion": "3.0.241", "siteName": "www.example.com", "moduleLoaded": true, "counts": { "templates": 45, "fields": 72, "pages": 960 } } Example: Content Search Ask Cursor: "Search for pages containing 'summer'" { "query": "summer", "count": 5, "results": [ { "id": 1764, "title": "Lake District walks in summer", "path": "/guides/lake-district-summer/", "template": "page-guide", "matchedField": "Body", "snippet": "The Lake District offers some of the best walking trails in summer. From gentle lakeside strolls to challenging fell walks..." } ] } Example: File Search Ask Cursor: "Find images with 'lake' in the filename" { "query": "lake", "count": 5, "results": [ { "filename": "lake-windermere-sunset.jpg", "url": "/site/assets/files/1070/lake-windermere-sunset.jpg", "size": 31207, "sizeStr": "30.5 kB", "description": "Sunset over Lake Windermere", "field": "Images", "page": { "id": 1070, "title": "Lake District walks in summer", "path": "/guides/lake-district-summer/" }, "width": 500, "height": 626 } ] } Example: Get Page with All Fields Ask Cursor: "Get the page at /about/" { "id": 1050, "name": "about", "path": "/about/", "url": "/about/", "template": "basic-page", "status": 1, "statusName": "published", "parent": { "id": 1, "path": "/", "title": "Home" }, "numChildren": 5, "created": "2023-05-15T10:30:00+00:00", "modified": "2024-11-20T14:22:00+00:00", "fields": { "title": "About Us", "body": "<p>We are a team of dedicated professionals...</p>", "Images": { "_count": 2, "_files": ["team-photo.jpg", "office.jpg"] } } } Example: RepeaterMatrix Support The module fully supports RepeaterMatrix fields, returning the actual content with type labels: { "matrix": { "_count": 3, "_items": [ { "_typeId": 1, "_typeLabel": "Body", "Body": "<h2>Welcome to our guide</h2><p>This guide covers...</p>", "Images": null }, { "_typeId": 2, "_typeLabel": "FAQs", "faq_question": "What is the best time to visit?", "faq_answer": "The summer months offer the best weather for walking..." }, { "_typeId": 3, "_typeLabel": "Call to Action", "cta_title": "Plan Your Visit", "cta_link": "/contact/" } ] } } So thats the first part done and working. My next plan is to be able to 1. PULL / convert a databse page into a local text file which lists all page properties, fields, template etc 2. edit the file as a local text file 3 PUSH the text file back into PW so that the original content picks up the changes Just having fun and building something useful. Very likely there are similar solutions or better ways to handle this but this suits my workflow ATM. Cheers P
    3 points
  4. Included are more than 70 issue fixes and 175 commits. Here we’ll zoom in on the numerous new features and improvements to the core for one of our best new versions yet! https://processwire.com/blog/posts/pw-3.0.255/
    3 points
  5. As some of you might know from my monthly newsletter I have been struggling with how to proceed with my commercial modules. It's a long story, but last year I reached a point were something had to change. The main problem is that building and selling modules for ProcessWire has never been sustainable for me. Not even close. It has been a lot of work to build the shop. It has been a lot of work to provide proper docs. It has been a lot of work to create videos about the modules so that interested people can get an idea of my modules. That's fine. I knew it would probably not be easy. But I wanted to try πŸ™‚ You never know if you don't try. And I've had hope that it is possible. Unfortunately I don't have this hope any more and that's why I have to draw a line under it. That's also fine. I've learned a lot and I'm really thankful for anybody that has sent some Euros to a stranger that they have never met in person and that excludes any refund πŸ˜„ So for me the decision was taken. It took me quite some time to get there, but here we are. There was just one problem left: My clients. They have put trust in me and I didn't want to disappoint them. Just drawing a line might be a good solution for myself but might be a terrible solution for them (and their clients as well). Just not providing updates and keeping selling them is also not my style. With open sourcing my modules I try to find the best solution for everybody involved and I want to especially thank @FireWire for helping me get there πŸ™‚ What does that mean? I'm using my modules in many of my own projects, which means that I will likely keep them alive for some time. On the other hand I don't plan to develop a lot of websites any more and many modules are somewhat feature complete as @FireWire helped me to realise, so there are no bigger updates planned for any of my modules at this time. Also, none of my modules is tested with the new admin theme. If you want to help out on that front, I'll be happily merging PRs, but as I'm not using it myself I'm not going to fix any issues or adding support for it in my spare time. So if you want to keep using my modules: Go ahead and have fun! πŸ™‚ If you find the modules helpful it's always nice to let me know. Hope this is a good solution for everyone! Thx for reading and all the best.
    3 points
  6. 2 points
  7. Hi ProcessWire community! πŸ‘‹ I'm excited to share a new module I've been working on: TeleWire - a Telegram notifications module that brings instant messaging capabilities to your ProcessWire sites. The Problem with Current Notification Solutions After running several e-commerce sites and experimenting with different notification systems, I've encountered these recurring issues: πŸ“§ Email (SMTP/WireMail): Requires SMTP server configuration (WireMailSMTP) Google App Passwords setup complexity Emails constantly landing in spam folders Delayed delivery (sometimes 5-10 minutes) No guarantee the recipient will see it quickly πŸ“± SMS (Twilio, etc): Monthly fees just to keep a phone number active (~$1-15/month) Per-message charges (can add up quickly) US compliance requirements (verification, regulations) Not everyone wants to share their phone number πŸ’¬ WhatsApp Business API: Requires business verification Complex setup process API fees and restrictions Limited to business accounts πŸ”” Push services (Pushover, etc): Requires purchasing apps ($5-10 per platform) Recipient needs to install and configure the app Additional barrier to entry Why Telegram? πŸ†“ Completely free - No monthly fees, no per-message charges, no app purchases 🌍 Widely available - Free to download on any platform, 900+ million users worldwide ⚑ Instant delivery - Messages arrive in 1-2 seconds, not minutes 🎯 Low barrier to entry - Just "install the free app and start a chat with the bot" vs "pay $5" or "give me your phone number" πŸ”’ Reliable - No spam filters, no deliverability issues, no carrier restrictions πŸ“± Multi-platform - iOS, Android, Web, Desktop - works everywhere 🎨 Rich features - HTML formatting, emojis, photos, documents, links Key Features πŸš€ Send text notifications with HTML/Markdown formatting πŸ“Έ Send photos and documents πŸ‘₯ Support for multiple recipients (users and groups) πŸ”§ Simple admin interface with test button πŸ“Š Optional logging and debug mode ⚑ Optimized performance with configurable timeouts 🎯 Easy to integrate with hooks Real-World Use Cases E-commerce order notifications: $wire->addHookAfter('FormBuilderProcessor::processInputDone', function($event) { $form = $event->object; if($form->name === 'order-form') { $telewire = $this->modules->get('TeleWire'); $message = 'πŸ›’ <b>New Order</b>' . "\n\n"; $message .= 'πŸ‘€ Customer: ' . $form->get('customer_name')->value . "\n"; $message .= 'πŸ’° Total: $' . $form->get('total')->value; $telewire->send($message); } }); Failed login attempts monitoring: $wire->addHookAfter('Session::loginFailed', function($event) { $telewire = $this->modules->get('TeleWire'); $name = $event->arguments(0); $message = '⚠️ <b>Failed Login Attempt</b>' . "\n\n"; $message .= 'Username: ' . $name . "\n"; $message .= 'IP: ' . $this->session->getIP(); $telewire->send($message); }); Content updates: $wire->addHookAfter('Pages::saved', function($event) { $page = $event->arguments(0); if($page->template == 'article' && !$page->isNew()) { $telewire = $this->modules->get('TeleWire'); $message = 'πŸ“ <b>Article Updated</b>' . "\n"; $message .= 'Title: ' . $page->title . "\n"; $message .= 'By: ' . $this->user->name; $telewire->send($message); } }); Send photos with captions: $telewire = $modules->get('TeleWire'); // Product photo when new product added $telewire->sendPhoto( $page->images->first()->httpUrl, "New product: {$page->title} - \${$page->price}" ); Send documents (invoices, reports): $telewire = $modules->get('TeleWire'); // Send generated PDF invoice $telewire->sendDocument( '/site/assets/invoices/invoice-123.pdf', 'Invoice #123 for Order #456' ); Installation Get a bot token from @BotFather on Telegram (takes 30 seconds) Install the module from GitHub Configure your bot token and chat IDs Click "Send Test Message" to verify everything works Requirements: PHP 8.2+ and ProcessWire 3.0.210+ Admin Interface Features The configuration page includes: βœ… Real-time connection status indicator πŸ§ͺ One-click test message button (AJAX, no page reload) βš™οΈ Configurable parse mode (HTML/Markdown/MarkdownV2) πŸ“ Optional logging with debug mode for troubleshooting ⏱️ Adjustable API timeouts πŸ”‡ Silent mode option (no notification sound) πŸ“Š Message length handling (auto-split long messages) Production Ready This module is currently running on several production sites: 🍫 E-commerce shop - order notifications, stock alerts 🍷 Wine/liquor business - order confirmations, delivery updates πŸ“° News portal - content publishing notifications Average response time: ~150-300ms per notification Getting Your Chat ID Find @userinfobot in Telegram Send any message - it will reply with your Chat ID Important: Start conversation with your bot by sending /start Enter the Chat ID in module configuration For groups: Add the bot to your group, make it admin, and use the negative Chat ID API Documentation // Get module instance $telewire = $modules->get('TeleWire'); // Simple text message $telewire->send('Hello from ProcessWire!'); // HTML formatted message $message = '<b>Bold</b> <i>italic</i> <code>code</code>'; $telewire->send($message); // Send with custom options $telewire->send('Silent notification', [ 'disable_notification' => true, 'parse_mode' => 'Markdown' ]); // Send photo $telewire->sendPhoto('/path/to/photo.jpg', 'Optional caption'); // Send document $telewire->sendDocument('/path/to/file.pdf', 'Document caption'); Feedback Welcome! I'd love to hear your thoughts, use cases, and suggestions. If you've been frustrated with email deliverability or SMS costs for notifications, give this a try! GitHub: https://github.com/mxmsmnv/TeleWire Thanks to the ProcessWire community for the inspiration and all the great modules that helped me learn the PW module system!
    2 points
  8. Hey @ryan, hey all readres, I'd like to propose two features that would help those of us working with business and organizational clients. OAuth 2.0 Login Support Several of our clients use Microsoft 365, and it would be nice to integrate their websites seamlessly with e.g. Microsoft Entra ID. Native OAuth 2.0 support would allow users to log in with their organizational accounts instead of managing separate credentials. For an urgent case I'll try to set up @flydev's module (https://processwire.com/modules/oauth2-login/) but unfortunately the creation of users is not yet (?) possible. Microsoft Graph API for Email Delivery As said before, more and more peopele rely on Microsoft 365, and traditional SMTP with basic authentication is being phased out. Supporting Microsoft Graph API would allow us to: Use OAuth 2.0 tokens instead of storing SMTP passwords Leverage existing Microsoft 365 infrastructure Ensure better deliverability and avoid authentication headaches Native support for both would make ProcessWire from my perspectibe a more compelling choice for organizations looking for enterprise-grade SSO and email solutions.
    1 point
  9. First of all, I know that there is a dedicated Formbuilder forum but after ten years of paying for it I do not want to pay just to learn that there is no answer ;). I just want to know if there is any possibility to use formbuilder together with Tailwind.css as CSS framework. Thanks in advance, Bernhard
    1 point
  10. Hi, I'm not sure it's very useful if you're neither French nor seriously obsessive, but just in case... In French, when using a CKEditor or TinyMCE field, it is easy to insert a non-breaking space before exclamation marks, question marks, colons, semicolons, and so on, so that they do not wrap to the next line on their own, at the end of a sentence or in the middle of one. This is not possible in simple text fields, single-line fields, or non-rich-text textarea fields and this often causes formatting issues that are not very β€˜attractive’, especially in responsive usage, remember, i said obsessive πŸ˜‚. So I created for myself a small textformatter module that allows you (well pw for you actually) to insert a non-breaking space before or after certain specific characters in a text or textarea field. It's completely useless and should not be used in a rich-text field, but if it's ever useful to anyone, it's available on GitHub at this address. https://github.com/virtualgadjo/Processwire-module-espaces-insecables-dans-champs-text have a nice day
    1 point
  11. @taotoo avec grand plaisir πŸ™‚
    1 point
  12. Hi, I am running a PW site with about 3000 frontend-users and medium traffic on all-inkl.com without issues for over a year now. Performance and response times are quite good. Switched the site last year from Strato due to slow DB queries on higher traffic. No issues with PW on all-inkl so far. Cheers
    1 point
  13. I would call the module stale, @Gadgetto hasn't visited the forum in 2.5 years.
    1 point
  14. I always ask Cusror to summarise the changes because it's much better at writing than me so here they are: What We Built Today The Problem Previously, to edit ProcessWire content, you had to either: Log into the admin panel and use the web interface Or ask the AI to read page content, but it couldn't write back The Solution We added Pull/Push sync β€” a Git-like workflow for ProcessWire content: Pull a page from ProcessWire β†’ saves it as an editable YAML file Edit the YAML in your IDE (or have AI edit it) Push the changes back β†’ updates the live page Key Features Feature Description Natural language -> Just say "Pull the About page" in Cursor chat Mirrored folders -> Pages save to site/syncs/[page-path]/ matching your site structure Readable YAML -> Content is human-editable, not database dumps Readable dates -> Dates show as 2026-01-27 not Unix timestamps Dry-run by default -> Push shows what would change before applying Conflict detection -> Warns if someone else edited the page since you pulled Revision tracking -> Each pull stores a hash to detect remote changes What Works Now Pull any page by path or ID Edit text fields, titles, SEO fields, dates Push changes back to ProcessWire Re-pull to get latest version What's Not Yet Implemented Editing RepeaterMatrix content (the complex page builders) Uploading/changing images and files Bulk pull/push of multiple pages Creating new pages Example Workflow You: "Pull the blog post about the Lake District" AI: Finds and pulls it to site/syncs/news/posts/lake-district-walks/page.yaml (this mirrors the page path/slug) You: Edit the YAML file + save You: "Push the Lake District walks page" AI: Shows preview, then applies changes to ProcessWire and updates the 'real' PW page
    1 point
  15. Hey @Stefanowitsch I think this should be fixed on the dev branch. Can you please confirm? Note that you need to create new events as old events might have some messed up end dates in the database! There was an issue in how those timestamps have been calculated and thus we had wrong dates in the database, which makes sense that your selector also failed to return the correct events.
    1 point
  16. 1 point
  17. Hi. I have latest version of PW and I have your module installed few days ago. That was version 1.1.0. Now when I check updates I see version 1.1.2. After download from PW and update it still shows 1.1.0 and that there is new version 1.1.2. I tried to download and install module manually, but it is always the same. Why is not PW recognizing update for your module?
    1 point
  18. @Jim Bailie I don't know and since you mentioned me: I'm not the one to ask this question.
    1 point
  19. Edit: Bernard's announcement here begs the question, for me at least: Why is there no centralized sales channel, a'la CraftCMS where Processwire modules can be sold? Maybe this has been discussed before, but maybe it's worth repeating.
    1 point
  20. Hi, @eelkenet, thanks for the findings! We updated the module to version 1.1.2 that addresses all 4 points: Specific error messages for upload_max_filesize, UPLOAD_ERR_PARTIAL, etc. TheMappingEngine now has multiple fallback strategies title field selection via Dropdown in UI for manual selection All parsers now use max_rows for data limiting Good luck with WP import, that one can be a bit tricky πŸ˜‰ due to WPs "unique" structure. Cheers, Mike
    1 point
  21. This works perfect. The events from the whole year are returned. $events = $pages->find("template=event-item, rockcalendar_date.inRange='2026-01-01 - 2026-12-31', sort=rockcalendar_date, parent.template=event, limit=6"); However if I specify a certain month (like december only) - the recurring events - are not included in the results. $events = $pages->find("template=event-item, rockcalendar_date.inRange='2026-12-01 - 2026-12-31', sort=rockcalendar_date, parent.template=event, limit=6"); I have the feeling this is because those recurring events had their initial start date in january. When including january in the search query they are included in the results. I created like 100 recurring events (for each event-parent) so there are more than enough event pages in the backend that should take place in december. EDIT: There seems to be something wrong when creating those recurring events in the first place. I have to investigate this: - I create an initial start event for example on january the 5th - then I create 100 recurring events - the events are shown in the page tree under the event-parent page - on the rockcalendar_calendar field on the event-parent page I see the recurring events only for january. if i switch a few months into the future no recurring event of this series that I just created is visible EDIT 2: I installed an older version of this module (1.5.1) that I am using in a different project. The error is not happening here. All recurring events are shown in the calendar on the event parent and also the query selector is working (if december only is selected). I switched back to the current version (2.0.0) and the error is back. This is no deal breaker as I can use the older version instead but I just want to let you know.
    1 point
  22. Hi @Mikel, thank you for sharing this module! I am currently going through first attempts to use this module. In my case I am trying to get (a database dump of) a WordPress site into PW. During my process I bumped into a couple of things, you may or may not be aware of: There is no warning if the uploaded file is too big, for instance due to upload_max_filesize being set too low. If the module cannot figure out a Suggested Title Field for a table, there is no way to define this yourself and the dry run will fail early (in MappingEngine::createMapping). Also there is no way to select another column as source for the title field. I think the limits don't work as intended (at least when importing SQL). When setting the sample_size to 100, and maximum_rows to 0, it will still only import 100 rows of data per table. Again, thanks for setting this all up! --- (PS, I kept running into issues while attempting to modify your module, so for now I have moved on to building a WP-scraper that leveraged the built-in rest-api.)
    1 point
  23. Thx for your support! Hope the modules will be useful for you. It's public now, thx for letting me know! πŸ™‚ I have released my first open source PW module 9+ years ago and I have realised that nothing of what you mentioned pays my bills πŸ˜‰ And all you mentioned is equally true for paid modules - the difference being that making money allows you to dedicate more time and thus provide even better solutions/docs/support. Or tackle problems that would otherwise not be possible to tackle. I think PW and all of us would benefit a lot more if we had a working ecosystem for paid modules and a larger market to sell the modules to. I just don't see that happen and that's why I had to give up and find another way. So I have a bit of a problem calling it "inspiring". I hope it is not and others find a better way. Open sourcing my modules was really just about minimising damage (for myself and my clients). If others benefit from that decision, that's great - but it was not the reason and I would not recommend anybody to take this as inspiration. πŸ™‚ Thank you πŸ™‚ Hey @Ivan Gretsky thank you very much. I think your post is spot on and you are asking some very good questions. Some very important questions. The problem that I have is that I think that those questions are not only important to you but would also be important for the PW project. I'm not sure who you are asking for? If you are asking for PW and try to push it forward, I'm sorry, I can't answer that here in a public thread unless I'm asked from an official source and get the feeling that the people in charge are interested. I hope you understand, but I don't want to burn my energy πŸ™‚ If you are asking for yourself, though, I'm happy to share anything I have learned, observed, experienced in a personal chat with you. Just drop me a line and we can meet and talk about it. Would be nice to meet you after such a long time!
    1 point
  24. Good day, @bernhard! First of all, I have to thank you for being who you are. A lone talented enthusiast trying to build a sustainable living on top of our beloved CMS. But not just making sites like the rest of us. But creating your little module-selling empire))) Taking on every hard problem ever put in front of a PW developer and solving it in no time. You have leaded the way for us for some many years. Everyone here has been following you in one way or another. And thus I feel sad about you taking this decision. Yet in the same time I can imagine the freedom you should feel after it. I really wish you good luck in any place your future journey will take you! I sounds like I am saying goodbye to someone leaving, but I am not. I am just saying that every end is the new beginning. What else I would love to invite you into doing is to analyze why this path of yours (creating a bunch of super cool module) didn't lead you to the place expected. Recently @kongondo, the only other prominent paid module creator I can remember, has done the same exit as you. Why is this? This question is of interest to me because I have many times thought about how I myself could build my income upon what I love and know - ProcessWire. Could it be, that PW is so much a DIY kind of thing, that most of us want to build something of our own and are not ready to subdue to modules authors' way of doing things (other than @ryan himself)? Or does everyone here enjoys opensource so much that proprietary is something to avoid? Or is it just simply not enough of target audience?
    1 point
  25. Hi everyone, This module completely replaces the default ProcessWire image sizing engine with the powerful Intervention Image v3 library. The goal was to modernize how we handle images in ProcessWire, bringing in features like AVIF support, superior resizing quality, and strict aspect-ratio handling, while keeping the API compatible with what you already know. πŸš€ What does it do? Replacement: It hooks into Pageimage. You can keep using $image->width(300), $image->size(800, 600), or $image->crop(...) just like you always have. Modern Formats: Automatically handles WebP and AVIF generation. Smart Responsive Images: It introduces a configuration-based approach where you define Breakpoints, Grid Columns, and Resizing Factors. The module uses these settings to automatically calculate and generate the perfect srcset for your layouts. ✨ New Methods: render() and attrs() While standard methods work as expected, I’ve added/updated methods to handle modern HTML output: 1. $image->render(string $preset, array $options) This outputs the complete HTML tag. It automatically handles: The <img> tag with srcset and sizes. The <picture> tag with <source> elements if you have enabled extra formats (like AVIF/WebP) in the settings. Lazy Loading & LQIP: It automatically generates a Low Quality Image Placeholder (pixelated/blur effect) and applies a base64 background to the image tag for a smooth loading experience. // Example: Render a 'landscape' preset defined in module settings echo $page->image->render('landscape', ['class' => 'my-image']); 2. $image->attrs(string $preset, array $options) Perfect for developers who use template engines like Twig or Latte, or prefer full control over their HTML. This returns an array of attributes instead of an HTML string. $data = $page->image->attrs('landscape'); // Returns array like: // [ // 'src' => '...', // 'width' => 1200, // 'height' => 675, // 'srcset' => '...', // 'sources' => [ ... ], // Array for picture tag sources // 'style' => 'background-image: url(data:image...);', // LQIP Base64 // 'class' => 'iv-lazy ...' // ] βš™οΈ Configuration Strategy Instead of hardcoding sizes in your templates, you configure your design tokens in the module settings: Breakpoints (e.g., 1200px) Aspect Ratios (e.g., 16:9) Grid Columns (e.g., 1-1, 1-2, 1-3) Factors (e.g., 0.5, 1, 1.5, 2 for Retina support) The module calculates the necessary image dimensions based on these combinations. If you request a specific aspect ratio, it ensures strict adherence to it, preventing 1px rounding errors. πŸ“ A Note on Documentation I wanted to get this into your hands as soon as possible, but due to a heavy workload, I haven't finished writing the detailed README.md yet. Currently, you can grab the code from GitHub (link below). I will submit this to the official ProcessWire Modules Directory after add some other features and after update readme.md Download / GitHub: GitHub Repo I’d love to hear your feedback and suggestions!
    1 point
  26. Hi @Stefanowitsch I can integrate as option a base CSS with semantic class names, similar to how I handled it in my WireMagnet module. This way, the styling can be done independently of Tailwind. I plan to release the module on GitHub in the next 2–3 weeks, once I've successfully completed some final tests.
    1 point
  27. Until we get an "official" media manger module we need to make some workarounds. Let me tell you about my personal solution for this: I am using the FileMover module from @Robin S for copying images from a global "media library" field (that is placed inside a dedicated "media library" template ) to any of my image fields. Please have look at robins comment here where he extended the functionality of his module through a hook. In this case you can open the image library page through a modal with a click from any image field. There is also a small screencast that shows this – for me this is a really good workaround. Please have a look for yourself and give it a try (and some credits to robin!).
    1 point
  28. Hello all! There's a new version of Fluency and a critical update announcement for all DeepL users. Fluency 2.2.0 has just been released and is a critical update for all users of Fluency that employ DeepL as their translation service. As mentioned above, DeepL is deprecating their previous method of API authentication on January 15, 2025. This means that all Fluency versions less than 2.2.0 that are using DeepL will no longer translate content. Upgrading from Fluency 1.8.0 or earlier requires a complete uninstall/reinstall. The module will have to be configured again, so note your API key if you don't have access to it otherwise. This will not result in any content loss. Fluency 2.2.0 also brings additional features and bugfixes. These include compatibility with AdminThemUikit v3 and its theming customization abilities. Fluency also now uses CSS custom properties so it is possible to customize it separately. This release also includes a fix for an issue that may affect saving content in RockPageBuilder fields mentioned earlier in this thread. For full notes on changes and improvements see the Github release page. If you have any trouble with the module please report them here, filing an issue on Github is helpful as well. Thank you all for your feedback and ongoing support. Additional thanks to the developers who have donated via PayPal, always appreciated!
    1 point
  29. Is my 100th post I wanted to do something special. I edited a video, hope you like it Just for fun Edited: Now with subtitles
    1 point
Γ—
Γ—
  • Create New...