Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

AutomatedQA - Functional Testing -> Работа с XtraTreeList



it4business.ru - проект об IT для бизнеса  

Новые темы IT-форума

AutomatedQA - Functional Testing -> Работа с XtraTreeList
2009-08-11 10:42 VitalyD
Добрый день.
Работаю с DevExpress контролом дерева (XtraTreeList)

И все бы ничего (в 7-ой версии Комплита даже есть поддержка DevExpress Контролов и можно не использовать .NETовские методы и свойства).

Однако в случае если узлы дерева - чекбоксы и нужно их прочекать, ничего не могу поделать(((

TestComplete не дает доступ к Checked/Unchecked, а при выставлении NET свойства "Checked" для Node в true - галочка действительно ставиться, однако событий которые должны происходить при проставлении галочки не происходит (по крайней мере нужные поля неразлачиваются).

Мб кто-нибудь работает с таким деревом и знает как правильно устанавливать/снимать галки у узлов дерева???

TestComplete 7.10, JScript, DevExpress 8.3

Тестирование ПО -> Свободное тестирование
2009-08-11 11:09 skYmarine
Ребят, поделитесь ссылочкой по теме "что такое свободное тестирование" и как процесс оного и его результаты отображаются в отчете по тестированию.

Или объясните на пальцах. Очень надо.

_

Работа/Санкт-Петербург -> Инженер по тестированию мобильных приложений
2009-08-11 13:48 pancakyes
Ищем хорошего человека и специалиста в команду тестирования мобильных приложений.

Требования к кандидату

- опыт тестирования коммерческих приложений (не менее года);
- хорошее знание основных принципов и методологий тестирования.

Мы не ожидаем от вас глубокого знания специфики мобильных технологий, это дело наживное. Но любовь к гаджетам будет вашим дополнительным плюсом.

С чуть более подробным описанием вакансии вы можете ознакомиться здесь:
http://company.yandex.ru/inside/job/test_mob.xml

Там же расположена форма, с помощью которой вы можете отправить нам свое резюме. Хочу обратить ваше внимание, что решение тестового задания является обязательным для продолжения общения по вакансии.

Если у вас есть вопросы, замечания, прочее - смело обращайтесь, я с удовольствием на них отвечу.


Software-Testing.Ru -> Лилия Горбачик: Тестирование Web Services
2009-08-11 14:31 barancev
Продолжаем публиковать слайдкасты выступлений на конференции SQA Days 2009 Piter: доклад Лилии Горбачик на тему "Тестирование Web Services". В начале доклада приводятся краткие пояснения архитектуры веб-сервисов для тех, кто не знаком с этим видом программных компонентов. Далее в докладе рассматриваются такие особенности тестирования веб-сервисов, как отсутствие пользовательского интерефейса, кросс-платформенность, а также необходимость проверки на соответствие стандартам XML, SOAP, WSDL. Уделено внимание не только функциональному тестированию (автоматизированному и ручному), но также тестированию производительности и защищенности веб-сервисов.

Смотреть и слушать...

Тест менеджмент -> Литература по тестированию.
2009-08-11 16:23 Parfentev
Появилась необходимость создать в компании библиотеку литературы, которая может пригодиться в работе.
Подскажите пожалуйста качественной литературы на темы:
Основы тестирования ПО
Аспекты тестирования ПО(продвинутый уровень что ли, для людей с базой знаний и опытом работы)
Основы автоматизированного тестирования
Процессы (RUP,SCRUM,AGILE,XP) (представления о них не имею, по этому все тулю до кучи)
Основы менеджмента(желательно на примере тестирования).
Менеджмент разработки и тестирования ПО (для продвинутых=-0))

Буду очень благодарен за любой совет.

Тест анализ и тест дизайн -> Сценарии для тестирования Login формы
2009-08-11 18:03 LeshaL
Хотелось бы узнать, а какие ещё сценарии, можно придумать для тестирование Login формы на рисунке

кроме таких что первыми идут в голову:

Проверить заполение обязательных полей.
Ввод корректного логина и корректного пароля.
Проверка на 'Remember me on this computer'.
Ввод корректного логина и некорректного пароля
Ввод некорректного логина и корректного пароля
Ввод некорректного логина и некорректного пароля

Автоматизированное тестирование ПО -> ПО для виртуализации в автоматизированном тестировании
2009-08-11 20:14 novak
В ходе тестирования десктопных приложений удобно использовать различные средства виртуализации, позволяющие эмулировать необходимые конфигурации компьютеров, осуществлять быструю подготовку окружений, сохранять и передавать виртуальные машины для отладки и совершать много других интересных вещей. Для автоматизации тестирования виртуальные машины являются удачным решением с точки зрения управляемости окружения для работы тестируемого приложения.
На данный момент существует не так много различных решений для виртуализации. В опросе я поместил названия тех, с которыми мне приходилось непосредственно работать, а также дополнительный пункт для других вариантов.
А какие программы для виртуализации использовали вы для автоматизации процессов тестирования?

Selenium - Functional Testing -> Ошибка: Specified element is not a Select (has no options)
2009-08-11 22:58 vitorg
У меня на страничке поле Статус - выпадающий список из 4-х опций. При записывании теста с помощью Selenium IDE, выбор опции из списка не записывается.
Попыталася вручную прописать комманду select: selenium.select("status", "Брокер"). При выполнении кейса получила ошибку: Specified element is not a Select (has no options)
Ошибку поняла, но справиться с ней не смогла.
Поле status описано вот так программно:

<td>Cтатус</td>
<td class="active"> </td>
<td>
<p class="select" onmousedown="dropdown(this,'reg_status',valid_form)">Частное лицо</p>
<input type="hidden" value="1" name="status" id="reg_status" />
<ul class="dropdown" id="reg_status_select" style="display:none">

<li value="1"><a href="java script:void(0)">Частное лицо</a></li><li value="2"><a href="java script:void(0)">Брокер</a></li><li value="3"><a href="java script:void(0)">Строительная компания</a></li><li value="4"><a href="java script:void(0)">Агентство</a></li> </ul>
</td>

Подскажите, пожалуйста, как можно автоматизировано заполнить поле со списком выбранным значением/опцией

Работа: вакансии для IT-специалистов -> Perl, Php, FreeBSD программист
2009-08-11 23:49 q7u5
Резюме:

Дмитрий Александрович

Образование: Высшее, техническое.
м. Киев (или удаленно)
Телефон: (068) 353-25-20.
Дата рождения: 24 сентября 1986.
email: q7u5@ukr.net
опыт работы: более 3 лет

Опыт работы и профессиональные навыки:

- Программирование: Perl, php, изучаю так же С/C++/Java/Python.
- Perl: OOP, MVC Catalyst, Template::Toolkit (базово), HTML::Template, DBIx::Class, DBI, SQL::Abstract, IPC (базово), IO::Socket (базово), etc.
- Php: создавал и усовершенствовал код для SMF, дописывал несколько модулей в билинговой системе провайдера.
- Базы данных: MySQL, PostgreSQL, SQLite, BerkeleyDB, CVS.
- HTML, Java Script, CSS на среднем уровне.
- Mod_perl, FastCGI, mod_php.
- OO на perl любой сложности, читаю, пишу.
- Администрирование FreeBSD/Linux (предпочитаю FreeBSD), настройка веб сервера под хостинг или под проект.
Web Server: Apache;
DNS: PowerDNS, Bind9;
MTA: почтовая системы в связке: Postfix+Courier-imap+Cyrus-sasl+etc, Exim+Dovert+etc (предпочитаю Postfix);
Proxy: Squid.
Ftp: ProFTP, etc.
так же: jail, Samba, Ldap, OpenVPN, Cacti, etc.
- Настройка Windows+Apache+php+perl+etc.
- Порядочность выполнения работ.
- Желание учиться.
- Коммуникабельность.

администрирую 2 сервера, безлимитные хостинги с shell

написал 2 большие программы, добавил много возможностей по управлению и т. д. так же писал множество скриптов:
( обратите внимание на исходный код)

1) http://x0.org.ua/web/simplemail/
http://freshmeat.net/projects/simplemailadmin/
Simplemail Admin facilitates management of virtual domains in Exim, Postfix, and other mail servers.
(perl, MySQL)

2) http://x0.org.ua/web/my_kabinet/
выполнял заказ, модули для программы на php,кабинет пользователей

