Recently Updated Topics
Showing topics posted in for the last 7 days.
- Today
-
Hello @Peter Knight At the moment, it stops the successful form submission like any other validator and an error message will be displayed to the user under the inputfield, that the text looks like SPAM with a hint to prevent using to much links to write to much words in uppercase letters using typical SPAM words and so on If a form has too much failed attempts, it will be logged, with timestamp and IP if this security measure was not disabled manually, but not with detailed information. So at the moment it only stops the successful form submission. Maybe the error message is written generally. This could be improved to give more information of what went wrong. Idea: Could be done only via a session I think but I have to try it.
-
Collections — Airtable-style data management for ProcessWire
jacmaes replied to maximus's topic in Modules/Plugins
@maximus Thanks for all your modules, you're on a roll! I've tes . tested this module and opened an issue. It's probably an misunderstanding on my part, but when you get a chance, could you take a look at it? Thanks! -
Hi @nbcommunication - I've actually set up my own report endpoint which logs to PW log files (csp-report and csp-report-only). I also ping via slack for any enforced violations. The only thing I still have in report-only mode now is "require-trusted-types-for". I have actually reported to a few open source projects I integrate about the changes to support "require-trusted-types-for" and they've actually been very responsive so I am hoping to be able to enforce this option very soon also. Note that I do exclude violations from browser plugins and the like, so my csp-report log is actually almost completely silent now. I do have separate policies for frontend vs PW admin which helps because PW still has various inline scripts and no nonce (yet). I am using Cloudfront but all my CSP and nonce logic is handled locally in my /site/init.php file - it's very different and much stricter than what I posted earlier above. I have Cloudfront enabled caching for all assets, but I am not using Procache for a variety of reasons, but performance with Cloudfront asset caching is a pretty good middle-ground.
-
Context Module - AI-Optimized Site Documentation with TOON Format
maximus replied to maximus's topic in Modules/Plugins
Context v1.5.0 — AI Gateway Hi, just pushed a new release. The main addition is a centralized AI Gateway — a ContextAI class that any ProcessWire module can use to make AI requests through a single shared configuration: $ai = wire('context')->ai(); // Simple $text = $ai->complete('Summarize: ' . $page->title); // Full options $result = $ai->chat([ 'messages' => [['role' => 'user', 'content' => '...']], 'model' => 'openai/gpt-4o-mini', 'caller' => 'MyModule', ]); // Gateway entry point for third-party modules $result = $ai->gateway(['caller' => 'MyModule', 'messages' => [...]]); Supported providers: OpenRouter (200+ models via one key), OpenAI, or any OpenAI-compatible endpoint. New settings fieldset: provider, API key, default model, temperature, max tokens, timeout, global system prompt, and a Test Connection button that fires a live request and shows the response time. The idea is that modules don't need to implement their own HTTP clients or manage API keys — they just call wire('context')->ai() and everything is configured in one place. GitHub: https://github.com/mxmsmnv/Context - Yesterday
-
@teppo If I understand correctly, it sounds like you are primarily looking for a way to disable LazyCron from running during regular web requests? And to be triggered from a real CRON job (via CLI command) or from some other condition, like the presence of a GET variable or something? We already have conditions in the module that prevent it from during during ajax requests, file requests, redirect requests, path hook requests, etc., so it'd be a simple matter to have an option to prevent it from running during web requests and instead delegate to CLI or similar. I'll go ahead and add this. Though let me know if I've misunderstood any part.
-
Hey NEO in this instance is more aligned to “new” than any acronym or AI /LLM technology. I guess the upper case letters suggests an acronym but, honestly, I just liked the visual rhythms of both words. Not sure if this answers your question or if I misunderstood?
-
Thanks for all the feedback, this is great. I just wanted to say ProcessWire has always been "back", never left. It's always been a long term project and never a fad project, so periods of rapid development and periods of slow development are normal, and I'm sure that cycle will always be the case. I've always been careful about making sure the project doesn't get bloated with short term things. So to make sure the quality is high over the long term, it's good to know when to go into rapid development, and when to let things simmer slowly. There's room for both. The other factor is that sometimes I have client work deadlines that I've got to give priority to because that's what keeps me in business, and able to keep investing in ProcessWire. I mention all this just because I don't want folks to be disappointed when there are weeks without any commits, etc., because that's unavoidable. For me this has always been a lifetime project, so ProcessWire isn't leaving or coming back, it's here to stay, as has always been the case.
- 7 replies
-
- 17
-
-
-
The module may not have received any updates in the last five years, but it works reliably. I use it as a must-have for updates. Thanks for sharing the link - I hadn't heard of it before.
-
I’m using the core FieldtypeComments in ProcessWire and everything works correctly on the frontend and in the database. Comments are saved properly and displayed without issues. However, in the admin I get a one-time SQL error after a new comment is submitted: SQLSTATE[HY000]: General error: 1525 Incorrect TIMESTAMP value: '1777649215' Observations: Difference between “error value” and stored value is consistently +3600 seconds No data corruption or functional issues occur Environment: PHP timezone and $config->timezone both set to Europe/Brussels The warning only appears once per comment submission and does not affect saving or rendering. Has anyone seen this behavior before with FieldtypeComments?
-
Start - Personal quick-access dashboard with visual link editor
maximus replied to maximus's topic in Modules/Plugins
Yes, I know it well — great Dashboard module! I've used it on almost every project to keep the admin from feeling bare. But as projects grew, I kept hitting the same wall: customizing Dashboard meant writing PHP for each install, and the widget lists got unwieldy. Start (and its companion module Collections) came out of that frustration — the goal was a fully visual, no-code editor where you just drag, drop, and pick icons without touching any config files. - Last week
-
Hi. I have set up a 301 redirect in the host webspace to redirect to a pw site on to my other host server. I simply have these 2 lines in .htaccess and nothing else. (There is no pw on this webspace) RewriteEngine On RewriteRule (.*) https://my-otherdomain.com/mysub [R=301,L] On this other server I have pw installed in a folder www/mysub This works in so far the home page is shown as expected but internal links give internal server error. I suspect because url slugs are referencing the wrong server. Do I need to add rules for this and any idea what rules to add ? Thanks for any help-
-
Mm picture tags could work but then that means creating portrait-oriented edits for every corresponding desktop slide image - and that's not always possible depending on what design will be shown, especially when I begin uploading the rest of my projects. If I'm querying mob vs desktop based on tagged images won't that impact caching regardless? Maybe I misunderstood. In the end I may end up doing extra edits but it's a bit of a pain. Maybe excluding the slideshow from Procache might be another idea...if possible
- 12 replies
-
- beginner portfolio
- masonry
-
(and 3 more)
Tagged with:
-
Hi Is anyone aware of a demo site for testing stuff? Ideally, containing hundreds of pages, pagination, multi-lingual setup, etc? I can set something up with PromptWire in an hour or two, but I was wondering if something like the Skyscrapers site exists? Cheers P
-
You need an M5 Mac with 128GB RAM, I think (see: https://www.youtube.com/watch?v=SmuX-Al7DUs&t=173s) I have a M4 Pro Mac Mini with 24GB RAM. I cannot run anything more demanding than Qwen3-VL-8B, as the model must be kept in memory (you don’t want to wait for a model to load, I load it before starting to work on something and unload it at shutdown). I do not use Qwen3-VL-8B for coding, instead I use GLM, Gemini subsriptions (and recently, for that given project only, the client pays for Claude subscription so that I can use it). I also like the image descriptions Qwen3-VL-8B generates. IMHO, strangely, it is better than any other LLM I’ve ever tried in this use case. My only issue with Qwen3-VL-8B was that in chat mode it spits out emojis by default all the time, which I hate, but the “NEVER use emojis!” system prompt in LM Studio solved that.
-
Determine if current request is url/path hook
adrian replied to Ivan Gretsky's topic in API & Templates
I actually came across the need for this as well. @ryan - could we perhaps have: $page->isUrlHook In my case I have url segments enabled on the homepage and some logic to process them, but that logic can't tell if it's a urlsegment or a path created by a URL hook. I ended up with this for now: $urlHookSegments = []; $pathHooks = $wire->hooks->pathHooks ?? (new \ReflectionProperty($wire->hooks, 'pathHooks'))->getValue($wire->hooks); foreach ((array) $pathHooks as $hook) { $match = $hook['match'] ?? ''; if (preg_match('#^/([^/{(]+)#', $match, $m)) { $urlHookSegments[$m[1]] = true; } } if ($input->urlSegment1 && !isset($urlHookSegments[$input->urlSegment1])) {- 1 reply
-
- 1
-
-
PromptWire is now at v1.9 and includes a few new features and fixes. The list below is AI-generated... Diagnostics can run against production The eight read tools (pw_health, the four pw_db_* ones, pw_logs, pw_last_error, pw_clear_cache) now accept site: local | remote | both. Previously site: remote was silently ignored and queried the local database instead. Bulk page push to remote or both pw_pages_push accepts targets: local | remote | both. Pages go in parent-first order so newly-created parents exist before their children try to attach. Pull pages back from production pw_page_pull source: remote fetches a page that was edited directly in the production admin and writes it into your local sync tree, so you can re-edit and push back without touching the live admin. Phantom diffs eliminated from pw_site_compare Page content is now hashed deterministically across environments. Identical content produces identical hashes regardless of timezone, page-array storage order, or whether a date field has an output format set. pw_modules_list Lists installed modules with version, file path, and install state. Pass site: both to compare local vs production install state in one call. pw_users_list Lists users with id, name, email, roles, and any member_* fields. Pass includeAll: true for every non-system field on the user template. pw_resolve Bulk name-to-id lookup for fields, templates, pages, roles, permissions, users, or modules. Translates names into the equivalent IDs on the target site without one round trip per name. pw_inspect_template Like pw_get_template but each field comes back as {name, type, label}. Designed for spotting fieldgroup differences before pushing changes. File inventories include .module files and symlinked module directories Previously the file sync silently skipped any modules developed in symlinked sibling repos. pw_modules_list bugfix (v1.9.1) The default call with no classes filter was returning null class names. Caught during release validation and patched the same day.
-
FieldtypeDimensions – product dimensions and weight field
adrian replied to maximus's topic in Modules/Plugins
There is nothing good about imperial 😜 -
Both hard refresh of browser and modules refresh did not help. I'll try a fresh install and see if that fixes it. I tested it on two different setups, but both were on version 4.27.7 before the update.
-
Path settings appear in the wrong fieldset tab
olafgleba replied to olafgleba's topic in API & Templates
@monollonom Bingo! 🙂 I was not aware of this config setting. Never used it on any templates. And that said, i wouldn't have investigate in this direction. Especially all source templates do not have this flag set. Maybe it is a good idea to check/set this while adding pages through the API, though. Many thanks, cheers Olaf -
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.
-
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 -
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}
-
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.