Jump to content

My first doubt using PW


gfdesign
 Share

Recommended Posts

Hi everyone.

I'm from Argentina so my appologies for my English (I'm begginer student). As I've read in other post, I also came from Textpattern world. Other fantastic CMS that gave me many satisfactions. I'm looking forward for the next version TXP5, meanwhile I'd like try on PW because many interesting things have catched my attention. I'm graphic designer with some HTML / CSS knowledge but almost or nothing of PHP. I think I've understood how PS works, but I'm stucked in something that should be very simple. So here there is my first doubt.

I want to put a list of pages are using a specify template with my own markup. I guess I should use a similar code like this:

    $skyscrapers = $pages->find("template=skyscraper");
    foreach($skyscrapers as $s)
        echo "<li><a href='{$s->url}'>{$s->title}</a></li>"; 

But, I can't understand what is $s for or how I could limit the number of pages (amongst other things) I want to show. So, I'll be grateful if someone can clear me up. I have a lot of questions but I'll try to find out by myself, if not, probably I'll go back for here :)

On other hand, I haven't seen a forum in Spanish, so I'd like users who speak it create one. Also, I would want to offer my help for translating PW to my language and this way Spanish community goes raising such as it happens on TXP forums.

Best regards and thanks in advance.
Fernando

Link to comment
Share on other sites

$s is like one item which belongs to the group $skyscrapers. I prefer to name them $skyscraper so you have:

foreach($skyscrapers as $skyscraper)
{
    echo "<li><a href='{$skyscraper->url}'>{$skyscraper->title}</a></li>"; 
}

See more about a foreach in the manual.

If you want to limit the number of results you can do this:

$skyscrapers = $pages->find("template=skyscraper, limit=10"); 

There are some great tutorials in this forum or on the wiki. I would recommend to do them all. I'm coming from TXP too and and while I still like it very much, ProcessWire is second to none when it comes to structuring data.

  • Like 2
Link to comment
Share on other sites

Fernando,

Welcome to PW. 

In other words, that $s is a temporary variable created to hold information about all the pages found by this $pages->find("template=skyscraper").

In order to get the most out of PW, I recommend that you first learn some basic PHP. See this thread for suggestions about good PHP learning resources. 

Cheers

  • Like 1
Link to comment
Share on other sites

Many thanks guys for reply so soon and the welcome.

Yes, I agree what Arjen said.

...ProcessWire is second to none when it comes to structuring data.


That was one of thing that catched my attention because to me would be much easier to explain to my clients how is organized his site and so to have a general vision about the contents. And let's not even talk about the content custom types and drag and drop features. I love them!

I like TXP because never was necessary to me learn PHP, but seeing PW potential, I'll try to study it, so thanks for the suggestions.
Very soon, I'll go back with new questions :)
Best regards

Link to comment
Share on other sites

gfdesign,

I spent years working with TXP and still maintain a small handful of TXP sites for existing clients.

You really don't need to know very much PHP to build sites with ProcessWire. Sure, if you want to build complex things, then you might need a little deeper understanding, but for most sites you don't need more than the basics. 

Using the example you posted above, let's compare (as closely as possible), ProcessWire to TXP methods.

ProcessWire

// get pages with the template "skyscraper"
$skyscrapers = $pages->find("template=skyscraper");

// for each "skyscraper" display the following
foreach($skyscrapers as $s){
    echo "<li><a href='{$s->url}'>{$s->title}</a></li>";
}

Texpattern

In your page:

// Get all articles with the category "skyscraper", use form "list" to display them.
<txp:article_custom category="skyscraper" form="list" />

In the form "list":

// for each article display the following
<li><txp:permlink><txp:title /></txp:permlink></li>

If you take the TXP tags out of it, there really isn't much difference.

When you call a form in TXP, you are basically creating a foreach().

For creating most sites with PW you really don't need to know all that much PHP.

Brush up on the basics and dive in. Ask lots of questions, there are nice folks here who are always willing to help.

Oh yeah... Welcome. :)

  • Like 3
Link to comment
Share on other sites

In this case it makes sense to show an alternative way of doing what Reno showed. Just to make it a bit closer to the TXP example:

<ul>

<?php foreach ($pages->find("template=skyscraper") as $s): ?>

    <li><a href='<?=$s->url?>'><?=$s->title?></a></li>