3) http://x0.org.ua/web/tree_forum/
Tree Portal
(написан на 95%, осталось: верстку, внешний вид переделать)
(perl, MVC Catalyst, MySQL, SQL::Abstract)

4) запланировал еще несколько проектов, виду сборник FAQ
http://unixforum.org.ua/index.php?topic=23928
статья CRUD SQL::Abstract http://www.lissyara.su/?id=1962

резюме:
http://www.developers.org.ua/m/ProFTP/
http://forum.perl.dp.ua/cgi-bin/YaBB.pl?num=1250013012
http://kosenkod.moikrug.ru/
http://www.superjob.ua/resume/?id=5211132
http://forum.searchengines.ru/showthread.php?p=5323525
http://job.ukr.net/resume/dmitrij-267783/
http://jobmarket.com.ua/dir/info_technolog...mer/359091.html

Анонсы и обсуждения материалов it4business.ru -> Книги для менеджеров проектов
2009-08-12 00:55 Case

В форуме портала www.it4business.ru, на тренингах и конференциях, часто возникает вопрос «Какие книги читать менеджеру проектов?» или «Что читать, чтобы стать менеджером проектов?».

Редакция www.it4business.ru обратилась к ведущим специалистам в области управления проектами с просьбой составить список рекомендуемых для менеджеров проектов книг.

