Symfony Twig: Банальная темизация

Lewik

Новичок
Каждый заказчик может захотеть свою структуру страницы. При этом очень вероятно очень похожую на остальных заказчиков.
У каждого заказчика своя тема оформления (кроме css там может быть докручено что то еще)
99% это табличная информация.

Как мне кажется, в твиге должна задаваться структура и потом она должна использовать блоки оформления.

На стаковерфлоу я видел советы про то, что такие вещи проще делать через формы.

Сейчас я запилил свой велик: есть блоки с темой оформления, есть блоки-построители. В шаблоне переопределяются только блоки-построители, которые юзают блоки-темы из родителя, определенного динамически.

Я чувствую что здесь все очень просто, но я не могу понять как сделать это. Может это известный прием или что.
 

keltanas

marty cats
CMS что ли написать хочешь?

PS: я тебя опять не понимаю
 
Последнее редактирование:

WMix

герр M:)ller
Партнер клуба
на view нет смысла заморачиваться (изменения на уровне css чаще всего хватает если нет, копипаст и изменение), а вот модель легко кочует из проекта в проект.
 

Lewik

Новичок
keltanas, нет, не CMS. Это большой проект, который каждый раз подстраивается под нового заказчика.
WMix, обычно для каждого второго заказчика докручивается что-то не на css.
Очень часто приходится дорабатывать интерфейс сразу под всех заказчиков, или под часть. Так же часто один из заказчиков хочет уникальные элементы. Самих шаблонов далеко за 500.
CSS точно не пройдет, помимо прочего оно должно работать на IE8. Да и верстку я получаю в како-виде.
AmdY, ну... это просто выбор родительского шаблона. Как мне это может помочь?
 

fixxxer

К.О.
Партнер клуба
Lewik, It can also look for templates in an array of directories:

$loader = new Twig_Loader_Filesystem(array($templateDir1, $templateDir2));
With such a configuration, Twig will first look for templates in $templateDir1 and if they do not exist, it will fallback to look for them in the $templateDir2.
 

Lewik

Новичок
fixxxer, ну так и что мне от этого? Мне требуется отделить html от построения структуры таблицы.
 

fixxxer

К.О.
Партнер клуба
дефолтные шаблоны делаешь в templateDir1, оверрайды в templateDir2, комбинируешь с наследованием/use/макросами.
 

Lewik

Новичок
fixxxer, это совсем общее описание. Вот как раз с use и макросами далеко не все так просто =) use нельзя определить динамически. У меня не получилось юзать макрос в макросе, кстати. Не понятна структура блоков, что конкретно они должны содержать, как назначать онклики и прочие дополнительные вещи.
 

fixxxer

К.О.
Партнер клуба
Назначать онклики надо в js.

Структура блоков понятна только тебе :) Зачем use динамически? Базовые в dir1, кастомные в dir2, по блоку на файл.

Макрос из макроса, если в том же файле - через _self
 

keltanas

marty cats
Lewik, не совсем понимаю твою проблему. Такое ощущение, что ты опять пытаешься это усложнить. Отвечу на сабж.

Вот, посмотри, как twig интегрируется с symfony:
PHP:
class Symfony\Bundle\TwigBundle\DependencyInjection\TwigExtension
        // register user-configured paths
        foreach ($config['paths'] as $path => $namespace) {
            if (!$namespace) {
                $twigFilesystemLoaderDefinition->addMethodCall('addPath', array($path));
            } else {
                $twigFilesystemLoaderDefinition->addMethodCall('addPath', array($path, $namespace));
            }
        }

        // register bundles as Twig namespaces
        foreach ($container->getParameter('kernel.bundles') as $bundle => $class) {
            if (is_dir($dir = $container->getParameter('kernel.root_dir').'/Resources/'.$bundle.'/views')) {
                $this->addTwigPath($twigFilesystemLoaderDefinition, $dir, $bundle);
            }

            $reflection = new \ReflectionClass($class);
            if (is_dir($dir = dirname($reflection->getFilename()).'/Resources/views')) {
                $this->addTwigPath($twigFilesystemLoaderDefinition, $dir, $bundle);
            }
        }

        if (is_dir($dir = $container->getParameter('kernel.root_dir').'/Resources/views')) {
            $twigFilesystemLoaderDefinition->addMethodCall('addPath', array($dir));
        }
Во-первых ты можешь указать в настройках бандла список путей paths, где должны искаться шаблоны в первую очередь.
Во-вторых поиск шаблонов осуществляется в директориях app/Resources/{bundleName}/views
В-третьих поиск в директориях Resources/views самих бандлов
И наконец в директории app/Resources/views

Как это может быть полезно для твоего вопроса?
 

Lewik

Новичок
keltanas, по-моему никак)
Вопрос выбора нужного тимплейта не стоит. Нет вопроса выбора основного тимплейта клиента - мы это вообще решили через глобальную твиговскую переменную и строку в extend с конкатенацией.

Еще раз: =)

Дано:
99% контента - таблицы (table, div и даже br - html-реализация самая разная. Даже на js есть).
У большинства клиентов структуры этих таблиц - очень похожие (3-4 ifа хватает, если больше - то другой тимплейт).
У всех клиентов очень разные html реализации таблиц.

Найти:
1. Периодически, но кардинально, требуется изменять тему оформления клиента.
2. Часто требуется изменять структуру как глобально у всех клиентов так и уникально у конкретного клиента.
Часто - несколько раз в неделю, если не каждый день.

Пока мы нашли способ довольно просто, но вроде работает нормально.
Мы просто делаем блоки типа table - внутри <table> и прочие. Внутри можно из массива собрать атрибуты, дополнить или переопределить их.
В каждом шаблоне клиента (который общий на весь сайт) - эти блоки определяются под одним именем. И потом юзаются в конкретном шаблоне. Это позволяет составлять отдельно структуру таблицы и отдельно ее html-реализацию. Если все ок будет - я покажу это решение.

Я смог понятно объяснить вопрос?
 

keltanas

marty cats
Почему нельзя сделать какой-то бандл | модуль | плагин | контроллер, который бы по параметрам отрисовывал бы таблицы и вставлял их в шаблон?
Например:
Код:
{{ render(controller('AcmeArticleBundle:Article:recentArticles', {'data': account.data, 'template': account.template})) }}
или вариант с кешированием
Код:
{{ render_esi(controller('AcmeArticleBundle:Article:recentArticles', {'data': account.data, 'template': account.template})) }}
 
Последнее редактирование:
Сверху