Пользовательский стиль Zend Framework 2 для каждого пользователя

Я создаю приложение для компаний, которое отправляет анонимные ссылки клиентам для заполнения анкеты. Компания должна иметь возможность изменять цвета и логотип анкеты, чтобы отразить принадлежность к КИ компании.

Моя идея заключалась в том, чтобы создать папку для каждой компании (в моем случае, представленную как сущность-клиент доктрины) и динамически загружать макет макета style.css и logo.png и т. д. из этой папки.

Вопрос: как это реализовать? Как я могу изменить переменную в файле макета из контроллера? Или мне нужно поместить весь макет в файл view.phtml для ViewModel?

Заранее спасибо!


person Giacomo Voß    schedule 13.03.2014    source источник


Ответы (2)


Если бы мне пришлось иметь несколько макетов в зависимости от некоторых условий.

Я бы сделал макеты для каждой компании, прописал их в module.config.php

'view_manager' => array(
    'template_path_stack' => array(
        'module' => __DIR__ . '/../view/',
    ),
    'template_map' => array(
        'layout/company1' => __DIR__ . '/../view/layout/company1.phtml',
        'layout/company2' => __DIR__ . '/../view/layout/company2.phtml',
    )
),

Затем в gloabal.php или в тот же module.config.php добавил бы некоторые опции:

'companies_layouts' => array(
    'IDofComapny1' => 'layout/company1',
    'IDofComapny2' => 'layout/company2',
)

И, наконец, в контроллере сделал бы что-то вроде этого:

public function indexAction()
{
    $sm = $this->getServiceLocator();

            // Getting company identifier
    $companyId = $this->params()->fromRoute( 'companyId' );

    // do something
            ...

    $this->layout( $sm->get('Config')['companies_layouts'][$comanyId] );

    return new ViewModel();
}

Если вам просто нужно установить css в зависимости от некоторых условий, вы можете просто сделать это в файле представления:

switch( true ){
    case some condition:
        $css = 'file1.css';
        break;
    case some condition:
        $css = 'file2.css';
        break;
}
$this->headLink()->appendStylesheet( $css );

И в файле макета у вас должна быть следующая строка:

<head>
    ...
    <?= $this->headLink() ?>
    ...
</head>
person Roman    schedule 13.03.2014
comment
Гораздо более глубокий, чем мой ответ, поэтому +1 за этот. Действительно хороший первый пост, добро пожаловать в SO! - person Sam; 13.03.2014

Вам нужно установить путь к файлу style.css и логотипу в соответствии с названием компании в вашем действии, а затем вы можете получить доступ к этому варианту в своем макете так же, как и к файлу просмотра. И установите CSS с помощью функции headLink(). и назначьте файл логотипа в заголовке макета.

Вам не нужно размещать код макета в файле представления. Напишите ниже код на вашем контроллере. вы также можете получить доступ к переменной стиля в вашем макете.

return new ViewModel(array( 'style' => $style ,'logo' => $logo));
person manan    schedule 13.03.2014