Книги для менеджеров

Разделы:

  • Управление программистами
  • Управление проектами
  • Менеджмент, общение, люди
  • Литература на английском языке

(more…)


Алгоримты и производительность -> [perl] Использование квантовой логики в программировании
2009-08-12 03:22 q7u5
увидел не давно, хорошая вещь

в других языках этого нету

можно отметить, часто попадается, где нужно сделать быстый поиск по массиву

http://www.opennet.ru/docs/RUS/perl_obzor/...s/quantium.html

Веб-технологии -> Реализация CRUD под Perl (в MVC Catalyst)
2009-08-12 03:26 q7u5
В данной статье рассматривается реализация CRUD под perl. Все кто программируют под web знают, что главная проблема веб программирования обработать HTML form тэги (<form></form>) и при этом работать с БД (как правило с различными СУБД), что в некоторых случаях бывает затруднительно. CRUD - (англ. create read update delete — «Создание чтение обновление удаление»):

##### Код { #####
Операция     SQL-оператор

Создание     INSERT
Чтение     SELECT
Редактирование     UPDATE
Удаление     DELETE
##### Код } #####


Реализовано в Django на Python, Ruby on Rails и на многих фреймворках Java

но лучшая реализация в perl :)
Catalyst::Controller::FormBuilder от CGI::FormBuilder
Catalyst::Controller::FormFu от HTML::FormFu
Catalyst::Plugin::Form::Processor от Form::Processor
Rose::HTML::Form
Catalyst::Plugin::CRUD
CatalystX::ListFramework::Builder
CatalystX::CRUD::YUI
BasicCRUD

Более детально, например, при ошибке нужно все заполненные данные вернуть пользователю обратно, ну и указать в чем именно ошибка. Для удобного программирования в современных языках программирования есть ORM (англ. Object-relational mapping, русск. Объектно-реляционная проекция) присутствуют практически во всех веб фремворках, они необходимы для решения проблем хранения данных существует — это реляционные системы управления базами данных. Использование реляционной базы данных для хранения объектно-ориентированных данных приводит к семантическому провалу, заставляя программистов писать программное обеспечение, которое должно уметь как обрабатывать данные в объектно-ориентированном виде, так и уметь сохранить эти данные в реляционной форме. Эта постоянная необходимость в преобразовании между двумя разными формами данных не только сильно снижает производительность, но и создает трудности для программистов, так как обе формы данных накладывают ограничения друг на друга.

