Jump to content

SnipWire - Snipcart integration for ProcessWire


Recommended Posts

8 hours ago, d'Hinnisdaël said:

I think there will be cases where custom fields will differ by product template, so the order might not be guaranteed and it's probably better to name them after their content (custom_field_size instead of custom_field_1). But how do you determine the option n° for Snipcart — if you move around the field in the template, should it keep its ID to keep order records consistent, or does that not matter as long as it's named properly?

Taking this example from Snipcart docs ...

data-item-custom1-name="Print label"
data-item-custom1-required="true"
data-item-custom2-name="Size"
data-item-custom2-options="Small|Medium|Large"
data-item-custom2-value="Medium"
data-item-custom3-name="Gift"
data-item-custom3-options="true|false"

... this could be translated to this naming convention:

snipcart-item-c-{fieldname}-{param}

(The "c" is to avoid naming collisions with existing snipcart-item fields)

snipcart-item-c-printlabel
snipcart-item-c-size
snipcart-item-c-gift

The n° option could be detected/added automatically by the field order within a template. But would this be flexible enough?

If we'd use this convention:

snipcart-item-c1-{fieldname}-{param}
snipcart-item-c2-{fieldname}-{param}
snipcart-item-c3-{fieldname}-{param}

We would block the reusability of fields in multiple templates.

Link to post
Share on other sites
1 hour ago, szabesz said:

What do you mean by saying "start with"? Is the example above a prefix or the complete fieldname?

Why not? 🙂 

Good question! 🙂 Its probably the best way to have a separate "order" template. But then wouldn't I also need a separate "Order" page?

Link to post
Share on other sites
1 hour ago, Gadgetto said:

Taking this example from Snipcart docs ...


data-item-custom1-name="Print label"
data-item-custom1-required="true"
data-item-custom2-name="Size"
data-item-custom2-options="Small|Medium|Large"
data-item-custom2-value="Medium"
data-item-custom3-name="Gift"
data-item-custom3-options="true|false"

... this could be translated to this naming convention:

snipcart-item-c-{fieldname}-{param}

(The "c" is to avoid naming collisions with existing data-item fields)


snipcart-item-c-printlabel-name="Print label"
snipcart-item-c-printlabel-required="true"
snipcart-item-c-size-name="Size"
snipcart-item-c-size-options="Small|Medium|Large"
snipcart-item-c-size-value="Medium"
snipcart-item-c-gift-name="Gift"
snipcart-item-c-gift-options="true|false"

The n° option could be detected/added automatically by the field order within a template. But would this be flexible enough?

Are you sure that's the final markup? Whenever I had to use custom fields, the attribute names were kept as custom1, custom2, etc. So the example from the Snipcart docs are copy-paste and not meant to be changed to the fieldnames you have. It's of course possible that both work and Snipcart will detect the fields either way. Just checking.

This is an example from an existing shop I'm running:

<?php if ($cart_has_options): ?>
  data-item-custom1-name="<?= $cart_option_name ?>"
  data-item-custom1-options="<?= join('|', $cart_option_data) ?>"
  data-item-custom1-value="<?= $cart_option_value ?>"
<?php endif; ?>

 

Link to post
Share on other sites
7 hours ago, d'Hinnisdaël said:

Are you sure that's the final markup? Whenever I had to use custom fields, the attribute names were kept as custom1, custom2, etc. So the example from the Snipcart docs are copy-paste and not meant to be changed to the fieldnames you have. It's of course possible that both work and Snipcart will detect the fields either way. Just checking

Sorry, I didn’t mean this as the final html markup. I meant the naming convention for PW fields.

I edited my post above.

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

Its probably the best way to have a separate "order" template. But then wouldn't I also need a separate "Order" page?

