Jump to content
dadish

GraphQL for ProcessWire

Recommended Posts

25 minutes ago, dragan said:

Granted, I didn't do extensive testing so far, but I guess it throws errors each time when there is no value in a field. (hence, the selector "only show if images.count > 0" was working fine). Could that be? Earlier it just outputted empty nodes or null instead (which I would expect and is totally fine).

It could be. When some field is empty it should return null or empty array. Somewhere in the code it might be trying to return a value instead. I'm looking into FieldtypeInteger and can't quite figure out yet what I missed.

  • Like 1

Share this post


Link to post
Share on other sites

New Version 1.0.4

- Fixes empty value bug for FieldtypeInteger.

@dragan I was able to reproduce error for FieldtypeInteger. Turns out ProcessWire returns an empty string instead of null when FieldtypeInteger is empty. That's why GraphQL schema was complaining about getting empty string instead of Int.

Let me know if the latest patch works for you.

  • Like 3

Share this post


Link to post
Share on other sites

@dadish 

Thanks for the quick update / fix.

I tried it again today, and while empty int fields are no longer a problem, I get some other strange issues:

I can query some page reference fields, but not others. The error shown is like:

Spoiler

{
  "errors": [
    {
      "message": "Cannot query field \"title\" on type \"Page\".",
      "extensions": {
        "category": "graphql"
      },
      "locations": [
        {
          "line": 10,
          "column": 11
        }
      ]
    },
    {
      "message": "Cannot query field \"title\" on type \"Page\".",
      "extensions": {
        "category": "graphql"
      },
      "locations": [
        {
          "line": 15,
          "column": 11
        }
      ]
    },
    {
      "message": "Cannot query field \"title\" on type \"Page\".",
      "extensions": {
        "category": "graphql"
      },
      "locations": [
        {
          "line": 20,
          "column": 11
        }
      ]
    }
  ]
}

Unlike with the integer issue, the output stops, i.e. there is no additional data output shown.

I compared a pageref field that doesn't throw GraphQL errors with another one that does:

The one that works shows this in the documentation explorer panel: (when searching with the field-name)

ProductPageArray
ProductPage
ProjectPage.product
ProjectCreateInput.product
ProjectUpdateInput.product

While others just show:

ProjectPage.industry
ProjectCreateInput.industry
ProjectUpdateInput.industry

(project = template, product + industry = page reference fields)

Does that give you a hint what's happening behind the scenes? 

Share this post


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

"message": "Cannot query field \"title\" on type \"Page\".",

 

When you create a FieldtypePage field it can store a reference to any page. Which means the module cannot know which template those pages have upfront, which in turn means we cannot know which fields those pages will have when we generate the schema (except built in fields like id, name, url and etc). But if you set a particular template for selectable pages for that field, then it will detect it and additional template fields for your page references will be available.

So my guess would be that your page reference field does not have a template assigned to it. Is that your case?

  • Like 1

Share this post


Link to post
Share on other sites
11 minutes ago, dadish said:

So my guess would be that your page reference field does not have a template assigned to it. Is that your case?