Некоторые реализации ORM автоматически синхронизируют загруженные в память объекты с базой данных. Для того чтобы это было возможным, после создания объект-в-SQL-преобразующего SQL-запроса полученные данные копируются в поля объекта, как во всех других реализациях ORM. После этого объект должен следить за изменениями этих значений и записывать их в базу данных.

Системы управления реляционными базами данных показывают хорошую производительность на глобальных запросах, которые затрагивают большой участок базы данных, но объектно-ориентированный доступ более эффективен при работе с малыми объёмами данных, так как это позволяет сократить семантический провал между объектной и реляционной формами данных.

С точки зрения программиста система должна выглядеть как постоянное хранилище объектов. Он может просто создавать объекты и работать с ними как обычно, а они автоматически будут сохраняться в реляционной базе данных.

На практике всё не так просто и очевидно. Все системы ORM обычно проявляют себя в том или ином виде, уменьшая в некотором роде возможность игнорирования базы данных. Более того, слой транзакций может быть медленным и неэффективным (особенно в терминах сгенерированного SQL). Все это может привести к тому, что программы будут работать медленнее и использовать больше памяти, чем программы, написанные «вручную».

Но ORM избавляет программиста от написания большого количества кода, часто однообразного и подверженного ошибкам, тем самым значительно повышая скорость разработки. Кроме того, большинство современных реализаций ORM позволяют программисту при необходимости самому жёстко задать код SQL-запросов, который будет использоваться при тех или иных действиях (сохранение в базу данных, загрузка, поиск и т. д.) с постоянным объектом.

на perl: Class::DBI (CDBI), DBIx::Class(DBIC), Rose::DB::Object (RDBO) и другие

Важно сказать, про шаблоны программирования на которых основаны фремворки, большинство из них которые под web основаны на модели MVC, позволяют использовать основную бизнес логику в контролерах, модели как правило дополнительный классы (тот же ORM) и представление - это HTML или XML шаблон. Но как правило у них очень много возможностей и по этому много исходного кода, они очень ресурсоемкие, единственное целесообразно использовать их в очень больших проектах. Многие программисты не согласны с тем как построенные данные фремворки, главный недостаток, отсутствие провидения большого рефакторинга с помощью тестирования для улучшения парадигм или для ускорение работы программ (и уменьшение потребляемой памяти). Что использовать выбирайте сами.

покажу свой класс реализацию CRUD для SQL::Abstract

Примечание:
1) я продемонстрировал реализацию CRUD, для моих проектов этого было вполне достаточно, я не делал класс максимально удобно и с большими возможностями, по той причине, что каждый может написать/дописать так как захочет.
2) если что-то не понятно - спрашивайте, потому что я не знаю, то что вы не знаете, по этому комментарнии написал слабые.
3) использовать можно не только в MVC Catalyst.


##### Код { #####
package MyApp::Model::ExtraDBI;

use strict;
use warnings;
use base qw( Catalyst::Model Class::Accessor);
use Class::C3::Adopt::NEXT;
use HTML::Entities::Numbered;

__PACKAGE__->mk_accessors(qw/bad_fields_type all_fields_type/); # вместо $f->bad_fields_type('array');  

sub new {  # наследуем конструктор
    my ( $self, $c ) = @_;
        $self = $self->next::method(@_);
}

sub no_sql {  # метод если есть - значение вставляется в SQL хэш
    my $self = shift;
    $self->{no_sql} = 1;
    return $self;
}

sub no_bad { не вставляется в массив в которой элемент-ошибка
    my $self = shift;
    $self->{no_bad} = 1;
    return $self;
}

####
#   Add out fields
###

