Version 3 (modified by mburillo@…, 17 months ago) (diff)

--

Version 0.7: composites

So far we have three different models with three different menu entries that help us to show their default views. It would be nice to be able to tell the framework to render the some modules together, using a given layout. That's where Composites come in handy. Composites help us to group our model views.

Composite view

There is already a default composite created with zmoddev. This composite is configured with a top-bottom layout. However, its model list is empty. We will have to populate it with our models. The default composite lives in src/EBox/Apache2/Composite/Composite.pm. We should add our models to components and set printableName to Apache2 configuration. This is how this file should then look:

package EBox::Apache2::Composite::Composite;

use base 'EBox::Model::Composite';

use strict;
use warnings;

## eBox uses
use EBox::Gettext;

# Group: Public methods

# Constructor: new
#
#         Constructor for composite
#
sub new
  {

      my ($class, @params) = @_;

      my $self = $class->SUPER::new(@params);

      return $self;

  }

# Group: Protected methods

# Method: _description
#
# Overrides:
#
#     <EBox::Model::Composite::_description>
#
sub _description
  {

      my $description =
        {
         components      => [
                        '/apache2/Settings',
                        '/apache2/Modules',
                        '/apache2/VirtualHosts',
                            ],
         layout          => 'top-bottom',
         name            => 'Composite',
         printableName   => __('Apache2 configuration'),
         compositeDomain => 'Apache2',
#         help            => __(*),
        };

      return $description;

  }

1;

Now, you will use the abstract class EBox::Model::CompositeProvider and implement the method compositeClasses in you src/EBox/Apache2.pm, this is how it should look like after the changes:

package EBox::Apache2;

use strict;
use warnings;

use base qw(EBox::GConfModule EBox::Model::ModelProvider
        EBox::Module::Service EBox::Model::CompositeProvider);


use EBox::Validate qw( :all );
use EBox::Global;
use EBox::Gettext;

use EBox::Exceptions::InvalidData;
use EBox::Exceptions::MissingArgument;
use EBox::Exceptions::DataExists;
use EBox::Exceptions::DataMissing;
use EBox::Exceptions::DataNotFound;

sub _create
{
    my $class = shift;
    my $self = $class->SUPER::_create(name => 'apache2',
            printableName => __('Apache2'),
            domain => 'ebox-apache2',
            @_);
}

## api functions

# Overrides:
#
#       <EBox::Model::ModelProvider::modelClasses>
sub modelClasses
{
    return [
        'EBox::Apache2::Model::ServerAliases',
        'EBox::Apache2::Model::Modules',
        'EBox::Apache2::Model::VirtualHosts',
        'EBox::Apache2::Model::Settings',
        ];
}

# Overrides:
#
#       <EBox::Model::CompositeProvider::compositeClasses>
sub compositeClasses
{
    return [
        'EBox::Apache2::Composite::Composite',
        ];
}


sub domain
{
    return 'ebox-apache2';
}

# Method: actions
#
#   Override EBox::ServiceModule::ServiceInterface::actions
#
sub actions
{
    return [];
}


# Method: usedFiles
#
#   Override EBox::ServiceModule::ServiceInterface::usedFiles
#
sub usedFiles
{
    return [];
}

# Method: enableActions
#
#   Override EBox::ServiceModule::ServiceInterface::enableActions
#
sub enableActions
{
}

# Method: serviceModuleName
#
#   Override EBox::ServiceModule::ServiceInterface::serviceModuleName
#
sub serviceModuleName
{
    return 'apache2';
}

# Method: _configureModules
#
#       This method is used to enable or disable apache modules based
#       on the user configuration.
#
sub _configureModules
{
    my ($self) = @_;

    my $mgr = EBox::Model::ModelManager->instance();
    my $model = $mgr->model('apache2/Modules');

    for my $id (@{$model->ids()}) {
        my $row = $self->row($id);
        my $module = $row->valueByName('module');
        my $enabled = $row->valueByName('enabled');
        if ($enabled) {
            EBox::Sudo::root("a2enmod $module");
        } else {
            EBox::Sudo::root("a2dismod $module");
        }
    }
}

# Method: _setConf
#
#       Overrides <EBox::Module::Service::_setConf>
#
sub _setConf
{
    my ($self) = @_;

    $self->_writeConfiguration();
    $self->_configureModules();
}

# Method: menu
#
#       Overrides EBox::Module method.
#

#
sub menu
{
    my ($self, $root) = @_;

    my $folder = new EBox::Menu::Folder('name' => 'Apache2',
            'text' => __('Apache2'));

    my $settings = new EBox::Menu::Item(
            'url' => 'Apache2/View/Settings',
            'text' => __('Settings'));

    my $modules = new EBox::Menu::Item(
            'url' => 'Apache2/View/Modules',
            'text' => __('Modules'));

    my $virtualHosts = new EBox::Menu::Item(
            'url' => 'Apache2/View/VirtualHosts',
            'text' => __('Virtual Hosts'));


    $folder->add($settings);
    $folder->add($modules);
    $folder->add($virtualHosts);

    $root->add($folder);
}

1;

Build and install the package. Go to the URL  https://<your_ip>/Apache2/Composite/Composite and you will see something like:

If you just change the layout from top-bottom to tabbed you will get:

Attachments