Exceptions
Exception
Twig\Error\ SyntaxError
Show exception properties
Twig\Error\SyntaxError {#3985 -lineno: 65 -columnno: null -rawMessage: "Unknown "string" filter." -source: Twig\Source {#2657 -code: """ {% extends 'base.html.twig' %}\n {% block title %}{{ isNew ? 'Новый медиаплан' : 'Редактирование медиаплана' }}{% endblock %}\n {% block body %}\n {% include '_components/breadcrumbs.html.twig' with {items: [{label: 'Главная', path: path('app_home')}, {label: 'ПРОДАЖИ'}, {label: 'Медиапланы', path: path('app_media_plan_index')}, {label: isNew ? 'Создание' : mediaPlan.number}]} %}\n \n <h1 class="h3 mb-4">{{ isNew ? 'Новый медиаплан размещения' : 'Редактирование медиаплана ' ~ mediaPlan.number }}</h1>\n \n {% if isNew %}\n <div class="alert alert-info">\n <i class="bi bi-info-circle"></i> Создание медиаплана для заказа <strong>{{ mediaPlan.order.number }}</strong>, клиент: <strong>{{ mediaPlan.client.name }}</strong>\n </div>\n {% endif %}\n \n <form method="post" data-controller="form-dirty form-submit" novalidate>\n <div class="row g-4">\n <div class="col-lg-8">\n <div class="card h-100">\n <div class="card-header">Основные данные</div>\n <div class="card-body">\n <div class="row g-3">\n <div class="col-12">\n <label for="media-resource" class="form-label">Медиаресурс <span class="text-danger">*</span></label>\n <select id="media-resource" name="media_plan[media_resource]" class="form-select" required data-media-plan-field="mediaResource">\n <option value="">Выберите медиаресурс</option>\n {% for mr in mediaResources|default([]) %}\n <option value="{{ mr.id }}" {{ mediaPlan.mediaResource and mediaPlan.mediaResource.id == mr.id ? 'selected' }}>\n {{ mr.name }}\n </option>\n {% endfor %}\n </select>\n <div class="form-text">На каком медиаресурсе будет размещение</div>\n </div>\n \n <div class="col-12">\n <label for="service" class="form-label">Услуга <span class="text-danger">*</span></label>\n <select id="service" name="media_plan[service]" class="form-select" required data-media-plan-field="service">\n <option value="">Выберите услугу</option>\n {% for service in services|default([]) %}\n <option value="{{ service.id }}" {{ mediaPlan.service and mediaPlan.service.id == service.id ? 'selected' }}>\n {{ service.name }}\n </option>\n {% endfor %}\n </select>\n <div class="form-text">Тип услуги размещения</div>\n </div>\n \n <div class="col-12">\n <label for="pricelist-item" class="form-label">Позиция прайса <span class="text-danger">*</span></label>\n <select id="pricelist-item" name="media_plan[pricelist_item]" class="form-select" required data-media-plan-field="pricelistItem">\n <option value="">Выберите позицию прайса</option>\n {% for item in pricelistItems|default([]) %}\n <option value="{{ item.id }}" {{ mediaPlan.pricelistItem and mediaPlan.pricelistItem.id == item.id ? 'selected' }}>\n {{ item.label }}\n </option>\n {% endfor %}\n </select>\n <div class="form-text">Тарифные условия и правила ценообразования</div>\n </div>\n \n <div class="col-12">\n <label for="adjustment-key" class="form-label">Скидка / наценка</label>\n <select id="adjustment-key" name="media_plan[adjustment_key]" class="form-select">\n <option value="">Не применять</option>\n {% for rule in adjustmentRules|default([]) %}\n <option value="{{ rule.id }}" {{ mediaPlan.adjustmentKey and mediaPlan.adjustmentKey == rule.id|string ? 'selected' }}>\n {{ rule.note ?: (rule.adjustmentKind == 'discount' ? 'Скидка' : 'Наценка') }} \n ({{ rule.percentage > 0 ? '+' : '' }}{{ rule.percentage }}%)\n </option>\n {% endfor %}\n </select>\n <div class="form-text">Применить правило скидки или наценки к спотам медиаплана</div>\n </div>\n \n <div class="col-md-6">\n <label for="period-from" class="form-label">Период размещения с <span class="text-danger">*</span></label>\n <input type="date" id="period-from" name="media_plan[period_from]" class="form-control" required \n value="{{ mediaPlan.periodFrom ? mediaPlan.periodFrom|date('Y-m-d') : '' }}">\n <div class="form-text">Начало периода размещения</div>\n </div>\n \n <div class="col-md-6">\n <label for="period-to" class="form-label">Период размещения до <span class="text-danger">*</span></label>\n <input type="date" id="period-to" name="media_plan[period_to]" class="form-control" required \n value="{{ mediaPlan.periodTo ? mediaPlan.periodTo|date('Y-m-d') : '' }}">\n <div class="form-text">Конец периода размещения</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n \n <div class="col-lg-4">\n <div class="card h-100">\n <div class="card-header">Дополнительные данные</div>\n <div class="card-body">\n <dl class="mb-0">\n <dt>Заказ</dt>\n <dd>\n <a href="{{ path('app_order_show', {id: mediaPlan.order.id}) }}">{{ mediaPlan.order.number }}</a>\n </dd>\n \n <dt>Клиент</dt>\n <dd>\n <a href="{{ path('app_client_show', {id: mediaPlan.client.id}) }}">{{ mediaPlan.client.name }}</a>\n </dd>\n \n <dt>Договор</dt>\n <dd>\n <a href="{{ path('app_contract_show', {id: mediaPlan.order.contract.id}) }}">\n {{ mediaPlan.order.contract.number ?: 'Оферта' }}\n </a>\n </dd>\n \n {% if not isNew %}\n <dt>Статус</dt>\n <dd>\n <span class="badge {{ {'draft': 'bg-secondary', 'approved': 'bg-success'}[mediaPlan.status] }}">\n {{ constant('STATUS_LABELS', mediaPlan)[mediaPlan.status] }}\n </span>\n </dd>\n {% endif %}\n </dl>\n \n {% if not isNew %}\n <hr>\n <p class="small text-muted mb-0">\n Создан: {{ mediaPlan.createdAt|date('d.m.Y H:i') }}\n {% if mediaPlan.createdBy %}\n <br>{{ mediaPlan.createdBy.shortName }}\n {% endif %}\n </p>\n {% endif %}\n </div>\n </div>\n </div>\n </div>\n \n <div class="d-flex gap-2 mt-4">\n <button class="btn btn-primary" data-form-submit-target="button" type="submit">\n <i class="bi {{ isNew ? 'bi-plus-circle' : 'bi-check-lg' }}"></i> \n {{ isNew ? 'Создать медиаплан' : 'Сохранить изменения' }}\n </button>\n <a class="btn btn-outline-secondary" href="{{ isNew ? path('app_order_show', {id: mediaPlan.order.id}) : path('app_media_plan_show', {id: mediaPlan.id}) }}">\n Отмена\n </a>\n </div>\n </form>\n \n {% if isNew %}\n <script>\n (() => {\n // Динамическая загрузка данных будет реализована на следующих этапах\n // Пока показываем все доступные опции\n })();\n </script>\n {% endif %}\n {% endblock %}\n """ -name: "media_plans/form.html.twig" -path: "/var/www/varnarad/data/www/dev.varnaradio.ru/templates/media_plans/form.html.twig" } -phpFile: "/var/www/varnarad/data/www/dev.varnaradio.ru/vendor/twig/twig/src/Parser.php" -phpLine: 527 }
in
templates/media_plans/form.html.twig
(line 65)
<div class="col-12"><label for="adjustment-key" class="form-label">Скидка / наценка</label><select id="adjustment-key" name="media_plan[adjustment_key]" class="form-select"><option value="">Не применять</option>{% for rule in adjustmentRules|default([]) %}<option value="{{ rule.id }}" {{ mediaPlan.adjustmentKey and mediaPlan.adjustmentKey == rule.id|string ? 'selected' }}>{{ rule.note ?: (rule.adjustmentKind == 'discount' ? 'Скидка' : 'Наценка') }}({{ rule.percentage > 0 ? '+' : '' }}{{ rule.percentage }}%)</option>{% endfor %}</select>
in
vendor/twig/twig/src/ExpressionParser/Infix/FilterExpressionParser.php
->
getFilter
(line 47)
$arguments = new EmptyNode();} else {$arguments = $this->parseNamedArguments($parser);}$filter = $parser->getFilter($token->getValue(), $line);$ready = true;if (!isset($this->readyNodes[$class = $filter->getNodeClass()])) {$this->readyNodes[$class] = (bool) (new \ReflectionClass($class))->getConstructor()->getAttributes(FirstClassTwigCallableReady::class);}
in
vendor/twig/twig/src/Parser.php
->
parse
(line 428)
}$token = $this->getCurrentToken();while ($token->test(Token::OPERATOR_TYPE) && ($ep = $this->parsers->getByName(InfixExpressionParserInterface::class, $token->getValue())) && $ep->getPrecedence() >= $precedence) {$this->getStream()->next();$expr = $ep->parse($this, $expr, $token);$this->checkPrecedenceDeprecations($ep, $expr);$token = $this->getCurrentToken();}return $expr;
in
vendor/twig/twig/src/ExpressionParser/Infix/BinaryOperatorExpressionParser.php
->
parseExpression
(line 46)
/*** @return AbstractBinary*/public function parse(Parser $parser, AbstractExpression $left, Token $token): AbstractExpression{$right = $parser->parseExpression(InfixAssociativity::Left === $this->getAssociativity() ? $this->getPrecedence() + 1 : $this->getPrecedence());return new ($this->nodeClass)($left, $right, $token->getLine());}public function getAssociativity(): InfixAssociativity
in
vendor/twig/twig/src/Parser.php
->
parse
(line 428)
}$token = $this->getCurrentToken();while ($token->test(Token::OPERATOR_TYPE) && ($ep = $this->parsers->getByName(InfixExpressionParserInterface::class, $token->getValue())) && $ep->getPrecedence() >= $precedence) {$this->getStream()->next();$expr = $ep->parse($this, $expr, $token);$this->checkPrecedenceDeprecations($ep, $expr);$token = $this->getCurrentToken();}return $expr;
in
vendor/twig/twig/src/ExpressionParser/Infix/BinaryOperatorExpressionParser.php
->
parseExpression
(line 46)
/*** @return AbstractBinary*/public function parse(Parser $parser, AbstractExpression $left, Token $token): AbstractExpression{$right = $parser->parseExpression(InfixAssociativity::Left === $this->getAssociativity() ? $this->getPrecedence() + 1 : $this->getPrecedence());return new ($this->nodeClass)($left, $right, $token->getLine());}public function getAssociativity(): InfixAssociativity
in
vendor/twig/twig/src/Parser.php
->
parse
(line 428)
}$token = $this->getCurrentToken();while ($token->test(Token::OPERATOR_TYPE) && ($ep = $this->parsers->getByName(InfixExpressionParserInterface::class, $token->getValue())) && $ep->getPrecedence() >= $precedence) {$this->getStream()->next();$expr = $ep->parse($this, $expr, $token);$this->checkPrecedenceDeprecations($ep, $expr);$token = $this->getCurrentToken();}return $expr;
in
vendor/twig/twig/src/Parser.php
->
parseExpression
(line 189)
$rv[] = new TextNode($token->getValue(), $token->getLine());break;case $this->stream->getCurrent()->test(Token::VAR_START_TYPE):$token = $this->stream->next();$expr = $this->parseExpression();$this->stream->expect(Token::VAR_END_TYPE);$node = new PrintNode($expr, $token->getLine());NodeDocumentation::add($node, $token);$rv[] = $node;break;
in
vendor/twig/twig/src/TokenParser/ForTokenParser.php
->
subparse
(line 43)
$targets = $this->parseAssignmentExpression();$stream->expect(Token::OPERATOR_TYPE, 'in');$seq = $this->parser->parseExpression();$stream->expect(Token::BLOCK_END_TYPE);$body = $this->parser->subparse([$this, 'decideForFork']);if ('else' == $stream->next()->getValue()) {$elseLineno = $stream->getCurrent()->getLine();$stream->expect(Token::BLOCK_END_TYPE);$else = new ForElseNode($this->parser->subparse([$this, 'decideForEnd'], true), $elseLineno);} else {
in
vendor/twig/twig/src/Parser.php
->
parse
(line 238)
$subparser->setParser($this);$documentationTargetIndex = \count($this->documentationTargets);$this->documentationTargets[] = null;try {$node = $subparser->parse($token);$documentationTarget = $this->documentationTargets[$documentationTargetIndex];} finally {array_pop($this->documentationTargets);}if (!$node) {
in
vendor/twig/twig/src/TokenParser/BlockTokenParser.php
->
subparse
(line 47)
$this->parser->setDocumentationTarget($block);$this->parser->pushLocalScope();$this->parser->pushBlockStack($name);if ($stream->nextIf(Token::BLOCK_END_TYPE)) {$body = $this->parser->subparse([$this, 'decideBlockEnd'], true);if ($token = $stream->nextIf(Token::NAME_TYPE)) {$value = $token->getValue();if ($value != $name) {throw new SyntaxError(\sprintf('Expected endblock for block "%s" (but "%s" given).', $name, $value), $stream->getCurrent()->getLine(), $stream->getSourceContext());
in
vendor/twig/twig/src/Parser.php
->
parse
(line 238)
$subparser->setParser($this);$documentationTargetIndex = \count($this->documentationTargets);$this->documentationTargets[] = null;try {$node = $subparser->parse($token);$documentationTarget = $this->documentationTargets[$documentationTargetIndex];} finally {array_pop($this->documentationTargets);}if (!$node) {
in
vendor/twig/twig/src/Parser.php
->
subparse
(line 113)
$this->importedSymbols = [[]];$this->embeddedTemplates = [];$this->expressionRefs = new \WeakMap();try {$body = $this->subparse($test, $dropNeedle);} catch (SyntaxError $e) {if (!$e->getSourceContext()) {$e->setSourceContext($this->stream->getSourceContext());}
in
vendor/twig/twig/src/Environment.php
->
parse
(line 572)
{if (null === $this->parser) {$this->parser = new Parser($this);}return $this->parser->parse($stream);}/*** @return void*/
in
vendor/twig/twig/src/Environment.php
->
parse
(line 603)
* @throws SyntaxError When there was an error during tokenizing, parsing or compiling*/public function compileSource(Source $source): string{try {return $this->compile($this->parse($this->tokenize($source)));} catch (Error $e) {$e->setSourceContext($source);throw $e;} catch (\Exception $e) {throw new SyntaxError(\sprintf('An exception has been thrown during the compilation of a template ("%s").', $e->getMessage()), -1, $source, $e);
in
vendor/twig/twig/src/Environment.php
->
compileSource
(line 422)
$this->cache->load($key);}if (!class_exists($cls, false)) {$source = $this->getLoader()->getSourceContext($name);$content = $this->compileSource($source);if (!isset($this->hotCache[$name])) {$this->cache->write($key, $content);$this->cache->load($key);}
in
vendor/twig/twig/src/Environment.php
->
loadTemplate
(line 384)
return $name;}$cls = $this->getTemplateClass($name);return $this->loadedWrappers[$cls] ??= new TemplateWrapper($this, $this->loadTemplate($cls, $name));}/*** Loads a template internal representation.*
in
vendor/twig/twig/src/Environment.php
->
load
(line 343)
* @throws SyntaxError When an error occurred during compilation* @throws RuntimeError When an error occurred during rendering*/public function render($name, array $context = []): string{return $this->load($name)->render($context);}/*** Displays a template.*
in
vendor/symfony/framework-bundle/Controller/AbstractController.php
->
render
(line 467)
if (null !== $block) {return $this->container->get('twig')->load($view)->renderBlock($block, $parameters);}return $this->container->get('twig')->render($view, $parameters);}private function doRender(string $view, ?string $block, array $parameters, ?Response $response, string $method): Response{$content = $this->doRenderView($view, $block, $parameters, $method);
in
vendor/symfony/framework-bundle/Controller/AbstractController.php
->
doRenderView
(line 472)
return $this->container->get('twig')->render($view, $parameters);}private function doRender(string $view, ?string $block, array $parameters, ?Response $response, string $method): Response{$content = $this->doRenderView($view, $block, $parameters, $method);$response ??= new Response();if (200 === $response->getStatusCode()) {foreach ($parameters as $v) {if ($v instanceof FormInterface && $v->isSubmitted() && !$v->isValid()) {
in
vendor/symfony/framework-bundle/Controller/AbstractController.php
->
doRender
(line 284)
* If an invalid form is found in the list of parameters, a 422 status code is returned.* Forms found in parameters are auto-cast to form views.*/protected function render(string $view, array $parameters = [], ?Response $response = null): Response{return $this->doRender($view, null, $parameters, $response, __FUNCTION__);}/*** Renders a block in a view.*
if ($adjustmentRuleSet) {$adjustmentRules = $adjustmentRuleSet->getRows()->toArray();}}return $this->render('media_plans/form.html.twig', ['mediaPlan' => $mediaPlan,'isNew' => $new,'mediaResources' => $mediaResources,'services' => $services,'pricelistItems' => $pricelistItems,
if (!$mediaPlan->isEditable()) {$this->addFlash('warning', 'Медиаплан в статусе "' . MediaPlan::STATUS_LABELS[$mediaPlan->getStatus()] . '" недоступен для редактирования');return $this->redirectToRoute('app_media_plan_show', ['id' => $mediaPlan->getId()]);}return $this->editForm($request, $mediaPlan, false);}#[Route('/{id}/approve', name: 'app_media_plan_approve', methods: ['POST'], requirements: ['id' => '\d+'])]#[IsGranted('MEDIA_PLAN_APPROVE')]public function approve(Request $request, MediaPlan $mediaPlan): Response
in
vendor/symfony/http-kernel/HttpKernel.php
->
edit
(line 185)
$this->dispatcher->dispatch($event, KernelEvents::CONTROLLER_ARGUMENTS);$controller = $event->getController();$arguments = $event->getArguments();// call controller$response = $controller(...$arguments);// viewif (!$response instanceof Response) {$event = new ViewEvent($this, $request, $type, $response, $event);$this->dispatcher->dispatch($event, KernelEvents::VIEW);
in
vendor/symfony/http-kernel/HttpKernel.php
->
handleRaw
(line 76)
$request->headers->set('X-Php-Ob-Level', (string) ob_get_level());$this->requestStack->push($request);$response = null;try {return $response = $this->handleRaw($request, $type);} catch (\Throwable $e) {if ($e instanceof \Error && !$this->handleAllThrowables) {throw $e;}
in
vendor/symfony/http-kernel/Kernel.php
->
handle
(line 193)
if (!$this->handlingHttpCache) {$this->resetServices = true;}try {return $this->getHttpKernel()->handle($request, $type, $catch);} finally {--$this->requestStackSize;}}
in
vendor/symfony/runtime/Runner/Symfony/HttpKernelRunner.php
->
handle
(line 34)
) {}public function run(): int{$response = $this->kernel->handle($this->request);$response->send(false);if (\function_exists('fastcgi_finish_request') && !$this->debug) {fastcgi_finish_request();
in
vendor/autoload_runtime.php
->
run
(line 32)
$app = $app(...$args);exit($runtime->getRunner($app)->run());
require_once('/var/www/varnarad/data/www/dev.varnaradio.ru/vendor/autoload_runtime.php')
in
public/index.php
(line 5)
<?phpuse App\Kernel;require_once dirname(__DIR__).'/vendor/autoload_runtime.php';return static function (array $context) {return new Kernel($context['APP_ENV'], (bool) $context['APP_DEBUG']);};
Logs
| Level | Channel | Message |
|---|---|---|
| INFO 10:59:53 | request |
Matched route "_profiler". {
"route": "_profiler",
"route_parameters": {
"_route": "_profiler",
"_controller": "web_profiler.controller.profiler::panelAction",
"token": "latest"
},
"request_uri": "https://lk2.varnaradio.ru/_profiler/latest?type=request&url=https%3A%2F%2Flk2.varnaradio.ru%2Flogin",
"method": "GET"
}
|
Stack Trace
|
SyntaxError
|
|---|
Twig\Error\SyntaxError:
Unknown "string" filter in "media_plans/form.html.twig" at line 65.
at templates/media_plans/form.html.twig:65
at Twig\Parser->getFilter()
(vendor/twig/twig/src/ExpressionParser/Infix/FilterExpressionParser.php:47)
at Twig\ExpressionParser\Infix\FilterExpressionParser->parse()
(vendor/twig/twig/src/Parser.php:428)
at Twig\Parser->parseExpression()
(vendor/twig/twig/src/ExpressionParser/Infix/BinaryOperatorExpressionParser.php:46)
at Twig\ExpressionParser\Infix\BinaryOperatorExpressionParser->parse()
(vendor/twig/twig/src/Parser.php:428)
at Twig\Parser->parseExpression()
(vendor/twig/twig/src/ExpressionParser/Infix/BinaryOperatorExpressionParser.php:46)
at Twig\ExpressionParser\Infix\BinaryOperatorExpressionParser->parse()
(vendor/twig/twig/src/Parser.php:428)
at Twig\Parser->parseExpression()
(vendor/twig/twig/src/Parser.php:189)
at Twig\Parser->subparse()
(vendor/twig/twig/src/TokenParser/ForTokenParser.php:43)
at Twig\TokenParser\ForTokenParser->parse()
(vendor/twig/twig/src/Parser.php:238)
at Twig\Parser->subparse()
(vendor/twig/twig/src/TokenParser/BlockTokenParser.php:47)
at Twig\TokenParser\BlockTokenParser->parse()
(vendor/twig/twig/src/Parser.php:238)
at Twig\Parser->subparse()
(vendor/twig/twig/src/Parser.php:113)
at Twig\Parser->parse()
(vendor/twig/twig/src/Environment.php:572)
at Twig\Environment->parse()
(vendor/twig/twig/src/Environment.php:603)
at Twig\Environment->compileSource()
(vendor/twig/twig/src/Environment.php:422)
at Twig\Environment->loadTemplate()
(vendor/twig/twig/src/Environment.php:384)
at Twig\Environment->load()
(vendor/twig/twig/src/Environment.php:343)
at Twig\Environment->render()
(vendor/symfony/framework-bundle/Controller/AbstractController.php:467)
at Symfony\Bundle\FrameworkBundle\Controller\AbstractController->doRenderView()
(vendor/symfony/framework-bundle/Controller/AbstractController.php:472)
at Symfony\Bundle\FrameworkBundle\Controller\AbstractController->doRender()
(vendor/symfony/framework-bundle/Controller/AbstractController.php:284)
at Symfony\Bundle\FrameworkBundle\Controller\AbstractController->render()
(src/Orders/Controller/MediaPlanController.php:447)
at App\Orders\Controller\MediaPlanController->editForm()
(src/Orders/Controller/MediaPlanController.php:86)
at App\Orders\Controller\MediaPlanController->edit()
(vendor/symfony/http-kernel/HttpKernel.php:185)
at Symfony\Component\HttpKernel\HttpKernel->handleRaw()
(vendor/symfony/http-kernel/HttpKernel.php:76)
at Symfony\Component\HttpKernel\HttpKernel->handle()
(vendor/symfony/http-kernel/Kernel.php:193)
at Symfony\Component\HttpKernel\Kernel->handle()
(vendor/symfony/runtime/Runner/Symfony/HttpKernelRunner.php:34)
at Symfony\Component\Runtime\Runner\Symfony\HttpKernelRunner->run()
(vendor/autoload_runtime.php:32)
at require_once('/var/www/varnarad/data/www/dev.varnaradio.ru/vendor/autoload_runtime.php')
(public/index.php:5)
|