-
Posts
92 -
Joined
-
Last visited
-
Days Won
2
millipedia last won the day on March 14
millipedia had the most liked content!
Contact Methods
-
Website URL
https://millipedia.com
Recent Profile Visitors
2,927 profile views
millipedia's Achievements
Sr. Member (5/6)
241
Reputation
-
We've been using Cloudways for a while now and they've been good for us. Not as cheap as Hetzner but they include some useful hosting management ( git deployment, staging environments, Let's Encrypt etc). And just being to duplicate sites at the click of a button is frankly great. Shout out to Krystal as well if you want a more traditional cPanel setup with email. I'm sure someone in this forum put me on to them - they've worked well for us as well.
-
[Solved] How you work with pw on external server
millipedia replied to olivetree's topic in Getting Started
I'm with Jan here. I have a local copy of the files I'm working on (templates, modules, assets etc) and then ftp them from VSCode using the SFTP extension. I don't have the files upload automatically when they're saved but my muscle memory for uploading a file on save is good. I've tried using Remote Host in VSCode and occasionally use continuous integration with GitHub but for most of my projects that's overkill. -
Comments module with Cloudflare Turnstile
millipedia replied to millipedia's topic in API & Templates
Just reminding myself of what else we did, and there's also some form obfuscation going on. I'm rot13ing the comments form markup (with the injected field above) and then when the user clicks the comment button I'm unobfuscating it and getting Cloudflare to fire it's challenge. I just thought that not having the form visible without some user inaction might fool a couple of bots. Of course now my secret is out .... -
Comments module with Cloudflare Turnstile
millipedia replied to millipedia's topic in API & Templates
Well it's been trundling along for the last year on the British Record Shop Archive using the above method. We've had a couple of thousand comments ... and I honestly don't remember having a single bit of spam (famous last words there) so I'd say it's been pretty successful. I'm planning to redo the comments forms on the BRSA to allow users to submit images, so I'm probably going to end up with a custom form rather than the above, but it's worked so far. -
KDE Plama user here and very happy with it (currently KDE Neon but sometimes Kubuntu). I do also own a Mac becasue we sometimes build apps which needs me to use XCode, and I have a laptop that I can dual boot into Windows but I can't even remember the last time I had to do that and most of my day is spent in Linux. I'd agree that the main drawback is the gap in graphics software. I use Affinity Designer on the Mac which is great, but whilst it nearly runs in Wine it's not quite there yet. Apart from that my development stack on Maxc and Linux is pretty much identical so it's dead easy to swap between them. The designers I work with nearly all use Figma these days so it's been a while since I was given a PSD anyway (which Affinity Desginer deals with very well). You should definitely give Plasma a go if you want to be able to tweak your desktop .... although I warn you will spend a lot of time tweaking your desktop ....
-
Import passwords into ProcessWire from non-PW site
millipedia replied to DrQuincy's topic in General Support
I had to do this just the other week. We had an old CMSMS site that we'd moved to PW. We had a db table with the old user names and passwords in which we stuck on the new site, and then just created our own login page which first checked to see if we had the user in PW already. If the user isn't already in PW then check the password against the old table; If it matches then use that information to add a new user to PW. The users don't really notice that anything has changed. Here's the code I used for that - you'll have to adapt to your circumstances of course but it worked well for our move. if ($input->post('ml_name')) { // when processing form (POST request), check to see if token is present // (we have a CSRF field on our login form) if ($session->CSRF->hasValidToken()) { // form submission is valid // okay to process } else { // form submission is NOT valid throw new WireException('CSRF check failed!'); } $ml_name = $sanitizer->name($input->post('ml_name')); $ml_pass = $input->post('ml_pass'); // dont allow the guest username if ($ml_name === 'guest') { throw new WireException('Invalid username'); }; // do we have this user in PW already? $u_exists = $users->get("$ml_name"); if ($u_exists->id) { // user exists // lets try and log them in try { if ($session->login($ml_name, $ml_pass)) { $session->redirect('/'); } else { $ml_feedback = 'Unknown details.'; } } catch (WireException $e) { // show some error messages: // $e->getMessage(); } } else { // ok - well do we have this user in the old CMS table? $query = $this->database->prepare("SELECT * FROM `cms_module_feusers_users` WHERE username = :login_name LIMIT 1;"); try { $query->execute(['login_name' => $ml_name]); } catch (PDOException $e) { die ('Error querying table : ' . $e->getMessage()); } // we've got a user from the old table if($query && $row=$query->fetch()) { $ml_feedback='Is in old table'; $hash=$row['password']; // handily the old auth just uses password_verify if(password_verify($ml_pass, $hash)){ // Add this user to the PW users $new_user=$users->add($ml_name); if($new_user){ $new_user->pass=$ml_pass; $new_user->addRole('members'); $new_user->save(); $log->save("new_members_site", $ml_name . " added as user"); $u = $session->login($ml_name, $ml_pass); if($u) { $session->redirect('/'); } else { die("Error in logging in. Please contact admin."); } $ml_feedback='new user added to PW'; }else{ $ml_feedback='Unable to add new user. Please let admin know'; } }else{ $ml_feedback='No matching records found.'; } }else{ $ml_feedback='No record found.'; } } } and this is the login form that the we had on our new login page - this and the above was all in a single template. <form id="ml_login_form" class="ml_login_form" method="POST"> <?php echo $session->CSRF->renderInput(); ?> <label for="ml_name">Username</label> <input id="ml_name" name="ml_name" type="text" value="<?= $ml_name ?>" required> <label for="ml_pass">Password</label> <input id="ml_pass" name="ml_pass" type="password" value="<?= $ml_pass ?>" required> <div style="display: none;"> <label for="ml_pass_bear">Password</label> <input id="ml_pass_bear" name="ml_pass_bear" type="text" value=""> </div> <button type="submit" name="ml_submit" class="butt">Submit</button> <div class="ml_feedback"><?= $ml_feedback ?></div> </form> -
Depending on your requirements, the Stripe payment processor for FormBuilder might be worth investigating. You can set Paypal to be a payment option in Stripe so that users can pay using PayPal but you can keep all your transactions on the same plaform. Out of the box FormBuilder might not do everything you need (if you need a basket etc) but it is possible to hook into the module to update line items / prices etc. We recently built a basket system for a site that we'd wired directly into Stripe but then shifted over to hook into Formbuilder instead because it already did a lot of the heavy lifting in using the Stripe API.
-
Maintain separate configs for live/dev like a boss :)
millipedia replied to bernhard's topic in Tutorials
So, today I learned that you can use a config-dev.php file which takes precedence over the normal config.php file if it's present. ... unfortunately I discovered this by accidentally uploading a config-dev file to a live site. I'd got two config files for live and staging in my project folder and just renamed them when I wanted to update a setting - I'd coincidently named the file for the staging details as config-dev.php and accidently uploaded it to production. Luckily this just meant that the content from the staging site got displayed which wasn't too out of date so hopefully no one noticed.... Now I look into it, I can see that's it been around for ever and there's been lots of chat about it, but hey, I didn't know about it, so thought I'd stick it in this thread just in case anyone else was a daft as me. -
Obviously you should try and educate your client into the advantages of building in PW (and in the difficulties of designing a pixel perfect site that works across all browser and devices) but if they really insist on being able to fiddle then WebFlow is probably the kind of thing they want. Not a PW solution, but it does work well once you get the hang of it. We lost a client of 20 years to it last year ?
-
Increase font size in Processwire (backend)?
millipedia replied to cabrooney's topic in General Support
Bernhard's AdminRockStyle is probably the easiest way to go, but there's a blog post from Ryan which covers how to customise the admin theme using Less. We keep a slightly more accessible colour scheme in our skeleton project as a starting base for new sites for example, and it would be easy enough to add a larger font size in there. -
One thing that has improved the speed at which I can mark up a design from Figma is the VS Code extension. I can open a design in a VS Code tab, and then not only see the the properties for an element but also have them appear as auto-complete suggestions as I type. Given that mostly I'm just grabbing one or two properties for an element that's really useful. The same goes for assets; I can copy SVG elements directly to paste into my markup or export them straight into my project folder. If you use Figma and VS Code then it's definitely worth checking out.
-
Great - that's really useful. I didn't know about the 'always' condition in .htaccess (even though it's all over the place in the usual .htaccess file ....). I think a combination of that and catching my errors earlier should do me. Thanks for your help.
-
We're building a Capacitor app that grabs data from the OpenAI API via ProcessWire (it's a fun project - I'll write it up once it's done). For successful requests we're adding a CORS header: header('Access-Control-Allow-Origin: *'); header('Content-Type: application/json'); and that's all good. Occasionally though we'll get a timeout form OpenAI (or I've done something daft in the code) and PW will throw a 500 error. Because that response doesn't have the correct headers then I can't catch the error in the app. I've tired adding the header into wire()->addHookBefore('Page::errorPage', function($event) { but I'm not convinced that 500 errors even get there. Suggestions as to how I can a header gratefully received....
-
Just in case it might be useful to you, there's a $sanitizer->truncate() method which will trim a block of text to the nearest word / sentence etc. It's very handy for creating neat summaries.
-
Has anyone managed to update this module to use an updated API version? I've done my very best to persuade users that now is the time to ditch Twitter but I've still got a few clients holding out ....