Jump to content


  • Posts

  • Joined

  • Last visited

  • Days Won


Everything posted by Sergio

  1. Great tips from Diogo and I'd like to suggest Hugo (https://gohugo.io/) as a great SSG, specially if you want to explore alternatives to javascript-based ones for two basic reasons: 1. You don't want to mess with a lot of javascript dependencies fatigue, specially as you go back to edit the project in a few months/years, and things start to break when you try to run the project. 2. The project will have 100s or 1000s of pages and you want to generate it as fast as possible.
  2. Hi! I think this post can help you:
  3. Greetings! Webflow has an super nice tutorial on implementing this using their app, BUT it's totally fine to just learn from it and to it by hand, so if you are more of a visual learner, like me, you'll enjoy it:
  4. This looks amazing!! Thank you for your hard work and generosity! Super contribution to ProcessWire!
  5. Hi Daniel! It sure is. A simple way to do it is to have the field on only ONE page, like the homepage or a "settings" page and get this page's field content in your footer template. For instance, if you have this field on your homepage, called "footer_text", you can get it this way: // On your footer.php file //Get the homepage reference $homepage = $pages->get('/'); // Let's say your field is called "footer_text" echo $homepage->footer_text; // Docs: https://processwire.com/api/ref/pages/get/
  6. Your code seems to be missing one line: $wire->addHookAfter("Pages::saveReady", function(HookEvent $event) { $page = $event->object; //this line if($page->template->name != 'mytemplate') return; $defaultLang = wire("languages")->get("default"); $page->title->setLanguageValue($defaultLang, "New Value"); });
  7. 25,000 per hour/day/week? It all depends. From what you described about the app, even 25k users a day should be fine to start with a VPS with 2GB of RAM. If its usage increase a lot you can move the database to another VPS on its own AND/OR increase the VPS CPU and RAM resources very quick. My advice is to keep things simple and not try to over-engineer the application performance from the start. But if you feel "adventurous" 🙂 or think that the project will have this many users right away on day one (which I doubt) you can start with a "serverless" approach where the infrastructure is scaled on-demand, using https://vapor.laravel.com/ and you don't have to worry. There's a course about this approach that is very interesting: https://serverlesslaravelcourse.com/
  8. Although doable, I'd only recommend a system like this to be implemented using ProcessWire if the rest of the project must (or already is) be highly coupled with PW and it doesn't make sense to decouple it for whatever reason. Otherwise I'd recommend you to implement it using another framework. PW shines in the content management part, and I love it, but it may present you with some limitations in its developer-experience department when you need to implement some business logic that relies heavily on integration of payment systems, user data input, generation of reports and especially tests. There's also a myriad of similar systems like this already implemented that you can use as a base, like this one https://github.com/LaravelDaily/Laravel-Test-Result-PDF (demo: https://www.youtube.com/watch?v=GmLFHGud7I8).
  9. Try to unpublish the page where you put the iframe using the API or directly on the database 'pages' table by changing its status to "2049".
  10. Strange problem. Can you try increase the maximum memory for PHP (memory_limit) by editing the file php.ini in your server directly or using a control panel? Look for a line like this: memory_limit = 512M
  11. Hi @Youbility, yes I did. It's working on production at https://www.brightline.org/ Here's a slightly different version of that one: https://gist.github.com/sjardim/d74fae71b5bfe6a44ab88efc9aaa5279 Hope that helps!
  12. Actually, ignore that! After closing Chrome and opening it again the font-weight 300 is fine! So it was a cache on its end. The real problem seems to be my local Rubik version like you suspected!
  13. Good call. I checked and I had Rubik installed so I disabled it but the problem remained, maybe I need to restart the computer to work, but I can't do it right now. But I also checked again the website and the only problem appears to be on 300 font-weight. 400 or more are fine ( I changed it to 400 on the Body as a test, screenshot attached).
  14. Nice project! Congratulations! Is there feedback from the client about Processwire? They knew it before this project? On thing that I noted is that on Chrome / Windows 10, the font rendering a bit off, making it hard to read (especially the lower "a" and s). Could you check?
  15. Hi @kongondo, sure, but he mentioned "logged-in users can publish posts" so I think he can capture the user timezone settings on the server side, and/or, give the user to overwrite this preference on admin. EDIT: sorry, I misread it. You are right, @kongondo! my bad!
  16. I would go with the great Carbon library and handle the timezone conversion in PHP. https://carbon.nesbot.com/docs/#api-timezone $tz = new CarbonTimeZone('Europe/Zurich'); // instance way $tz = CarbonTimeZone::create('Europe/Zurich'); // static way // Get the original name of the timezone (can be region name or offset string): echo $tz->getName(); // Europe/Zurich echo "\n"; // toRegionName returns the first matching region or false, if timezone was created with a region name, // it will simply return this initial value. echo $tz->toRegionName(); // Europe/Zurich echo "\n"; // toOffsetName will give the current offset string for this timezone: echo $tz->toOffsetName(); // +02:00 echo "\n"; // As with DST, this offset can change depending on the date, you may pass a date argument to specify it: $winter = Carbon::parse('2018-01-01'); echo $tz->toOffsetName($winter); // +01:00 echo "\n"; $summer = Carbon::parse('2018-07-01'); echo $tz->toOffsetName($summer); // +02:00 // With no parameters, a default timezone is created: echo new CarbonTimeZone(); // UTC echo "\n"; echo CarbonTimeZone::create(); // UTC
  17. You can filter by dates like so: $events = $page->children('limit=50, date<=today, sort=-date'); Also check this thread to see more details: date_start>=today date_start>=1365436783 date_start>=2013-04-08 date_start>=4/8/2013 date_start>=8.4.2013 date_start>="April 8, 2013"
  18. Here's my version: <?php // Cache all topics $template = $templates->get("topics"); $topics_children = $cache->get("all_topics", $template, function($pages) { return $pages->get("/topics/")->children(); }); //Topic1|Topic2 $search_topics = explode("|", $input->whitelist->topic); //Get Topics from cache foreach($topics_children as $topic) { $checked = (is_array($search_topics) && in_array($topic->title, $search_topics)) ? ' checked ' : ''; echo "<label for='{$topic->title}'><input type='checkbox' name='topic[]' $checked value='{$topic->title}' id='{$topic->title}' /> {$topic->title}</label></br>"; } //On my search template if($input->get('topic')) { $value = $sanitizer->selectorValue($input->get('topic')); $selector .= "topics=$value, "; $input->whitelist('topic', $value); } ?>
  19. I'm happy that you found the solution 🙂
  20. My bad, I misread it. Maybe this will help you:
  21. Forgot to mention that although I load more items using javascript, the query parameters are kept between the pages.
  22. Here's how I did it on a similar project. The search query: https://www.brightline.org/resources/?keywords=distributed&resource_type=Reports&topic=Blockchain&author=Blockchain+Research+Institute&submit=1 On the page: if(count($resources) > 0) { $segment = ''; if($input->urlSegment1) { $segment = $sanitizer->selectorValue($input->urlSegment1); $segment .= "/"; } echo $pagination = renderPagination($resources, $segment); } And on a _func.php (or any other file like _init.php) function renderPagination(PageArray $items, $segment = '') { if(!$items->getLimit() || $items->getTotal() <= $items->getLimit()) return ''; $next = isset($options['next']) ? $options['next'] : __('Next'); $previous = isset($options['previous']) ? $options['previous'] : __('Previous'); $page = page(); if(!$page->template->allowPageNum) { return "Pagination is not enabled for this template"; } // customize the MarkupPagerNav to output $options = array( 'numPageLinks' => 4, //4 is a good size for mobile as we're using next and prev items 'nextItemLabel' => $next, 'nextItemClass' => 'js-next', // 'previousItemLabel' => '<span><i class="uk-icon-angle-double-left"></i></span>', // 'previousItemClass' => '', // 'lastItemClass' => '', // 'currentItemClass' => 'tw-bg-orange tw-font-bold', 'separatorItemLabel' => '<span>&hellip;</span>', 'listMarkup' => "<ul id='js-pagination' class='tw-my-8 tw-justify-center tw-text-lg tw-list-reset tw-flex'>{out}</ul>", 'itemMarkup' => "<li class='{class} tw-mr-3'>{out}</li>", 'linkMarkup' => "<a href='{url}' class='tw-rounded tw-bg-white tw-px-3 tw-py-2 hover:tw-bg-orange hover:tw-text-white'>{out}</a>", 'currentLinkMarkup' => "<span class='tw-px-2 tw-py-2'>{out}</span>" ); $pager = modules('MarkupPagerNav'); $pager->setBaseUrl($page->url.$segment); return $pager->render($items, $options); }
  23. One thing is to load the search result in memory on PHP side on a $pages->find, another is render the HTML in the browser. There's no way to render a HTML node tree of that size without some solutions like image lazy loading through a script, especially on mobile browsers. Nowadays it's partially supported natively, but for most cases you need to rely on Javascript. Google Images loads more images as you scroll the page, you can see this better if you slow down your connection using Chrome Devtools, for instance.
  24. In the near future I plan to study on using Teppo's module to build an index directly to a Meilisearch instance running on the same server. I used it on a recent Laravel project and, although I only scratched the surface of its capabilities, the partial match and typo toleration is worth a try IMHO. Also it was a breeze configuring it.
  25. There's also this cool module by @teppo that let you create a search index to speed up things immensely on some cases. https://modules.processwire.com/modules/search-engine/
  • Create New...