Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 01/25/2017 in all areas

  1. I just updated the Captain Hook cheatseheet to latest version 3.x now there's a master and dev version. Thanks to @owzim for providing a cli script to parse the repos automaticly and generate a array to use. It helps a lot to update. https://somatonic.github.io/Captain-Hook/index.html
    7 points
  2. New Captain Hook panel just added! Features: The hooks are parsed directly from the files in your PW installation, so they will always be up to date. They are cached, but will be updated whenever you upgrade your PW version. If you have your Editor Protocol Handler properly configured for Tracy, clicking on the Line Number will open to the method in your code editor. This panel uses @owzim's Captain Hook generator: https://github.com/owzim/PWCaptainHookCLI Please let me know if you have any problems or suggestions.
    6 points
  3. I tried this module today to output a video preview from a multilanguage field. Worked like a charm. See the screenshot. I created two fields, one for the default language (English) and one for Portuguese. Here's the code for both, if someone's interested: English field: return '<iframe src="https://www.youtube.com/embed/'.$page->youtube_id.'/?showinfo=0&amp;iv_load_policy=3&amp;controls=1" frameborder="0" allowfullscreen width="100%"></iframe>'; Portuguese field: //1021 is the 'portuguese' language page id $youtube_id = $page->youtube_id->getLanguageValue(1021); return '<iframe src="https://www.youtube.com/embed/'.$youtube_id.'/?showinfo=0&amp;iv_load_policy=3&amp;controls=1" frameborder="0" allowfullscreen width="100%"></iframe>'; Thanks @kongondo for this great module!
    4 points
  4. Not meaning to be too critical here, but it would be really helpful if you could start providing a little more info. Just telling us it didn't work makes it a lot more difficult to help. It would be great if you could do a little debugging first. Do you have debug mode turned on? What about TracyDebugger - do you have that installed and the debug bar turned on? Those will both help you get more info on why something isn't working. I seem to recall in another one of your recent posts you had an issue with a multi vs single page field. Remember that you can't get the title from a multi page field like that - you need to specify which one of the selected pages. It might be as simple as $p->podcast_shows->first()->title but without more info, it's hard for us to know.
    4 points
  5. That's a relative thing - we could all say that relative to someone like Linus Torvalds. The key thing is that you are trying Can you confirm that podcast_shows is in fact a Page field? Is it set to multiple or single? Did you try my suggestion of ->first()->title?
    3 points
  6. Hello everyone, I've been fiddling around a lot lately with docker containers for my local development on a linux machine. Tried many different options, also readily available processwire images and tutorials from the forum. But never got it right. Mainly because of permission issues with docker volumes. That is a tricky part on linux machines whereas on OSX it doesn't seem to be an issue. Then I discovered http://www.wordpressdocker.com/. And the setup with nginx as a proxy that routes requests to separate containers with the actual site install appealed to me. The whole thing sits on top of alpine linux containers which are really lightweight. So I decided to give it a try. And, first time since experimenting with docker, I got a running PW install. Rewriting was not working until I adjusted the nginx config. Now I have a fairly complex PW site running in a container. Everything is working, image upload/editing etc. So I'm really exited, especially since the dev site is now blazing fast compared to my old vagrant virtualbox vm setup. Honestly, I don't really understand everything that is happening behind the scene. But I managed to adjust the original files and build a new image that works with PW and doesn't have all the WP stuff. The nginx config I took from https://github.com/elasticweb/nginx-configs/blob/master/configs/processwire-2.conf Not sure if it covers everything for PW3 as well. I would very much appreciate if someone who is more in the know than me could take a look. All files for building the docker image are here https://github.com/gebeer/alpine-php-processwire A working image here: https://hub.docker.com/r/gebeer/alpine-php-processwire/ Documentation is kind of lacking. I took over quite a lot from the original project. But following the github README and the original documentation should get people started who have a little experience with docker already. If someone needs a more in depth step by step tutorial for setting things up, let me know and I'll put something together.
    2 points
  7. New Captain Hook version just posted! Changes: I have rewritten the file parser so that it uses token_get_all, rather than a regex. This makes it much faster and it also makes it easier to exclude functions that are commented out. Please let me know if you notice any files/hookable methods that aren't listed. Added a new column which has the className::hookName formatted and ready to copy/paste. Hooks for site modules will be automatically added when a new module is installed. Cached version is now stored in the DB cache table, rather than on the filesystem.
    2 points
  8. Thank you for introducing me to this - I had my RuntimeMarkup table up and running in no time!
    2 points
  9. Imo many panels could be enhanced with a filter, not only CaptainHook. But as I wrote I know it's complicated and the filter should work differently in each panels. Unless I'm mistaken some panels even load data with Ajax, making things even worse. If I knew a cross-panel solution I would have created a PR I think ctrl+F will do now
    2 points
  10. No errors here, thanks! I really think there could be a search/filter box in the panels. I know it's hard because panel layouts are different but it could greatly improve productivity (e.g the new CaptainHook panel is about 4 screens high here).
    2 points
  11. You can (I believe should in most cases) store the child pages for a PageTable in an external branch of the page tree - perhaps: Admin > PageTableBlocks You should also take a look at the RepeaterMatrix pro field (https://processwire.com/api/modules/profields/repeater-matrix/). If you decide to go with the PageTable field, also take a look at the PageTableExtended (http://modules.processwire.com/modules/fieldtype-page-table-extended/)
    2 points
  12. Blackfire is nice, but ProcessWire is not as linear as this Screenshot does look like. ProcessWire's graph is more circular as most method calls go through Wire::__call() to be hookable.
    2 points
  13. There's no need for an additional $pages->get() here. $pages->find() will already retrieve those pages. $items = $pages->find("some=selector"); foreach($items as $item) { // $item === $pages->get($item->id); echo $item->title; }
    2 points
  14. This rules - so useful! Thank you @adrian, thank you @owzim!
    2 points
  15. Here is an example of grouping news items under date headings according to a "post_date" datetime field. The headings are the dates (formatted as per the "Date Output Format" specified in the datetime field settings), unless the date equates to "Today" or "Yesterday", in which case those strings are used. You should be able to adapt this to your needs. $news_items = $pages->find("template=news_item, sort=-post_date"); $previous_item_date = ''; foreach($news_items as $news_item) { if($news_item->post_date !== $previous_item_date) { $timestamp = $news_item->getUnformatted('post_date'); if($timestamp >= strtotime('today')) { $date = 'Today'; } elseif($timestamp >= strtotime('yesterday')) { $date = 'Yesterday'; } else { $date = $news_item->post_date; } echo "<h3>$date</h3>"; // output the date heading } echo "<p>$news_item->title</p>"; // output whatever fields of the item $previous_item_date = $news_item->post_date; }
    2 points
  16. In earlier versions of PW, all repeater items in a page would be loaded when opening Page Edit - this could cause problems if there were a lot of repeater items. But in recent versions repeater items may be ajax-loaded, meaning repeaters can now scale up much better than previously. So there's no reason to avoid repeaters. Also see Repeater Matrix, which is more similar to PageTable in that it allows for multiple matrix types (sort of equivalent to templates). You could use RuntimeMarkup in conjunction with a Page Reference field. You would configure a RuntimeMarkup field to get and format the fields from band pages currently selected in the Page Reference field. Note that after changing the Page Reference field you would need to save the page in order to see the RuntimeMarkup field update.
    2 points
  17. Played a bit more with this. The following works for me. I am not sure if it is foolproof and/or if there are better approaches. Please note: From what I can tell, when saving a page, inputs (fields) will be sent in the order they appear in a template. date1 refers to the first date and date2 to the last date. We need to temporarily store the value of date1 in order to later compare it to date2. I stored the value in a session. You could do it differently, e.g. cache it. The code doesn't prevent a save of the 2 date fields. You can do that if you wish. This code is necessarily verbose in places; just to make things clear. public function init() { $this->pages->addHookAfter("InputfieldDatetime::processInput", $this, "hookAfter"); } public function hookAfter(HookEvent $event) { $field = $event->object; if($field->name == 'date1' || $field->name == 'date2') { // @note: from what I can tell, inputs are sent in the order of the fields in the page // ...so, date1 will be hooked into before date2 $date1 = '';// first date $date2 = '';// last date $session = $this->wire('session'); // save date1 to session; we'll retrieve it to compare against date2 if($field->name == 'date1') { $date1 = $field->value; $session->set('date1', $date1); } elseif($field->name == 'date2') { $date2 = $field->value; $date1 = $session->get('date1'); // compare the first and last dates if($date1 >= $date2) $field->error("Last date must be greater than the first date"); //else $this->message("Those dates are fine matey!");// @note: for testing only // delete the temporary session date1 $session->remove('date1'); } } }
    2 points
  18. I posted something like this a few years ago, but that's obviously not up to date with current versions of ProcessWire. Would be interesting to create an updated version and compare these side by side, just to see how far we've come since then
    2 points
  19. index.php ProcessWire Bootstrap Module Init (Hooks to ProcessWire::init) init.php ProcessWire Core ready Hooks to ProcessWire::ready ready.php Template Rendering prependedTemplateFiles template.php appendedTemplateFiles Hooks to ProcessWire::finished finished.php Shutdown This should be almost complete, but I don't guarantee about anything
    2 points
  20. hi guys, i'm in a hurry so i try it short i wanted to make it visible what happens behind the scenes when you do different things in processwire backend, especially WHEN all the hookable methods are called (render > saveReady > save or the like) i tried a simple wire('log')->save('hookrecorder', __METHOD__); inside the pages::saveReady() method and that worked! next step: i tried to add this line to all hookable functions here: <?php $rustart = getrusage(); include('index.php'); wireCopy('wire_original', 'wire_tmp'); $dir_iterator = new RecursiveDirectoryIterator("wire_tmp"); $iterator = new RecursiveIteratorIterator($dir_iterator, RecursiveIteratorIterator::SELF_FIRST); foreach ($iterator as $file) { if ($file->isFile() AND $file->getExtension() === "php") { $content = file_get_contents($file); $pattern = "/(\w+) function ___(\w+(?<!log))\((.*)\) *{/"; $replace = "$1 function ___$2($3) {\n wire('log')->save('hookrecorder', __METHOD__);"; /* // for debugging preg_match_all($pattern, $content, $matches); echo $file . "<br>"; if(is_array($matches[0]) AND count($matches[0]) > 0) { foreach($matches[0] as $match) { echo $match . '<br>'; } } echo "<br><br>";*/ $content = preg_replace($pattern, $replace, $content); file_put_contents($file, $content); } } //wireRmdir('wire_tmp', true); // Script end function rutime($ru, $rus, $index) { return ($ru["ru_$index.tv_sec"]*1000 + intval($ru["ru_$index.tv_usec"]/1000)) - ($rus["ru_$index.tv_sec"]*1000 + intval($rus["ru_$index.tv_usec"]/1000)); } $ru = getrusage(); echo "This process used " . rutime($ru, $rustart, "utime") . " ms for its computations\n"; echo "It spent " . rutime($ru, $rustart, "stime") . " ms in system calls\n"; ?> it creates a directory wire_tmp with all the inserted log-statements. i replaced wire folder with wire_tmp folder (renamed it) and this does not work unfortunately (white screen, don't know if it would be different with debuggin true). i also tried to replace the wire/core/Wire.php file with the original one and to not log calls of "wire('log')" as i thought this may leed to errors (it's excluded in the regex) the idea is to save a page and then look all the hookable method calls up under setup > logs > hookrecorder and have a list like just now | pagexy | pages::save() just now | pagexy | pages::saveReady() just now | pagexy | pages::render() looking forward to hearing your opinions. should i exclude private methods or the like? or should i exclude whole files? or can i achieve what i want much simpler (eg server logging tools)?
    2 points
  21. Last update: June 2024 Current stable version: 1.5.4 Dev version: github dev-branch You can find the module on Github and in the modules directory : https://modules.processwire.com/modules/duplicator/ https://github.com/flydev-fr/Duplicator/archive/master.zip Screenshots / Features Dir and files exclusion CRON job Advanced settings Local and Cloud storage duplicator.mp4
    1 point
  22. Hello, in one of my current projects, we have a test and production stage with their own ProcessWire installations, and we regularly want to migrate template/field configuration to the next stage without migrating content as well. ProcessWire supports this via the import/export functionality in the admin GUI. However we (and some others) would like to do this as part of an automated process. There seem to have been some discussion on this topic and two existing modules that get pretty near our requirements: https://github.com/mindplay-dk/SystemMigrations/blob/master/SystemMigrations.module https://github.com/LostKobrakai/Migrations However, they try to solve more then we need and for mindplay-dk's module, development seems to have discontinued. At that point I decided to build a more simple module with reduced scope that basically just makes ProcessWire's import/export automation-ready. Thanks in advance for trying this out and any feedback! About this Module CAUTION: This module is incompatible with repeater fields and ProFields. The module enables you to transfer template and field configuration from one processwire installation to another in an automated way. Changes to templates or fields are exported to the file system immediately (so they can be added to source control together with changes in the template files) The import script is designed to run from the command line (so it can be invoked from your build/deployment tool). On invocation in import mode, a DB backup is created template/field changes from the persist directory are imported into the DB In restore mode, the import script can restore any of the DB backups previously saved How to Use Make sure the module is installed in the source and destination ProcessWire environments. After installation of the module, you should check if the module's default persistDirectory configuration setting fits your requirements. The module will automatically export all fields, fieldgroups, and templates to JSON files in the directory specified by that setting. Note that the same setting is used by the import script as well, so if you change it, make sure you change it in all affected ProcessWire environments. The JSON files can be transferred to the destination ProcessWire environment. Running the import script from the command line will import template and field data in the destination ProcessWire environment. Manual Installation Caution: Beta software - do not use in a production environment without prior testing and regular back-ups. Caution: This module is incompatible with repeater fields and ProFields. In case automatic installation does not work, get the code at https://github.com/jaromic/pw-autoexport-tf/ and follow the instructions in README.md for manual installation. Manual Uninstall Delete the following files and directories from your module directory: AutoExportTemplatesAndFields/ AutoExportTemplatesAndFields.module Download Install from the module directory, clone the repository via GitHub, or download ZIP.
    1 point
  23. If you haven't seen it already, check out the new Captain Hook panel in Tracy Debugger. If you have the Editor Protocol Handler configured you can jump straight to the hookable method in your code editor. Because the line links are generated from whatever PW version you are running it will always be correct. Pretty cool. Plus it includes the hookable methods in module classes!
    1 point
  24. @Sérgio. Excellent! Thanks for sharing!
    1 point
  25. With the new .csv option for exporting translations of multiple files combined it wasn't to bad to get something working: https://github.com/processwire/processwire/pull/52
    1 point
  26. All fixed, thanks. I'm really liking how easy it is to jump straight to the method in my code editor via the clickable line number. A real timesaver.
    1 point
  27. Thanks @tpr - that helps. Could you please try the latest version. Hopefully I have fixed that and the problem @Robin S was having. I have also added /site/modules/ so it is also scanned for hookable methods. This means the list of files/hooks will now also include all your installed 3rd party modules.
    1 point
  28. A more verbose error message: ErrorException: is_file(): open_basedir restriction in effect. File(classes/CaptainHookSearch.php) is not within the allowed path(s): (/var/www/vhosts/domain.com/:/tmp/) in /var/www/vhosts/domain.com/sub.domain.com/wire/core/FileCompiler.php:312 Stack trace: #0 [internal function]: Tracy\Bar->Tracy\{closure}(2, 'is_file(): open...', '/var/www/vhosts...', 312, Array) #1 /var/www/vhosts/domain.com/sub.domain.com/wire/core/FileCompiler.php(312): is_file('classes/Captain...') So it's the FileCompiler I guess. For the open_basedir I have the default setting in Plesk: {WEBSPACEROOT}{/}{:}{TMP}{/}
    1 point
  29. What I would like to know, and haven't found if it exists, is a mapping for the order of files invoked by PW. I see quite a few references to init.php and ready.php, etc. files, but have no idea where they are executed in the precedence order. Is there a 'map' that shows the files in order of execution, and their corresponding definition (use this file when...) ? similar to: index.php | blah...blah | init | ready | blah...blah |
    1 point
  30. I can't see why it's there either. I have removed here and it's still working fine (although it was working fine for me with it also). Does it fix the problem at your end? Do you have anymore details on this error. There isn't actually an is_file() call in that CaptainHookSearch.php file. Maybe if you sent me your open_basedir restrictions it would help me to reproduce.
    1 point
  31. I recently discovered an app that maybe help you on that, it's called Blackfire https://blackfire.io See a screenshot of an example from its website. Install on your server (or local) and give it a try and maybe compare with @teppo's diagram above. Edit: this is a Symfony app, and not mine, just to clarify.
    1 point
  32. I think that's because when you use your Hanna tag in CKEditor your audio attribute is (or should be) valid link markup, e.g. <a href="/some/url/">LINK</a> But in the Hanna Code test tab the attribute is not a valid link but simply the string "LINK" which cannot be parsed by SimpleXML. So probably nothing to worry about, but if the error message is a concern you can do some simple check to see if the attribute looks like it will be a link. For example, at the top of your Hanna code: if(substr($audio, 0, 2) !== '<a') return;
    1 point
  33. Problem seems to be here: $paths = array($root); Might be misunderstanding something but don't think the root directory is wanted in that array.
    1 point
  34. I'm seeing an error in the new Captain Hook panel on Windows - I think it's the path slashes issue. ErrorException: file_get_contents(D:/Websites/__www/1testing/wire/): failed to open stream: No such file or directory in D:\Websites\__www\1testing\site\assets\cache\FileCompiler\site\modules\TracyDebugger\CaptainHook\classes\CaptainHookSearch.php:44 Dumping $filenamesArray in CaptainHookSearch::getHooks() shows paths like... "D:/Websites/__www/1testing/wire/" "D:/Websites/__www/1testing/wire\config.php" "D:/Websites/__www/1testing/wire\core\admin.php" "D:/Websites/__www/1testing/wire\core\boot.php" ... Edit: actually, it might be the first item in the array that's the problem: "D:/Websites/__www/1testing/wire/". Seems like this shouldn't be in there seeing as it's a directory and and not a .php or .module file.
    1 point
  35. Depending on your needs, you could set margin:0 for the p tag in the required div, which would make it look like a normal line break. But again, this may not be appropriate, but it is another potential option. You might also try CKEditor settings for that particular field to not add p tags in the first place: http://stackoverflow.com/questions/3339710/how-to-configure-ckeditor-to-not-wrap-content-in-p-block
    1 point
  36. With the latest dev version, you can also now do: $urls->httpRoot
    1 point
  37. $config->urls->httpRoot https://processwire.com/blog/posts/processwire-2.6.18-updates-pagination-and-seo/#new-http-prefix-available-for-all-config-gt-urls-properties
    1 point
  38. Hey @blynx, Thanks for your reply. I've read the page you linked and I do have a question about your example. I think it is not but the following: Please tell me if I am wrong, can't test it now unfortunately. Regards, ~Harmen
    1 point
  39. Try Hooking into the inputfield instead like so. Note, example is from module context. See also notes below: public function init() { $this->pages->addHookAfter("InputfieldDatetime::processInput", $this, "hookAfter"); } public function hookAfter(HookEvent $event) { $field = $event->object; if($field->name == 'recurringdateend'){// @note: just a quick example; you might want to hook into 'date_end' as well $page = $this->wire('modules')->ProcessPageEdit->getPage(); #$this->message($field->name);// @note: testing only #$this->message($page->id);// @note: testing only /* // @note: testing only + FOR INFO $oldDate = $page->get($field->name);// existing DB value $newDate = $field->value;// incoming/NEW data $this->message("old date is: $oldDate");// returns timestamp $this->message("new date is: $newDate");// returns timestamp */ // @note: quick example, not useful to you but a good to know 'how-to' // @note: what you really want I suppose is to compare incoming values (from input) // @see above for that ($oldDate and $newDate) $firstdate = $page->get("date_end");//date field 1 $lastdate = $page->get("recurringdateend");// date field 2 if($firstdate >= $lastdate){ //check if the date of field 1 is higher than the value of field 2 // error here; @note $lastdate is not a field! // error example: $field->error('Some Error'); } } } @Note that in my example we are comparing existing DB values (not very useful). In your case, you want to compare incoming values, right? See the $oldDate and $newDate example. However, you would need to Hook into both 'date_end' and 'recurringdateend' in that case (i.e. run your Hook code if either is the field name). Edit2: See complete answer in next post.
    1 point
  40. Bumped to 1.5.48: Now using League\Csv for CSV importing. Note that delimeters are no longer automatically detected, and you need to specify your delimeter and enclosure characters separately. Blank lines are now also ignored. @owzim - This might fix your issue as the importer now delegates the start and end times to the same method used for the main jumplink editor. If that works for you, then this will as well. If it doesn't fix the problem, then I'll need to investigate further. On my side, however, all looks good.
    1 point
  41. Currently the module is functional, I use it on every site and it work quite well, no error since November. At this moment only ProcessWire >3.0.0 is supported but I was planning to release it being compatible with 2.7. What you can do with the module (working features) : You can modify package's settings : name of final filename, ignore some folders, set a maximum number of packages, remove older packages and trigger the backup function with LazyCron or PwCron. Save the package in a local folder Upload package to Dropbox Upload package to GoogleDrive Remove packages from those cloud services (depending on the configuration set) *A package is a ZIP file bundled with a database dump and a full website directory dump (site, wire, etc) I think I will finish the first public version and we'll see what happens as I tested the @arjen's fork of @rot's module and didn't managed to get it working as expected. I also find my module more "simple" to use; I mean you set options, check some checkbox, set a cronjob, click submit and let it run. Also I saw some good features like emailing the logs on failure that could be added easily. I'll look at the module a little closer this afternoon. Thanks for your input guys.
    1 point
  42. There was a typo in the hook code I posted: should have been "parents" and not "parent". This should work... $nav = $modules->get('MarkupSimpleNavigation'); $nav->addHookAfter('getItemString', function(HookEvent $event) { $item = $event->arguments('page'); // if the item has more than one parent then it is a subpage if($item->parents->count() > 1) { $event->return = "<a href='{$item->parent->url}#{$item->name}'>$item->title</a>"; } }); // define your options array if needed and render your menu If not please post your MarkupSimpleNavigation code.
    1 point
  43. Just came here to say that this module works brilliantly! I have made an "email sender field" that uses the page's data to manage surveys for a certain product and right now I'm doing a "defaults selection for repeater field" for a repeatear field with page fields in it that will describe features of a product. It's really nice to just hack your way so fast with this! I use it with wireRenderFile() which rules because it lets me handle the markup nicely in a separate file in my preferred text editor. EDIT: Added "mail settings" screenshot. Jus realized my description text is all messed up engrish
    1 point
  44. Hello, I fixed my problem. The solution was easier than its research Just needed to truncate cache table in MySQL.
    1 point
  45. Announcing that I've tested and can confirm that RuntimeMarkup is compatible with ProcessWire 2.8.x and ProcessWire 3.x
    1 point
  46. I don't share the warm fuzzy feelings I get when I use people's modules nearly often enough, so I just left a comment on the module directory page. The short version is that it's saving me from having to create custom modules for a lot of places where I'd want to output some custom, processed output when editing a page and it is streamlining some of the steps I need to perform when approving entries in the dev directory, so thanks for this!
    1 point
  47. If the parent page is hidden you'd have to include "include=hidden" in the selector when doing a find(), but not if you get() the page explicitly. Also wanted to note that doing $pages->get("title=previous caption winners")->children; isn't a very reliable method to find a page by it's title, since the title isn't unique. In most cases it makes more sense to use id or page name, page path. $pages->get(1005)->children; Or maybe $pages->get("/some/path/")->children; To find if a parent has children there's also a method in PW numChildren(). if($pages->get(1004)->numChildren) { // has children } In PW 2.3 there's a new version of numChildren() to make it access aware if you pass true as the argmument if($pages->get(1004)->numChildren(true)) { // has children that are really visible to the user }
    1 point
  48. Based on netcarvers first script I tried this on my products (550) and grouping them by price field. $pa = $pages->find("template=product,sort=sort"); $groups = array(); foreach($pa as $p) $groups["$p->sc_price"][] = $p->id; echo "<ul>"; foreach($groups as $key => $gr){ $count = count($gr); echo "<li>$key ($count)"; if($count){ echo "<ul>"; foreach($gr as $key => $pid){ $r = $pages->get($pid); echo "<li><a href='$r->url'>$r->title</a></li>"; } echo "</ul>"; } echo "</li>"; } echo "</ul>"; echo "<br/>memory:".memory_get_peak_usage()/1024/1024; This doesn't add much memory in my case, 1MB more and maybe takes +~1sec but haven't looked at execution times. So 2000 pages will maybe be around +2-3MB and 2-3 seconds. I can run this script along with a ton other heavy scripts easily with 16M php memory limit. Further if you use PW's markup cache to only generate the list once every hour you would save some resources. Try it and see what you get. If memory would be a problem you might still consider constructing 1 or 2 sql queries and see if it performs better. This surely would involve some complex sql joins over fields, fieldgroup and page tables and make sure pages are published etc.
    1 point
×
×
  • Create New...