All Activity
- Past hour
-
Ivan Gretsky started following Determine if current request is url/path hook
-
Good day! I have a module that sets a url hook. But then I have code in site/ready.php that stops page rendering process under certain conditions based on a page being viewed. So I need to modify that condition to include all url/path hooks. How do I do it? I thought of setting a custom $config variable. Or checking for $config->requestPath(). But maybe there is something universal?
- Today
-
Hi @ryan there are a lot of modules I was working on. I began creating them even before the company project itself got underway (these are apps intended for internal use), anticipating what I would need based on the initial requirements and my prior experience with ProcessWire projects. I wanted to avoid conflating module development with the development of the core application itself. That said, this meant I was able to test some of the modules incrementally, as the need arose; however, a significant portion of the project remains to be completed, and there are other modules—on which I performed only limited initial testing—that I haven't actually put into use yet. In fact, they could be considered by the community as proofs of concept, given that I am not strictly a "professional" developer; I'm a graphic designer, and my role within the company is as Webmaster. Nevertheless—thanks to ProcessWire's ease of use—I have spent years implementing tools that assist the various departments in their daily operations. All these modules were built around a philosophy of "Simple": they get straight to the point regarding my specific needs, though I am not sure whether they would prove useful to others. I have never worked with Git or a version control system, nor have I ever published modules before, so I have no idea what the best way to proceed would be; if you could offer me any guidance, I would be very grateful. SimpleWire current modules list: SimpleAsset: Asset management for ProcessWire. Resolves, groups, and renders CSS/JS assets from CDN sources or local paths with cache-busting, SRI, and inline threshold support. SimpleAttempt: Error-first pattern helper for ProcessWire. Returns [error, data] arrays instead of try-catch blocks for explicit, predictable error handling. SimpleAttribute: HTML attribute-based template syntax (.attr.phtml) with pw-* directives, {{ }} interpolation, and file-modification caching. SimpleClient: Fluent cURL-based HTTP client with retry, file download, and concurrent pool support. SimpleForm: Programmatic HTML form builder with fluent API and DomQuery. SimpleHelper: GitHub-based utility vault management with local caching, ETag updates, and discovery. SimpleIcon: Tabler Icons renderer with local SVG caching. Supports data URI, inline SVG, and image tag output formats. SimpleQuery: GraphQL-like query engine (WireQL) for ProcessWire pages with caching, rate limiting, and write support. SimpleQueue: Background job queue with priority, delayed execution, retry, and LazyCron-based processing. SimpleRender: Template rendering with views, components, partials, JSON, XML, and fragment extraction. SimpleRequest: HTTP request abstraction with input handling, validation, and content negotiation. SimpleResponse: HTTP response builder with HTMX support, redirects, and content negotiation. SimpleRouter: URL routing with pattern matching and caching for ProcessWire. For use as a URL segments engine. SimpleSSE: Server-Sent Events (SSE) helper for ProcessWire. Provides a simple API for streaming real-time events to the browser. SimpleFlow: In planning. A basic visual workflow module for ProcessWire. SimpleHook: In planning. A support module for the SimpleFlow module. SimpleFront: In planning. Islands architecture component framework SimpleAuth: In planning. A thin wrap around ProcessWire user/role/access APIs.
-
@WireCodex It sounds like a lot of people here would be interested. Is it something where you'd want to make it a public and supported module in the modules directory, or more interested in sharing as a proof of concept?
-
@AndZyk I was able to duplicate the issue when using openrouter. It turned out that because the openrouter string starts with "anthropic", it was getting interpreted as a line having a "provider" property, which is something that we deprecated, but still supported for backwards compatibility, and so it was causing the properties to get mixed up. I've updated the detection logic so that it shouldn't happen anymore. Thanks .
-
ProcessTranslatePage 1.5 + 1.6 Two new versions released — improved glossary handling and a second translation provider. 1.5 — Better glossary management The module now detects free DeepL accounts (limited to one glossary) and warns instead of showing an error. Existing glossaries on your account are shown as a dropdown so you can select one manually, and there's a new "Delete glossary" option in the settings that removes it from DeepL while keeping the entries in the language fields. 1.6 — Added Google Cloud Translation option My main motivation here was that I just discovered DeepL has discontinued new free API plans, so Google Cloud Translation is now available as an alternative. Both providers support the same field types and write modes. Setup for Google requires a GCP service account; the full steps are in the readme. Glossary support remains DeepL-only for now, as Google's glossaries require a Cloud Storage bucket which seemed a little bit too much effort for the effect. Locale codes (DE, de, EN-GB, en_gb …) are normalised automatically on runtime now, so the format in the language fields doesn't matter anymore.
-
@ryan Thank you for the explanation. When I try to enter all values manually in the primary agent: It mixes the values after saving: I cannot leave all fields empty, because then it throws an error. My module config is correct, but ignored because of the primary agent setting. I hope this helps.
-
Move from Wordpress to Processwire (in Germany)
imandreas replied to ThomasLichtenstern's topic in Jobs
Hi @ThomasLichtenstern I would be available right now, living in South of Germany, we made lovely PW websites with a focus on details and usability and using PW for a lot of business logics right now. And we are experienced and keen on frontend details - so your customer will love it - on mobile and on desktop. It's tricky to link our showcases here in PW Website, but here some of them. A few larger websites in pharmaceutical business with PW are already offline due to clients. Some of our websites are listed in the site and still online, e.g. https://processwire.com/sites/list/die-schwarz-bunte-dein-freizeit-guide/ Looking forward, would be a pleasure Andreas - Yesterday
-
Move from Wordpress to Processwire (in Germany)
Tyssen replied to ThomasLichtenstern's topic in Jobs
https://directory.processwire.com/developers/ -
Hi, team. Lately, Claude and I 😁have been working on a series of modules for a new project at my company. This set includes a module for queue management. They aren't finished or ready for production yet; in fact, I’ve had few opportunities to test some of them, as I haven't reached those specific stages of the project yet. With these implementations, I’m not aiming to create anything overly complex—after all, there are already plenty of libraries available for that purpose. The idea is for them to be easy to use, free of external dependencies, and equipped with the basic functionality required for the tasks at hand—always adhering to the language and philosophy of ProcessWire. Would you be interested in having me upload some of them to GitHub for a look?
-
Leftfield started following Move from Wordpress to Processwire (in Germany)
-
Move from Wordpress to Processwire (in Germany)
Leftfield replied to ThomasLichtenstern's topic in Jobs
Hi @ThomasLichtenstern I've just moved WordPress (500+ pages) website to Processwire. I got all neccessary scripts to move content, links redirect pages/posts/categories. I did whole SEO, because they had problem with WP, even with SEO plugins I am 100% sure there are way better developers here than me, but if... I am here :) -
Move from Wordpress to Processwire (in Germany)
ThomasLichtenstern replied to ThomasLichtenstern's topic in Jobs
Oh great, where can I find it? I did search without success -
Move from Wordpress to Processwire (in Germany)
Peter Knight replied to ThomasLichtenstern's topic in Jobs
Hey Thomas There's a developer directory in here somewhere with many talented devs - both solo and agency. -
Hi, I have a customer here in Germany that wants to move away from wordpress to processwire. Its a wordpress site with no special funktions or so. Just some pages with graphics. Is there someone here who can help? Can send the link to the actual site if wanted for an estimation of time to migrate. Regards Thomas
-
Hi Ryan, I'll do my best to explain this, but keep in mind my experience with queues / background jobs is only 2 years old. But in short, inspiration would be best taken from the classic, "batteries included" big web application frameworks like Laravel (as Teppo pointed out) and Rails. I like the Laravel page I linked because it gets very in-depth (I've read that page at least 10 times). Let's use a classic example like this: Let's say someone wants to upload a video to a field and we want it to be converted to a different file format (let's say that's being handled by ffmpeg). That's a time intensive task that wouldn't be able to be done within a standard max limit 30 second web request, or even with the memory available to php via php-fpm. It might take minutes or even hours, and even then, things can go wrong and it might fail. So, instead we'd want this to happen independent of the web request, therefore a background job dedicated to that task would have to be made and scheduled to be processed. It could happen immediately, or maybe it can be scheduled for 30 minutes later. This is not related to cron jobs which are a different concept. (Another example is for example in an ecommerce checkout; it's generally better practice to send the order notification email as a background job instead of inline with the code that processes the order after it's submitted). With that, queue systems are typically powered by a different dedicated database or system, with Redis being a popular choice. The reason for this is to limit load on the primary database; many large systems may have millions of jobs per day so offloading that to a separate database saves resources. However the big web application frameworks I mentioned also allow the option for the main database itself to store the jobs (Rails enabled this in Nov 2024), which is typically fast enough and probably good enough for a ProcessWire-based solution. You then have workers which act on the jobs. You can define there to be one or multiple workers. Let's say you have a powerful server and want to transcode multiple videos at a time, then having multiple workers would allow more jobs to be done in parallel and take advantage of your system resources. Obviously you don't want a worker to act on a job more than once, or two different workers to act on the same job. So this gets into jobs have statuses, being locked, and avoiding race conditions. The Laravel documentation gets into all of that, but I think reading up on queues/background jobs/workers and experimenting with it would be tremendously helpful. In regards to my print-on-demand system, I'm not using a queue system as I described above and I did experiment with WireQueue and IftRunner a while ago, but it didn't really... fit? It was a while ago and I was still wrapping my head around queues; also I came to realize that what I needed was even deeper than that (ie, durable workflows, but that's unrelated to what we're talking about here). I eventually put something together that relies on "fake" jobs using cron jobs and progressing through a durable workflow; it's not the most efficient way to do it, but I got it working. I've been meaning to rewrite that part of the system one day and having a native / first-party queue system (which dovetails with the CLI commands), would be the best approach.
-
Ah let's not forget The OG WireQueue! Couple examples from my own experience, involving FormBuilder: It would be great to make FormBuilder actions asynchronous, when integrating whatever third party email/list management, some have very simple integrations that can pass as barely noticeable since it normally involves an extra request, but some of these, sometimes require tokens refreshments to a different endpoint for example, and time starts adding, making the forms feel slow. Another issue that I actually have right now in a website, is how I integrate FormBuilder to save leads as pages, and before saving new pages, I make a search of existing pages/users to avoid duplication of data. This has worked perfectly for the last 8 years or something, but after a few hundreds of leads saved in the database, the query of users during the request is starting to be noticeable, and the form submissions now feel slow. So I'm going to build FormBuilderActionQueueItem to add this process as a queue item to be processed and migrate all logic to the queue worker. Another example that comes to my mind is also building emails that depend on some sort of query, it's not a rare petition that I get to "enrich" emails with related information and data that comes from queries, since the FormBuilder administrator emails' purpose is to help a sales teams make decisions.
-
Hi, We use the mod_cspnonce + Apache SSI approach. .htaccess: Options +Includes AddType text/html .html .php AddOutputFilter INCLUDES .html .php <IfModule mod_headers.c> # If not the PW admin <If "! %{QUERY_STRING} =~ /{your-admin-url}/"> ... Header set Content-Security-Policy "\ default-src 'self';\ script-src 'nonce-%{CSP_NONCE}e' 'strict-dynamic';\ ... " </If> </IfModule> In your template: <!--NoMinify--> <script src="./your-script.js" nonce="<!--#echo var="CSP_NONCE"-->"> <!--/NoMinify--> Note that the NoMinify tags need to be added to stop ProCache stripping out the SSI var as it treats it as an HTML comment. We've been using this in production for 2-3 years on sites with the Apache module available and it works well. Cheers, Chris
-
@teppo @elabx The wp-cron looks identical to lazyCron. But the queue stuff does look new. I built out the IftRunner queueing module a long time ago and apparently Apeisa did find it very useful, since he had me build it for them at the time. But I didn't have any good use cases myself, so didn't continue building the module beyond the original scope. But I think we did do some pretty cool stuff it. Though it was so long ago that I think the landscape has changed and if we were to build something now it'd be very different from before. I'll definitely look into it more here. I'm still interested to hear @Jonathan Lahijani use cases too.
-
@AndZyk The model field accepts any value — you're not limited to the predefined examples in the dropdown. For OpenRouter, type the full model ID directly (e.g. anthropic/claude-sonnet-4-6) and it will be saved as-is. I'd suggest configuring in Setup > AgentTools > Agents, rather than using the module config settings (though they map to the same things). We've added several common OpenRouter model IDs to the suggestions list in the next update, so they'll appear in the dropdown automatically. As for the fields appearing to mix values — sounds like maybe browser autofill? The API key field uses type="password", which can cause some browsers to try to autofill nearby fields as a user/pass. Disabling browser autofill for the page should prevent that. Or, in Setup > AgentTools > Agents, you could just click the little "reveal API key" button just to make sure something else isn't getting autofilled into it. Please let me know if you still can't get it to work?
-
prestoav started following Core Module Export/Import – Error
-
PW: 3.0.255 PHP: 8.3.3 Sadly I now have the same issue and I can't find a way around it. Duplicate sites, create a new page on one then try to export the page to the duplicate site and get this error: Error: Call to a member function getLanguageValue() on null in wire/modules/LanguageSupport/FieldtypeTextareaLanguage.module:126 #0 [internal function]: FieldtypeTextareaLanguage->___importValue() #1 wire/core/Wire.php (425): call_user_func_array() #2 wire/core/WireHooks.php (1018): Wire->_callMethod() #3 wire/core/Wire.php (484): WireHooks->runHooks() #4 wire/core/PagesExportImport.php (998): Wire->__call() #5 wire/core/PagesExportImport.php (685): PagesExportImport->importFieldValue() #6 wire/core/PagesExportImport.php (535): PagesExportImport->arrayToPage() #7 wire/modules/Fieldtype/FieldtypeRepeater/FieldtypeRepeaterPorter.php (255): PagesExportImport->arrayToPages() #8 wire/modules/Fieldtype/FieldtypeRepeater/FieldtypeRepeater.module (1006): FieldtypeRepeaterPorter->importValue() #9 [internal function]: FieldtypeRepeater->___importValue() #10 wire/core/Wire.php (425): call_user_func_array() #11 wire/core/WireHooks.php (1018): Wire->_callMethod() #12 wire/core/Wire.php (484): WireHooks->runHooks() #13 wire/core/PagesExportImport.php (998): Wire->__call() #14 wire/core/PagesExportImport.php (685): PagesExportImport->importFieldValue() #15 wire/modules/Process/ProcessPagesExportImport/ProcessPagesExportImport.module (619): PagesExportImport->arrayToPage() #16 wire/modules/Process/ProcessPagesExportImport/ProcessPagesExportImport.module (320): ProcessPagesExportImport->processImportItemToPage() #17 wire/modules/Process/ProcessPagesExportImport/ProcessPagesExportImport.module (242): ProcessPagesExportImport->processImportSubmit() #18 wire/modules/Process/ProcessPagesExportImport/ProcessPagesExportImport.module (76): ProcessPagesExportImport->processImport() #19 wire/core/Wire.php (413): ProcessPagesExportImport->___execute() #20 wire/core/WireHooks.php (1018): Wire->_callMethod() #21 wire/core/Wire.php (484): WireHooks->runHooks() #22 wire/core/ProcessController.php (362): Wire->__call() #23 wire/core/Wire.php (413): ProcessController->___execute() #24 wire/core/WireHooks.php (1018): Wire->_callMethod() #25 wire/core/Wire.php (484): WireHooks->runHooks() #26 wire/core/admin.php (174): Wire->__call() #27 wire/modules/AdminTheme/AdminThemeUikit/controller.php (15): require('/home/u99035861...') #28 site/templates/admin.php (15): require('/home/u99035861...') #29 wire/core/TemplateFile.php (328): require('/home/u99035861...') #30 wire/core/Wire.php (413): TemplateFile->___render() #31 wire/core/WireHooks.php (1018): Wire->_callMethod() #32 wire/core/Wire.php (484): WireHooks->runHooks() #33 wire/modules/PageRender.module (547): Wire->__call() #34 wire/core/Page.php (3152): PageRender->render() #35 wire/core/Wire.php (416): Page->___renderPage() #36 wire/core/WireHooks.php (1018): Wire->_callMethod() #37 wire/core/Wire.php (484): WireHooks->runHooks() #38 wire/core/Page.php (3097): Wire->__call() #39 wire/core/Wire.php (413): Page->___render() #40 wire/core/WireHooks.php (1018): Wire->_callMethod() #41 wire/core/Wire.php (484): WireHooks->runHooks() #42 wire/modules/Process/ProcessPageView.module (193): Wire->__call() #43 wire/modules/Process/ProcessPageView.module (114): ProcessPageView->renderPage() #44 wire/core/Wire.php (416): ProcessPageView->___execute() #45 wire/core/WireHooks.php (1018): Wire->_callMethod() #46 wire/core/Wire.php (484): WireHooks->runHooks() #47 index.php (56): Wire->__call() #48 {main}
-
Thank you for adding the multi agent feature. For me it doesn't work with OpenRouter, because the model should be for example anthropic/claude-sonnet-4-6 instead of claude-sonnet-4-6. But if I change the model manually it messes app the fields, because of the predefined options I think. It mixes values in other fields. Could you please fix this? 🙂 Regards, Andreas
-
virtualgadjo started following How to transfer a Processwire site from one server to another
-
Hi, honestly, the answer is in your first post, files and DB backup are all you need (same as when you go online for a local dev website) the only things you'll have to change are the db connection settings in the config.php file of course, depending on the pw version the websites are using you may have to check the php version your new hosting server is on and if needed set a lower one (most recent hosting service will use a 8+ version and if your website uses a 3.0.165 pw there may be some warnings 🙂 in that case go for a php 7.4.x version and, afterwards, simply upgrade both your pw and php) have a nice day
-
@Roych thanks! This is a really nice and clean module that integrates straight into the backend. I just installed it on a client site and its already filling with interesting data. @ai_slop I was able to make this module work together with PrivacyWire since I am inside the EU. If consent is chosen the cookie is set and the module activates.
-
elabx started following PW 3.0.259 – Core updates
-
Got my vote. I've implemented https://github.com/php-enqueue in a couple projects. @ryan Nice to se the Cli interface, just wanted to give a heads up of wire-cli and rockshell. These have been around from quite a while, something could be inspired from these libraries or maybe pick up from the current state of the libraries to work on things like scheduling/queue/agenttools
- Last week
-
@szabesz thanks for letting me know. Yes, the link was a mistake. I wanted to pin the 1st comment to the the top for the latest info but didn't know how. In future will add new info above old for continuity. 🙂