sub _add_bad_fields {    
    my ($self) = @_;

    if ( $self->{no_bad} == 1 ) {
        $self->{no_bad} = undef;
        return;
    }
           # куда заносить в массив или в хэш
    if ( $self->bad_fields_type eq 'array' ) {  
        if ( !$self->{bad_array_out} ) {
            $self->{bad_array_out} = [];  # массив

        }
        push @{ $self->{bad_array_out} },
          $self->{key};    # is $self->fails_type  array

    }

    if ( $self->bad_fields_type eq 'hash' ) {

        $self->{bad_hash_out}->{ $self->{key} } =
          $self->{value};  # $self->fails_type  HASH   key = faild, value = name
    }

}
                   # добавляются в другой массив или в хэш все элементы
                   # которые идут в SQL или в форму для возврата
sub _add_all_fields {
    my ($self) = @_;

    if ( $self->{no_sql} == 1 ) {
        $self->{no_sql} = undef;
        return;
    }

    if ( $self->all_fields_type eq 'array' ) {

        if ( !@{ $self->{all_array_out} } ) {
            $self->{all_array_out} = [];
        }

        push @{ $self->{all_array_out} },
          $self->{key};    # is $self->fails_type  array
    }

    if ( $self->all_fields_type eq 'hash' ) {

        $self->{all_hash_out}->{ $self->{key} } =
          $self->{value};  # $self->fails_type  HASH   key = faild, value = name
    }

}

####
#   Clean text, remove bad tag, etc
###

sub _del_blanks_end_began {   # пробелы с начале и в конце
    my $self = shift;

    $self->{value} =~ s/^\s+//;
    $self->{value} =~ s/\s+$//;

    return $self;

}

sub _cleaning {   # сносить оспасный теги
    my $self = shift;

    $self->{value} =~ s!!!g;
    $self->{value} =~ s|&|;|g;
    $self->{value} =~ s|<!--||g;
    $self->{value} =~ s|-->||g;
    $self->{value} =~ s|<script||ig;
    $self->{value} =~ s|>||g;
    $self->{value} =~ s|<||g;
    $self->{value} =~ s|"||g;
    $self->{value} =~ s|  | |g;
    $self->{value} =~ s!\|!|!g;
    $self->{value} =~ s|\n||g;
    $self->{value} =~ s|\$||g;
    $self->{value} =~ s|\r||g;
    $self->{value} =~ s|\_\_(.+?)\_\_||g;
    $self->{value} =~ s|\\||g;
    $self->{value} =~ s|\'||g;
    $self->{value} =~ s|!||g;

    return $self;

}
         # экранируются тэги модулем
sub _clean_html {
    my $self = shift;

    $self->{value} = name2decimal( $self->{value} );

    return $self;
}

####
#   Valid fields
###
sub head_text {
    my $self = shift;

    $self->{key}   = shift; # первый элемент
    $self->{value} = shift; # второй элемент

    $self->_del_blanks_end_began;
    $self->_cleaning;
    $self->_add_all_fields();

    return $self->{value} if ( defined wantarray );
# wantarray для того чтобы определить есть ли элемент на выходе
}

sub valid_id {
    my $self = shift;

    $self->{key}   = shift;
    $self->{value} = shift;

    $self->_del_blanks_end_began();
    $self->_add_all_fields();

    if ( !$self->{value} =~ /^\d+$/ ) {  # цифра
        $self->_add_bad_fields();
        $self->{value} = undef;
    }
    return $self->{value} if ( defined wantarray );

}

sub int_check {
    my $self = shift;
    $self->{key}   = shift;
    $self->{value} = shift;

    $self->_del_blanks_end_began();
    $self->{value} = $self->{value} eq 'on' ? '1' : '0';
    $self->_add_all_fields();

    return $self->{value} if ( defined wantarray );

}

sub one_die {
    my $self = shift;

    $self->{key}   = shift;
    $self->{value} = shift;

    $self->_del_blanks_end_began();

    $self->_add_all_fields();

    if ( !$self->{value} == 1 ) {
        $self->_add_bad_fields();
        $self->{value} = undef;
    }
    return $self->{value} if ( defined wantarray );
}

sub zero_die {
    my $self = shift;

    $self->{key}   = shift;
    $self->{value} = shift;

    $self->_del_blanks_end_began();

    $self->_add_all_fields();

    if ( !$self->{value} == 0 ) {
        $self->_add_bad_fields();
        $self->{value} = undef;
    }
    return $self->{value} if ( defined wantarray );
}

