Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Both regex and runtime Antlers parsers trip up with meta keywords #143

Closed
ncla opened this issue Jul 25, 2022 · 4 comments
Closed

Both regex and runtime Antlers parsers trip up with meta keywords #143

ncla opened this issue Jul 25, 2022 · 4 comments
Labels
bug Something isn't working

Comments

@ncla
Copy link

ncla commented Jul 25, 2022

Reproducible repository (seo-bug branch): https://github.com/ncla/statamic-bugs/tree/seo-bug

Consider the following:

layout.antlers.html

<!doctype html>
<html>
    <head>
        {{ aardvark-seo:head }}
    </head>
    <body>
            {{ yield:test }}
            {{ template_content }}
    </body>
</html>

home.antlers.html

{{ section:test }}
    sus
{{ /section:test }}

home.md

---
id: home
blueprint: pages
title: Home
template: home
author: b5b6debc-3727-41dc-9387-bf66ddff0739
image:
  src:
    - 'assets::unknown-(1).png'
updated_by: b5b6debc-3727-41dc-9387-bf66ddff0739
updated_at: 1658759602
published: true
use_meta_keywords: true
meta_keywords:
  - test
  - test2
  - test3
  - test4
no_index_page: false
no_follow_links: false
sitemap_priority: '0.5'
sitemap_changefreq: daily
override_twitter_settings: false
---
## Welcome to your new brand Statamic site!

With Antlers parser set to regex

image

The string "sus" from section/yield combo does not appear.

If I remove {{ aardvark-seo:head }} from layout.antlers.html, the "sus" string does appear in output.

image

With Antlers parser set to runtime

Without any changes done in previous scenario, it throws exception.

