diff --git a/content/collections/docs/4-to-5.md b/content/collections/docs/4-to-5.md new file mode 100644 index 000000000..0501b3829 --- /dev/null +++ b/content/collections/docs/4-to-5.md @@ -0,0 +1,416 @@ +--- +id: 91e8f239-2f99-47bc-b4dd-3518cd3e36ae +blueprint: page +title: 'Upgrade from 4 to 5' +intro: 'A guide for upgrading from 4 to 5. For most sites (those running Laravel > 9), the process will take less than 5 minutes.' +template: page +--- +## Overview + +First read through this guide to see if there's anything that you might need to adjust. While there are many items on this page, a majority of them only apply to addons or custom code. We've noted who each item would apply to so you can more easily scan through the changes. + +### Upgrade using Composer + +In your `composer.json`, change the `statamic/cms` requirement: + +```json +"statamic/cms": "^4.0" // [tl!--] +"statamic/cms": "^5.0" // [tl!++] +``` + +Then run: + +``` shell +composer update statamic/cms --with-dependencies +``` + +## High impact changes + +### PHP and Laravel support +**Affects apps using PHP < 8.1 or Laravel < 10.** + +- The minimum version of PHP is now 8.1. +- The minimum version of Laravel is now 10. + +We highly recommend upgrading all the way to Laravel 11 and PHP 8.3. + +:::tip +If you want to (semi-)automate the Laravel upgrade process, we recommend using [Laravel Shift](https://laravelshift.com/discounts/statamic-1983) (use that link for a special 19.83% discount 🤘). +::: + +### Site configuration changes +**Affects everyone.** + +_Note that Statamic will attempt to migrate this for you automatically during the upgrade._ + +The site config has been moved from `config/statamic/sites.php` into `resources/sites.yaml`. This allows you to manage your sites from the Control Panel. + +```php +// config/statamic/sites.php +return [ // [tl! --:start] + 'sites' => [ + 'default' => [ + 'name' => 'First Site', + 'url' => config('app.url'), + 'locale' => 'en_US', + ], + 'two' => [ + 'name' => 'Second Site', + 'url' => config('app.url').'/fr/', + 'locale' => 'fr_FR', + ] + ] +]; // [tl! --:end] +``` + +```yaml +# resources/sites.yaml +default: # [tl! ++:start] + name: First Site + url: '{{ config:app:url }}' + locale: en_US +two: + name: Second Site + url: '{{ config:app:url }}/fr/' + locale: fr_FR # [tl! ++:end] +``` + +_**Note:** Text direction is now also automatic, [based on each site's language](/multi-site#text-direction). You do not need to migrate `direction` values to your `resources/sites.yaml`._ + +There is now also a new `multisite` boolean in `config/statamic/system.php`. Previously, the multi-site feature would be considered "enabled" as soon as you configured a second site. Now there is an explicit option to enable it. + +This should be set to `true` if you previously had 2 or more sites configured. + +```php +// config/statamic/system.php +'multisite' => true, +``` + +## Medium impact changes + +### Blueprint default value usage +**Affects apps that have `default` defined in their blueprints or fieldsets.** + +In v4, setting a `default` value for a field would only make it show up in the respective publish forms. In v5, these values will actually be used where appropriate, such as within front-end templates. + +```yaml +handle: myfield +field: + type: text + default: my default value +``` +```yaml +title: My Entry +# the "myfield" is missing +``` +```antlers +{{ if myfield }}yes{{ else }}no{{ /if }}: {{ myfield }} + +v4 outputs: "no: " {{# [tl! --] #}} +v5 outputs: "yes: my default value" {{# [tl! ++] #}} +``` + +In most cases, this is what you would have expected to happen anyway. + +### Site methods +**Affects apps or addons using the `Site::hasMultiple()` method.** + +Continuing from the multi-site configuration changes above, there are now two separate methods for determining multi-site state. + +- The new `Site::multiEnabled()` method will return true if the `multisite` boolean in `system.php` is enabled. +- The existing `Site::hasMultiple()` method will return `true` if at least two sites are configured. + +You should decide whether each existing usage of `Site::hasMultiple()` should imply that the feature is enabled entirely, or if you need to actually count the number of sites. + +### Laravel Helpers package has been removed +**Affects apps or addons relying on methods from that package in custom code.** + +The `laravel/helpers` package provided support for the older global-style string/array/misc functions like `array_get`, `str_contains`, `snake_case`, `ends_with`, etc. You will now need to either require this package yourself, or update to use the underlying methods. + +For example: + +```php +namespace App\Example; + +use Statamic\Support\Arr; // [tl! ++,**] +use Statamic\Support\Str; // [tl! ++,**] + +class Example +{ + function example() + { + array_get($arr, $key); // [tl! --,**] + Arr::get($arr, $key); // [tl! ++,**] + + str_start($str, $prefix); // [tl! --,**] + Str::start($str, $prefix); // [tl! ++,**] + + ends_with($str, $needle); // [tl! --,**] + Str::endsWith($str, $needle); // [tl! ++,**] + } +} +``` + +We recommend making the code changes. However, if you just want to require the package: + +```sh +composer require laravel/helpers +``` + +### Statamic will now use your app's default pagination view +**Affects apps using the `auto_links` pagination variable in templates.** + +Previously, Statamic used the `pagination::default` view to rendering pagination links. In Statamic 5, it will use your app's default pagination view, typically `pagination::tailwind`. + +To avoid making code changes, you may wish to change the default view back to `pagination::default`: + +```php +// app/Providers/AppServiceProvider.php + +use Illuminate\Pagination\Paginator; // [tl! ++] + +public function boot(): void +{ + Paginator::defaultView('pagination::default'); // [tl! ++] +} +``` + +### Updated `please` file for Laravel 11 +**Affects apps upgrading to Laravel 11 and the new application skeleton (including all upgrades via Laravel Shift).** + +Previously, our `please` command line utility assumed an `app/Console/Kernel.php` file existed in your application. However, with the introduction of Laravel 11, this file is no longer included with the new application structure. + +When upgrading apps to Laravel 11 with the new application skeleton, you'll need to update the `please` file in your app's root directory: + +```php +#!/usr/bin/env php +handleCommand(new ArgvInput); + +exit($status); +``` + +## Low impact changes + +### Regex Antlers Parser has been removed +**Affects apps that are still using the `regex` parser.** + +The new Antlers parser was introduced in 3.3 and was made the default in 3.4. + +You would have been using the old Parser if either of these apply: +- In `config/statamic/antlers.php`, the `version` was set to `regex`. +- The `antlers.php` file doesn't exist at all. + +The newer parser should be backwards compatible but if you encounter any errors, you may need to check the [docs](/antlers). + +### Validation rule changes +**Affects apps using `unique_entry_value`, `unique_term_value`, or `unique_user_value` rules.** + +_Note that assuming you haven't done anything too unusual, the following changes may have been performed automatically by Statamic during the update process._ + +We have updated our custom validation rules to use the more modern Laravel syntax. This means dropping the string based aliases in favor of classes. + +```yaml +validate: + - 'unique_entry_value:{collection},{id},{site}' #[tl!--] + - 'new \Statamic\Rules\UniqueEntryValue({collection},{id},{site})' #[tl!++] + + - 'unique_term_value:{taxonomy},{id},{site}' #[tl!--] + - 'new \Statamic\Rules\UniqueTermValue({taxonomy},{id},{site})' #[tl!++] + + - 'unique_user_value:{id}' #[tl!--] + - 'new \Statamic\Rules\UniqueUserValue({id})' #[tl!++] +``` + +### Antlers sanitization +**Affects apps or addons using the `sanitize` modifier or the `Html::sanitize` method.** + +The `sanitize` modifier (and `Html::sanitize()` method) method has changed under the hood from using `htmlentities` to `htmlspecialchars`. + +This change allows for things like accent characters (ü, Ã, etc) to remain unescaped. This is likely what you want to happen anyway, but if you have a reason for them to be converted, you should use `entities` modifier or `Html::entities()` method respectively. + +### Seed removed from `shuffle` modifier +**Affects apps using the shuffle modifier with an argument.** + +In Laravel 11, the underlying randomization technique was made more secure and no longer supports seeds. If you need to support seeds, you will need to use a custom modifier. + +``` +{{ my_array | shuffle:123 }} {{# [tl! --] #}} +{{ my_array | custom_shuffle_with_seed:123 }} {{# [tl! ++] #}} +``` + +The shuffle modifier without an argument will continue to work without any modification needed. + +### The `modify_date` modifier is now immutable +**Affects apps using the modify_date modifier.** + +In Statamic 4, the `modify_date` modifier would modify date variable which would then be reflected elsewhere in your template. + +In Statamic 5, this is fixed, but if you were relying on this incorrect behavior you will need to handle it. + +```antlers +{{ date }} // 1st of may +{{ date | modify_date('+1 day') }} // 2nd of may +{{ date }} // 2nd of may {{# [tl! --] #}} +{{ date }} // 1st of may {{# [tl! ++] #}} +``` + +### The `svg` tag sanitizes by default +**Affects apps that use the `svg` tag.** + +The `{{ svg }}` will now sanitize the output by default. This meant things like JavaScript or other valid but potentially insecure elements will be filtered out. + +For most people this won't be a problem but if you rely on this advanced SVG features, you may want to disable it. + +```antlers +{{ svg + src="foo.svg" + sanitize="false" {{# [tl! ++] #}} +}} +``` + +Alternatively, you can opt out of it completely in a service provider: + +```php +public function boot() +{ + \Statamic\Tags\Svg::disableSanitization(); // [tl! ++] +} +``` + +### Bard JS value is now an object +**Affects apps or addons that are manually targeting Bard's value in JS** + +Previously, to prevent issues with how Laravel would trim whitespace on submitted strings, Bard's value would be a JSON stringified version of an object. In Statamic 5, it will just be the object. + +```js +let bardValue = JSON.parse(getBardValue()); // [tl! --] +let bardValue = getBardValue(); // [tl! ++] +``` + +### User roles inherit from groups +**Affects apps or addons using the `roles`/`hasRole` methods on the `User` class, or the `user:is`/`is` tags.** + +In v4, the `User` class's `roles` method would only return roles defined explicitly on the user. It would not return roles inherited through any assigned groups. + +This affected calling the `roles` method directly, the `hasRole` method, or the `user:is` and `is` tags. + +This was a common point of confusion. So in v5, including the inherited roles is the more "default" behavior. + +```php +// To get explicit roles... +$user->roles(); // [tl! --] +$user->explicitRoles(); // [tl! ++] + +// To check if a user has a role explicitly defined... +$user->hasRole($role); // [tl! --] +$user->explicitRoles()->has($role->handle()); // [tl! ++] + +// To set explicit roles... +$user->roles($roles); // [tl! --] +$user->explicitRoles($roles); // [tl! ++] + +// To get all roles, including ones through user groups... +getAllRoles($user); // (It was complicated) [tl! --] +$user->roles(); // [tl! ++] + +// To check if a user has a role, including ones through user groups... +getAllRoles($user)->has($role->handle()); // (It was complicated) [tl! --] +$user->hasRole($role); // [tl! ++] +``` + + +### Misc class method changes +The following methods have been removed: +- `Statamic\Entries\Collection::revisions()` removed. Use `revisionsEnabled()`. + +The following interfaces have added `findOrFail()` methods: +- `Statamic\Contracts\Assets\AssetContainerRepository` +- `Statamic\Contracts\Assets\AssetRepository` +- `Statamic\Contracts\Auth\UserRepository` +- `Statamic\Contracts\Entries\CollectionRepository` +- `Statamic\Contracts\Entries\EntryRepository` +- `Statamic\Contracts\Globals\GlobalVariablesRepository` +- `Statamic\Contracts\Structures\NavigationRepository` +- `Statamic\Contracts\Taxonomies\TermRepository` + +The following methods have changed: +- `Statamic\StaticCaching\Cacher::getCachedPage()` now returns a `Statamic\StaticCaching\Page`. + +## Zero impact changes + +These are items that you can completely ignore. They are suggestions on how to improve your code using newly added features. + +### JS Slug generation + +The `$slugify` JS API has been deprecated. This could be a good time to use the new slug helpers. + +If you are generating simple slug/handles, you can use the global helper: + +```js +let slug = this.$slugify('Foo Bar'); // foo-bar [tl! --] +let slug = str_slug('Foo Bar'); // foo-bar [tl! ++] + +let handle = this.$slugify('Foo Bar', '_'); // foo_bar [tl! --] +let handle = snake_case('Foo Bar'); // foo_bar [tl! ++] +``` + +If your slugs need to factor in language logic (like an entry's slug would), then you can use the new server side feature: + +```js +let slug = getSlug('Foo Bar'); // [tl! --:start] + +function getSlug(value) { + return this.$slugify(value); +} // [tl! --:end] + +let slug = await getSlug('Foo Bar'); // [tl! ++:start] + +async function getSlug(value) { + return this.$slug.async().create('Foo Bar'); +} // [tl! ++:end] +``` + + +### Addon test case + +If you have an addon, there's a good chance your `TestCase` is a bit complicated. + +You should be able to extend the new `AddonTestCase` and specify your service provider in favor of manually wiring up all the Testbench bits. + +```php +use Orchestra\Testbench\TestCase as OrchestraTestCase; // [tl! --] +use Statamic\Testing\AddonTestCase; // [tl! ++] + +abstract class TestCase extends OrchestraTestCase // [tl! --] +abstract class TestCase extends AddonTestCase // [tl! ++] +{ + protected string $addonServiceProvider = YourServiceProvider::class; // [tl! ++] + + protected function getPackageProviders($app) // [tl! --:start] + { + return [ + GraphQLServiceProvider::class, + StatamicServiceProvider::class, + YourServiceProvider::class, + ]; + } + + // etc... [tl! --:end] +} +``` diff --git a/content/collections/docs/antlers-legacy.md b/content/collections/docs/antlers-legacy.md deleted file mode 100644 index f5b3982d5..000000000 --- a/content/collections/docs/antlers-legacy.md +++ /dev/null @@ -1,426 +0,0 @@ ---- -id: dcf80ee6-209e-45aa-af42-46bbe01996e2 -blueprint: page -title: 'Antlers Templates (Legacy Regex)' -intro: |- - Antlers is a simple and powerful templating engine provided with Statamic. It can fetch and filter content, display and modify data, tap into core features like user authentication and search, and handle complex logic. - :::warning This parser has been retired - We have a [brand new, completely rewritten Antlers Parser](/antlers) jam packed with new features, performance improvements, and bug fixes. Make sure to use it if you're on Statamic 3.3 or higher. - ::: -template: page -nav_title: 'Antlers Templates (Legacy)' ---- -## Overview - -Antlers view files are often called templates. Any files in your `resources/views` directory using an `.antlers.html` file extension will be parsed with the Antlers engine. - -:::tip -The `.antlers.html` extension is important. Without it, your template will be rendered as **unparsed, static HTML**. -::: - -## Antlers Syntax - -Antlers adds capabilities on top of HTML through the use of curly brace expressions. Those curly braces – often called double mustaches or squiggly gigglies – look a whole lot like _antlers_ to us, hence the name. - -```antlers -{{ hello_world }} -``` - -Before getting into listing all the things that happen _inside_ an Antlers expression, lets take a moment to establish the rules for properly formatting one. - -### Formatting Rules - -1. Each set of curly braces **must** stay together always, like Kenan & Kel or Wayne & Garth. -2. Expressions are **case sensitive**. -3. Hyphens and underscores are **not** interchangeable. -4. Whitespace between the curly braces and inner text is **recommended**, but optional. -5. You **can** break up an expression onto multiple lines. - -Consistency is important. We recommend using single spaces between braces, lowercase variable names, and underscores as word separators. Picking your style and stick to it. Future you will thank you, but don't expect a postcard. - -``` antlers -This is great! -{{ perfectenschlag }} - -This is allowed. -{{squished}} - -This can make sense when you have lots of parameters. -{{ - testimonials - limit="5" - order="username" -}} - -This is terrible in every possible way. -{{play-sad_Trombone }} -``` - -## Displaying Data - -You can display data passed into your Antlers views by wrapping the variable in double curly braces. For example, given the following data: - -``` yaml ---- -title: DJ Jazzy Jeff & The Fresh Prince -songs: - - Boom! Shake the Room - - Summertime - - Just Cruisin' ---- -``` - -You can display the contents of the `title` variable like this: - -``` antlers -
Time to {{ songs:0 }} cuz we're {{ songs:2 }}.
-``` - -``` html -Time to Boom! Shake the Room cuz we're Just Crusin'.
-``` - -### Dictionaries -Dictionaries are represented in YAML by nested key:value pairs, _inside_ another variable name. These are sometimes called element maps, or associative arrays. - -``` yaml -mailing_address: - address: 123 Foo Ave - city: Barville - province: West Exampleton - country: Docsylvania -``` - -#### Accessing Data -You can access the keys inside the dictionary by "gluing" the parent/child keys together you want to traverse through, much like breadcrumbs. - -``` antlers -I live in {{ mailing_address:city }}. -``` - -### Multi-Dimensional Arrays -More complex data is stored in objects or arrays inside arrays. This is usually called a multi-dimensional array. - -``` yaml -skaters: - - - name: Tony Hawk - style: Vert - - - name: Rodney Mullen - style: Street -``` - -If you know the names of the variables inside the array, you can loop through the items and access their variables. - -``` antlers -{{ skaters }} -{{ style }}
-Vert
-Street
-There is a song!
-{{ elseif songs > 100 }} -There are lots of songs!
-{{ elseif songs }} -There are songs. -{{ else }} -
There are no songs.
-{{ /if }} -``` - - -Antlers variables are null by default. Keep your logic statements simple and skip checking for existence altogether.- -### Shorthand Conditions (Ternary) {#ternary} - -Basic ternary operators will let you write a simple if/else statement all in one line. - -``` -// Basic: verbose -This item is {{ if is_sold }}sold{{ else }}available{{ /if }}. - -// Ternary: nice and short -This item is {{ is_sold ? "sold" : "available" }}. -``` - -Learn more about [ternary operators][ternary] in PHP. - -### Modifiers Inside Conditions - -If you want to manipulate a variable with [modifiers](/modifiers) before evaluating a condition, wrap the expression in (parenthesis). - -``` -{{ if (number_of_bedrooms | count) > 10 }} -
Who are you, Dwayne Johnson?
-{{ /if }} -``` - -### Variable Fallbacks (Null Coalescence) {#null-coalescence} - -When all you need to do is display a variable and set a fallback when it’s null, use the null coalescence operator (`??`). - -``` -{{ meta_title ?? title ?? "No Title Set" }} -``` - -### Conditional Variable Fallbacks - -What if you want to combine an `is set` check with a ternary operator? No problem. - -``` -// Short and sweet -{{ show_title ?= title }} - -// Longer and bitterer -{{ if show_title }}{{ title }}{{ /if }} -``` - -### Using Tags in Conditions - -Yes, you can even use tags in conditions. When working with [tags][tags] instead of variables, you **must** wrap the tag in a pair of additional single braces to tell the parser to run that logic first. - -``` -{{ if {session:some_var} == "Statamic is rad!" }} - ... -{{ /if }} -``` - -## Code Comments {#comments} - -Antlers also allows you to define comments in your views. However, unlike HTML comments, Antlers are not included in the rendered HTML. You can use these comments to "turn off" chunks of code, document your work, or leave notes for yourself and other developers. - -``` -{{# Remember to replace the lorem ipsum this time. #}} -``` - -## Tags - -[Tags][tags] are the primary method for implementing most of Statamic's dynamic features, like search, forms, nav building, pagination, collection listing, filtering, image resizing, and so on. - -Tags often look quite similar to variables, so it pays to learn the list of available [Tags][tags] so you don't mix them up or create conflicts. - -### Variables Inside Tag Parameters - -There are two ways to use variables _inside_ a Tag's parameters. - -You can use **dynamic binding** to pass the value of a variable via its name. - -``` -{{ nav :from="segment_1" }} -``` - -Alternatively, you can use **string interpolation** and reference any variables with _single braces_. This method lets you concatenate a string giving you the ability assemble arguments out of various parts. Like Frankenstein's monster. - -``` -{{ nav from="{segment_1}/{segment_2}" }} -``` - -### Modifiers Inside Parameters - -If using a variable inside of a Tag is nice, using a variable with a modifier inside of a Tag is better. Or more complicated. Either way, it works exactly as you’d expect with one small caveat: When using a modifier inside of a Tag, no whitespace is allowed between variables, pipes, and modifiers. Collapse that stuff. - -``` -// Totally fine. -{{ partially:broken src="{featured_image|url}" }} - -// Totally not. -{{ partially:broken src="{ featured_image | url }" }} -``` - -## Prevent Parsing - -You may find you need to prevent Antlers statements from being parsed. This is common if you're using a JavaScript library like [Vue.js][vue], or perhaps you want to display code examples (like we do in these docs). In either case, you have a few options. - -First, you may use an `@` symbol to tell Antlers to leave it alone like a jellyfish on the beach. The `@` symbol will be stripped out automatically leaving nothing but your expression behind. - -``` -Hey, look at that @{{ noun }}! -``` - -### The `noparse` Tag - -Use this method if you need to prevent entire code blocks from being parsed. - -``` -{{ noparse }} - Welcome to {{ fast_food_chain }}, - home of the {{ fast_food_chain_specialty_item }}, - can I take your order? -{{ /noparse }} -``` - -## Using Antlers in Content - -By default, Antlers expressions and tags are **not** parsed inside your content. This is for performance and security reasons. - -For example, a guest author with limited access to the control panel could conceivably write some template code to fetch and display published/private content from a collection they don't have access to. - -If this isn't a concern of yours, you can enable Antlers parsing on a per-field basis by setting `antlers: true` in your blueprint. - -## Using PHP in Antlers - -PHP is disabled by default, but if you change your view's file extension from `.antlers.html` to `.antlers.php`, you can write all the PHP you want in that template. - -## IDEs & Syntax Highlighters - -Syntax highlighting packages are available for most of the popular IDEs. Make life sweeter, like they do with tea in the south. - -- [Antlers Toolbox for VS Code](https://antlers.dev/) -- [Antlers Language Support for PHP Storm](https://plugins.jetbrains.com/plugin/19203-antlers-language-support) -- [Antlers for Atom](https://github.com/addisonhall/language-antlers) -- [Antlers for Sublime](https://github.com/addisonhall/antlers-statamic-sublime-syntax) - - -[ternary]: https://www.php.net/manual/en/language.operators.comparison.php#language.operators.comparison.ternary -[vue]: https://vuejs.org -[modifiers]: /modifiers -[tags]: /tags \ No newline at end of file diff --git a/content/collections/docs/antlers.md b/content/collections/docs/antlers.md index 1329bb34b..069f9b93d 100644 --- a/content/collections/docs/antlers.md +++ b/content/collections/docs/antlers.md @@ -4,9 +4,6 @@ blueprint: page title: 'Antlers Templates' intro: |- Antlers is a simple and powerful templating engine provided with Statamic. It can fetch and filter content, display, modify, and set variables, tap into core features like user authentication and search, and handle complex logic. Coming from Laravel and want to stick to Blade? [We got you covered](/blade). - :::tip Hot Tip - For sites running Statamic 3.2 and older you'll need to use the [legacy Antlers parser](/antlers-legacy). For all other projects, keep reading. You're in the right place. - ::: template: page --- ## Overview @@ -32,13 +29,22 @@ This is a very simple Antlers tag: ### Configuring -You can configure advanced settings (or switch to the [legacy Antlers parser](/antlers-legacy)) in `config/statamic/antlers.php`. The `runtime` version is the fresh new default parser as of Statamic 3.4, as documented on this very page. +You can configure advanced settings, like guarded variables, tags & modifiers in `config/statamic/antlers.php`. ```php // config/statamic/antlers.php return [ - 'version' => 'runtime', - // ... + 'guardedVariables' => [ + 'config.app.key', + ], + + 'guardedTags' => [ + // + ], + + 'guardedModifiers' => [ + // + ], ]; ``` @@ -375,10 +381,6 @@ There are more than 150 built-in [modifiers](/reference/modifiers) that can do a You can even create [Macros](/modifiers/macro) to combine sets of often used modifiers into one, new reusable one. -#### Legacy Syntax - -The New Antlers Parser still supports what we're now calling the "[Legacy Syntax](/antlers-legacy#stringshorthand-style)" styles, and will continue to do so until Statamic 4.0. - ### Creating Variables You can now set variables by using the assignment operator, `=`. @@ -1283,6 +1285,14 @@ The `@` can also be used to escape individual braces within tag parameters or st // "string {foo} bar" ``` +### Tag parameters + +You may ignore the contents of tag parameters by prefixing the parameter with a backslash. This could be useful allow you to avoid having to escape each curly brace like the example above if you are providing some JS/JSON in a parameter: + +``` +{{ form:create \x-data="{ submittable: false }" }} +``` + ### The `noparse` Tag Use this method if you need to prevent entire code blocks from being parsed. diff --git a/content/collections/docs/debugging.md b/content/collections/docs/debugging.md index 9c5abe8bc..a94d00b79 100644 --- a/content/collections/docs/debugging.md +++ b/content/collections/docs/debugging.md @@ -20,6 +20,18 @@ Statamic will try to detect why you're receiving a specific exception and provid + +## Fake SQL Queries + +By default, Statamic doesn't use a database, so our query builders don't actually execute SQL queries. However, we "fake" the queries so that they appear in your preferred debugging tools like [Ray](https://myray.app) or Debugbar (more on that below). + +They are enabled when you're in debug mode, but if you'd like to disable them you can do so in `config/statamic/system.php`: + +```php +'fake_sql_queries' => false, +``` + + ## Debug Bar The debug bar is a convenient way to explore many of the things happening in any given page request. You can see data Statamic is fetching, which views are being rendered, information on the current route, available variables, user's session, request data, and more. diff --git a/content/collections/docs/forms.md b/content/collections/docs/forms.md index 348050770..4ecae2460 100644 --- a/content/collections/docs/forms.md +++ b/content/collections/docs/forms.md @@ -365,6 +365,8 @@ email: # other settings here ``` +If you don't want the attachments to be kept around on your server, you should pick the `files` fieldtype option explained in the [File Uploads](#file-uploads) section. + ### Using Markdown Mailable Templates Laravel allows you to create email templates [using Markdown](https://laravel.com/docs/mail#markdown-mailables). It's pretty simple to wire these up with your form emails: @@ -413,15 +415,15 @@ You can customize the components further by reviewing the [Laravel documentation Sometimes your fans want to show you things they've created, like scissor-cut love letters and innocent selfies with cats. No problem! File input types to the rescue. Inform Statamic you intend to collect files, specify where you'd like the uploads to go, and whether you'd like them to simply be placed in a directory somewhere, or become reusable Assets. -First up, add `files="true"` to your form tag. (This will add `enctype="multipart/form-data"` to the generated `