Jump to content

Robin S

Members
  • Posts

    4,928
  • Joined

  • Days Won

    321

Everything posted by Robin S

  1. If the renderChildrenOf() function is producing the markup (classes, etc) you need for a Bootstrap menu then you won't need to make any changes within the function. It already contains a foreach within the function so you just need to give it the PageArray of the top-level menu items. $homepage = $pages->get(1); $main_nav = $pages->find("parent=1, includeFooter!=1"); $main_nav = $main_nav->prepend($homepage); echo renderChildrenOf($main_nav); Depending on what you want for the footer menu you might use renderChildrenOf() for that too, or write your own foreach for $footer_nav
  2. I think you already solve that scenario with if(strpos($imageVideoName, 'video-') === false) continue; So a manually uploaded image will not be replaced (well, unless the image name by chance included the string 'video-' but that's unlikely). And that makes total sense to me. It wasn't what I expected at first but now I understand the intention behind it I see how it's the best option. And this behaviour could be mentioned on the module config screen or module description to clear up any confusion.
  3. Hi Adrian, It's totally fine if you think it's best to require the thumbnail field to have maxFiles '0' - as I mentioned above, I can only see myself using the module with a dedicated image field that I will make non-editable to users, so for me the field will only hold a single image even if maxFiles is set to 0. But if you wanted to support fields with maxFiles '1' I found that simply reordering the code in your module (the version before your most recent release) fixed the bug. By placing this section... //Delete any images from videos that were removed from the text fields during this update if($page->{$this->videoImagesField}){ foreach($page->{$this->videoImagesField} as $videoImage){ $imageVideoName = pathinfo($videoImage->filename,PATHINFO_FILENAME); if(strpos($imageVideoName, 'video-') === false) continue; if($this->whichImages != 'firstAvailable') { $imageVideoNameArray = explode('-',$imageVideoName); $imageVideoID = str_replace('video-', '', trim(str_replace(array_pop($imageVideoNameArray), '', $imageVideoName),'-')); } else{ $imageVideoID = str_replace('video-', '', $imageVideoName); } if(!in_array($imageVideoID, $allVideos)){ $page->{$this->videoImagesField}->delete($videoImage); $page->of(false); $page->save($this->videoImagesField); } } } ...above the sections that grab the thumbnails from YouTube/Vimeo any unneeded thumbs are disposed of before the field is repopulated with the new thumbnail. But I didn't do extensive testing so there are perhaps consequences to reordering the code like this.
  4. Sorry, sloppy testing on my part. You're absolutely right; relative time only works for $pages->find(). Shame though, as would be nice to use it for PageArrays.
  5. Thanks @BitPoet, you've helped me understand this better. It was because my relative time string was cast to an integer that I was getting confusing results (rather than an error or no results at all). Although in regards to... ...I ran a couple of tests and it seems that relative times work for any PageArray - so they do work for $pages->find(someselector)->find(selector_with_relative_timestamp). Edit: does not work And relative times seem to work for any custom Datetime field, so not just "created", "modified" and "published". But you've nailed it about the Comments fieldtype, which of course is not a PageArray. Would be nice to use relative times with a Comments find so thanks for making that Github request. Although now I understand a bit more about when relative times are possible and when they're not it's pretty easy to just do: $time = strtotime('2 days ago') or whatever and use the variable in the selector. And a little off-topic, but for anyone wanting to do a find on comments across multiple pages this function from Ryan's blog profile is very useful. FieldtypeComments::findComments should probably be mentioned in the Comments docs.
  6. Thanks @LostKobrakai, I think you may have hit upon what is giving me the unexpected results when using a relative time in a selector. I did some testing with a $pages->find() selector on a datetime field and the results were identical for strtotime and for having the relative time in the selector. So no problem there. But the selector that is giving me odd results when the relative time is in the selector vs stored in a variable as a timestamp with strtotime is: $comment_page->comments->find("created_users_id=$this_user, created>='20 hours ago'") This uses find on a comments field - does this find operation filter in memory or with a database query? Is there a way to know when a particular find operation will be performed in memory?
  7. Thanks @gebeer, I will definitely check out those parts of the PW code. I need to do more testing and will post back when I do, but based on some quick tests it seemed that the strtotime way was producing correct results while the native PW relative date was producing incorrect results. I do have the right timezone set in my config though.
  8. It's cool to be able to use relative times in selectors like: post_date>='90 minutes ago' But for debugging purposes I'd like to be able to get the timestamp that '90 minutes ago' actually results in. How can I do that? I thought it would be the same as PHP's strtotime, but in a selector: post_date>='90 minutes ago' Produces different results to: $mytime = strtotime('90 minutes ago'); ... post_date>=$mytime
  9. Currently you're getting your top-level menu items with: $pa = $homepage->children; Try changing to a find selector. If there is some common attribute of the pages you want for the footer menu (template, value of a field, etc) you could use that to exclude the pages, otherwise you'll need to exclude them by name or id. $pa = $pages->find("parent=1, id!=1050|1051|1052"); Edit: just noticed that you have added a checkbox to select pages for the footer nav. So you can do: $footer_nav = $pages->find("parent=1, footer_checkbox=1"); $main_nav = $pages->find("parent=1, footer_checkbox!=1");
  10. The demo shows an "insert paragraph here" feature when you hover on the bottom of the div. Not sure if that's part of the div plugin or a different plugin you'd need to install.
  11. There is a CKEditor plugin that looks like it's designed for what you want: http://ckeditor.com/addon/div You can try it out in the demo, third toolbar row.
  12. I think this is the problematic step. CKEditor can't know that you want to wrap these selected elements in a new element. Try creating an empty paragraph (maybe with a space or temporary character in it), select and apply the "Box" style, then cut and paste your paragraphs into it. You're probably aware of this already: it will be easier to see your box element if you add some styles for .box in your CKEditor "contents.css".
  13. Found some helpful discussion related to this issue here. The value of the inputfield must be set to a Pageimages object for an existing page. By default $page is used (which isn't what is wanted for this example) but it can be changed to a different page. In the context of Soma's gist the fix is to add the following at the end of the "success" section: $form->get("myimages")->attr("value", new Pageimages($uploadpage)); So the complete success section is if(!count($form->getErrors())){ // if no error occured // create new page and save values $uploadpage = new Page(); $uploadpage->template = "upload-entry"; $uploadpage->parent = $pages->get("/upload-api/"); // add title/name and make it unique with time and uniqid $uploadpage->title = date("d-m-Y H:i:s") . " - " . uniqid(); $uploadpage->addStatus(Page::statusUnpublished); $uploadpage->save(); // save uploaded files to new page and remove temp files $files = explode("|",$form->get("myimages")->value); foreach($files as $file){ if($file && file_exists($upload_path . $file)){ $uploadpage->myimages->add($upload_path . $file); unlink($upload_path . $file); } } $uploadpage->save(); $form->get("myimages")->attr("value", new Pageimages($uploadpage)); $sent = true; // or better do a redirect here before showing thank you text. }
  14. I'm trying Soma's gist for uploading a file from the frontend using the core File inputfield. After submit the file uploads just fine and I get the success message, but I also get an error when the form is re-rendered. Warning: filemtime(): stat failed for .../site/assets/files/1228/test-image.jpg in ...\wire\core\Pagefile.php on line 324 I believe the inputfield is trying to display information relating to the previously uploaded file, like it does in Admin. The reason this file can't be found at that location is because page 1228 is the page where the form is, whereas the file has been inserted into a different page. There's a line in the gist that looks like it's intended to solve this: // reset value before rendering the form again to prevent PW errors trying render files (as in admin) $form->get("myimages")->value = ''; // reset field value But maybe this isn't the right way to reset the value of a File inputfield? Edit: actually, the form isn't re-rendered on a successful submit, so not sure what is causing the submitted file to be looked for in this wrong location.
  15. Ahh, right. I was meaning the file I have auto-prepending to my templates, which I happen to have called init.php. I should have been clearer.
  16. Are you sure that's true? Good to know if it is, but tried testing it by putting die() in my init.php and admin is unaffected.
  17. Thanks. Probably the easiest thing for me is to put: $user->of(true); in my templates' auto-prepended init.php and then I can use the field consistently across $user and $page. (edited for clarity) Some of Ryan's comments in the old thread you linked to make it sound like having output formatting off for the user template is deliberate, but then the docs say and which make it sound like $user should be essentially the same as $page and will have outputting formatting on by default.
  18. Just struck this also. @Chris is right about the source of the problem... $storage->parent = $this->pages->get('/admin/'); ...should instead be... $storage->parent = $this->pages->get(2); Making the change above does allow the module to be installed but first you have to delete the fhStorage template from the failed installation attempt. And this isn't straightforward because the system flag is set, and can only be removed via the API. To do this... $t = $templates->get("fhStorage"); $t->flags = Template::flagSystemOverride; $t->flags = 0; $t->save(); Then the template may be deleted via the Admin (or the API).
  19. I have added an image field "avatar" to the user template. The field settings are "Maximum files: 1", "Formatted value: Single items (null if empty)". So I believe I should be able to get the URL of this image in my template with $user->avatar->url But this returns /site/assets/files/1217/ If I add the avatar field to any other template besides the User template I can get the URL as expected. For the user template if I use $user->avatar->first->url I get the URL okay. So it's like image fields added to the User template don't honour the "Formatted value" setting. Has anyone else experienced this? If so I guess it's bug and I'll file an issue on Github. Edit: If I get a specific User page it works normally $pages(1217)->avatar->url So it's just an issue when trying to get the image from the User object. Is this difference from the Page object likely to be intentional?
  20. I believe I have sendmail set up correctly in my localhost environment, and I can send mail fine with WireMail like: wireMail('my@email.com', 'some@email.com', 'Message Subject', 'Message Body'); But when attempting to use the core "forgot password" feature WireMail throws an error: Invalid email address (processwire@myvirtualhost) Is there a config option to set this default "from" address to something that is better formed?
  21. @bernhard Just wanted to say thanks for this module. I prefer it to the Helper Field Links module because the link doesn't create any extra space in the inputfield, which is useful when setting the layout of inputfields as I see almost the same interface as site editors will see. Cheers!
  22. Another way you could do this (code style may not be to your taste): <?php $pagesWithImages = $pages->find("filter_image!=''"); ?> <?php foreach($pagesWithImages as $p): ?> <?php foreach($p->filter_image as $filter): ?> <div class="filter-box" style="background-image: url(<?= $filter->url ?>);"> <div class="uk-overlay uk-overlay-hover uk-position-cover"> <div class="uk-overlay-panel uk-position-cover uk-overlay-background uk-overlay-fade uk-flex uk-flex-center uk-flex-middle"> <a class="hover-btn" href="<?= $p->url ?>"><?= $filter->description ?></a> </div> </div> </div> <?php endforeach; ?> <?php endforeach; ?
  23. I'm don't follow exactly what you're wanting to do. For instance, child's parent's children is the same as just children and "new" and "before" is ambiguous. But maybe this works... $johns_comments = $pages->find("template=comment, comment_username=John"); $comments_after_johns = new PageArray; foreach($johns_comments as $j_comment) { $comments_after_johns->add($j_comment->nextAll); } Not tested.
×
×
  • Create New...