<?php endforeach; ?>

</ul>
  • Like 2
Link to comment
Share on other sites

Diogo, that is true, and I probably should have show it as a container tag:

<ul>
    <txp:article_custom category="skyscraper">
        <li><txp:permlink><txp:title /></txp:permlink></li>
    </txp:article_custom>
</ul>

Either way, just as simple with ProcessWire.

:)

  • Like 1
Link to comment
Share on other sites

Thanks Guys, for so many examples using TXP as reference. All of you have been a great help so I'll put on practice your advices. Surely, I'll go back for more questions about lists of pages or other things. I hope to be helpful to you as well.
Best regards

  • Like 2
Link to comment
Share on other sites

Dears, I've followed yours examples but I they don't work when I want to sort such as I have in my control Panel. Pages always display sorted such as I've created them and not as I sort them using drag and drop feature. I'm using next code to show a list of pages.

<?php
    $trabajos = $pages->find("template=trabajo");
    foreach($trabajos as $trabajo){
        echo "<div class='module01 mosaic-block bar'>";
        echo     "<a href='{$trabajo->url}' class='mosaic-overlay'>";
        echo         "<div class='details'>";
        echo             "<h4>{$trabajo->title}</h4>";
        echo             "<p>{$trabajo->description}</p>";
        echo         "</div>";
        echo     "</a>";
        echo     "<div class='mosaic-backdrop'><img src='{$trabajo->imagen_principal->url}' alt='' /></div>";
        echo "</div><!--/module01 -->";        
    }
?>
 

Do you have any idea what could be the problem in my code why they don't sort as I see in my Administrator's screen? Worth mentioning, I've selected "Manual drag'n drop" in the 'Children are sorted by' field of theirs parent page.
Best regards

Fernando

Link to comment
Share on other sites

... and if it still doesn't work, call as children of their parent (i'm assuming they have the same parent)

$trabajos = $pages->get('trabajos-parent')->children("template=trabajo, sort=sort");
  • Like 1
Link to comment
Share on other sites

I'm working on a portfolio site. My structure is the next:

Home