Each pw order page could store the data of the related extra order fields. Order pages could be saved under Admin (page id 2) > Snipcart Orders > [order#n] similar to the way PW saves repeaters "hidden" under the Admin page.

Link to post
Share on other sites
8 hours ago, szabesz said:

Each pw order page could store the data of the related extra order fields. Order pages could be saved under Admin (page id 2) > Snipcart Orders > [order#n] similar to the way PW saves repeaters "hidden" under the Admin page.

A single order template with a single order page should be enough (for handling custom order fields). Or do you mean creating a page for each order?

Link to post
Share on other sites
On 1/24/2020 at 9:43 AM, d'Hinnisdaël said:

That's what I've done in the past: create an order template with fields that I map to custom options. Also good to have the consent text editable by site editors.

Regarding "custom order fields": It seems you have some experience integrating Snipcart into PW. I'm following your suggestion by preinstalling a "snipcart-order" template and a "snipcart-order" page under Admin / Setup / SnipWire. The goal is, that an admin could add PW fields to this page which should later be mapped (or "translated") to the required Snipcart markup.

But how should a PW field look like to get the required values from? 

Here is a sample Snipcart custom order field markup (taken from @Noborus sample) which should be generated from a PW field:

data-cart-custom1-name="By checking this box, I have read and agree to the <a href=\'https://www.processwire.com\' class=\'js-real-link\' target=\'_blank\'>Terms &amp; Conditions</a>"
data-cart-custom1-options="true|false"
data-cart-custom1-required="true"

One idea is, that I simply add a Textarea field where an admin could enter the config string from above. SnipWire will then render this to the <script> tag.

BTW, in this case we wouldn't even need a template/page/field. I could simply add a Textarea to module config where these strings could be stored.

What do you think?

Link to post
Share on other sites
21 hours ago, szabesz said:

Yes I do. I thought there is "custom data" related to each order but if not, then that is a different story.

Ah, ok! Snipcart custom order fields are global and valid/used for each order/cart.

  • Like 1
Link to post
Share on other sites
19 hours ago, Gadgetto said:

One idea is, that I simply add a Textarea field where an admin could enter the config string from above. SnipWire will then render this to the <script> tag.

BTW, in this case we wouldn't even need a template/page/field. I could simply add a Textarea to module config where these strings could be stored.

This might just be enough, but will this work reliably with multi-language setups?

The way I've done it in the past is by creating a repeater matrix field that has a string, an integer and a bool type for creating and editing options. But you'd have to create a field on installation and the matrix module isn't free, so I guess that's out of the question?

Link to post
Share on other sites
1 hour ago, d'Hinnisdaël said:

This might just be enough, but will this work reliably with multi-language setups?

The way I've done it in the past is by creating a repeater matrix field that has a string, an integer and a bool type for creating and editing options. But you'd have to create a field on installation and the matrix module isn't free, so I guess that's out of the question?

Yep, multi-language will require to use PW fields (at least to keep things simple). So I’ll stay with installing a cart template and a cart page where admins could add their custom cart fields. In the first version, I’ll solve this with a textarea field where the custom field config can be stored as is.

  • Like 1
Link to post
Share on other sites
57 minutes ago, Gadgetto said:

Yep, multi-language will require to use PW fields (at least to keep things simple). So I’ll stay with installing a cart template and a cart page where admins could add their custom cart fields. In the first version, I’ll solve this with a textarea field where the custom field config can be stored as is.

Sounds about right. Unfortunately, I've been too busy to try out the module properly and give more useful feedback 👽

Link to post
Share on other sites

UPDATE 2020-01-28

I just added the Snipcart "Custom Order Fields" feature!

Thank's @Noboru & @d'Hinnisdaël & @szabesz for your help and hints!

Custom order fields can be added/configured by editing a hidden config page under Admin > Setup > SnipWire > Custom Cart Fields.
The corresponding template/page/field resources are preinstalled by SnipWire installer. If you update to the new module versions, those resources will be added too!

1913208257_Bildschirmfoto2020-01-28um17_09_12.thumb.png.8845f692a8f2628b6991b9ca0a43e6a6.png

The config page has a single textarea field where you can add the configuration strings for your custom cart fields:
(multi language support is also available)

2020778956_Bildschirmfoto2020-01-28um17_09_54.thumb.png.e88956822a23fd27f9b24c403b8afc27.png

... can also be edited and enabled/disabled from within SnipWire module config.

581430103_Bildschirmfoto2020-01-29um12_22_36.thumb.png.ebb25dd301e0a425d5a9049bb639ebba.png

 

The config from the screenshot above leads to the custom step "Order Info" in checkout process:

324682490_Bildschirmfoto2020-01-28um17_29_04.thumb.png.9d857e73f9a3290703c1eabfd68827d7.png

The Snipcart docs for Custom Order Fields (v 2.0) can be read here:
https://docs.snipcart.com/v2/configuration/custom-fields

Next step is to implement custom product fields! When this is done, I'll release the first official version. SnipWire will then be added to the ProcessWire module directory (as far as @ryan accepts it).

  • Like 3
  • Thanks 1
Link to post
Share on other sites

UPDATE 2020-01-30

SnipWire 0.8.0 (beta) first public release!

It is done! After almost 1 year of hard work and a lot of help from the usual suspects I just released the first public version!
Please note that this is still a beta so please test, test, test before you use this plugin in a real project.

The module can be loaded via PW modules directory (just submitted - in review I think) or directly via GitHub.

More infos will be added soon ...

  • Like 3
  • Thanks 5
Link to post
Share on other sites

UPDATE 2020-02-03

SnipWire 0.8.1 (beta) released!

This update mainly serves to move all custom classes into their own namespaces! This should fix the annoying class naming conflicts with other modules.

Its now time to put some effort into the SnipWire docs!

  • Like 2
Link to post
Share on other sites

I'm just struggling with a problem regarding my MarkupSnipWire module (which is a part of SnipWire) and maybe I can get some hints here.

MarkupSnipWire is an autoloader module which - amongst other things - writes CSS and JS output required by Snipcart on page render. One of the required JS params is the currency in which the Snipcart shopping cart should run. By default it uses the "first" currency from SnipCarts module config.

I now want to implement a kind of "currency switcher" which should allow to (as the name says) switch the currency from within a ProcessWire template on the fly. So MarkupSnipWire should be able to receive the currency string (ISO 3 letters) and internally switch the used currency formats.

What would be the best method to send a param to an autoloader module?

If you have a look at the module code you can see there is a renderCSSJS method which is triggered by a hook after pager render in init().

https://github.com/gadgetto/SnipWire/blob/3d7af17a37fb20dcdd4038cd99339ecb704e5aef/MarkupSnipWire/MarkupSnipWire.module.php#L154

When this method is called, the $this->currency property already needs to be set.

setCurrency method is already available!

The goal is to let a developer use the SnipWire API variable in his templates like this:

$snipwire->setCurrency('usd');

 

Link to post
Share on other sites
26 minutes ago, bernhard said:

Can't you just save the currency in the user's $session ?

Hey @bernhard, this is not the problem. In front-end we could set the currency via POST, GET or SESSION or even via a API call $snipwire->setCurrency('usd');

But I'd like to set a parameter for MarkupSnipWire so that the module internally uses the desired currency for output rendering.

Link to post
Share on other sites

@Gadgetto First of all a big thank you for creating such a module!

I have installed it just now for the first time. I followed the installation / configuration steps, defined templates etc. But in the frontend I get an error when trying to access mysite.com/snipcart-shop/

1743277425_Screenshot_2020-02-07ErrorCalltoundefinedfunctionProcessWireukIcon().thumb.png.07d7e5be5916178130e7f01c95d74d1c.png

Any ideas what went wrong? I'm using latest PW dev, and AdminTheme UIKit is installed + active.

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

Any ideas what went wrong? I'm using latest PW dev, and AdminTheme UIKit is installed + active

Hi @dragan, this is a front-end problem:

The sample templates, which come as an additional installation, are based on the Regular site profile which is based on Markup regions output strategy and UIKit CSS framework.

ukIcon is a function in _uikit.php which is part of the regular site profile.

If you are using another profile or output strategy, you'll need to adapt the template source. If you like to run a quick test - just install PW using the "regular" profile.

Link to post
Share on other sites
Just now, dragan said:

Thank you. I'm using the multilanguage as base... getting the _uikit.php from Github did the trick!

Great! Just let me know if you need some help in using SnipWire as the docs are in the early stages at best... 😀

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...