Jump to content

Recommended Posts

27 minutes ago, dragan said:

@Ben Sayers I'm by no means an expert on hooks, but I usually put hooks in ready.php, not init.php.

Hi Dragan, I'm not sure if it matters, but I use the beginner profile, I don't see a ready.php file - I only see that file in the Default or Regular profiles. 

Link to post
Share on other sites
11 hours ago, Ben Sayers said:

I don't understand why the Jumplinks work with any page that doesn't contain "blog/".

Edit: I had the file named incorrectly (/site/_init.php) so I removed the underscore in the name and now I can see the dump is working but only for URLs that don't have "blog/" in them and I'm not redirected to the blog landing page, I get a 404. If I try a link with "blog/" in it, I see the blog landing page but the URL is still the old one instead of domain.com/blog/.

I have no experience with the blog module(s), but if a hook method attached to ProcessPageView::pageNotFound doesn't get executed at all for /blog/ URLs, this likely means one of two things: either there's no 404 exception when the user visits those URLs (i.e. the template of the page at /blog/ has URL segments enabled, but it isn't throwing 404 exception when a non-existing URL segment is accessed), or the module itself has some hook that prevents this from working.

The first option seems more likely to me, but again I don't have any experience with this module, so can't say for sure. This could also be by design, so maybe @kongondo could step in and see if he has an idea about what's going on here? 🙂

  • Like 1
Link to post
Share on other sites
43 minutes ago, teppo said:

This could also be by design, so maybe @kongondo could step in and see if he has an idea about what's going on here? 🙂

 

43 minutes ago, teppo said:

module itself has some hook that prevents this from working.

Blog has only one hook, used in the backend, limited to save of a single blog post (addHookAfter) to set its blog published date (@note: this is NOT the PW published field but the blog pages date field)

 

43 minutes ago, teppo said:

(i.e. the template of the page at /blog/ has URL segments enabled, but it isn't throwing 404 exception when a non-existing URL segment is accessed),

The following blog templates have URL segments enabled:

  1. Blog Archives (blog-archives) [virtual parent of blog archives; virtual since no real children; works becaue of URL Segments]
  2. Blog Authors (blog-authors) [virtual parent of blog authors; can also display multiple authors]
  3. Blog Comments (List) (blog-comments) [virtual parent of blog comments; can also display multiple comments]
  4. Blog Posts (blog-posts) [parent of posts; can also display all posts]
  5. Blog Tag (blog-tag) [a single blog tag]

Cross-reference

 

Edited by kongondo
  • Like 1
Link to post
Share on other sites

@teppo, @Ben Sayers,

Given my conversation with Ben in the blog module forum and given the correction made therein (?what?) and given Teppo's suspicion of URL Segments, I now wonder whether Ben's issue has to do with the term 'blog' at all. I suspect it is the 'posts' in the URL Segment since the posts templates utilises URL Segments as I listed above.

Edit: for clarification, Ben's correct address to the blog posts, is, f.ex. domain.com/blog/posts/some-post/ 

Edited by kongondo
Link to post
Share on other sites
1 hour ago, kongondo said:

Given my conversation with Ben in the blog module forum and given the correction made therein (?what?) and given Teppo's suspicion of URL Segments, I now wonder whether Ben's issue has to do with the term 'blog' at all. I suspect it is the 'posts' in the URL Segment since the posts templates utilises URL Segments as I listed above.

Edit: for clarification, Ben's correct address to the blog posts, is, f.ex. domain.com/blog/posts/some-post/ 

My apologies for the confusion, Kongondo. I updated the post format in my original post on this forum. So if my issue is indeed related to the 'posts' URL segment, do you (or anyone else) have any idea how to resolve it? All suggestions are welcome, I've been fiddling with this for almost two weeks, lol.

Edit: I can confirm that it is the "posts" part of the URL that is causing the issue, I tried redirecting "blog/test/" and it redirected just fine but "blog/posts/test/" does not.

Edited by kongondo
Further explanation of issue
Link to post
Share on other sites
1 hour ago, Ben Sayers said:

I can confirm that it is the "posts" part

I edited this to read "posts" NOT "post" to avoid further confusion 😃.

1 hour ago, Ben Sayers said:

do you (or anyone else) have any idea how to resolve it?

I think the key is in what @teppo stated above:

On 10/27/2019 at 8:42 AM, teppo said:

if a hook method attached to ProcessPageView::pageNotFound doesn't get executed at all for /blog/ URLs, this likely means one of two things: either there's no 404 exception when the user visits those URLs (i.e. the template of the page at /blog/ has URL segments enabled, but it isn't throwing 404 exception when a non-existing URL segment is accessed)

Your blog-posts template (file) is not throwing a 404 exception for the missing (deleted) posts. I am not sure whether manually throwing a 404 will resolved the issue but I am sure the other guys will have better knowledge of this. Meanwhile, please show us the contents of your blog-posts template file.

Edited by kongondo
Link to post
Share on other sites
34 minutes ago, kongondo said:

Meanwhile, please show us the contents of your blog-posts template file.

Sure thing, here is my 'blog-posts' template file, it's identical to my 'blog' template file. 

<?php namespace ProcessWire;
	
  include('./_head.php'); // include header markup ?>
  
  <!-- Page title -->
  <section id="page-title">
    <div class="container-fluid">
      <div class="page-title">
        <?php echo "<h1>" . $page->get('headline|title') . "</h1>";?>
      </div>
      <div class="breadcrumb">
		<?php
		echo "<ul>";
		$parents = $page->parents;
		foreach($parents as $parent) {
			$url = $parent->url;
			echo "<li><a href='$url'>{$parent->title}</a></li>\n";
		}
		// show current / "we are here" page as well, but not as link: (last element)
		echo "<li>{$page->title}</li>\n";
		echo "</ul>"; ?>
      </div>
    </div>
  </section>
  <!-- end: Page title --> 
  
  <!-- Content -->
  <section id="page-content">
    <div class="container-fluid"> 
      <!-- post content --> 
	  <?php
		// Change options for pagination
		$options = array(
		  'numPageLinks' => 5,
		  'listMarkup' => "<ul class='pagination justify-content-center'>{out}</ul>",
		  'itemMarkup' => "<li class='page-item {class}'>{out}</li>",
		  'linkMarkup' => '<a href="{url}" class="page-link">{out}</a>',
		  'currentItemClass' => 'active',
		  'separatorItemLabel' => '...',
		  'separatorItemClass' => 'page-link',
		  'currentLinkMarkup' => '<a href="{url}" class="page-link">{out}</a>',
		  'nextItemLabel' => '<i class="fa fa-angle-right"></i>',
		  'nextItemClass' => '',
		  'previousItemLabel' => '<i class="fa fa-angle-left"></i>',
		  'previousItemClass' => '',
		  'lastItemClass' => '',
		);	
		$blogposts = $pages->find("template=blog-post, sort=-blog_date, limit=9");
		setlocale(LC_ALL,"en_US.UTF8");
		$pagination = $blogposts->renderPager($options);
	  ?>
      <?php if(count($blogposts)): ?>
      <!-- Blog -->
      <div id="blog" class="grid-layout post-3-columns m-b-30" data-item="post-item">
		  <?php
			foreach ($blogposts as $b) {
				if(count($b->blog_images)) {
					$firstimage = $b->blog_images->first();
					$thumb = $firstimage->width(640);
				}
				echo "<div class='post-item'>
				  <div class='post-item-wrap border shadow'>";
				if(count($b->blog_images)) {
				echo "<div class='post-image'><a href='{$b->url}'><img alt='{$b->title}' src='{$thumb->url}'></a></div>";}
				echo "<div class='post-item-description'> <span class='post-meta-date'><i class='fa fa-calendar-alt'></i>{$b->blog_date}</span> <span class='post-meta-comments'><a href='{$b->blog_author->url}'><i class='fa fa-user-circle'></i>{$b->blog_author->title}</a></span>
					  <h2><a href='{$b->url}'>{$b->title}</a></h2>
					  <p>{$b->summary}</p>
					  <a href='{$b->url}' class='item-link'>Read More <i class='fa fa-arrow-right'></i></a>
					</div>
				  </div>
				</div>";
			}			
		  ?>		  
      </div>
      <!-- end: Blog --> 
      <?php echo $pagination; ?>
	  <?php endif; ?>
      
    </div>
    <!-- end: post content --> 
    
  </section>
  <!-- end: Content --> 
  
	<?php include('./_foot.php'); // include footer markup ?>	

 

Link to post
Share on other sites
On 10/25/2019 at 8:54 PM, Mike Rockett said:

@adrian Page identifiers were never intended to be used as part of a destination. These identifiers use the full, absolute URL of the page being identified. Perhaps destination selectors could come in handy here? Haven't ever tried it this way before, but I imagine redirecting subscribe/{all} to [[1495]]{all} (or [[1495]]/{all}} if trailing slashes are turned off) would work. Anything inside the square braces is passed to pages->get and replaced with page->url, which is why I believe this will work.

Thanks @Mike Rockett - using the page ID like that does work. This was the combo I needed:

image.png.2ff18b17783e740f4e3f7b656f50c502.png

Note that the first one showing "sign-up/" is from the selected page, not manually entered. With this, all seems to work as expected.

  • Like 1
Link to post
Share on other sites

@Mike Rockett - I've come across an issue with the way that Jumplinks sanitizes the URL. I have partners linking in to the site with campaign info in the query string, but Jumplinks is removing the "?" so that:

mysite.com/subscribe/partner/?utm=123

becomes:

mysite.com/sign-up/partner/-utm-123 

which of course looks like a second urlsegment to PW and therefore breaks things.

Any chance of revising the sanitizer that makes that change please?

Link to post
Share on other sites
3 minutes ago, Mike Rockett said:

@adrian I wonder if database->escape_string is playing a role here? I think I'm doing it differently in JL2, but that's nowhere near done in terms of a frontend. 🙈

I just removed all those calls and it doesn't seem to be coming from them as it didn't help.

Actually, those calls only seem to be in the import from csv logic, so I don't think they are relevant at all, are they?

Link to post
Share on other sites
3 minutes ago, adrian said:

Thanks very much - let me know if you have any trouble reproducing.

Going to have to spin this up and see what's going on. Mind sharing your source/destination with me?

Just now, adrian said:

I just removed all those calls and it doesn't seem to be coming from them as it didn't help.

Sorry, I edited that post as you were replying

  • Like 1
Link to post
Share on other sites

@adrian Ok so this seems to be the wildcard cleaner. Because {all} is the equivalent of .*, it includes the query string in this case and therefore cleans it like a normal wildcard. The only option for the time being is to disable cleaning of {all}, by changing it to {!all} in the destination. I know it's not perfect, but JL doesn't actually handle query strings very well – they should actually be handled separately somehow.

Edit: I'm actually going to see if I can update the cleaner to prevent query string character cleaning.

  • Like 1
Link to post
Share on other sites
3 minutes ago, adrian said:

You're a legend - thank you - works perfectly!

You're welcome. JL2 (when I get there 🙈) will give some more control here. This case would be covered by subscribe/{path} --> @[1495]/{path}, and then there'd either be a {query} wildcard or an option on the jumplink itself to automatically carry it over.

  • Like 1
Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By monollonom
      (once again I was surprised to see a work of mine pop up in the newsletter, this time without even listing the module on PW modules website 😅. Thx @teppo !)
      Github: https://github.com/romaincazier/FieldtypeQRCode
      Modules directory: https://processwire.com/modules/fieldtype-qrcode/
      This is a simple module I made so a client could quickly grab a QR Code of the page's url in the admin.
      There's not much to it for now, but if need be you can output anything using a hook:
      $wire->addHookAfter("FieldtypeQRCode::getQRText", function($event) { $event->return = "Your custom text"; }) You can also output the QR code on your front-end by calling the field:
      echo $page->qr_code_field; The module uses the PHP library QR Code Generator by Kazuhiko Arase. When looking for a way to generate a QR Code in PW I came across @ryan's integration in his TFA module. I'm not very familiar with fieldtype/inputfield module development so I blindly followed @bernhard (great) tutorial and his BaseFieldtypeRuntime. At some point I'll take a deeper look to make a module on my own.
      Some ideas for improvements :
      add the ability to choose what to ouput : page's url / editUrl / file(s) / image(s) / ... allow to output multiple QR codes ?
    • By Chris Bennett
      https://github.com/chrisbennett-Bene/AdminThemeTweaker
      Inspired by @bernhard's excellent work on the new customisable LESS CSS getting rolled into the core soon, I thought I would offer up the module for beta testing, if it is of interest to anyone.

      It takes a different approach to admin styling, basically using the Cascade part of CSS to over-ride default UiKit values.
      Values are stored in ModuleConfig Module creates a separate AdminThemeTweaker Folder at root, so it can link to AdminThemeTweaker.php as CSS AdminThemeTweaker.php reads the module values, constructs the CSS variables then includes the CSS framework Can be switched on and off with a click. Uninstall removes everything, thanks to bernhard's wonderful remove dir & contents function.
      It won't touch your core. It won't care if stuff is upgraded. You won't need to compile anything and you don't need to touch CSS unless you want to.

      It won't do much at all apart from read some values from your module config, work out the right CSS variables to use (auto contrast based on selected backgrounds) and throw it on your screen.
      You can configure a lot of stuff, leave it as it comes (dark and curvy), change two main colors (background and content background) or delve deep to configure custom margins, height of mastheads, and all manner of silly stuff I never use.

      Have been developing it for somewhere around 2 years now. It has been (and will continue to be) constantly tweaked over that time, as I click on something and find something else to do.
      That said, it is pretty solid and has been in constant use as my sole Admin styling option for all of those 2 years.

      If nothing else, it would be great if it can provide any assistance to @bernhard or other contributor's who may be looking to solve some of the quirkier UiKit behavior.
      Has (in my opinion) more robust and predictable handling of hidden Inputfields, data-colwidths and showIf wrappers.
      I am very keen to help out with that stuff in any way I can, though LESS (and any css frameworks/tools basically) are not my go.
      I love CSS variables and banging-rocks-together, no-dependency CSS you can write with notepad.



       

    • By opalepatrick
      I see old posts saying that repeaters are not the way to go in Custom Process Modules. If that is the case, when using forms (as I am trying to do) how would one tackle things like repeat contact fields where there can be multiple requirements for contact details with different parameters? (Like point of contact, director, etc) or even telephone numbers that have different uses?
      Just for background I am creating a process module that allows me to create types of financial applications in the admin area (no need to publish any of this, pure admin) that require a lot of personal or company information.
      Maybe I am thinking about this incorrectly?
    • By HMCB
      I ran across a reference to IftRunner module. The post was 6 years ago. I cant find it in available modules. Has it been pulled?
    • By tcnet
      PageViewStatistic for ProcessWire is a module to log page visits of the CMS. The records including some basic information like IP-address, browser, operating system, requested page and originate page. Please note that this module doesn't claim to be the best or most accurate.
      Advantages
      One of the biggest advantage is that this module doesn't require any external service like Google Analytics or similar. You don't have to modify your templates either. There is also no Javascript or image required.
      Disadvantages
      There is only one disadvantage. This module doesn't record visits if the browser loads the page from its browser cache. To prevent the browser from loading the page from its cache, add the following meta tags to the header of your page:
      <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" /> <meta http-equiv="Pragma" content="no-cache" /> <meta http-equiv="Expires" content="0" /> How to use
      The records can be accessed via the Setup-menu of the CMS backend. The first dropdown control changes the view mode.

      Detailed records
      View mode "Detailed records" shows all visits of the selected day individually with IP-address, browser, operating system, requested page and originate page. Click the update button to see new added records.

      Cached visitor records
      View modes other than "Detailed records" are cached visitor counts which will be collected on a daily basis from the detailed records. This procedure ensures a faster display even with a large number of data records. Another advantage is that the detailed records can be deleted while the cache remains. The cache can be updated manually or automatically in a specified time period. Multiple visits from the same IP address on the same day are counted as a single visitor.

      Upgrade from older versions
      Cached visitor counts is new in version 1.0.8. If you just upgraded from an older version you might expire a delay or even an error 500 if you display cached visitor counts. The reason for this is that the cache has to be created from the records. This can take longer if your database contains many records. Sometimes it might hit the maximally execution time. Don't worry about that and keep reloading the page until the cache is completely created.
      Special Feature
      PageViewStatistic for ProcessWire can record the time a visitor viewed the page. This feature is deactivated by default. To activate open the module configuration page and activate "Record view time". If activated you will find a new column "S." in the records which means the time of view in seconds. With every page request, a Javascript code is inserted directly after the <body> tag. Every time the visitor switches to another tab or closes the tab, this script reports the number of seconds the tab was visible. The initial page request is recorded only as a hyphen (-).

      Settings
      You can access the module settings by clicking the Configuration button at the bottom of the records page. The settings page is also available in the menu: Modules->Configure->ProcessPageViewStat.
      IP2Location
      This module uses the IP2Location database from: http://www.ip2location.com. This database is required to obtain the country from the IP address. IP2Location updates this database at the begin of every month. The settings of ProcessPageViewStat offers the ability to automatically download the database monthly. Please note, that automatically download will not work if your webspace doesn't allow allow_url_fopen.
      Dragscroll
      This module uses DragScroll. A JavaScript available from: http://github.com/asvd/dragscroll. Dragscroll adds the ability in view mode "Day" to drag the records horizontally with the mouse pointer.
      parseUserAgentStringClass
      This module uses the PHP class parseUserAgentStringClass available from: http://www.toms-world.org/blog/parseuseragentstring/. This class is required to filter out the browser type and operating system from the server request.
×
×
  • Create New...