sub cut_xss {

    my $self = shift;

    $self->{key}   = shift if @_;
    $self->{value} = shift if @_;

    $self->_del_blanks_end_began;
    $self->_clean_html;

    return $self->{value} if (wantarray);
    return $self;
}

sub exist_die {
    my $self = shift;

    $self->{key}   = shift if @_;
    $self->{value} = shift if @_;

    $self->_add_all_fields();

    if ( !$self->{value} ) {
        $self->_add_bad_fields();
        $self->{value} = undef;
        $self->{key}   = undef;
    }

    return $self->{value} if (wantarray);
    return $self;

}

####
#   Out fields all and bad
###
            # получение массива или хэша SQL
sub out_all {
    my $self = shift;

    if ( defined $self->{all_array_out} && $self->all_fields_type eq 'array' ) {
        return $self->{all_array_out};
    }

    if ( defined $self->{all_hash_out} && $self->all_fields_type eq 'hash' ) {
        return $self->{all_hash_out};
    }

}
           # там где были ошибки
sub out_bad {
    my $self = shift;

    if ( defined @{ $self->{bad_array_out} }
        && $self->bad_fields_type eq 'array' )
    {
        return $self->{bad_array_out};
    }

    if ( defined $self->{bad_hash_out} && $self->bad_fields_type eq 'hash' ) {
        return $self->{bad_hash_out};
    }

}
                # есть ли ошибки вывести 1
sub error_valid {
    my $self = shift;

    if ( $self->{bad_array_out} || $self->{bad_hash_out} ) {
        return 1;
    }
    else {
        return undef;
    }

}
##### Код } #####


как работает:

