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

  • Автор темы Автор темы Lewik
  • Дата начала Дата начала

Lewik

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

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

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

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

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

PS: я тебя опять не понимаю
 
Последнее редактирование:
на view нет смысла заморачиваться (изменения на уровне css чаще всего хватает если нет, копипаст и изменение), а вот модель легко кочует из проекта в проект.
 
keltanas, нет, не CMS. Это большой проект, который каждый раз подстраивается под нового заказчика.
WMix, обычно для каждого второго заказчика докручивается что-то не на css.
Очень часто приходится дорабатывать интерфейс сразу под всех заказчиков, или под часть. Так же часто один из заказчиков хочет уникальные элементы. Самих шаблонов далеко за 500.
CSS точно не пройдет, помимо прочего оно должно работать на IE8. Да и верстку я получаю в како-виде.
AmdY, ну... это просто выбор родительского шаблона. Как мне это может помочь?
 
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.
 
fixxxer, ну так и что мне от этого? Мне требуется отделить html от построения структуры таблицы.
 
дефолтные шаблоны делаешь в templateDir1, оверрайды в templateDir2, комбинируешь с наследованием/use/макросами.
 
fixxxer, это совсем общее описание. Вот как раз с use и макросами далеко не все так просто =) use нельзя определить динамически. У меня не получилось юзать макрос в макросе, кстати. Не понятна структура блоков, что конкретно они должны содержать, как назначать онклики и прочие дополнительные вещи.
 
Назначать онклики надо в js.

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

Макрос из макроса, если в том же файле - через _self
 
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

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

Еще раз: =)

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

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

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

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