In my code I am trying to read about 100 yml files and create an html table. The problem I am facing is I am unable to sort based on two columns. The column names are vendor and name.
I need to first sort on Vendor and then name.
It sorts on one columns only the vendor column and ignore the next column name.. All the column names are correct.
This is the code.
{% assign devices = "" | split: " " %}
{% for device in site.data.devices %}
{% assign devices = devices | push: device[1] %}
{% endfor %}
{% assign sorted = devices | sort_natural: 'name' | sort_natural: 'vendor' %}
{% assign lastVendor = "" %}
{% assign nbDevices = 0 %}
{%- for device in sorted %}
{%- assign nbDevices = nbDevices | plus:'1' %}
{%- assign lastVendor = device.vendor %}`
Here i start creating the table which gets filled with values from the yml files.
The table when created is sorted on only one column. Either vendor or name.
Tried group_by as suggested here but then no values show up in the table not sure why.
Tried sort and sort_natural both the effect is the same.
Any suggestions as to what I am doing wrong here.
Finally figured out why the code was not working.
We were building our jekyll site using docker. The docker image was outdated.
A build using just bundle exec jekyll serve resolved the issue !!
Now need to update the bundler and gems....still figuring out what all gets updated and will post here in case it helps anyone.
Related
I have a Jekyll site with articles about products. At the top of each post.md I include a file with {%- include vars -%}. vars is an include file that contains {%- include varfiles/product.html id=page.product -%}. It automatically grabs the product number into the page, and then passes it to product.html in the varfiles folder. The following is product.html
{%- assign product = site.data.products | where:"id",include.id | first -%}
<!-- product name -->
{%- if product.name -%}
{%- capture product-name -%}
{{ product.name }}
{%- endcapture -%}
{%- endif -%}
plus a lot more similar to the code above
The file is essentially many types of variable name creators based on the product properties pulled from the products data file, which is a list of products. The result is when I add the {%- include vars -%} at the top of any post.md it will automatically generate easier to remember/use variables names based on the product id number in the frontmatter. Then I can include the variable names throughout the article like {{ product-name }} and it automatically resolves from the variables that were created from the vars include.
THE PROBLEM: Whne I upgrade jekyll to use 4.0 all of the variables are empty. When putting {{ product-name }} somewhere in post.md under the vars include it would automatically convert it to the products name. On 4.0 it becomes empty. The only change I'm making is updating to Jekyll 4.0. If I downgrade all the variables work fine.
The workaround that seems to work is to change
{%- assign product = site.data.products | where:"id",include.id | first -%}
to
{%- assign product = site.data.products[include.id] -%}
no clue why that works.
I am using Shopify and creating a re-order button within the file named order.liquid.
while trying to create the re-order button I have had a moderate level of success.
The script I attach does indeed add the items to the cart that were previously ordered. However, I have tried without adding the quantity (just adds 1 of each). Without the [] after the &quantityHERE= (just adds two of each even if it was previously only one item bought).
Heres the code that creates my half-working URL:
{% assign line_items_string = '/cart/' %}
{% for line_item in order.line_items %}
{% if forloop.first == true %}
{% assign line_items_string = line_items_string | append: 'add?id[]=' %}
{% assign line_items_string = line_items_string | append: line_item.variant_id %}
{% assign line_items_string = line_items_string | append: '&quantity[]=' %}
{% assign line_items_string = line_items_string | append: line_item.quantity %}
{% else %}
{% assign line_items_string = line_items_string | append: '&id[]=' %}
{% assign line_items_string = line_items_string | append: line_item.variant_id %}
{% assign line_items_string = line_items_string | append: '&quantity[]=' %}
{% assign line_items_string = line_items_string | append: line_item.quantity %}
{% endif %}
{% endfor %}
Re-order
I am unable to get it to add the correct amount of items per line item even though the URL appears correct:
/cart/add?id[]=16220586868785&quantity[]=3&id[]=16220587360305&quantity[]=6&id[]=16220587622449&quantity[]=4&id[]=16221376479281&quantity[]=11&id[]=16221376348209&quantity[]=2&id[]=16221063938097&quantity[]=1&id[]=16221393682481&quantity[]=2
The fact the string ends with quantity 2 and will then add 2 of each item suggests it only uses the last declaration of quantity when dealing with the link. Therefore there must be a separator that can be used to distinguish between line items.
What is the separator that would go between each line items addition to the query string please? What goes after?
add?id[]=16220586868785&quantity[]=3**HERE**
I have tried using a , but admittedly this looks out of place followed by an &.
Edit
To help describe further what I have tried.
I am able to use the format ID:quantity if I:
want to go straight to checkout, the format is ID:quantity,ID:quantity.. so on.
only wish to add one item of a certain quantity to cart using add?ID:Quantity.
I need to know how to chain multiple to only add to cart. I don't know the separator (that is a comma when pushing straight to checkout).
Using permalinks to re-order things is always the ID:quantity. Have you tried that?
I would consider implementing this using jquery or javascript. You can create an ajax post using the cart/add.js call described here: https://help.shopify.com/en/themes/development/getting-started/using-ajax-api#add-to-cart
I'm trying to use where_exp to filter Jekyll pages based on two categories using or operator:
{% assign sortedPages = site.pages | sort:"date" | reverse | where_exp:"page","page.categories contains 'design-pattern'" %}
But I'm getting this error:
Expected end_of_string but found pipe
Ar or/and operators really supported? I can't figure out how to filter pages using where_exp as shown in my code snippet.
I've managed to solve my issue with some workarounds... It's not a very elegant solution, but as Jekyll isn't about creating actual software architecture... For now, it works flawlessly:
{% assign patterns = "" | split,"" %}
{% for page in site.pages %}
{% if page.categories contains "design-pattern" or page.categories contains "anti-pattern" %}
{% assign patterns = patterns | push:page %}
{% endif %}
{% endfor %}
{% assign sortedPages = patterns | sort:"date" | reverse %}
I create an empty array.
I loop over all pages and I filter them by two possible categories.
I push pages that fulfill the whole condition.
Once I get the filtered page array, I sort and reverse it.
I was unable to replicate the error message you included with your original question. However, as far as filtering based on multiple conditions goes, it is supported. You can also put all of your filters together. The result is much cleaner code 😊
Example
If one wants to set a variable named "sortedPages" equal to "site.pages", but with the following filters:
Sort by date
Sort in reverse order
Only include a page if it has design-pattern and/or anti-pattern as a category
they can do so with the following one-liner:
{% assign sortedPages = site.pages | sort:"date" | reverse | where_exp: "item", "item.categories contains 'design-pattern' or item.categories contains 'anti-pattern'" %}
Answer as multiple lines
Splitting up statements across multiple lines is also supported. Doing so can sometimes improve readability:
{%
assign sortedPages = site.pages
| sort:"date"
| reverse
| where_exp: "item", "item.categories contains 'design-pattern' or item.categories contains 'anti-pattern'"
%}
I have created an empty array in Jekyll but I am not able to push data.
Here it is described how to do but it does not seem to work on my machine. I use Jekyll 2.5.3
{% assign selected = site.array %}
{% for success in site.data.success %}
{% assign selected = selected | push: success.id %}
{% endfor %}
site.array is defined into my _config.yml as
site.array: []
I am sure that success.id exists
UPDATE 1
I changed in _config.yml
array: []
Still no luck.
Why define a site.something in _config.yml ?
Any variable defined here will be accessed with the site prefix, but it's not up to you to add this prefix, Jekyll takes care of it. eg: {{ site.title }} refers to site: My awesome title. It's automatic.
Just define : emptyArray: [], and access it with site.emptyArray.
With site.array: [], you're defining a configuration variable that will never be site.site.array because a yaml key is supposed to be a string. Here, the only way to access your variable, is to write site["site.array"].
Note: If you can, upgrade to a newer version of Jekyll if you want to be future-proof.
I'm not sure if Jekyll accepts an empty array, "out of the blue".
So, try to use an if statement before the for loop:
{% if site.array %}
{% assign selected = site.array %}
{% for success in site.data.success %} {% assign selected = selected | push: success.id %}
{% endfor %}
{% endif %}
And keep just array: in your _config.yml. Any variable defined in this file will be called by site.variable.
I suggest you to try with some values in the array before leaving it empty, to make sure the code works.
Hope to have helped!
I can see that Liquid allows you to sort a collection using the below syntax:
{% assign sorted_items = items.all|sort:'Email' %}
{% for item in sorted_items %}
<div>Name: {{item.name}}</div>
<div>Email: {{item.email}}</div>
{% endfor %}
However this does not appear to work in Business Catalyst.
If I use this to render the result to the page it simply renders "null".
{{sorted_items | json }}
Should I be able to do this in Business Catalyst, or am I completely wasting my time trying to find a solution to sort my WebApp data?
You can sort the data like this:
{module_data resource="customers" version="v3" fields="firstName,email1" collection="myData"}
<pre>{{myData|json}}</pre>
{% capture emails -%}
{% for item in myData.items -%}
,{{ item.email1.value }} - {{ item.firstName }};
{% endfor %}
{% endcapture %}
<pre>{{ emails | split: "," | sort }}</pre>
The comma is not spelling mistake : )
After you split the string in array you can do whatever you need to do with it.
The answer from Daut is not good. Any solution in the for loop will only sort the number of items fetched from the module and the max amount for that is 500.
If you are using module_data you just use its actual sort!
{module_data resource="customers" version="v3" order="firstName" fields="firstName,email1" collection="myData"}
module_data supports both WHERE for filtering and ORDER to order the results.