No, they all have a template assigned (most though without a physical file - don't think that should matter).

12 minutes ago, dadish said:

which in turn means we cannot know which fields those pages will have when we generate the schema (except built in fields like id, name, url and etc)

I only ever just use the system-field title. Is that not included?

Strange thing is that if I replace title with name in the query, it works. But (again, just for some PR fields) if use title, I get errors.

Share this post


Link to post
Share on other sites
27 minutes ago, dragan said:

I only ever just use the system-field title. Is that not included?

No, it's not. The title field can be removed from the page. so it's not included by default.

28 minutes ago, dragan said:

Strange thing is that if I replace title with name in the query, it works. But (again, just for some PR fields) if use title, I get errors.

In your graphql documentation, does your page reference fields has a title field in them?

  • Like 1

Share this post


Link to post
Share on other sites
28 minutes ago, dadish said:

In your graphql documentation, does your page reference fields has a title field in them?

Yes. 

PageType with template service.

title: PageTitle!
Field with the type of FieldtypePageTitle

It's listed in the config under "legalFields" (showing as "title (system)").

However, I can't choose it from legalPageFields, i.e. the dropdown doesn't list it.

Share this post


Link to post
Share on other sites
2 minutes ago, dragan said:

However, I can't choose it from legalPageFields, i.e. the dropdown doesn't list it.

That's fine. You should set it under legalFields config. The legalPageFields is for built-in fields like name, id, path, url, created and etc.

I'm still not sure how this could be happening. You're the second person with this problem but I can't reproduce it. Page reference fields have title and I can query them on my installations. Is there any chance that you can reproduce this in any of the Site Profiles? Then you can export it with Site Profile Exporter and share with me. I will continue trying to reproduce it but it'll go faster if you help me with it.

  • Like 2

Share this post


Link to post
Share on other sites
8 minutes ago, dadish said:

Is there any chance that you can reproduce this

I'll gladly do so and try to find a pattern that might help to isolate/identify the root cause. Alas, this week I'm short on time 😞

 

Share this post


Link to post
Share on other sites

New Version 1.0.5

- Fixes empty value bug for FieldtypePage and FieldtypePage::derefAsPageOrFalse setting.

@dragan I was trying to reproduce your bug but encountered different one which is also related to FieldtypePage. This probably not related to your bug but try it anyway when you have time.

 

  • Like 2

Share this post


Link to post
Share on other sites

When trying to fetch Repeater fields with module version 1.0.5, I get responses like this one:

[ 
	{ 
		"title": "", 
		"body": "", 
		"products": { 
			"list": [], 
			"__typename": "ProductPageArray" 
		}, 
		"__typename": "RepeaterProductGroupsPage" 
	},
	{ 
		"title": "", 
		"body": "", 
		"products": { 
			"list": [], 
			"__typename": "ProductPageArray" 
		}, 
		"__typename": "RepeaterProductGroupsPage" 
	} 
]

So I get an answer with the expected data structure (and no errors whatsoever), but the values of the fields are always empty. Also the amount of repeater items in the response matches with the backend. This is when I send the request from the frontend (via Apollo). Looking at the same query within GraphiQL returns the data with the correct values.

Could this be a permission problem? I correctly set the access permissions to view for all the fields mentioned in the query.

Share this post


Link to post
Share on other sites
6 hours ago, charger said:

Could this be a permission problem? I correctly set the access permissions to view for all the fields mentioned in the query.

Yes, it is probably a permission problem. For the page fields. You need to make sure the user has view permission for the pages in the page field. So in your case, you need to make sure that user has a view permission for product template.

Not sure why the title and body are not showing up. But, If you are setting permissions in the template context, then you need to set them for the fields in your repeater too. Either via the repeater field settings or via the template that your repeater is using. That would be repeater_product_groups template, if I guessed the name correctly.

Share this post


Link to post
Share on other sites

The template permissions are set correctly then. The guest role has view permission on the product template.

I’m setting the field permissions not in template context, but per field. So they all have the view permission, also in template context. Just double-checked that. What’s weird is that title and body generally work outside a repeater field. It’s only within the repeater field, that they return no values.

Any other ideas?

Share this post


Link to post
Share on other sites

@charger So the bug you're facing is due to the fact that repeaters are pages under the hood and the module checks permission those pages as well and since you do not have view access enabled for your repeater template the values return empty. So in version 1.0.5 you just need to enable view access for your repeater template repeater_product_groups and the values should show up.

But since you are already enabling view for your repeater field I think it's safe to assume that you want to enable view for template that used by that repeater field too. So for latest version 1.0.6 that I just released you don't have to enable access to your repeater templates. Just enabling access to your repeater field is enough.

New Version 1.0.6

Just upgrade the module to the version above and let me know if it solves your problem.

  • Like 2

Share this post


Link to post
Share on other sites

@dadish I’m afraid the problem persists. I get the exact same response. I cleared compiled files and browser cache.

Share this post


Link to post
Share on other sites

@charger I have no other ideas how to solve your case. Could you describe the steps to reproduce the error? You can take a starting point of any site profile and outline the steps to reproduce the issue. That would make it much easier for me to help you.

  • Like 1

Share this post


Link to post
Share on other sites

I could track down the problem to Apollo fragments (specifically using the same fragment more than once in the same query). Not sure why this only popped up inside Repeater fields though.

Thanks for the support!

Share this post


Link to post
Share on other sites

Hi @dadish the module is awesome. But i have some troubles with language support.

Here is my query:

{
  language(name: "default")
  airport(s: "limit=4, sort=title") {
    list {
      id
      title
    }
  }
}

Here is the response problem:

{
  "errors": [
    {
      "message": "Cannot query field \"language\" on type \"Query\".",
      "extensions": {
        "category": "graphql"
      },
      "locations": [
        {
          "line": 2,
          "column": 3
        }
      ]
    },
    {
      "message": "Cannot query field \"title\" on type \"AirportPage\".",
      "extensions": {
        "category": "graphql"
      },
      "locations": [
        {
          "line": 6,
          "column": 7
        }
      ]
    }
  ]
}

title field has type - Page Title (Multi-Language), but as it mentioned above response is "Cannot query field \"title\" on type \"AirportPage\"

Here is GraphQL module configuration screen.

image.thumb.png.52deabac2d789cf74b032aa527375c5d.png

Where did I make a mistake?

  • Like 1

Share this post


Link to post
Share on other sites
9 hours ago, Ilyas said:

Where did I make a mistake?

Nowhere. This is embarrassing. I forgot about language field when I rewrote the module for alternative graphql library. My bad, sorry.

New Version 1.1.0

I updated the module to support languages now. Please upgrade and it should work fine. Sorry for inconvenience and thanks a lot for the feedback.

  • Like 2

Share this post


Link to post
Share on other sites

Hello,
First i want to to thank @dadish for this very helpful module! 
I played around a bit with existing pages (in development) and i have a question regarding the "title issue":

I'm trying to get the title from child pages with this query:

{
  job{
    getTotal
    list {
      title
      id
      job_client {
        list {
          title
        }
      }
      children(s: "template=task") {
        list {
          title
        }
      }
    }
  }
}

the task template has the title field but i only get this result:

{
  "errors": [
    {
      "message": "Cannot query field \"title\" on type \"Page\".",
      "extensions": {
        "category": "graphql"
      },
      "locations": [
        {
          "line": 14,
          "column": 11
        }
      ]
    }
  ]
}

Children results work with "name" instead of "title"...

Share this post


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 MoritzLost
      This is a new module that provides a simple solution to clearing all your cache layers at once, and an extensible interface to perform various cache-related actions.
      The simple motivation behind this module was that I was tired of manually clearing caches in several places after deploying a change on a live site. The basic purpose of this module is a simple Clear all caches link in the Setup menu which clears out all caches, no matter where they hide. You can customize what exactly the module does through it's configuration menu:
      Expire or delete all cache entries in the database, or selectively clear caches by namespace ($cache API) Clear the the template render cache. Clear out specific folders inside your site's cache directory (/site/assets/cache) Refresh version strings for static assets to bust client-side browser caches (this requires some setup, see the full documentation for details). This is the basic function of the module. However, you can also add different cache management action through the API and execute them through the module's interface. For this advanced usage, the module provides:
      An interface to see all available cache actions and execute them. A system log and logging output on the module page to see verify what the module is doing. A CacheControlTools class with utility functions to clear out different caches. An API to add cache actions, execute them programmatically and even modify the default action. Permission management, allowing you granular control over which user roles can execute which actions. The complete documentation can be found in the module's README.
      Beta release
      Note that I consider this a Beta release. Since the module is relatively aggressive in deleting some caches, I would advise you to install in on a test environment before using it on a live site.
      Let me know if you're getting any errors, have trouble using the module or if you have suggestions for improvement!
      In particular, can someone let me know if this module causes any problems with the ProCache module? I don't own or use it, so I can't check. As far as I can tell, ProCache uses a folder inside the cache directory to cache static pages, so my module should be able to clear the ProCache site cache as well, I'd appreciate it if someone can test that for me.
      Future plans
      If there is some interest in this, I plan to expand this to a more general cache management solution. I particular, I would like to add additional cache actions. Some ideas that came to mind:
      Warming up the template render cache for publicly accessible pages. Removing all active user sessions. Let me know if you have more suggestions!
      Links
      https://github.com/MoritzLost/ProcessCacheControl ProcessCacheControl in the Module directory

    • By joshua
      This module is (yet another) way for implementing a cookie management solution.
      Of course there are several other possibilities:
      - https://processwire.com/talk/topic/22920-klaro-cookie-consent-manager/
      - https://github.com/webmanufaktur/CookieManagementBanner
      - https://github.com/johannesdachsel/cookiemonster
      - https://www.oiljs.org/
      - ... and so on ...
      In this module you can configure which kind of cookie categories you want to manage:

      You can also enable the support for respecting the Do-Not-Track (DNT) header to don't annoy users, who already decided for all their browsing experience.
      Currently there are four possible cookie groups:
      - Necessary (always enabled)
      - Statistics
      - Marketing
      - External Media
      All groups can be renamed, so feel free to use other cookie group names. I just haven't found a way to implement a "repeater like" field as configurable module field ...
      When you want to load specific scripts ( like Google Analytics, Google Maps, ...) only after the user's content to this specific category of cookies, just use the following script syntax:
      <script type="optin" data-type="text/javascript" data-category="statistics" data-src="/path/to/your/statistic/script.js"></script> <script type="optin" data-type="text/javascript" data-category="marketing" data-src="/path/to/your/mareketing/script.js"></script> <script type="optin" data-type="text/javascript" data-category="external_media" data-src="/path/to/your/external-media/script.js"></script> <script type="optin" data-type="text/javascript" data-category="marketing">console.log("Inline scripts are also working!");</script> The type has to be "optin" to get recognized by PrivacyWire, the data-attributes are giving hints, how the script shall be loaded, if the data-category is within the cookie consents of the user. These scripts are loaded asynchronously after the user made the decision.
      If you want to give the users the possibility to change their consent, you can use the following Textformatter:
      [[privacywire-choose-cookies]] It's planned to add also other Textformatters to opt-out of specific cookie groups or delete the whole consent cookie.
      You can also add a custom link to output the banner again with a link / button with following class:
      <a href="#" class="privacywire-show-options">Show Cookie Options</a> <button class="privacywire-show-options">Show Cookie Options</button> This module is still in development, but we already use it on several production websites.
      You find it here: https://github.com/blaueQuelle/privacywire/tree/master
      Download: https://github.com/blaueQuelle/privacywire/archive/master.zip
      I would love to hear your feedback 🙂
      Edit: Updated URLs to master tree of git repo
       
    • By David Karich
      Admin Page Tree Multiple Sorting
      ClassName: ProcessPageListMultipleSorting
      Extend the ordinary sort of children of a template in the admin page tree with multiple properties. For each template, you can define your own rule. Write each template (template-name) in a row, followed by a colon and then the additional field names for sorting.
      Example: All children of the template "blog" to be sorted in descending order according to the date of creation, then descending by modification date, and then by title. Type:
      blog: -created, -modified, title  Installation
      Copy the files for this module to /site/modules/ProcessPageListMultipleSorting/ In admin: Modules > Check for new modules. Install Module "Admin Page Tree Multible Sorting". Alternative in ProcessWire 2.4+
      Login to ProcessWire backend and go to Modules Click tab "New" and enter Module Class Name: "ProcessPageListMultipleSorting" Click "Download and Install"   Compatibility   I have currently tested the module only under PW 2.6+, but think that it works on older versions too. Maybe someone can give a feedback.     Download   PW-Repo: http://modules.processwire.com/modules/process-page-list-multiple-sorting/ GitHub: https://github.com/FlipZoomMedia/Processwire-ProcessPageListMultipleSorting     I hope someone can use the module. Have fun and best regards, David
    • By dimitrios
      Hello,
      this module can publish content of a Processwire page on a Facebook page, triggered by saving the Processwire page.
      To set it up, configure the module with a Facebook app ID, secret and a Page ID. Following is additional configuration on Facebook for developers:
      Minimum Required Facebook App configuration:
      on Settings -> Basics, provide the App Domains, provide the Site URL, on Settings -> Advanced, set the API version (has been tested up to v3.3), add Product: Facebook Login, on Facebook Login -> Settings, set Client OAuth Login: Yes, set Web OAuth Login: Yes, set Enforce HTTPS: Yes, add "https://www.example.com/processwire/page/" to field Valid OAuth Redirect URIs. This module is configurable as follows:
      Templates: posts can take place only for pages with the defined templates. On/Off switch: specify a checkbox field that will not allow the post if checked. Specify a message and/or an image for the post.
      Usage
      edit the desired PW page and save; it will post right after the initial Facebook log in and permission granting. After that, an access token is kept.
       
      Download
      PW module directory: http://modules.processwire.com/modules/auto-fb-post/ Github: https://github.com/kastrind/AutoFbPost   Note: Facebook SDK for PHP is utilized.


×
×
  • Create New...