##### Код { #####
    my ( $self, $c, $edit_co ) = @_;

    $c->stash->{template} = 'add_section.tt';

    my $f = $c->model('ExtraDBI')->new;  # инициализируется класс

    $f->all_fields_type('hash'); # определяется что возвращать
    $f->bad_fields_type('array');  #
            
           # $c->request->params-> хэш форм
    $f->cut_xss( 'name_co', $c->request->params->{name_content} )->exist_die;
        # Удаляется xss, первый элемент ключ, второй - значение
        # дальше идет метод exist_die, если не определено значение,
        # то возращает ошибку в массив

    $f->cut_xss( 'heading_name_co', $c->request->params->{name_head_content} )
      ->exist_die;

    $f->cut_xss( 'keys_co', $c->request->params->{content_keys} )->exist_die;
    $f->cut_xss( 'text_co', $c->request->params->{content_text} )->exist_die;

    if ( $c->check_user_roles("moder_se") ) {
         # проверяется включен ли элемент HTML check, вкл 1, выкл 0 и вставляться в хэш,
         # дальше из него строиться SQL запрос, хэш отправляется в SQL::Abstarct
        $f->int_check( 'hiden_g_co',
            $c->request->params->{type_hiden_guest_content} );
        $f->int_check( 'close_co', $c->request->params->{type_close_content} );
        $f->int_check( 'active_co',
            $c->request->params->{type_active_content} );

    }

    $f->int_check( 'hiden_co',  $c->request->params->{type_hiden_content} );
    $f->int_check( 'voting_co', $c->request->params->{type_voting_content} );
    $f->int_check( 'forbi_comm_co', $c->request->params->{forbi_comm_co} );

    my $sp;

    if ( $c->request->params->{type_section_privat} eq 'on' ) {
        $sp = 'AND privat_se = 1';
    }
    else {
        $sp = 'AND privat_se = 0';

        $f->no_sql->int_check( 'privat_se', 'on' );
    }

    if ( !$edit_co && !$c->request->params->{section_child2} ) {
        $c->request->params->{section_child2} =
          $c->request->params->{type_section_privat} eq '1' ? 1 : 35;
    }

    if (
        $f->no_sql->valid_id(    
        # это действие в SQL запрос не идет,
        # valid_id() если значение не цифра, то ошибка
            'parent_se_id', $c->request->params->{section_child2}
        )
      )
    {

        my $dbh = $c->model('DBI')->dbh;
        my $sth = $dbh->prepare(
            "SELECT id_se,
                         id_un,
                         close_se,
                         active_se,
                         forbi_content_se,
                         privat_se
                   FROM section
                  WHERE id_se = ?
                    $sp
                  LIMIT 1"
        );
        $sth->execute( $c->request->params->{section_child2} );
        my $section = $sth->fetchrow_hashref();
        $sth->finish();

        if ( $f->exist_die( 'id_se', $section->{id_se} ) ) {  
                # если отсутствует - ошибка

            if ( !$c->check_user_roles('moder_se') ) {

                if (   $section->{active_se} == 0
                    && $section->{id_un} != $c->user->{user}->{id} )
                {
                    $f->no_sql->zero_die( 'active_se', 0 );
                }

                $f->no_sql->zero_die( 'forbi_content_se',
                    $section->{forbi_content_se} );

            }
        }
    }

    if ($edit_co) {
        $f->no_sql->exist_die( 'no_edit_id_co',
            $c->request->params->{edit_id_co} );

        if ( !$c->check_user_roles('moder_se') ) {

            my $dbh = $c->model('DBI')->dbh;
            my $sth = $dbh->prepare(
                "SELECT id_co,
                         close_co,
                         id_un
                        
                   FROM content
                  WHERE id_co = ?

                  LIMIT 1"
            );
            $sth->execute( $c->request->params->{edit_id_co} );
            my $section = $sth->fetchrow_hashref();
            $sth->finish();

            $f->no_sql->zero_die( 'close_co', $section->{close_se} );

            if ( $section->{id_un} == $c->user->{user}->{id} ) {
                $f->no_sql->zero_die( 'id_un_no_co', 0 );
            }

        }

    }

    # если найдена ошибка, то пропускает обработку СУБД
    if ( !$f->error_valid ) {
              # если ошибок нету
        my $hash = $f->out_all; # получаем хэш SQL

        my $type_sql;

        my $where; # дополнительный хэш, условие SQL

        if ($edit_co) {  
                      # если текущее действие редактирование

            $type_sql = 'update';
                        # sql действие для модуля  SQL::Abstarct

            $where->{id_co} = $c->request->params->{edit_id_co};
            $where->{id_un} = $c->user->{user}->{id}
              if ( !$c->check_user_roles('moder_co') );
            $hash->{modified} = time;

        }

        if ( !$edit_co ) {  
                 # аналогично, не редактирование

            if ( !$c->check_user_roles("moder_se") ) {

                $hash->{hiden_g_co} = 0;
                $hash->{close_co}   = 0;
                $hash->{active_co}  = 0;

            }

            $type_sql        = 'insert';
            $hash->{created} = time;
            $hash->{id_un}   = $c->user->{user}->{id};

        }
        use SQL::Abstract;
        my $sql = SQL::Abstract->new;
                                # генерим запрос, таблица content
        my ( $stmt, @bind ) = $sql->$type_sql( 'content', $hash, $where );

        my $dbh = $c->model('DBI')->dbh;
        my $sth = $dbh->prepare($stmt);

        $sth->execute(@bind);

        $sth->finish();
                 # выполнили

        my $lastid = $dbh->{mysql_insertid} unless ($edit_co);
                # последний элемент для редиректа

        my $url;
                   # редиректим в зависимости от условия
        my $redirect_id =
          $edit_co ? $c->request->params->{edit_id_co} : $lastid;

        if ( $c->request->params->{type_redirect} eq 'on' ) {
            $url = '/profile/edit_pesonal_content/' . $redirect_id;
        }
        else {
            $url = '/view_content/' . $redirect_id;
        }

        $c->response->redirect( $c->uri_for($url) );
        $c->detach();

    }
    else {
        # если была ошибка (которая не должна быть, иначе SQL запрос не сработает)

        my $out_all = $f->out_all;
                # получить все элементы, чтобы заполнить обратно формы ШТМЛ
        my $out_bad = $f->out_bad;  
                # там где была ошибка

        $c->stash->{bad_form} = 1;
                # ошибка, $c->stash-> хэш который идет в шаблон HTML
                  
        while ( my ( $key, $value ) = each( %{$out_all} ) ) {  
                   # ссылка на хэш и в шаблон
            $c->stash->{ $key . '_current' } = $value;
        }

        foreach ( @{$out_bad} ) {
                # все плохие эллементы, то же самое массив через ссылку
            $_ .= $_ . '_error' if ( $_ eq 'id_se' );
            $c->stash->{$_} = 1;

        }
                # возвращется обратно в зависимости редактирования или добавления
        if ( !$edit_co ) {
            $c->forward( 'add_content',
                [ $c->request->params->{section_child2} ] );
        }
        else {
            $c->forward( 'edit_pesonal_content',
                [ $c->request->params->{section_child2} ] );
        }
        $c->detach();

    }