[2022-07-25 15:05:02] local.ERROR: Array to string conversion {"userId":"b5b6debc-3727-41dc-9387-bf66ddff0739","exception":"[object] (ErrorException(code: 0): Array to string conversion at /var/www/html/vendor/statamic/cms/src/Modifiers/CoreModifiers.php:926)
[stacktrace]
#0 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php(257): Illuminate\\Foundation\\Bootstrap\\HandleExceptions->handleError()
#1 [internal function]: Illuminate\\Foundation\\Bootstrap\\HandleExceptions->Illuminate\\Foundation\\Bootstrap\\{closure}()
#2 /var/www/html/vendor/statamic/cms/src/Modifiers/CoreModifiers.php(926): implode()
#3 /var/www/html/vendor/statamic/cms/src/Modifiers/Modify.php(199): Statamic\\Modifiers\\CoreModifiers->joinplode()
#4 /var/www/html/vendor/statamic/cms/src/Modifiers/Modify.php(156): Statamic\\Modifiers\\Modify->runModifier()
#5 /var/www/html/vendor/statamic/cms/src/Modifiers/Modify.php(133): Statamic\\Modifiers\\Modify->modify()
#6 /var/www/html/vendor/statamic/cms/src/View/Antlers/Language/Runtime/NodeProcessor.php(2384): Statamic\\Modifiers\\Modify->__call()
#7 /var/www/html/vendor/statamic/cms/src/View/Antlers/Language/Runtime/NodeProcessor.php(1955): Statamic\\View\\Antlers\\Language\\Runtime\\NodeProcessor->runModifier()
#8 /var/www/html/vendor/statamic/cms/src/View/Antlers/Language/Runtime/NodeProcessor.php(702): Statamic\\View\\Antlers\\Language\\Runtime\\NodeProcessor->reduce()
#9 /var/www/html/vendor/statamic/cms/src/View/Antlers/Language/Runtime/RuntimeParser.php(382): Statamic\\View\\Antlers\\Language\\Runtime\\NodeProcessor->render()
#10 /var/www/html/vendor/statamic/cms/src/View/Antlers/Language/Runtime/RuntimeParser.php(760): Statamic\\View\\Antlers\\Language\\Runtime\\RuntimeParser->renderText()
#11 /var/www/html/vendor/statamic/cms/src/View/Antlers/Engine.php(97): Statamic\\View\\Antlers\\Language\\Runtime\\RuntimeParser->parseView()
#12 /var/www/html/vendor/laravel/framework/src/Illuminate/View/View.php(139): Statamic\\View\\Antlers\\Engine->get()
#13 /var/www/html/vendor/laravel/framework/src/Illuminate/View/View.php(122): Illuminate\\View\\View->getContents()
#14 /var/www/html/vendor/laravel/framework/src/Illuminate/View/View.php(91): Illuminate\\View\\View->renderContents()
#15 /var/www/html/vendor/statamic/cms/src/View/View.php(110): Illuminate\\View\\View->render()
#16 /var/www/html/vendor/statamic/cms/src/View/View.php(198): Statamic\\View\\View->render()
#17 [internal function]: Statamic\\View\\View->__toString()
#18 /var/www/html/vendor/withcandour/aardvark-seo/src/Tags/AardvarkSeoTags.php(34): preg_replace()
#19 [internal function]: WithCandour\\AardvarkSeo\\Tags\\AardvarkSeoTags->head()
#20 /var/www/html/vendor/statamic/cms/src/View/Antlers/Language/Runtime/NodeProcessor.php(1430): call_user_func()
#21 /var/www/html/vendor/statamic/cms/src/View/Antlers/Language/Runtime/NodeProcessor.php(702): Statamic\\View\\Antlers\\Language\\Runtime\\NodeProcessor->reduce()
#22 /var/www/html/vendor/statamic/cms/src/View/Antlers/Language/Runtime/RuntimeParser.php(382): Statamic\\View\\Antlers\\Language\\Runtime\\NodeProcessor->render()
#23 /var/www/html/vendor/statamic/cms/src/View/Antlers/Language/Runtime/RuntimeParser.php(760): Statamic\\View\\Antlers\\Language\\Runtime\\RuntimeParser->renderText()
#24 /var/www/html/vendor/statamic/cms/src/View/Antlers/Engine.php(97): Statamic\\View\\Antlers\\Language\\Runtime\\RuntimeParser->parseView()
#25 /var/www/html/vendor/laravel/framework/src/Illuminate/View/View.php(139): Statamic\\View\\Antlers\\Engine->get()
#26 /var/www/html/vendor/laravel/framework/src/Illuminate/View/View.php(122): Illuminate\\View\\View->getContents()
#27 /var/www/html/vendor/laravel/framework/src/Illuminate/View/View.php(91): Illuminate\\View\\View->renderContents()
#28 /var/www/html/vendor/statamic/cms/src/View/View.php(110): Illuminate\\View\\View->render()
#29 /var/www/html/vendor/statamic/cms/src/Http/Responses/DataResponse.php(154): Statamic\\View\\View->render()
#30 /var/www/html/vendor/statamic/cms/src/Http/Responses/DataResponse.php(45): Statamic\\Http\\Responses\\DataResponse->contents()
#31 /var/www/html/vendor/statamic/cms/src/Structures/Page.php(384): Statamic\\Http\\Responses\\DataResponse->toResponse()
#32 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(815): Statamic\\Structures\\Page->toResponse()
#33 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(802): Illuminate\\Routing\\Router::toResponse()
#34 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(725): Illuminate\\Routing\\Router->prepareResponse()
#35 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(141): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}()
#36 /var/www/html/vendor/withcandour/aardvark-seo/src/Http/Middleware/RedirectsMiddleware.php(16): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#37 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): WithCandour\\AardvarkSeo\\Http\\Middleware\\RedirectsMiddleware->handle()
#38 /var/www/html/vendor/statamic/cms/src/StaticCaching/Middleware/Cache.php(47): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#39 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Statamic\\StaticCaching\\Middleware\\Cache->handle()
#40 /var/www/html/vendor/statamic/cms/src/Http/Middleware/AuthGuard.php(14): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#41 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Statamic\\Http\\Middleware\\AuthGuard->handle()
#42 /var/www/html/vendor/statamic/cms/src/Http/Middleware/AddViewPaths.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#43 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Statamic\\Http\\Middleware\\AddViewPaths->handle()
#44 /var/www/html/vendor/statamic/cms/src/Http/Middleware/Localize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#45 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Statamic\\Http\\Middleware\\Localize->handle()
#46 /var/www/html/vendor/statamic/cms/src/Http/Middleware/HandleToken.php(13): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#47 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Statamic\\Http\\Middleware\\HandleToken->handle()
#48 /var/www/html/vendor/statamic/cms/src/Http/Middleware/StacheLock.php(29): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#49 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Statamic\\Http\\Middleware\\StacheLock->handle()
#50 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(50): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#51 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle()
#52 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php(78): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#53 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken->handle()
#54 /var/www/html/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#55 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\View\\Middleware\\ShareErrorsFromSession->handle()
#56 /var/www/html/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(121): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#57 /var/www/html/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(64): Illuminate\\Session\\Middleware\\StartSession->handleStatefulRequest()
#58 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Session\\Middleware\\StartSession->handle()
#59 /var/www/html/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(37): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#60 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse->handle()
#61 /var/www/html/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(67): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#62 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Cookie\\Middleware\\EncryptCookies->handle()
#63 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(116): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#64 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(726): Illuminate\\Pipeline\\Pipeline->then()
#65 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(703): Illuminate\\Routing\\Router->runRouteWithinStack()
#66 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(667): Illuminate\\Routing\\Router->runRoute()
#67 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(656): Illuminate\\Routing\\Router->dispatchToRoute()
#68 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(167): Illuminate\\Routing\\Router->dispatch()
#69 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(141): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}()
#70 /var/www/html/vendor/statamic/cms/src/Http/Middleware/DisableFloc.php(18): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#71 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Statamic\\Http\\Middleware\\DisableFloc->handle()
#72 /var/www/html/vendor/statamic/cms/src/Http/Middleware/CheckMultisite.php(14): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#73 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Statamic\\Http\\Middleware\\CheckMultisite->handle()
#74 /var/www/html/vendor/statamic/cms/src/Http/Middleware/CheckComposerJsonScripts.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#75 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Statamic\\Http\\Middleware\\CheckComposerJsonScripts->handle()
#76 /var/www/html/vendor/statamic/cms/src/Http/Middleware/PoweredByHeader.php(19): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#77 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Statamic\\Http\\Middleware\\PoweredByHeader->handle()
#78 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(59): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#79 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle()
#80 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#81 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()
#82 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull->handle()
#83 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#84 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()
#85 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle()
#86 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#87 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle()
#88 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(86): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#89 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle()
#90 /var/www/html/vendor/fruitcake/laravel-cors/src/HandleCors.php(38): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#91 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Fruitcake\\Cors\\HandleCors->handle()
#92 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#93 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Http\\Middleware\\TrustProxies->handle()
#94 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(116): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#95 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(142): Illuminate\\Pipeline\\Pipeline->then()
#96 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(111): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter()
#97 /var/www/html/public/index.php(52): Illuminate\\Foundation\\Http\\Kernel->handle()
#98 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/resources/server.php(16): require_once('...')
#99 {main}
"} 

Doing one of the following fixes the issue:

  1. Removing {{ aardvark-seo:head }} from layout.antlers.html
  2. Removing meta_keywords array from home.md

php please support:details output

Environment
Application Name: Statamic
Laravel Version: 9.21.6
PHP Version: 8.1.7
Composer Version: 2.3.8
Environment: local
Debug Mode: ENABLED
URL: responsive-alt-bug.test
Maintenance Mode: OFF

Cache
Config: NOT CACHED
Events: NOT CACHED
Routes: NOT CACHED
Views: CACHED

Drivers
Broadcasting: log
Cache: statamic
Database: mysql
Logs: stack / single
Mail: smtp
Queue: sync
Session: file

Statamic
Addons: 2
Antlers: runtime
Version: 3.3.23 PRO

Statamic Addons
spatie/statamic-responsive-images: 2.13.0
withcandour/aardvark-seo: 2.0.28
@ncla
Copy link
Author

ncla commented Jul 26, 2022

Regression seems to have appeared in v2.0.27. One version lower v2.0.26 produces the section + yield combo correctly (regex parser). Runtime parser however is broken regardless of version, produces the Array to string conversion exception.

@AndrewHaine AndrewHaine added the bug Something isn't working label Aug 5, 2022
@FlorianMoser
Copy link

I was debugging exactly the same issue today. The exception happens in Statamic\Modifiers::joinplode in the implode() function.

When using the regex parser, the $value passed to the function is a one dimensional array. When using the runtime parser, it is an array of arrays. The different parser seem to fetch the data differently, however I haven't yet found out where that happens.

Strangely enough, implode() seems to handle the arrays in array quite well on UNIX. The code runs perfectly on my server (PHP 8.1.8). However it crashes on my Mac (PHP 8.1.9, also tested on PHP 8.1.4).

@AndrewHaine
Copy link
Contributor

Thanks all for your work on debugging this, we've had some time to review internally. It looks like there are two separate issues here but both appear to be upstream and will require action on Statamic's part to fix.

"Array to string conversion"... error
As above this is an issue with the join modifier in the runtime parser, there is an open issue in the Statamic repo which we will keep an eye on, in the meantime, it looks like removing the separation string specification from the modifier (join=", " -> | join) fixes the issue and outputs the same value so we will release an update with this fix next week.

Sections not working with regex parser
This appears to be related to this issue which was raised by a member of our team, the issue appears to have been resolved when using the runtime parser but we perhaps need to account for this on our end by using the old view() method if the site is configured to use the regex parser. We'll discuss internally and work on deploying a fix next week.

Thanks,
Andrew

@AndrewHaine
Copy link
Contributor

Fixed in 2.0.29

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

3 participants