Jump to content
Gadgetto

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.

Share this post


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?

Yep it should be a prefix. Sorry for my bad English ...

Share this post


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?

Share this post


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; ?>

 

Share this post


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.

Share this post


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.

Share this post


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?

Share this post


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

Or do you mean creating a page for each order?

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

Share this post


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?

Share this post


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

Share this post


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?

Share this post


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

Share this post


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 👽

Share this post


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

Share this post


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

Share this post


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

Share this post


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');

 

Share this post


Link to post
Share on other sites

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

Share this post


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.

Share this post


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.

Share this post


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.

Share this post


Link to post
Share on other sites

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

Share this post


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

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