Jump to content


  • Posts

  • Joined

  • Last visited

  • Days Won


Inxentas last won the day on April 3 2018

Inxentas had the most liked content!

Recent Profile Visitors

1,657 profile views

Inxentas's Achievements

Jr. Member

Jr. Member (3/6)



  1. Super, thank you! I couldn't find it in the Process module documentation, but that makes a lot of sense. I'm almost embarrased 😄
  2. My goal is to add a tab at the top of the admin named "tools" under which I want to install a few custom modules. For the Tools tab, I used a page with a ProcessList (so it visually looks like the Templates page). This works perfectly for superusers, but I cannot for the life of me find out how to allow other roles then the superuser to access these pages. I've tried allowing the "admin" templates to be viewed by these Roles, but that doesn't seem to work. Is this actually possible?
  3. Ha ha yes, I feel so silly because this isn't the first time this exact issue has caused me to look for the culprit for about an hour, to finally post on a forum in desperation... only to find the bloody typo just 5 minutes later! I'm alwats torn between blaming Windows / MacOS for not being case sensitive and exact enough, or myself for sticking with CamelCase. Thanks for understanding 😄
  4. Typical. Just as I submit the topic, I find the solution. Turns out I just made a CamelCase boo boo with the filename: Defaultpage.php had to be DefaultPage.php. Sorry to waste your time.
  5. I seem to have some issues with the use of $config->usePageClasses introduced in ProcessWire 3.0.167. I've set it to true so I can use Page Classes. Works perfectly on my own machine, but not on my Staging server. I get the following error: Look out… Error: Exception: Method Page::renderHeading does not exist or is not callable in this context (in wire/core/Wire.php line 544) The method renderHeading() is part of the DefaultPage class. It seems the staging server ignores the classes entirely, as a var_dump() turns out the page is not of the DefaultPage class but the standard Page class. I have no real idea where to look for the issue, does anyone have an idea on how to debug this? The only difference between my Local machine and the Staging server is that it uses a different MySQL database to connect to. Here is the class in full: <?php namespace ProcessWire; class DefaultPage extends Page { /** * Renders a heading based on any title and an optional blurb. * * @param type $title * @param type $blurb * @return string */ public function renderHeading($title, $blurb = null) { $html = ''; $html .= '<div class="content"><div class="layout"><div class="intro"><div class="narrow">'; if ($title != null) { $html .= '<div class="big"><h2>'.$title.'</h2></div>'; } $html .= '<div class="divider"><div class="inner"></div></div>'; if ($blurb != null) { $html .= '<div class="blurb">'.$blurb.'</div>'; } $html .= '</div></div></div></div>'; return $html; } /** * Renders a Project page for the Collection Page grid. * * @param type $col * @param type $row * @param type $project * @return string */ public function renderProject($col, $row, $project) { $html = ''; $html .= '<div class="project project_'.$col.'_'.$row.'">'; $html .= '<a class="inner" href="'.$project->url.'">'; if ($project->image_header) { $html .= '<span class="background" style="background-image:url(\'' . $project->image_header->width(600)->url . '\')"></span>'; } $html .= '<span class="background" style="background-color:rgba(0,0,0,0.2);"></span>'; $html .= '<span class="inner">'; $html .= '<h2>' . $project->title . '</h2>'; $html .= '<div>' . $project->meta_description . '</div>'; $html .= '</span>'; $html .= '<a class="link" href="' . $project->url . '">View</a>'; $html .= '</a>'; $html .= '</div>'; return $html; } } When I add a specific class for the homepage and let it extend DefaultPage... <?php namespace ProcessWire; class PageHomePage extends DefaultPage { } I get the following error: Well well… Fatal Error: Class 'DefaultPage' not found (line 3 of site/classes/PageHomePage.php) It seems the DefaultPage class cannot be found/loaded.
  6. No, I simply moved them to a local directory, hoping that would be sufficient. Uploading them via the admin seemed to work, thank you! I'm still curious as to what is the difference (what uploading them via the admin actually does apart from storing the file). I could not find a "translation" system template, did you perhaps mean the language_files_site system Field? That one seems to have an option to allow for overwriting files.
  7. A client of mine wants his translations being done by an external agency. I've showed them the Site Translation Files and they can deliver me the required translations in the same JSON format. I went about it by first making some translation files for each language, so there's an ID and all the fields get an identifier. The intent is to give them the file, they change the content, and we place those files back. From there I've done some testing and it appears we could simply change the content of these files, as long as the JSON format is being respected. Whenever I changed something, the translation worked properly. So I sent a JSON file to the translator and had them translate the strings. There's no stuff in there that needs escaping so I figured this should work properly. At first they screwed up the values in the "file" and "textdomain" properties of the JSON object, but we fixed that. However, when I place the file in it's appropriate folder I get the following error: Fatal error: Uncaught TypeError: Argument 3 passed to ProcessWire\LanguageTranslator::textdomainTemplate() must be of the type array, null given, called in C:\wamp\www\bamboobrands.com\public_html\wire\modules\LanguageSupport\LanguageTranslator.php on line 485 and defined in C:\wamp\www\bamboobrands.com\public_html\wire\modules\LanguageSupport\LanguageTranslator.php on line 137 TypeError: Argument 3 passed to ProcessWire\LanguageTranslator::textdomainTemplate() must be of the type array, null given, called in C:\wamp\www\bamboobrands.com\public_html\wire\modules\LanguageSupport\LanguageTranslator.php on line 485 in C:\wamp\www\bamboobrands.com\public_html\wire\modules\LanguageSupport\LanguageTranslator.php on line 137 When I delete the JSON file the error goes away so I'm quite sure it's the file causing the issue. I did the following test: Deleted the language file and remade it via Find Files To Translate. Copied the file's content into a new JSON file. Overwritten the language file with this new JSON file. The same error occurs. I've confirmed with DiffChecker that the files are 100% identical. Somehow this issue only occurs when I overwrite the file. I seem to be able to copy-paste the data in, but using a different file causes above error. What could be causing this? Encoding maybe? I couldn't get the translator's file to work, but I could paste their work into the file. (I've told my client translation is an maintenance issue because his content will keep changing anyway. He is adamant that we do it this way, disregarding the fact that pasting in his translations would be less work then working around any coding issues. I know it's kind of stupid and error-prone to do it this way).
  8. I have a big collection of Pages with a template called page-product. These products have a few fields describing their properties. Now my client wants to split this template into various types of products, each with their own set of properties. The most obvious solution would be to make a few new specific templates, like page-product-foo or page-product-bar. Doing this would also mean rewriting a lot of existing selector logic. So what I could also do, is allow the client to append a child to the Product that has these properties. For me that would be a good solution, but for my client this might be confusing. So I'm looking for a user-friendly way to do the same. Ideally, these Properties should be filled in when editing a Page without having to mess with it's Children. One option is to make a Page with children for each type of product and make it a dropdown. And subsequently have each "property" field be visible only when a specific product-type is chosen. However, I'm not sure if this is the best way to go about it - since at the frontend I'd have to take these fields into account, and I'm not sure whether I'll be able to deduct in code which field should be shown (I guess this could be pulled from $fields->MyFieldName). Does anyone have a better idea on how to implement such a feature?
  9. Thanks guys, but I'm indeed aware how Google works 😃 and had hoped to find a less hacky way of doing things then straight up SQL. The weird this is that when I try to collect the language setting from a user via a selector and $pages, I don't get the actual field value - I get the value in the $user object instead. Something that works around this would also work well for me.
  10. I'm updating a website that is about a year old. The site has two languages: Dutch (default) and English. Now the clients wants English to become the default language. The site has a ton of translations already, so changing the default language in the backend is not really an option. So I'm looking for a way to simulate that behaviour, but in my experience doing it with redirects will lead to messy and unwanted behaviour. Can anyone tell me what the proper way of doing this is?
  11. Hi there! I am making a webapp where the admin can create Surveys, Questions and Answers. These are all Pages with a normal Parent / Child relationship. I want to prevent the admin from making changes to a Survey or it's children as soon as the submissions roll in. For that purpose I am using this code inside a hook, which basicly checks what template the soon-to-be-saved page is. I then find the proper Survey and check whether we have submissions for that Survey in an external table: public function testSave($event) { $page = $event->arguments('page'); $survey = null; switch($page->template->name){ case 'survey': $survey = $page; break; case 'question': $survey = $page->parent; break; case 'answer-choice': case 'answer-open': case 'answer-rating-1-10': case 'answer-rating-1-100': case 'answer-rating-likert': $survey = $page->parent->parent; break; } if ($survey) { $res = $this->db->query("SELECT * FROM submissions WHERE surveyId = " . $survey->id); if($res->num_rows > 0){ $this->error("There are already " . $res->num_rows . " submissions for " . $survey->title); } } } Works like a charm, with one exception. I do wish to prevent the page from being saved, but throwing an error doesn't prevent this. It doesn't seem to matter how I implement this in my module's init() method. These two lines of code have the exact same effect: the red warning appears, but values are still saved. $this->pages->addHookBefore('Pages::save', $this, 'testSave'); $this->pages->addHookBefore('Pages::saveReady', $this, 'testSave'); Is there a way to tell ProcessWire to NOT save the page when a certain condition is met? Thanks for your future replies!
  12. If the server would have a classic timeout on a foreach() it wouldn't serve the page at all... but it does. I'll check the logs as soon as I have access again. Hosting company changed it's control panel... I'll check that module! It goes a bit against the intent of the application to be dependent on superuser actions, but at the very least I learn a few more tricks. I also uploaded a bulk of images on the local server. This one behaves more natural. The first request I do times out due to trying to compress 303 images in a single request. When I do a second request, many images are already compressed so eventually it doesn't time out anymore. This is acceptable. It seems there's some artificial limit on the live server or something.
  13. I have an image gallery based on an Image field with about 300 images in it. That caused a little issues with uploading, since it's on a shared host I had to do that piecemeal in order to not overload the server. I kept refreshing the frontend of that page to make sure the server doesn't run out of memory compressing the images, as such an amount obviously requires thumbnails. After 160 images the frontend no longer updates. I can add images to the backend, but they are not shown on the frontend. The images field is not limited in any way. Is there a cap to the amount of images uploaded to a single field? Or any other aspect that might explain such behaviour? The images show up fine in the backend, but when I foreach() through that field I only get 160 results. Any idea what might be going on?
  14. Hello there! I have a question about translations in external files. I remember a topic I started about a year ago about the subject, but I can't find it at the moment. In that topic I had some issues getting translations to work in PHP includes in templates. The solution was the way these files were included. Now I have a similar problem, but it's a bit different. So far I've been able to let external files communicate with the ProcessWire API by including the index file. Imagine that you'd make a folder named ajax in the site folder. Any AJAX script stored there can access the $pages variable. If you set the user language ($user->language) you can even get the translated fields without issues. However, I don't seem to be able to work with translated files. Whenever I include the index file... include_once('./../../index.php'); I can access fields without problems, they even translate properly... $example = $pages->get('/example-page-url/')->example_field; But when trying to access a file based translations, I get some weird inconsistent behavior. Whenever a string is surrounded by the translation method, it is found in the backend, but not translated, even when the users language has been set to the required language: _('This string is recognized, but not translated.') Secondly, when I happen to include another file in that file, translatable phrases are no longer recognized unless I put an extra underscore in the method name: __('I have no idea why, but only like this does the backend recognize me.') Phrases found in this way are also not translated, in fact they cause an error due to the method "__" not existing. Note, those are two underscores. I am at a loss why this behaviour takes place. Does anyone know what I could be doing wrong? To summarize: translations in external AJAX scripts that include the index file, are recognized by the backend but not actually translated. whenever these files include other files, translation behavior get weird. The method requires an extra underscore for the phrase to be found, but logically this causes an error.
  15. Amazing how simple ProcessWire stuff can be to implement! Having no fall back is fine, but thanks for that heads up.
  • Create New...