Trabajos (I've put the code in this page/template)

Trabajo 1

Trabajo 2

Trabajo 3
...

Trabajo N

Store
Contacto

With your snippet, the code looks like so:

<?php
   $trabajos = $pages->get('trabajos-parent')->children("template=trabajo, sort=sort");
    foreach($trabajos as $trabajo){
        echo "<div class='module01 mosaic-block bar'>";
        echo     "<a href='{$trabajo->url}' class='mosaic-overlay'>";
        echo         "<div class='details'>";
        echo             "<h4>{$trabajo->title}</h4>";
        echo             "<p>{$trabajo->description}</p>";
        echo         "</div>";
        echo     "</a>";
        echo     "<div class='mosaic-backdrop'><img src='{$trabajo->imagen_principal->url}' alt='' /></div>";
        echo "</div><!--/module01 -->";        
    }
?>
 

Each page has your own template, except all "trabajo" pages that share same template "trabajo".

Link to comment
Share on other sites

You should substitute trabajos-parent with the selector to chose the page that is a parent of your Trabaho 1...n pages. In your case you don't even need to use a selector, it should be:

$trabajos = $page->children("template=trabajo, sort=sort");

and if you only have pages with this 'trabajo' template under your trabahos page, you don't need to spacify it in your selector, so it shrinks to:

$trabajos = $page->children("sort=sort");
  • Like 1
Link to comment
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
 Share

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By David Karich
      The Page Hit Counter module for ProcessWire implements a simple page view counter in backend. Page views of visitors are automatically tracked on defined templates, with monitoring of multiple page views. This gives you a quick overview of how many visitors have read a news or a blog post, for example, without first having to open complex tools such as Google Analytics. This module quickly provides simple information, e.g. for editors. Or, for example, to sort certain news by most page views. For example for "Trending Topics".

       
      Works with ProCache and AdBlockers. With a lightweight tracking code of only ~320 bytes (gzipped). And no code changes necessary! In addition GDPR compliant, since no personal data or IP addresses are stored. Only session cookies are stored without information. 
      In addition, there are some options, for example filtering IP addresses (for CronJobs) and filtering bots, spiders and crawlers. You can also configure the lifetime of the session cookies. Repeated page views are not counted during this period. It is also possible to exclude certain roles from tracking. For example, logged in editors who work on a page are not counted as page views.

      Sort by hits and access page views (hit value)
      Each trackable template has an additional field called phits. For example, you want to output all news sorted by the number of page views.
      // It is assumed that the template, e.g. with the name "news", has been configured for tracking. $news = $pages->find("template=news, sort=-phits"); To output the page views of a tracked page, use:
      echo $page->phits; Example: Reset counter per API
      $modules->get("PageHitCounter")->resetPageViews("template=whatever", false); Example: Tracking a page hit via API and jQuery
      If you want to track a template that does not represent a full page to automatically inject a tracking script, you can define allowed API templates in the module that you can track. Below is an example of how you can track a click on news tag using jQuery. This will allow you to find out which keywords are clicked the most. For example, you can sort and display a tag cloud by the number of hits. Suppose your keywords have the template "news_tag". The template "news_tag" was also configured in the Page Hit Counter Module as a trackable API template.
      Example PHP output of keywords / tags:
      // Required: the data attribute "data-pid" with the ID of the template to be tracked. echo $pages->find("template=news_tag, sort=-phits")->each("<a href='{url}' class='news_tag' data-pid='{id}'>{title}</a>"); Example Tracking Script with jQuery:
      /** * Required: Data attribute "data-pid" with the ID of the news tag template * Required: Send the POST request to the URL "location.pathname.replace(/\/?$/, '/') + 'phcv1'" * Required: The POST parameter "pid" with the ID of the template */ $(function(){ if($('a.news_tag').length > 0) { $('a.news_tag').each(function(){ var tPID = $(this).data("pid"); if(tPID) { $(this).on("click", function(){ $.post(location.pathname.replace(/\/?$/, '/') + 'phcv1', {pid: tPID}); }); } }); } }); So simply every click on a tag is counted. Including all checks as for automatic tracking. Like Bot Filtering, Session Lifetime, etc.
      Notice: Tracking with URL segments
      If the option "Allow URL Segments" is activated on a template, the hits are only counted if the base URL of the page is called. If you want the hit to be counted even when a segment is requested, you MUST configure the segments in the template configuration. How to do this can be found here. If you use dynamic segments, configure them as RegEx. There is currently no other option. The problem is that the Page Hit Counter hooked into the PageNotFound process. If URL segments are allowed but not defined, a 404 is never triggered. This means that the Page Hit Counter cannot be called.
      New since 2.0.0: Ignore URL segments
      If a template has URL segments configured, each hit on a different segment is counted as a new hit. Enable "Ignore URL segments" so that dynamic segments are not counted individually on the base template / page.
      New since 2.0.0: Use cookieless tracking (Experimental)
      Enable this option to not use individual cookies for tracking or if you have many different pages you want to track. The limit for cookies is 50 per domain for all cookies on the page. If the option is enabled, PHP session storage is used. Downside: you can't set the lifetime higher than configured in your PHP.ini and the session will be terminated as soon as the browser is closed.
      Upgrade note for 2.0.0 from previous versions!
      Version 2.0.0 requires an update in the database schema, so that additionally the date of the last access / hit on the page can be displayed ($page->lastPageHit). To make this possible, you have to do the update via the upgrade module, upload the ZIP itself and do an update directly via the backend AND DO A MODULE REFRESH DIRECTLY AFTER UPLOAD/UPDATE. If you do not do this, you will get an error that a column is missing in the database table.
      _______________________________________________________
      Background: This module is the result of a customer requirement, where the editors are overwhelmed with analytics or no tracking tools were allowed to be used. However, a way had to be found to at least count page views in a simple form for evaluations. Furthermore, by using ProCache, a way had to be found to count views of a page without clearing the cache.
      _______________________________________________________
      Pros
      Automatic Page View Tracking Lightweight tracking code, only ~320 bytes (gzipped) No code or frontend changes necessary Works with ProCache! Even if no PHP is executed on the cached page, the tracking works Works with browser AdBlockers No cache triggers (for example, ProCache) are triggered. The cache remains persistent GDPR compliant, session-based cookie only, no personal information Filtering of IPs and bots possible Exclude certain roles from tracking Ability to reset Page Views Works with all admin themes Counter database is created as write-optimized InnoDB API to track events for templates that are not viewable No dependencies on libraries, pure VanillaJS (Automatic tracking script) Works in all modern browsers Pages are sortable by hits Cons
      Only for ProcessWire version 3.0.80 or higher (Requires wireCount()) Only for PHP version 5.6.x or higher No support for Internet Explorer <= version 9 (Because of XMLHttpRequest()) No historical data, just simple summation (Because of GDPR) Segment URLs can only be counted if the segments are defined Planned Features / ToDos
      API access to hit values Since version 1.2.1 Possibility to sort the pages by hits (Request by @Zeka) Since version 1.2.0 Don't track logged in users with certain roles (Request by @wbmnfktr) Since version 1.1.0 Possibility to reset the counter for certain pages or templates (Request by @wbmnfktr) Since version 1.1.0 Better bot filter Since version 1.1.0 Disable session lifetime, don't store cookies to track every page view (Request by @matjazp) Since version 1.2.1 Option to hide the counter in the page tree (Request by @matjazp) Since version 1.2.1 Option to hide the counter in the page tree on certain templates Since version 1.2.1 API to track events for templates that are not viewable Since version 1.2.2 Cookieless tracking Since version 2.0.0 Show last hit Since version 2.0.0 Ignore URL segments (Request by @bernhard) Since version 2.0.0 Add hookable method after pageview was tracked (Request by @bernhard) Since version 2.0.0 Changelog
       
      2.0.0
      Feature request: Add hookable method after pageview was tracked (___pageViewTracked($pageID)) (Requested by @bernhard) Feature request: Ignore URL segments option (Requested by @bernhard) New: Cookieless tracking New: Show date of last hit Update: Botlist Enhancement: Documentation improvement 1.2.7
      Feature request: make buildPageListHitCounter-Function public (Requested by @bernhard) 1.2.6
      Bug-Fix: Set the counter of a cloned page to 0 Enhancement: The function for resetting counters is now available in the module as a public function to reset counters via own scripts on the API side (Request by @VeiJari) Enhancement: Documentation improvement API reset 1.2.5
      Bug-Fix: When counting 404 hits, cookies are no longer set. The session lifetime is deactivated for the 404 page Enhancement: Documentation improvement regarding URL segments 1.2.4
      Bug-Fix: Resetting the counters on system pages (e.g. 404) does not work (Reported by wbmnfktr) Bug-Fix: Tracking endpoint is logged as 404 if module "Jumplinks" is installed (Reported by wbmnfktr) Enhancement: Corrected few typos (Merged from Sergio #6 – THX!) 1.2.3
      Bug-Fix: Tracking script triggers 404 if pages are configured without slash (#3) Reported by @maxf5 Enhancement: Reduction of the tracking script size if it's gzipped (~320 bytes) Enhancement: Documentation improvement Enhancement: Corrected few typos 1.2.2
      New feature: API to track events for templates that are not viewable Enhancement: Documentation improvement 1.2.1
      API access to hit values Use $page->phits Bug-Fix: No tracking on welcomepage (Reported by wbmnfktr; Thx to matjazp) Bug-Fix: Tracking script path on subfolders (Reported by matjazp) Bug-Fix: Tracking on pages with status "hidden" Enhancement: Change database engine to InnoDB for phits field Enhancement: Option to disable session lifetime set session lifetime to 0, no cookies Enhancement: Better installation check Enhancement: AJAX Request asyncron Enhancement: Reduction of the tracking script size by ~20% Enhancement: Option to hide the counter in the page tree You can output the counter with the field name "phits" Enhancement: Option to hide the counter in the page tree on certain templates Enhancement: Option for activate general IP validation Enhancement: Reduction of tracking overhead up to ~30ms Enhancement: Better bot list for detection 1.2.0
      New feature: Sort pages by hits – New field phits Migrate old counter data to new field 1.1.0
      New feature: Exclude tracking of certain roles New feature: Reset Page Views Better bot filter and detection 1.0.0
      Initial release Notes
      By default, the page views are stored as INT in the database. This allows a maximum counter value of 4.2 billion views (4,294,967,295) per page. If you need more, change the type to BIGINT directly in the database. But I recommend to use Google Analytics or similar tools if you have such a large number of users.
      _______________________________________________________
      Download GitHub: ProcessWire Page Hit Counter (Version 2.0.0)
      PW Module Directory: ProcessWire Page Hit Counter (Version 2.0.0)
      Install via ProcessWire (Classname): PageHitCounter
      _______________________________________________________
      Update information
      If you have used version 1.2.1 from the DEV branch, please replace it completely with the new master version.
      Old stable version
      Download GitHub: ProcessWire Page Hit Counter (Version 1.2.7)
    • By Flashmaster82
      Is it possible to just show a list (page reference) but without any radio buttons? Or a drop down but the references is not selectable? The items needs to be references but the main thing is that its just a list. Please help!

    • By benbyf
      Hi, Looking to create form elements on a page–some input with a colection of form inputs and the appropriate labels and variables for that input. I've used ProForms in the past and rolled out my own when creating simply one off forms, but I wonder if anyone has found a good way of allowing form creation on page editing so that clients can adhocly make and edit forms?
      Thanks
    • By Atlasfreeman
      Hi!
      I want to make a small site, a one page site.
      And i have this idea about doing 2 to 3 diffrent template that i can load into the index / home page.

      I want to do this with an array so that i can keep creating more topics (with the template) id needed.
      <?php include('./head.inc'); // include header markup ?> <?php $children = $page->get('template=onecolmn|twocolumn, sort=sort'); foreach($children as $child) { include($child); } ?> <?php include('./foot.inc'); // include footer markup ?>  
      As you can see i have to template wish i want to control from the backend.
      I know include does not work this way, put what is my other option to make an array that loads the whole page on an other pages.
       
       
    • By Liam88
      Hi All,
      New user over at Processwire and have been rebuilding my site based on this CMS.
      I have been able to find so many answers through Google but I'm a little stuck on this one.
      I have my services page -> services categories -> category children.
      An example of those would be - domain -> services -> ppc -> management
      I also have a set of tags which have different names - services-tag -> grow-your-traffic
      Under these tags I would have multiple links to pages such as ppc, seo, social media and so on.
      A second example would be - services-tag -> convert-your-traffic
      Under here i would have multiple links to pages such as CRO
      Now the set of tags are not visible on-site as they are only created to give overview content to the main services categories.
      Using the categories and the tags I am looking to produce a layout such as (i have also attached an image as an example:
      Tag_1 headline
      Pull all services categories linking to Tag_1
      Tag_1 snippet
      Tag_2 headline
      Pull all services categories linking to Tag_2
      Tag_2 snippet
      So far I have this snippet which is pulling in the tag content but unable to get the posts to show under each of the tags. 
      If i change the if and statement to "tags" instead of "tag" then all posts show under all tags. Where as i want it to show only the posts which are linked to that tag.
      <?php namespace ProcessWire; $tags = $pages->get("/categories-services/")->children(); // Gets the tags $posts = $pages->get("/services/")->children(); // Gets the services categories $link = $tags->ref_6; // Gets the tags and services categories link - under here you have pages_id (services cat id) and data (tags id) // Tag header and summary foreach($tags as $tag) { // This breaks down the tags into sections echo '<section id="services"> <div class="container"> <div class="row"> <h2 class="heading-1"><span>'. $tag->headline.'</span></h2> <p class="mb-5">'. $tag->summary.'</p> </div> <div class="row justify-content-around services">'; // Main services categories that link to the above tags if ($posts->id === $link->pages_id && $tag->id === $link->data){ foreach($posts as $service){ // This pulls in the services categories under the tag header. echo '<div class="card flex-card" id=""> <div class="card-img"> <a href="/'. $service->name.'" title="'. $service->name .'"> <img class="card-img-top" src="../assets/files/'. $service->id.'/'. $service->img_1.'" alt="'. $service->img_1.'" title="'. $service->img_1.'"></a> </div> <div class="card-body"> <h3 class="card-title">'. $service->headline.'</h3> <p class="card-text">'. $service->summary .'</p> <div class="card-action"> <a href="" title="'. $service->name .'" role="link" class="link">View service<span></span></a> </div> </div> </div> '; } } // Grey snippet text echo '</div> </div> </section> <div class="snip-2 light-grey"> <div class="container"> <div class="row text-center">'. $tag->get('grey') .'</div> </div> </div>'; } ?> I appreciate this is a long post but i'm trying to be clear as I appreciate everyone's time.
      Any insight into where I am going wrong is greatly appreciated.
      Liam



×
×
  • Create New...