##### Код } #####


и пример из книге Джонатана Роквея “Catalyst”

используется: MVC Catatalyst, DBIx::Class, FormBuilder

##### Код { #####
package AddressBook::Controller::Address;
use strict;
use warnings;
use base qw(Catalyst::Controller::FormBuilder Catalyst::Controller::
BindLex');
sub add : Local Form('/address/edit') {
    my ($self, $c, $person_id) = @_;
    $c->stash->{template} = 'address/edit.tt2';
    $c->forward('edit', [undef, $person_id]);
}

sub edit : Local Form {
     my ($self, $c, $address_id, $person_id) = @_;
     my $address : Stashed;
     if(!$address_id && $person_id){
         # we're adding a new address to $person
         # check that person exists
         my $person = $c->model('AddressDB::People')->
                                      find({id => $person_id});
             if(!$person){
                $c->stash->{error} = 'No such person!';
                $c->detach('/person/list');
             }
         # create the new address
             $address = $c->model('AddressDB::Addresses')->
                                       new({person => $person});
  
     }
     else {
         $address = $c->model('AddressDB::Addresses')->
                                   find({id => $address_id});
         if(!$address){
             $c->stash->{error} = 'No such address!';
               $c->detach('/person/list');
         }
     }
     if ($c->form->submitted && $c->form->validate){
             # transfer data from form to database
         $address->location($c->form->field('location'));
         $address->postal ($c->form->field('postal' ));
         $address->phone    ($c->form->field('phone'    ));
         $address->email    ($c->form->field('email'    ));
         $address->insert_or_update;
         $c->stash->{message} =
             ($address_id > 0 ? 'Updated ' : 'Added new ').
                         'address for '. $address->person->name;
         $c->detach('/person/list');
   }
   else {
       # transfer data from database to form
       if(!$address_id){
            $c->stash->{message} = 'Adding a new address ';
       }

             else {
                 $c->stash->{message} = 'Updating an address ';
             }
             $c->stash->{message} .= ' for '. $address->person->name;
             $c->form->field(name => 'location',
                                  value => $address->location);
             $c->form->field(name => 'postal',
                                  value => $address->postal);
             $c->form->field(name => 'phone',
                                  value => $address->phone);
             $c->form->field(name => 'email',
                                  value => $address->email);
         }
     }
     sub delete : Local {
           my ($self, $c, $address_id) = @_;
           my $address = $c->model('AddressDB::Addresses')->
                                            find({id => $address_id});
           if($address){
                 # "Deleted First Last's Home address"
                 $c->stash->{message} =
                       'Deleted ' . $address->person->name. q{'s }.
                             $address->location. ' address';
                 $address->delete;
           }
           else {
                 $c->stash->{error} = 'No such address';
           }
           $c->forward('/person/list');
     }
     1;
##### Код } #####

зеркало

PS: пишу сайты, скрипты на perl, php, etc - обращайтесь!!

Оставайтесь на связи, мы работаем для вас!


© 2007 | IT для бизнеса: it4business.ru


В избранное