Leaderboard
Popular Content
Showing content with the highest reputation on 11/21/2019 in all areas
-
6 points
-
Personally I stick to uikit only. Especially on free modules everybody who is still using one of the "old" themes is free to file a PR... But I've never had this request. Maybe nobody is using any of my modules ? But just in case someone was using one, I guess it might make more sense to put the effort into switching from the old themes to uikit than supporting old themes in new modules.6 points
-
Even though I appreciate the idea of PW themes I think they would be somewhat limitating, fighting with the power of PW, where having your personal markup gives you freedom and uniqueness to projects. Pure HTML themes, instead, (not being bound to strict fields/relations) might be more appealing to me. If your goal is to make some revenue with them be aware that the market if fully saturated ? My two cent here, of course ?5 points
-
Thanks for your answers, guys! I think I will also only support the UIKit theme. This will make the development a lot easier and I can concentrate on more important features!4 points
-
Another +1 from here. If a module I maintain works for something other than Uikit then that's brilliant – but if it doesn't, I won't lose any sleep over it. For quite a while I used to support the "legacy" theme, new default theme, and Reno theme, but that was a major headache. There will no doubt be sites running those older themes for quite a while, but my guess / gut feeling would be that a notable portion of those are older sites that probably aren't that actively developed anyway.4 points
-
I'd build a custom DB table that holds the id of the page and the id of the user that visited that page. page | user -----|----- 1 | 41 2 | 41 3 | 41 Get all pages that have been visited by the admin? SELECT page FROM visitedpages WHERE user = 41 Get all users that visited page 1? SELECT user FROM visitedpages WHERE page = 1 Executing custom SQL is as easy as that: Thousands of pages? No Problem ? Thousands of users? No Problem ? PS: If you only want an array of all page ids:3 points
-
Hi, I was thinking of creating Processwire Themes for sale using UIKIT with SASS. The themes would be coded into Processwire using fields and repeaters with a delayed output strategy with basic tutorials. I came back to Processwire a few times as I couldn't get to grips but really glad I made the effort as WP was just hell. I feel these would be good for newbies and starter points. Just wondered if anyone had any thoughts on this or would I be better off just creating UIKIT themes. Screenshot attached. Thanks2 points
-
EDIT: Just realized that this will set the icon of every field! I'll look into that... Add this to /site/ready.php if($page->template == 'admin') { $config->styles->add("/site/assets/fontawesome/css/all.css"); } Then you can use all FontAwesome icons in your backend. To set the icon of an Inputfield you need a little hack, because the InputfieldWrapper adds the FA4 prefix automatically. The fix is quite easy: $wrapper = $field->parent; $wrapper->setMarkup([ 'item_icon' => "<i class='fad fa-image'></i> ", ]); $field->icon = 1; // set icon to anything not null Voila, you can use Duotone icons for your fields: PS: There's also a module by @Macrura but that didn't work for my usecase. And adding 3 lines in site/ready.php to use an existing folder of FontAwesome is better than installing another module and copying files over... PS: My approach does of yourse NOT show icons in the GUI of fields and templates. It's a code- or file-based approach that works in hooks and process modules.2 points
-
Isn't that basically for whats the toggle of UIkit component is for? ? Understanding the basics is important. But if you have to build large websites is a solid foundation really handy, so you can focus more on the content than on writing basic components. ?2 points
-
@Tom. Interesting thread! I do not use any FrontendFramework if I don't have to, (only jQuery). I more and more try to understand the basics and don't want to learn frameworks. Additional to that, I can copy paste the most from @wbmnfktr post, because my setup is as follows: ? My boilerplate for new projects: Starting with one out of 3-4 personal PW-profiles, that are more or less without content, but with special configurations and modules my personal SCSS Skeleton jQuery and / or some personal JS-snippets Tools I use and need: git my own Preprocessor- and Minifier module in PW some code and scss snippets bound to the $config->debug state for developing Tools that may be added on demand: Lazysizes Slick Slider script MixItUp script Thats my tools that give me freedom from things like grunt, gulp, whatever: The first one is my preprocessor and minifier pw module that detects every single file change of js, css, less and scss files (and the @import dependencies) automatic on page load. It can process less & scss and can minify css, js, html. The second one are three little buttons in the top left on frontend pages that can toggle a breakpoint indicator and a hierarchical background color system to identify html elements dimensions and positionings.2 points
-
Thanks for reporting back! I just published a new version on GitHub which has some great performance improvements and a lot of other new features! The orders list is now loaded in 1 - 1.5 seconds (instead of 4 seconds). The dashboard is also affected by these changes and should load much faster now!2 points
-
FYI: I've been running two sites with that modification to the database without any errors or issues.2 points
-
The page ID is stored in an unsigned auto-incremented int column (you can find this in ProcessWire's install.sql file) in the pages table in MySQL, so the highest the IDs can go is 4294967295 - that should be plenty ? You can manually reset an auto-increment column in MySQL, but not lower than the highest value that exists in the table. I guess you could also manually change the column to a BIGINT, I haven't checked but I don't think it would break anything in ProcessWire. That said, is it really necessary to trash and rebuild all pages every time? I don't know what job advertisements database you have, but if you can get a unique ID or identifier for every job posting from it, you could store that identifier in a hidden field in the corresponding ProcessWire page and then selectively update the fields that have changed (or at least only rebuild the pages that have been changed). This way you also retain meaningful created/modified timestamps inside ProcessWire, so it seems like a better approach.2 points
-
Hi all, I just released the first stable version (1.0.0). Decided to go stable because there have not been many bug reports. The module follows the SemVer specification: There won't be any breaking changes in the API for the 1 major version. Here's the changelog of the release: https://github.com/wanze/SeoMaestro/releases/tag/v1.0.0 Happy day ?2 points
-
RockAwesome ProcessWire Fieldtype to easily choose FontAwesome Icons Usage Install the module. Set paths in the Inputfield's settings page. Add a RockAwesome field to any template (or change an existing TEXT field). Preview https://modules.processwire.com/modules/fieldtype-rock-awesome/ https://github.com/BernhardBaumrock/RockAwesome1 point
-
Hello everyone, Recently I spent some time researching how I can update my workflow. I really enjoy working with TailwindCSS however, when it comes to Javascript, I often find myself having to search around to find a good package. Often I find myself having a package for lazy loading, a package for sliders, a package for animation, a package for parallax and a package for ajax. Before you know it, you are worrying about dependicies, conflicts and vunrabilities for many different packages. Since the push is to get rid of jQuery and use native javascript, often each will have their own utility classes, some of which do the same thing. This adds a lot of bulk to the website. This is what I love about UIKit, it provides plenty of functionality for a small ~130KB unminified. Not many know this, but the UIKit helper classes are exposed via the API too. So it means you will not have to worry about your javascript working cross-browser (https://github.com/uikit/uikit-site/blob/feature/js-utils/docs/pages/javascript-utilities.md). The perfect thing would be to combine UIKit and TailwindCSS, but the best way to achieve this is up for grabs. I personally use TailwindCSS base and implement components from UIKit. I then use PurgeCSS on the CSS file to make sure anything unused by either UIKit or Tailwind isn't making it to production. I do this using Parcel JS. I have used Webpack and Gulp previously, but I find Parcel is a simple and easy way to get a project started (and it's fast!). The next thing I've found is UIKit is not always the answer. There are now more than ever better ways of achieving things in browser. Such as CSS Grid, `position: sticky`, and `object-fit` try to use these CSS alternatives where possible. Purge will always make sure that you get the smallest possible file size, so avoid using the uk-grid element where possible and use CSS Grid. I have setup a github starter template (https://github.com/TomS-/UIKit-TailwindCSS/tree/master) if you want to have a look at it. CSS Grid will introduce intrinsic design (https://www.youtube.com/watch?v=lZ2JX_6SGNI - Great series) Next will be to use WebP, there is plenty going around on the blogs now about this, but this will make a massive improvement to your Google Page Insight rating (https://developers.google.com/speed/pagespeed/insights/?url=https%3A%2F%2Fwww.tikari.co.uk%2F&tab=desktop). I would love to hear your web manifesto - and ask me anything about mine ?1 point
-
Did you see my example gifs? Maybe you (or anybody else) can show me how I can SLIDE-toggle the white div here: https://jsfiddle.net/baumrock/1uaLmxo7/7/ BTW: It's also easy to rotate elements with the uikit js framework ? util.Transition.start(burger, { 'transform': 'rotate(270deg)', }, duration, 'ease');1 point
-
Ah ok, I thought you didn't knew, that you could add animations to the toggle component. If you wan't another animation other than the animations of the animation component, you could add different classes and animate them with css. ? https://getuikit.com/docs/toggle#animations Sorry, it was not my intention to turn this thread into another discussion about frameworks. I just wanted to share my opinion, why I like to use them. But of course this is just my opinion and I also like to start with a blank page. ?1 point
-
No matter how large a website will become... the main elements will stay the same. Just a different location, order or color. Most developers don't create (the) content anyway and in an agency or colab you split work most time as well. It's not totally impossible to maintain a large set of elements - especially when you have a few years of experience in doing and building such things AND have the ability and time to plan things out. I really like UIKIT and what their dev team has created there but... I still don't want to use it but get why others like it (or Bootstrap or Foundation or ...). And in my opinion... the best foundation for a large webproject is a blank file. ?1 point
-
My only concern would be that a lot of page references can slow down page-loading in edit-mode in the admin. But just for updating / creating / reading such values, I don't think performance would suffer. You can always completely hide these PR fields in the admin (or choose to only load via AJAX when opened).1 point
-
I am currently working on 2 large modules (SnipWire and GroupMailer). The further the development progresses the more complex it is to fully support the 3 main themes (UIKit, Reno and Default). What do you think: is it worth the effort or will the older themes soon disappear? Should I concentrate on UIKit only? How do you handle this with your modules?1 point
-
I use a similar setup within a product catalogue. The average is about ~60 referenced pages. Performance is still perfect. How many users are there that could read those hundreds of pages? Maybe you could save the users that read a page to that page instead.1 point
-
@cst989, here is one way you could do it. First create a new Lister bookmark with the columns and sorting set the way you want. It doesn't matter what you set in the filters because we are going to override that in a hook. Take note of the bookmark ID in the URL when you view the bookmark in Lister. Now add the following hook to /site/ready.php, updating the bookmark ID to suit: $wire->addHookBefore('ProcessPageLister::execute', function(HookEvent $event) { /* @var ProcessPageLister $lister */ $lister = $event->object; $bookmark = $event->wire('input')->get('bookmark'); // If executing your specific bookmark if($bookmark === '_1574293851') { // Find the templates that contain the meta_title field $tpls = new TemplatesArray(); foreach($event->wire('templates') as $template) { if($template->flags) continue; // Skip system templates (e.g. repeater templates) if($template->fieldgroup->has('meta_title')) $tpls->add($template); } // Set the defaultSelector for the Lister $lister->defaultSelector = "template=$tpls, meta_title=''"; } });1 point
-
Just wanted to thank you @Tom. for that brilliant hint! I'm not that experienced in frontend stuff, so basic tasks like slide-toggling a menu can really be a pain for me ? I've always made it easy for myself and just included jQuery for such things... Today I tried the UIkit JS utils and it's not that hard to do (here I'm using Zepto.js, but that's not a necessity): var util = UIkit.util; $(document).on('click', '.tm-burger', function(e) { e.preventDefault(); var $menu = $('#tm-menu-section'); var element = util.$('#tm-menu-section'); var duration = 700; if($menu.height()) { // hide menu $menu.height(element.scrollHeight); util.Transition.start(element, { 'height': 0, 'overflow': 'hidden', }, duration, 'ease'); } else { // show menu $menu.removeAttr('hidden'); $menu.height(0); $menu.css('overflow', 'hidden'); // trigger window resize to make sure that the menu renders correctly $(window).resize(); util.Transition.start(element, { 'height': element.scrollHeight, 'overflow': 'show', }, duration, 'ease').then(function() { $menu.height('auto'); }); } }); The benefit here is that I don't need any dependencies and I can create any transitions that I need and I'm not limited to jQuery's .slideUp() .slideDown() etc. ?1 point
-
Hi @ukyo I knew there where some Icon Pickers already, but thought it would be fun to build my own ? Also in your module's thread the images are broken, so I didn't get a good first impression... How would I make your module work with a paid version of FontAwesome? Is that possible?1 point
-
https://superuser.com/questions/7327/how-to-add-a-custom-search-engine-to-firefox https://addons.mozilla.org/de/firefox/addon/custom-search-engine/ Or just bookmark my Google Custom Search Engine (or create your own): https://cse.google.com/cse?cx=013706179141317928628:dendm4c3gpq The nice thing about GCSE is that you can freely configure several domains/sites where it should search: As you can see... it's been used quite frequently :-)1 point
-
I absolutely agree. Currently the synchronisation is in development and testing. The database (or better said, the distributors API) only provides a very narrow set of interrogations. And has some strange data field types also (e.g. row modified is delivered, but internaly stored as a string type in a unusal format). So the create/delete of pages every import is just for testing purposes. If all is set and stable (and i can rely on the DB modified field), your approach is definitely the way to go. The questions (page ID limitation? Reset...) came up while testing. And i was curious about it ? Thx for you answer (also to @rick) Olaf1 point
-
Am I the only one often needing a httpsUrl instead of a httpurl? https://github.com/processwire/processwire/pull/116/commits/25be5b54edc16edc80b337723145142660f795c6 Maybe it would make sense to have not only $config->url() and $config->path() but also $config->httpUrl() and $config->httpsUrl() $config->url("/var/www/foo/bar/site/templates/style.css"); // /site/templates/style.css $config->path("/site/templates/style.css"); // /var/www/foo/bar/site/templates/style.css $config->httpUrl("/site/templates/style.css"); // http://www.foo.bar/site/templates/style.css $config->httpsUrl("/site/templates/style.css"); // https://www.foo.bar/site/templates/style.css $config->httpsUrl($pages->get(2)); // https://www.foo.bar/processwire/ What do you think? You can support my request here: https://github.com/processwire/processwire-requests/issues/3261 point
-
Hi @adrian You could use the solution mentioned by @sz-ligatur Setup an image field holding the OG image (og_image). Configure this field to use the image of the homepage as default value, if no image is set. Use the placeholder {og_image} in SeoMaestro. The meta tag should now output the image of the homepage unless content editors overwrite the OG image in a page. Would this solution work for you? I think we'd introduce another level of complexity if the inheritance model includes the page tree and I'd rather keep it simple for now ? Cheers1 point
-
New version release! 1.0.2 I am very happy to inform you guys that the new major version of the module is out. ⚠️ WARNING: Breaking Changes! ⚠️ The module was rewritten to use webonyx/graphql-php instead of youshido/graphql. This was a big issue because the latter was not properly maintained anymore and the webonyx/graphql-php gone very further in development and supports more features that we need. There are some more breaking changes that are listed on the latest release page. What's new trash(id: ID!): Page! field allows to move pages to trash via GraphQL api. Solves N+1 problem for FieldtypePage field. Significantly improves response speed! Support for even more ProcessWire permissions. Now the full list is: page-add page-create page-delete page-edit page-move page-view page-edit-created page-edit-trash-created It is already available in ProcessWire's modules directory. So you can install it via class name.1 point
-
Hi adrian, I had a similar situation, and found an editor friendly solution using hooks: https://github.com/wanze/SeoMaestro/issues/8#issuecomment-486658463 Maybe that's a starting point?1 point
-
Hi @Peejay, did you run the Additional steps / Install Snipcart products package in SnipWire module settings? This step installs product templates, files, fields and some demo pages required to build a Snipcart product catalogue. This additional step is needed to prevent unintended deletion of your Snipcart products catalogue when main module is uninstalled. In the current alpha version this isn't yet checked by SnipWire. If you did already run the additional step with an earlier SnipWire version there will be fields missing which were added in a later version. So you will need to re-run this step. The missing resources(fields, templates, pages, ...) will then be installed. Existing ones won't be touched! To re-run this step, you will need to edit/remove a key in database directly: DB table: "modules" -> find entry with class "SnipWire" -> edit the "data" field and remove the Json key: "product_package":true (be sure to leave a valid Json string - you will need to also remove the corresponding comma : {"api_key":"YOUR_LIVE_API_KEY","api_key_test":"ODQzZTc1MjktZGQxNy00YmUzLWFkMWYtZDE3MDQ2YTk1ODNjNjM2ODE3NTg5NzUyNDQxOTc0","api_key_secret":"YOUR_LIVE_API_KEY_SECRET","api_key_secret_test":"","snipcart_environment":"0","single_page_shop":"","single_page_shop_page":1,"credit_cards":["visa","mastercard","amex"],"currencies":["eur","usd"],"show_cart_automatically":1,"shipping_same_as_billing":1,"show_continue_shopping":1,"split_firstname_and_lastname":1,"snipcart_debug":1,"snipcart_css_path":"https:\/\/cdn.snipcart.com\/themes\/2.0\/base\/snipcart.min.css","snipcart_css_integrity":"","snipcart_js_path":"https:\/\/cdn.snipcart.com\/scripts\/2.0\/snipcart.js","snipcart_js_integrity":"","include_jquery":"","jquery_js_path":"https:\/\/code.jquery.com\/jquery-3.3.1.min.js","jquery_js_integrity":"sha256-FgpCb\/KJQlLNfOu91ta32o\/NMZxltwRo8QtmkMRdAu8=","excluded_templates":["promailer-email","promailer-subscribe"],"cart_image_width":65,"cart_image_height":65,"cart_image_quality":70,"cart_image_hidpi":1,"cart_image_hidpiQuality":50,"cart_image_cropping":1,"data_item_name_field":"title","uninstall":"","submit_save_module":"Submit","taxes_included":1,"webhooks_endpoint":"\/webhooks\/snipcart","include_snipcart_css":1,"taxes":"[{\"name\":\"20% VAT\",\"numberForInvoice\":\"\",\"rate\":\"0.20\",\"appliesOnShipping\":[]},{\"name\":\"10% VAT\",\"numberForInvoice\":\"\",\"rate\":\"0.10\",\"appliesOnShipping\":[]},{\"name\":\"10% VAT (Shipping)\",\"numberForInvoice\":\"\",\"rate\":\"0.10\",\"appliesOnShipping\":[\"1\"]}]","snipwire_debug":1,"data_item_categories_field":"snipcart_item_categories","product_package":true} After the key is removed, visit the SnipCart module settings again and re-run the product package installer! In the release version of SnipCart, this will be handled automatically. On each update it will check if there are new fields or other resources to be installed. Hope this helps! p.s. You could also completely uninstall the SnipCart module and then reinstall - this should also activate the product package installer link! -- Martin1 point
-
Just had a quick look and they're very similar. I'm using: $intent = $payment->paymentCheckout($description); Instead of $payment->render(); The $intent variable then returns an array of the [0] Stripe form and [1] Intent Id. https://github.com/benbyford/PaymentStripeIntents/blob/master/PaymentStripeIntents.module#L138 This is because you may want to store only the Intent or just the form. Like to spend some more time with this module soon, so there will probably better Readme and additions soon.1 point
-
Additional side note: It seems my post confused a few of us. Therefore a few more details about my workflow. Clarification The above mentioned workflow does not involve ProcessWire. This workflow applies only to the part of creating HTML, CSS and JS for a project in its static version. You can call it a prototype, a template library, a loose collection of web-related documents, or however. This step is done way before I fire up ProcessWire (or give the files to another developer in case of Typo3, the CMS we don't name here or whatever). Each time I start a new client project for a website I already have in some kind a full-featured, defined and approved design - either made in Adobe PS, IS, XD, Sketch, Figma or any tool you can imagine - most of the time it's not my part to be honest. I can then work out each and every detail, plan out the things that were needed, look for repetitive elements and their modifications and states. The result of that (my work) needs to get an approval by the designer and the client - afterwards I create a new ProcessWire instance and migrate everything in template files and smaller bits I will need later on. With this overall approach I have had enough time to know how to structure the data and content in ProcessWire which makes things in it super easy and super fast most of the time. Hope this helps.1 point
-
I wouldn't call it a manifesto but anyway... let's talk about my workflow. TL;DR I build 90% from scratch. Every time. Each and every project. I don't use frameworks of any flavour.* * except from some JS stuff - see below Long version My boilerplate for new projects: SCSS Skeleton (my personal collection of SCSS Magic) JS Skeleton (my personal collection of JS Magic) HTML/Kit files depending on templates and elements the project needs (inspired by http://bradfrost.com/blog/post/atomic-web-design/) just an empty folder would work totally fine as well Tools I use and need: git Prepros/CodeKit (or ProCache ?) Tools that may be added later (if absolutely necessary): Lazysizes SVGinline jQuery for Slider scripts (slick, OwlCarousel) MixItUp Tools I never use (because I'm too old for that - I guess) Grunt, Gulp, Bower, Webpack, Parcel, ... you get the idea Benefits Projects are portable Projects run everywhere Every part of project can be changed without affecting other things (most of the time) No need for a special setup (at least for the compiled files) Small(est) file sizes and therefore fast websites (in most cases) Downsides Working with others means I have to trust them and their capability to write good CSS/SCSS You have to think at least twice for each step, every time It takes much more time to build everything from scratch It's much more expensive at first Clients often don't understand the benefits and sometimes WANT a Bootstrap website ? FAQ What if you work with others? As mentioned before I have to trust others that they are capable of writing good CSS/SCSS and therefore I tend to work only with very good people I really trust. Is it worth it? Yes! Why? When stuff breaks or needs to be changed, I know where to look, what to change and can do my stuff without the need to take care of any version upgrades, incompatibilities in or with newer version, I don't need a special setup or whatever. AND... if I want to I can still add whatever is needed. Try it the other way around. That's much harder. Are there exceptions? Of course. Backend stuff, admin interfaces and things like - ProcessWire admin is the perfect example. I wouldn't build something like that from scratch. I guess that's my manifesto.1 point
-
An update to the hook in the first post for PW v3.0.117 or greater. // Add a new 'chunk' method to WireArray, the equivalent of PHP's array_chunk $wire->addHookMethod('WireArray::chunk', function(HookEvent $event) { /* @var WireArray $wire_array */ $wire_array = $event->object; $size = $event->arguments(0); if( !((int) $size > 0) ) throw new WireException('WireArray::chunk requires an integer $size argument greater than zero'); $chunks = new WireArray(); for($n = 0; $n < count($wire_array); $n += $size) { $chunks->add($wire_array->slice($n, $size)); } $event->return = $chunks; }); This returns the chunks as a WireArray so you have the option of using WireArray methods. So if needed you could do something like: $items = $pages->find("template=foo"); $chunks = $items->chunk(5); $three_random_chunks = $chunks->find("limit=3, sort=random");1 point
-
Welcome to the forums @OxfordSUOliver If you have access to your files, paste the following temporarily into one of your template files and then visit a page that uses that template: $u = $users->get('sup'); // or whatever your supersuser name is $u->of(false); $u->pass = 'your-new-strong-secret-password'; $u->save(); Remember to delete the above from your template file once done. If you don't know the name of the supersuser, you can check this in your DB tables. See the pages table. Scroll down to user with ID 41 and check the string under the column name. Alternatively, temporarily again, in a template file, do the following: $u = $users->get(41); echo $u->name;// this is the name you want for logging in Note the original ProcessWire Superuser ID is normally 41, unless for some reason your colleague changed it, which would be highly unlikely, although they could have deleted that user having set up an alternative Superuser ?.1 point
-
The answer to the original question seems to be: // use this $config->httpHosts = array(); // instead of this $config->httpHosts = array(''); I guess the 2nd line creates an array with an empty item, not an empty array. But I still have a problem with empty httpHosts config on https sites. They just do not want to work without $config->httpHosts set explicitly.1 point
-
Forked here to add support for editing module files from /site/modules, plus on PW3 namespaced textarea inputs are also detected: https://github.com/rolandtoth/ProcessTemplateEditor1 point
-
By default, ProcessWire only returns published pages...so, exclusion of unpublished pages is already done within a 'find'1 point
-
Hello and welcome! I am not good at MySQL really. But you could achieve that with php script. The below code is an example, not tested yet. But you should get the idea. <?php // First get all the pages you want to manipulate $list = $pages->find("template=example"); // The language from which you want the values $langFrom = $languages->get('fr-fr'); // The language into which you want the values $langTo = $languages->get('fr-be'); // List of all fields that should be copied // if a page has it. Some fields does not have a // multiple language entries. Like Images, Files, Checkboxes // this will help us avoid errors $validFields = array( 'title', 'body', 'summary', 'sidebar' ); // Loop through pages foreach ($list as $p) { // Turn off outputFormatting $p->of(false); // then loop through each field foreach ($p->fields as $field) { // If the field is not one of those we want to copy then ignore if (!in_array($field->name, $validFields)) continue; // Get the value of the field for from language $fromValue = $p->getLanguageValue($langFrom, $field->name); // Here you can do any manipulations to your value // if you want to alter it a little // ... // ... // Set the value of the field for to language $p->setLanguageValue($langTo, $fromValue); } $p->save(); echo "$p->title is updated<br />"; } Note: If there are too many pages on which you need to perform this, consider limiting the list and doing it with small batches. Like... <?php $limit = 100; $page = 1; $start = ($page - 1) * $limit; $list = $pages->find("template=example, limit=$limit, start=$start"); // and the rest is like above // ...1 point