-
Posts
240 -
Joined
-
Last visited
-
Days Won
3
Posts posted by da²
-
-
Hello,
Is your template named "repeater"?
(I don't really understand the "page object class: RepeaterPage" here, I don't see this information on my side but am not on last PW version, I imagine this is the custom class associated with this template, but RepeaterPage is a PW class)
-
- 2
-
Nice, for a beginner it's a nice way to quickly discover PW mechanics. And probably an experimented user can also find some interesting features he doesn't already know (I already see some of them). 🙂
- 2
-
On my side I use a script to upload site, there's 2 parts:
- A Ant project that synchronizes some folders/files from the source code to a "target" directory, add a version number and transpile SCSS to CSS, TypeScript to JS...
- A bash script that runs the Ant project, and if no error, use rsync to synchronize only changed files with the production server. It uses a file listing exclusions so I'm sure the site/config.php will never be uploaded, like the sessions or the cache.
This script is a Linux one because Linux have those powerful integrated tools like rsync, but I'm running Windows and executing the script with Microsoft Linux WSL.
I have another bash script for staging server, it's the same as for production except it also pushes a clean version of my local ProcessWire database to the staging server. -
You can do it with a module or manually.
https://processwire.com/modules/process-wire-upgrade/
https://processwire.com/docs/start/install/upgrade/ -
3 hours ago, cb2004 said:
I was thinking maybe it could be a bit simpler
If you don't want to add a library, why not using a simple XHR? That's only a few line of JS and PHP.
On what part are you struggling exactly?- 1
-
Hello, updating PHP means you need to install a newer version of PHP, it's not directly related to ProcessWire in first instance. It depends of your OS (Windows, Linux), it also depends if this is a shared host or a dedicated server. In a shared host you usually have an administration interface provided by your hosting service to manage your server. In a dedicated server you generally do everything yourself.
About ProcessWire you have to check that the currently installed version is compatible with the PHP version you plan to install. Probably it won't be OK because you talk about years. If you plan to install PHP 8+ you'll also need to upgrade PW.
- 2
-
4 minutes ago, August said:
I meant how do you know about git, you seem to be well up to date
@August I use PhpStorm, in my commit window I just have to right click a file or a set of files, and create patch:
Of course you can do the same with vanilla git tools, by command line or probably with Git GUI.
-
22 minutes ago, August said:
I wonder how you know...
@August Because I'm using big tables that are filled dynamically and locked in admin and the result is a horizontal scrollbar on the whole page:
22 minutes ago, August said:Let's hope Ryan takes a moment to do this - until then I'll always have to modify this file, which I don't really want to do..
In that case I create a git patch file, so if I update PW to a version that doesn't fix the issue, I then apply the patch. I also document on my wiki what's the goal of each patch.
-
Hello @August
Maybe you can add your suggestion to my issue report.
-
If you look into InputfieldRepeater.module, in method ___processInput() :
if($numErrors || $numRequiredEmpty) { $this->error(sprintf($this->_('Errors in “%s” item %d'), $this->label, $key + 1)); if(!$page->hasStatus(Page::statusUnpublished)) $this->numRequiredEmpty += $numRequiredEmpty; $openIDs[$page->id] = $page->id; // force item with error to be open on next request } else if(isset($openIDs[$page->id])) { unset($openIDs[$page->id]); }
It opens items with an error, but our hook is executed after this, so this code doesn't know at this time that this item has an error (and "before" hook is not working at all).
You see that $openIDs is used to remember which items to open, and at bottom of this function it stores it in session:
if($_openIDs !== $openIDs) $this->wire()->session->setFor($this, 'openIDs', $openIDs);
So it looks like there's at least a way to achieve your goal by directly updating this session variable:
wire()->addHookAfter("Inputfield(name=championshipRoundRepeater)::processInput", function (HookEvent $event) { /** @var InputfieldRepeater $inputfieldRepeater */ $inputfieldRepeater = $event->object; $openIDs = wire()->session->getFor($inputfieldRepeater, 'openIDs') ?? []; /** @var InputfieldWrapper $wrapper */ foreach ($inputfieldRepeater->getWrappers() as $repeaterItemId => $wrapper) { /** @var Inputfield $itemField */ $itemField = $wrapper->getByName("title_repeater$repeaterItemId"); $itemField->error('this is an error'); $openIDs[$repeaterItemId] = $repeaterItemId; } wire()->session->setFor($inputfieldRepeater, 'openIDs', $openIDs); });
I don't like this solution because it is strongly dependent of a the ___processInput() private implementation. Maybe there's a cleaner way to work with this, I don't know... If no, maybe it would be a good idea to add a hookable method ___checkForItemErrors(InputfieldWrapper $repeaterItem):void, called from ___processInput()? @ryan
-
I don't how to do this, but by exploring HTML source of the repeater items in admin page (browser dev tools), looking InputfieldWrapper API and InputfieldRepeater API, and var_dumping things in a hook, I found a way.
self::addHookAfter("Inputfield(name=championshipRoundRepeater)::processInput", function (HookEvent $event) { /** @var InputfieldRepeater $inputfieldRepeater */ $inputfieldRepeater = $event->object; /** @var InputfieldWrapper $wrapper */ foreach ($inputfieldRepeater->getWrappers() as $repeaterItemId => $wrapper) { /** @var Inputfield $itemField */ $itemField = $wrapper->getByName("title_repeater$repeaterItemId"); $itemField->error('this is an error'); } });
- 1
-
4 minutes ago, MarkE said:
I don’t know what the Cargo pagebuilder is like, but the website isn’t great
Yes the site is terrible and full of bugs, I even had page freezes, not sure they really want their CMS to be used. 😄
- 1
-
I reported this behavior to the dev who created the Twig module for PW and the given solution is to use get().
I hate some of the Twig behaviors and consider switching to another solution in the future.
Another thing to know is that, when you call page.noIndex, if not found Twig will also call method page.getNoIndex(), property page.getNoIndex and a bunch of other calls like that...
- 1
-
There's also bugs in Twig, sometimes it will say the variable doesn't exist when it exists but has no value. The workaround is to use get(): page.get('noindex');
- 1
-
Looks like it's a feature since a few years.
- 1
-
@fruid Use custom page classes.
In site/classes:
<?php namespace ProcessWire; class UserPage extends User { public function getMessages(): PageArray { return wire()->pages->find('template=message, receiver=' . $this->id); } }
Be sure to enable it in site/config.php:
$config->usePageClasses = true;
- 4
-
Just to add another solution to the original question, this is how I hide not editable pages in admin tree:
$this->addHookAfter('Page::listable', isPageListable(...)); function isPageListable(HookEvent $event): void { if ($event->page->path == "/") $event->return = true; else $event->return = wire()->user->hasPermission("page-edit", $event->page); }
- 1
-
Why using JS and not a saveReady hook?
And maybe a hook on ProcessPageEdit::processInput(form:InputFieldWrapper) to check that fields content is valid and mark them as "error" in the form. You can also manage errors in saveReady by displaying an error Notice to user.
- 1
-
Maybe you have "use" statements replacing the missing namespace? Or maybe there's something different in composer.json configuration?
- 1
-
And maybe Ryan is transpiling this CSS from SCSS, this is how I use UIKit.
-
I was just joking about how you wrote the "Hit CMD+Enter" like if the answer is sure, don't take my message too seriously. 🙂
I wouldn't event trust the answer about rw-r--r--, because very often ChatGPT is absurdly wrong and answers the exact opposite of the truth. Then I correct it and next answer is good. So if I need to check the AI answers on the web, it's faster not to ask the AI and directly go on the web/documentation. Most of the time I use AI when I can't find answer with traditional ways.
14 minutes ago, cwsoft said:I do like to refine some of my code in little steps or to prompt the AI for specific questions on my own code, like I did in the past as part of a development team with my human colleagues. Thats where AI is really not so bad in my opinion, at least if you are working alone on projects and there are no human colleagues you could ask.
This part is more interesting IMO, discussing about architecture of your own code, things you can refactor, design patterns you can use... It can be a way to improve faster as a developer. I'm also working alone, and have worked in the past in a team that used to do regular code reviews.
- 3
-
3 hours ago, bernhard said:
Hit CMD+Enter and done
You have a lot of confidence in AI. 😄 I would replace with: check that the AI gave the correct command (using web or manual), then press Enter. ^^
-
Hello,
maybe a missing "namespace Processwire;" ?
Cannot bootstrap index.php & run via PHP CLI?
in API & Templates
Posted
@hellomoto It's a common error. You are outputting data before the headers, but headers must be the first thing to output.
Headers are sent by ProcessWire, but you echo something before to include PW:
Also why do you use this code and not a simple include at start of file?