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

@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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By Gadgetto
      SnipWire - Snipcart integration for ProcessWire
      Snipcart is a powerful 3rd party, developer-first HTML/JavaScript shopping cart platform. SnipWire is the missing link between Snipcart and the content management framework ProcessWire.
      With SnipWire, you can quickly turn any ProcessWire site into a Snipcart online shop. The SnipWire plugin helps you to get your store up and running in no time. Detailed knowledge of the Snipcart system is not required.
      SnipWire is free and open source licensed under Mozilla Public License 2.0! A lot of work and effort has gone into development. It would be nice if you could donate an amount to support further development:

      Status update links (inside this thread) for SnipWire development
      2020-01-21 -- Snipcart v3 - when will the new cart system be implemented? 2020-01-19 -- integrated taxes provider finished (+ very flexible shipping taxes handling) 2020-01-14 -- new date range picker, discount editor, order notifiactions, order statuses, and more ... 2019-11-15 -- orders filter, order details, download + resend invoices, refunds 2019-10-18 -- list filters, REST API improvements, new docs platform, and more ... 2019-08-08 -- dashboard interface, currency selector, managing Orders, Customers and Products, Added a WireTabs, refinded caching behavior 2019-06-15 -- taxes provider, shop templates update, multiCURL implementation, and more ... 2019-06-02 -- FieldtypeSnipWireTaxSelector 2019-05-25 -- SnipWire will be free and open source Plugin Key Features
      Fast and simple store setup Full integration of the Snipcart dashboard into the ProcessWire backend (no need to leave the ProcessWire admin area) Browse and manage orders, customers, discounts, abandoned carts, and more Process refunds and send customer notifications from within the ProcessWire backend Complete Snipcart webhooks integration (all events are hookable via ProcessWire hooks) Integrated taxes provider (which is more flexible then Snipcart own provider) Useful Links
      SnipWire in PW modules directory (alpha version only available via GitHub) SnipWire Docs (please note that the documentation is a work in progress) SnipWire @GitHub (feature requests and suggestions for improvement are welcome - I also accept pull requests) Snipcart Website  
      ---- INITIAL POST FROM 2019-05-25 ----
       
    • By d'Hinnisdaël
      Happy new year, everybody 🥬
      I've been sitting on this Dashboard module I made for a client and finally came around to cleaning it up and releasing it to the wider public. This is how it looks.
      ProcessWire Dashboard

      If anyone is interested in trying this out, please go ahead! I'd love to get some feedback on it. If this proves useful and survives some real-world testing, I'll add this to the module directory.
      Download
      You can find the latest release on Github.
      Documentation
      Check out the documentation to get started. This is where you'll find information about included panel types and configuration options.
      Custom Panels
      My goal was to make it really simple to create custom panels. The easiest way to do that is to use the panel type template and have it render a file in your templates folder. This might be enough for 80% of all use cases. For anything more complex (FormBuilder submissions? Comments? Live chat?), you can add new panel types by creating modules that extend the DashboardPanel base class. Check out the documentation on custom panels or take a look at the HelloWorld panel to get started. I'm happy to merge any user-created modules into the main repo if they might be useful to more than a few people.
       Disclaimer
      This is a pre-release version. Please treat it as such — don't install it on production sites. Just making sure 🍇
      Roadmap
      These are the things I'm looking to implement myself at some point. The wishlist is a lot longer, but those are the 80/20 items that I probably won't regret spending time on.
      Improve documentation & add examples ⚙️ Panel types Google Analytics ⚙️ Add new page  🔥 Drafts 🔥 At a glance / Page counter 404s  Layout options Render multiple tabs per panel panel groups with heading and spacing between ✅ panel wrappers as grid item (e.g. stacked notices) ✅ Admin themes support AdminThemeReno and AdminThemeDefault ✅ Shortcuts panel add a table layout with icon, title & summary ✅ Chart panel add default styles for common chart types ✅ load chart data from JS file (currently passed as PHP array) Collection panel support image columns ✅ add buttons: view all & add new ✅
    • By Robin S
      This module is inspired by and similar to the Template Stubs module. The author of that module has not been active in the PW community for several years now and parts of the code for that module didn't make sense to me, so I decided to create my own module. Auto Template Stubs has only been tested with PhpStorm because that is the IDE that I use.
      Auto Template Stubs
      Automatically creates stub files for templates when fields or fieldgroups are saved.
      Stub files are useful if you are using an IDE (e.g. PhpStorm) that provides code assistance - the stub files let the IDE know what fields exist in each template and what data type each field returns. Depending on your IDE's features you get benefits such as code completion for field names as you type, type inference, inspection, documentation, etc.
      Installation
      Install the Auto Template Stubs module.
      Configuration
      You can change the class name prefix setting in the module config if you like. It's good to use a class name prefix because it reduces the chance that the class name will clash with an existing class name.
      The directory path used to store the stub files is configurable.
      There is a checkbox to manually trigger the regeneration of all stub files if needed.
      Usage
      Add a line near the top of each of your template files to tell your IDE what stub class name to associate with the $page variable within the template file. For example, with the default class name prefix you would add the following line at the top of the home.php template file:
      /** @var tpl_home $page */ Now enjoy code completion, etc, in your IDE.

      Adding data types for non-core Fieldtype modules
      The module includes the data types returned by all the core Fieldtype modules. If you want to add data types returned by one or more non-core Fieldtype modules then you can hook the AutoTemplateStubs::getReturnTypes() method. For example, in /site/ready.php:
      // Add data types for some non-core Fieldtype modules $wire->addHookAfter('AutoTemplateStubs::getReturnTypes', function(HookEvent $event) { $extra_types = [ 'FieldtypeDecimal' => 'string', 'FieldtypeLeafletMapMarker' => 'LeafletMapMarker', 'FieldtypeRepeaterMatrix' => 'RepeaterMatrixPageArray', 'FieldtypeTable' => 'TableRows', ]; $event->return = $event->return + $extra_types; }); Credits
      Inspired by and much credit to the Template Stubs module by mindplay.dk.
       
      https://github.com/Toutouwai/AutoTemplateStubs
      https://modules.processwire.com/modules/auto-template-stubs/
    • By Mike Rockett
      Jumplinks for ProcessWire
      Release: 1.5.60
      Composer: rockett/jumplinks
      ⚠️ NOTICE: 1.5.60 is an important security patch-release for an XSS vulnerability discovered by @phlp. It's HIGHLY RECOMMENDED that all Jumplinks users update to the latest version as soon as possible.
      Jumplinks is an enhanced version of the original ProcessRedirects by Antti Peisa.
      The Process module manages your permanent and temporary redirects (we'll call these "jumplinks" from now on, unless in reference to redirects from another module), useful for when you're migrating over to ProcessWire from another system/platform. Each jumplink supports wildcards, shortening the time needed to create them.
      Unlike similar modules for other platforms, wildcards in Jumplinks are much easier to work with, as Regular Expressions are not fully exposed. Instead, parameters wrapped in curly braces are used - these are described in the documentation.
      Under Development: 2.0, to be powered by FastRoute
      As of version 1.5.0, Jumplinks requires at least ProcessWire 2.6.1 to run.
      View on GitLab
      Download via the Modules Directory
      Read the docs
      Features
      The most prominent features include:
      Basic jumplinks (from one fixed route to another) Parameter-based wildcards with "Smart" equivalents Mapping Collections (for converting ID-based routes to their named-equivalents without the need to create multiple jumplinks) Destination Selectors (for finding and redirecting to pages containing legacy location information) Timed Activation (activate and/or deactivate jumplinks at specific times) 404-Monitor (for creating jumplinks based on 404 hits) Additionally, the following features may come in handy:
      Stale jumplink management Legacy domain support for slow migrations An importer (from CSV or ProcessRedirects) Feedback & Feature Requests
      I’d love to know what you think of this module. Please provide some feedback on the module as a whole, or even regarding smaller things that make it whole. Also, please feel free to submit feature requests and their use-cases.
      Note: Features requested so far have been added to the to-do list, and will be added to 2.0, and not the current dev/master branches.
      Open Source

      Jumplinks is an open-source project, and is free to use. In fact, Jumplinks will always be open-source, and will always remain free to use. Forever. If you would like to support the development of Jumplinks, please consider making a small donation via PayPal.
      Enjoy! 🙂
    • By Robin S
      Add Image URLs
      Allows images/files to be added to Image/File fields by pasting URLs.

      Usage
      Install the Add Image URLs module.
      A "Paste URLs" button will be added to all image and file fields. Use the button to show a textarea where URLs may be pasted, one per line. Images/files are added when the page is saved.
       
      https://github.com/Toutouwai/AddImageUrls
      https://modules.processwire.com/modules/add-image-urls/
×
×
  • Create New...