# apostrophe-urls

# Inherits from: apostrophe-module

# apos.urls

Provides the build method, a flexible and powerful way to build URLs with query parameters and more. This method is made available as the build filter in Nunjucks. This is also the logical place to add new utility methods relating to URLs.

# Methods

# build(url, path, data)

Build filter URLs. data is an object whose properties become new query parameters. These parameters override any existing parameters of the same name in the URL. If you pass a property with a value of undefined, null or an empty string, that parameter is removed from the URL if already present (note that the number 0 does not do this). This is very useful for maintaining filter parameters in a query string without redundant code.

Pretty URLs

If the optional path argument is present, it must be an array. (You may skip this argument if you are just adding query parameters.)

Any properties of data whose names appear in path are concatenated to the URL directly, separated by slashes, in the order they appear in that array.

The first missing or empty value for a property in path stops this process to prevent an ambiguous URL.

Note that there is no automatic detection that this has already happened in an existing URL, so you can't override existing components of the path.

If a property's value is not equal to the slugification of itself as determined by apos.utils.slugify, then a query parameter is set instead.

If you don't want to handle a property as a query parameter, make sure it is always slug-safe.

Overrides: multiple data objects

You may pass additional data objects. The last one wins, so you can pass your existing parameters first and pass new parameters you are changing as a second data object.

Working with Arrays

Normally, a new value for a property replaces any old one, and undefined, null or '' removes the old one. If you wish to build up an array property instead you'll need to use the MongoDB-style $addToSet and $pull operators to add and remove values from an array field in the URL:

Add tags[]=blue to the query string, if not already present

{ tags: { $addToSet: 'blue' } }

Remove tags[]=blue from the query string, if present

{ tags: { $pull: 'blue' } }

All values passed to $addToSet or $pull must be strings or convertible to strings via toString() (e.g. numbers, booleans)

(The actual query string syntax includes array indices and is fully URI escaped, so it's slightly different but has the same impact. PHP does the same thing.)