Создание модуля - TatooineLab/Tatooine GitHub Wiki

Вы можете создать модуль, например, модуль для работы со статьями - Article. Для этого создадите в папке lib/ файл Article.pm:

package Article;

=nd
Package: Article
  Модуль для работы со статьями
=cut

use strict;
use warnings;

use Error;
use Tatooine::Validator;
# Наследуем методы для работы со стандартными действиями (сохранение, вывод, удаление)
# и для работы с базой данных
use parent qw(Tatooine::DB Tatooine::BaseActions);

=nd
Method: new
  Конструктор
=cut
sub new {
  my ($class, $attr_child) = @_;
  # Проверяем атрибуты потомка
  $attr_child = {} unless $attr_child;
  # Заполняем поля объекта
  my %attr = (
  	action_prefix	=> 'ARTICLE', # Префикс, который используется при регистрации действий
    list => [],				          # Список записей
  	## Параметры базы данных
  	db => {
  		table => 'article', # Название таблицы, с которой работает модуль
  	},
  	%{$attr_child}
  );
  # Вызываем конструктор базового класса и передаем ему атрибуты текущего
  $class->SUPER::new(\%attr);
}

=nd
Method: setTpl($name_tpl)
  Устанавливает шаблон для данного модуля. Принимает имя шаблона.
=cut
sub setTpl {
  my ($self, $tpl) = @_;
  # Выставляем шаблон, данные берутся из конфига
  $self->R->{template} = Tatooine::Base::T->{admin}{article}{$tpl};;
}

# Процедура проверки вводимых данных
sub validateData {
  my $self = shift;
  my $V = Tatooine::Validator->new($self->R);

  $V->validate(
  	{
  		title	=> 'TITLE',
  		sort	=> 'INTEGER'
  	}
  );
}

1;

Далее необходимо в папке public_html/admin/article/ создать скрипт:

#! /usr/bin/perl

use strict;
use warnings;
use utf8;

use lib '../../../lib';

use Tatooine::Router;
use Article;

# Создаем объект роутера
my $router = Tatooine::Router->new();

# Создаём объект модуля
my $article = Article->new({
  router => $router
});
# Регистрируем действия модуля (будут зарегистрированы действия редактирования, 
# удаления, валидации и вывода записей)
$article->registerActions;

# Для переопределения какого-либо действия используется следующая конструкция
# Запоминаем действие базового класса
my $ba_main = $router->{action}{$article->Prefix.'_MAIN'};
$router->registerAction($article->Prefix.'_MAIN' => { do => sub {
		my $S = shift;
		
		# Идентифицируем раздел
		$S->F->{active_section} = 'article';
		
		# Вызываем действие базового класса
		$ba_main->{do}->($S);
	}
});

# Для добавления нового действия используется следующая конструкция
$router->registerAction($article->Prefix.'_NEW_ACTION' => { do => sub {
    my $S = shift;
    
    ...
    
    $article->setTpl("NEW_ACTION_TPL");
    return "STOP";
  }
});

# Выбираем действие(я)
$router->selectActions ( sub {
  my $S = shift;
  my @act;
  
  # Поиск стандартных действий в зависимости от пришедших параметров CGI
  push @act, $article->selectActions;
  
  # Поиск новых действий
  push @act, $article->Prefix.'_NEW_ACTION' if $S->F->{new_action_param};
  
  return @act;
});

$router->listen;