Jump to content


  • Content Count

  • Joined

  • Last visited

Community Reputation

90 Excellent

About a-ok

  • Rank
    Hero Member

Profile Information

  • Gender
    Not Telling

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. I ended up using Guzzle to do, for example, the following: // Shopify init function shopifyQL($query) { $shopifyHost = "xxxxx.myshopify.com"; $shopifyPassword = "xxxxx"; $graphqlEndpoint = "https://$shopifyHost/admin/api/2021-01/graphql.json"; $client = new \GuzzleHttp\Client(); $response = $client->request('POST', $graphqlEndpoint, [ 'headers' => [ 'Content-Type' => 'application/json', 'X-Shopify-Access-Token' => $shopifyPassword, 'X-Shopify-Api-Features' => 'include-presentment-prices' ], 'json' => [ 'query' => $query ] ]); $json = $response->getBody()->getContents(); $body = json_decode($json, true); $data = $body['data']; return $data; } // Get Shopify shop defaults (useful for currency checks) wire()->addHookMethod('Page::shopifyShop', function($event) { $page = $event->object; $query = <<<GQL query { shop { name primaryDomain { url host } } } GQL; // Get cache only if it's less than or equal to 1 month $result = wire('cache')->get('shopifyShop', WireCache::expireMonthly); if (!$result) { $result = shopifyQL($query); wire('cache')->save('shopifyShop', $result, WireCache::expireMonthly); } $event->return = $result; });
  2. I've been having a play... and I'm getting somewhere but passing the query itself is something I'm struggling with. I might end up using Guzzle but thought I'd see if it was possible using PW natively. // Shopify init $shopifyHttp = new WireHttp(); $shopifyHost = "xxxx.myshopify.com"; $shopifyPassword = "xxxx"; $shopifyHttp->setHeaders([ 'Content-Type' => 'application/json', 'X-Shopify-Access-Token' => $shopifyPassword, 'X-Shopify-Api-Features' => 'include-presentment-prices' ]); $shopifyBase = "https://$shopifyHost/admin/api/2021-01/graphql.json"; $query = <<<GQL query { shop { name primaryDomain { url host } } } } GQL; bdb($shopifyHttp->post($shopifyBase, [ 'query' => json_decode($query) ])); Any thoughts? I've tested the POST request in Postman and works and this was the PHP HTTP code for that... <?php require_once 'HTTP/Request2.php'; $request = new HTTP_Request2(); $request->setUrl('https://xxxxx.myshopify.com/admin/api/2021-01/graphql.json'); $request->setMethod(HTTP_Request2::METHOD_POST); $request->setConfig(array( 'follow_redirects' => TRUE )); $request->setHeader(array( 'X-Shopify-Access-Token' => 'xxxxx', 'Content-Type' => 'application/json', 'Cookie' => '_shopify_fs=2021-03-31T10%3A14%3A46Z; _y=82249b91-c91c-4631-8cb9-2a859e3e756e; _s=5be7df5e-f9a6-45a9-a472-e7f262f54a8b; _shopify_y=82249b91-c91c-4631-8cb9-2a859e3e756e; _shopify_s=5be7df5e-f9a6-45a9-a472-e7f262f54a8b' )); $request->setBody('{"query":" query {\\n shop {\\n name\\n primaryDomain {\\n url\\n host\\n }\\n }\\n }","variables":{}}'); try { $response = $request->send(); if ($response->getStatus() == 200) { echo $response->getBody(); } else { echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' . $response->getReasonPhrase(); } } catch(HTTP_Request2_Exception $e) { echo 'Error: ' . $e->getMessage(); }
  3. Thanks so much for this, @teppo 🙂 Yep, exactly. Currently I do something like the following in ready.php – I do something similar for products etc. // Shopify init $shopifyHttp = new WireHttp(); $shopifyHttp->setHeaders(['X-Shopify-Api-Features' => 'include-presentment-prices']); $shopifyHost = "xxxxxx.myshopify.com"; $shopifyAPIKey = "xxxxxx"; $shopifyPassword = "xxxxxx"; $shopifyBase = "https://$shopifyAPIKey:$shopifyPassword@$shopifyHost/admin/"; // Get Shopify shop defaults (useful for currency checks) wire()->addHookMethod("Page::shopifyShop", function($event) use($shopifyHttp, $shopifyBase) { $page = $event->object; // Get cache only if it's less than or equal to 1 month $result = wire("cache")->get("shopifyShop", WireCache::expireMonthly); if (!$result) { $result = $shopifyHttp->getJSON($shopifyBase . "shop.json"); wire("cache")->save("shopifyShop", $result, WireCache::expireMonthly); } $event->return = $result; }); This works great BUT the Shopify API is moving closer to GraphQL each day and feel like I should adapt, or die 😉 I'll look at those examples and see how I could change this up!
  4. Hi folks. I’m a bit confused. I built a site a year or so ago that uses `wireHttp()` to query Shopify endpoints and then would store this in the `wireCache` as well create pages on PW based on products returned etc. It was all quite simple but worked well. Anyway. I’m looking to replace this set up with GraphQL but I’m getting super confused. Is GraphQL a replacement for wireHttp as it’s a REST replacement? Can you use GraphQL on Processwire to return third party data? Any advice or help understanding would be really appreciated.
  5. Has anyone successfully used PW as a static site generator with Gatsby or Nuxt, for example? If so I need to pick your brain.
  6. Ah thanks @teppo I didn't manage to find this. Much appreciated. @adrian Thanks also! And yeah 🙄
  7. I was using MAMP for local development for years and Tracy never had any issues. I've recently just switched to using Laravel Valet with the custom driver and all seems okay but when I enable Tracy I get the following error. When I disable Tracey and debug `$_SERVER['REQUEST_URI']` it returns false. Any thoughts on how I can continue to use Tracy (which is so brilliant useful) when using Laravel Valet? Thanks!
  8. Hi folks, I've been moving away from a local set up of MAMP to Laravel Valet, which all seems okay. I'm using the PW driver too. I'm assuming that's working ok? Only issue I seem to have is with two modules: Field: Fieldtype 'FieldtypeRepeaterMatrix' does not exist Field: Fieldtype 'FieldtypeFieldsetGroup' does not exist These were installed and in use on my previous set up (MAMP) and the files are all there in the site/modules/ folder but for some reason they're not getting picked up? I've tried refreshing the modules as well as clearing the compiled files but no luck. Any immediate thoughts? Thanks!
  9. Bump? Still unsure of how best to fix this...
  10. I am not sure either. This helped me loads! Thanks!
  11. I believe the error was in fact the use of `->not()` as I was supply a PageArray to remove and not a selector? I simply changed this to the below which seems to have the same effect without the error? foreach ($results as $result) { if ($result->template->name == 'repeater_modulesA' && ($result->getForPage()->is('unpublished') || $result->getForPage()->is('trash'))) { $results->remove($result); } }
  12. I'm using the selector operator %= when returning search results: $searchQuery = $sanitizer->text($input->get->q); $searchQuery = $sanitizer->selectorValue($searchQuery); $input->whitelist('q', $searchQuery); $fieldsToSearch = 'title|text|textA|textarea|projectsCategories.title|projectsClients.title|aboutPressCategories.title|aboutPressClients.title'; $templatesToSearch = 'projectsSingle|shopSingle|typeSingle|typeCustomSingle|typeCustomSingleB|aboutPressSingle|repeater_modulesA'; $results = $pages->find("$fieldsToSearch%=$searchQuery, template=$templatesToSearch, sort=sort, check_access=0"); However, I'm getting an error: ProcessWire\WireException Unknown Selector operator: -- was your selector value properly escaped? field=, value=, selector: If I change the operator from %= to = then no error is returned but obviously this isn't the ideal operator for what I'm doing. However, to create even more mystery, this error seems only to be returned when using certain words. For example 'house' will return the error but 'houses' won't. So now I'm thinking the error is actually not related to the above but actually to what follows... $resultsToRemove = new PageArray(); foreach ($results as $result) { if ($result->template->name == 'repeater_modulesA' && ($result->getForPage()->is('unpublished') || $result->getForPage()->is('trash'))) { $resultsToRemove->add($result); } } if (count($resultsToRemove)) $results = $results->not($resultsToRemove); $resultCount = count($results); This part is required as I am searching repeater templates using check_access=0 but obviously don't want unpublished repeater rows or trashed repeaters to be returned so I need to do a little check. I think this is maybe where it's breaking but can't know for sure. I'm also unsure why it would break for the search query 'house' but not 'houses'? If I can provide any more info to help me resolve this I can do... just a bit stumped.
  13. a-ok


    Is it possible to assign a PDF filename via a hook? I want to assign a different filename (custom, not using {page.id} etc) for different pages.
  14. @kongondo Thanks! Using vanilla/alpine/react sort of thing but yeah principle should be the same 🙂 Okay great. Will be in touch if I have any more questions but super appreciate the help/advice.
  15. @kongondo This is super interesting. My set up in PW is the following: Works Categories Artworks Digital Painting Books Editions Work Work Work Activities Categories Events Reading Talks Workshops Exhibitions Curated Group Solo Publications Anthologisations Books Editing Essays Activity Activity Activity And what I'm wanting to do on the front end (with JS) is when the user clicks 'Works' then it shows the first category level ('Artworks', 'Books', 'Editions'), then if the user clicks 'Artworks' it would show 'Digital' and 'Painting' while keeping the previous 'parents' active. I'll figure out the JS somehow for the menu but I'm guessing your method (which I think is a super smart way of doing it) would structurally allow for this sort of functionality?
  • Create New...