หมายเหตุ: ตัวอย่างเหล่านี้ใช้ประโยชน์จาก html :: formfu :: model :: dbic เป็นของ HTML::FormFu v02.005, html :: formfu :: model :: dbic โมดูลไม่ได้รวมกับ HTML::FormFu และมีอยู่ในการกระจายแบบสแตนด์อโลน
use HTML::FormFu;
my $form = HTML::FormFu->new;
$form->load_config_file('form.yml');
$form->process( $cgi_query );
if ( $form->submitted_and_valid ) {
# do something with $form->params
}
else {
# display the form
$template->param( form => $form );
}หากคุณใช้ตัวเร่งปฏิกิริยาตัวอย่างที่เหมาะสมกว่าอาจเป็น:
package MyApp::Controller::User;
use Moose;
extends 'Catalyst::Controller::HTML::FormFu';
sub user : Chained CaptureArgs(1) {
my ( $self, $c, $id ) = @_;
my $rs = $c->model('Schema')->resultset('User');
$c->stash->{user} = $rs->find( $id );
return;
}
sub edit : Chained('user') Args(0) FormConfig {
my ( $self, $c ) = @_;
my $form = $c->stash->{form};
my $user = $c->stash->{user};
if ( $form->submitted_and_valid ) {
$form->model->update( $user );
$c->res->redirect( $c->uri_for( "/user/$id" ) );
return;
}
$form->model->default_values( $user )
if ! $form->submitted;
}หมายเหตุ: เพราะ "กระบวนการ" ถูกเรียกให้คุณโดยตัวควบคุมตัวเร่งปฏิกิริยาโดยอัตโนมัติ หากคุณทำการปรับเปลี่ยนแบบฟอร์มใด ๆ ภายในวิธีการดำเนินการของคุณเช่นการเพิ่มหรือเปลี่ยนองค์ประกอบการเพิ่มข้อ จำกัด ฯลฯ คุณต้องโทรหา "กระบวนการ" อีกครั้งด้วยตัวคุณเองก่อนที่จะใช้ "ส่ง _and_valid" วิธีการใด ๆ ที่แสดงภายใต้ "ค่าฟอร์มที่ส่งและข้อผิดพลาด" หรือ "แก้ไขแบบฟอร์มที่ส่ง" หรือแสดงแบบฟอร์ม
นี่คือตัวอย่างของไฟล์กำหนดค่าเพื่อสร้างแบบฟอร์มการเข้าสู่ระบบพื้นฐาน (ตัวอย่างทั้งหมดที่นี่คือ YAML แต่คุณสามารถใช้รูปแบบใด ๆ ที่สนับสนุนโดย config :: any) คุณยังสามารถสร้างแบบฟอร์มโดยตรงในรหัส Perl ของคุณแทนที่จะใช้ไฟล์กำหนดค่าภายนอก
---
action: /login
indicator: submit
auto_fieldset: 1
elements:
- type: Text
name: user
constraints:
- Required
- type: Password
name: pass
constraints:
- Required
- type: Submit
name: submit
constraints:
- SingleValueHTML :: FORMFU เป็นกรอบรูปแบบ HTML ซึ่งมีจุดมุ่งหมายที่จะใช้งานได้ง่ายที่สุดเท่าที่จะเป็นไปได้สำหรับรูปแบบเว็บพื้นฐาน แต่ด้วยพลังและความยืดหยุ่นในการทำสิ่งอื่นที่คุณอาจต้องการทำ (ตราบใดที่มันเกี่ยวข้องกับรูปแบบ)
คุณสามารถกำหนดค่าเกือบทุกส่วนของพฤติกรรมและเอาต์พุตของ FormFu โดยค่าเริ่มต้นฟอร์ฟฟูเริ่มต้น "XHTML 1.0 ที่เข้มงวด" มาร์กอัปที่สอดคล้องกับมาร์กอัปโดยมีมาร์กอัปพิเศษน้อยที่สุดเท่าที่จะเป็นไปได้ แต่ด้วยชื่อคลาส CSS ที่เพียงพอเพื่อให้ได้รูปแบบเอาท์พุทในวงกว้างโดยการเปลี่ยนเฉพาะ CSS
วิธีทั้งหมดที่แสดงไว้ด้านล่าง (ยกเว้น "ใหม่") สามารถเรียกได้ว่าเป็นวิธีปกติในวัตถุ $form ของคุณหรือเป็นตัวเลือกในไฟล์กำหนดค่าของคุณ ตัวอย่างส่วนใหญ่จะแสดงใน YAML confer syntax
เอกสารนี้เป็นไปตามการประชุมที่ข้อโต้แย้งวิธีการที่ล้อมรอบด้วยวงเล็บเหลี่ยม [] เป็น ทางเลือก และจำเป็นต้องมีข้อโต้แย้งอื่น ๆ ทั้งหมด
อาร์กิวเมนต์: [ตัวเลือก %]
ค่าส่งคืน: $ แบบฟอร์ม
สร้างวัตถุ HTML :: FormFU ใหม่
วิธีการใด ๆ ที่สามารถเรียกได้ในวัตถุ HTML :: FormFU อาจส่งผ่านเป็นอาร์กิวเมนต์ไปยัง "ใหม่" แทน
my $form = HTML::FormFu->new({
action => '/search',
method => 'GET',
auto_fieldset => 1,
}); อาร์กิวเมนต์: $ filename
อาร์กิวเมนต์: @filenames
ค่าส่งคืน: $ แบบฟอร์ม
ยอมรับชื่อไฟล์หรือรายการชื่อไฟล์ที่มีรูปแบบใด ๆ ที่ได้รับการยอมรับจาก config :: any
เนื้อหาของแต่ละไฟล์กำหนดค่าจะถูกส่งไปยัง "เติม" และจะถูกเพิ่มลงในแบบฟอร์ม
"LOAD_CONFIG_FILE" อาจถูกเรียกในไฟล์กำหนดค่าเองเพื่อให้การตั้งค่าทั่วไปถูกเก็บไว้ในไฟล์กำหนดค่าเดียวซึ่งอาจโหลดโดยรูปแบบใด ๆ
---
load_config_file:
- file1
- file2Yaml หลายเอกสารภายในไฟล์เดียว เครื่องหมายเริ่มต้นเอกสารเป็นบรรทัดที่มี 3 ขีด จะมีการใช้เอกสารหลายฉบับตามลำดับราวกับว่ามีชื่อไฟล์หลายชื่อ
ในตัวอย่างต่อไปนี้มีการใช้เอกสารหลายฉบับในการโหลดไฟล์กำหนดค่าอื่นหลังจากเพิ่มองค์ประกอบ (ถ้านี่เป็นเอกสารเดียว load_config_file จะถูกเรียกก่อน elements โดยไม่คำนึงถึงตำแหน่งในไฟล์)
---
elements:
- name: one
- name: two
---
load_config_file: ext.ymlเส้นทางสัมพัทธ์ได้รับการแก้ไขจากไดเรกทอรี "config_file_path" หากตั้งค่ามิฉะนั้นจากไดเรกทอรีการทำงานปัจจุบัน
ดู "แนวทางปฏิบัติที่ดีที่สุด" สำหรับคำแนะนำเกี่ยวกับการจัดระเบียบไฟล์กำหนดค่า
อาร์กิวเมนต์: ตัวเลือก %
หากกำหนดไว้อาร์กิวเมนต์จะใช้เพื่อสร้างข้อมูล :: ผู้เยี่ยมชม :: วัตถุการโทรกลับในระหว่าง "load_config_file" ซึ่งอาจใช้ในการประมวลผลการกำหนดค่าก่อนที่จะถูกส่งไปยัง "เติม"
ตัวอย่างเช่นรหัสด้านล่างจะเพิ่มการโทรกลับไปยังแบบฟอร์มที่จะเปลี่ยนค่าการกำหนดค่าใด ๆ ที่ลงท้ายด้วย ".yml" เป็นแบบไดนามิก "
$form->config_callback({
plain_value => sub {
my( $visitor, $data ) = @_;
s/.yml/.yaml/;
}
});ค่าเริ่มต้น: ไม่ได้กำหนดไว้
วิธีนี้เป็น 'accessor ที่สืบทอดมา' พิเศษซึ่งหมายความว่าสามารถตั้งค่าในแบบฟอร์มองค์ประกอบบล็อกหรือองค์ประกอบเดียว เมื่อมีการอ่านค่าหากไม่มีการกำหนดค่ามันจะผ่านลำดับชั้นขององค์ประกอบของผู้ปกครองโดยอัตโนมัติผ่านองค์ประกอบบล็อกใด ๆ และขึ้นอยู่กับแบบฟอร์มค้นหาค่าที่กำหนดไว้
อาร์กิวเมนต์: ตัวเลือก %
ค่าส่งคืน: $ แบบฟอร์ม
แต่ละปุ่มตัวเลือก/ค่าที่ผ่านอาจเป็น HTML :: Method-Name และ Agvuments ของ FormFU
ให้วิธีง่ายๆในการตั้งค่าหลายค่าหรือเพิ่มหลายองค์ประกอบในรูปแบบที่มีวิธีการโทรแบบเดียว
ความพยายามที่จะโทรหาวิธีเมธอด-ชื่อตามลำดับกึ่งฉลาด (ดูแหล่งที่มาของ populate () ใน HTML::FormFu::ObjectUtil สำหรับรายละเอียด)
อาร์กิวเมนต์: %ค่าเริ่มต้น
ค่าส่งคืน: $ แบบฟอร์ม
ตั้งค่าเริ่มต้นของฟิลด์หลายค่าจากแฮชรีฟเดียว
คีย์ของ Hash-Ref สอดคล้องกับชื่อของฟิลด์ฟอร์มและค่าจะถูกส่งผ่านไปยังวิธีเริ่มต้นของฟิลด์
สิ่งนี้ควรถูกเรียกหลังจากฟิลด์ทั้งหมดได้รับการเพิ่มลงในแบบฟอร์มและก่อนที่จะเรียกว่า "กระบวนการ" (มิฉะนั้นให้เรียก "กระบวนการ" อีกครั้งก่อนที่จะแสดงผลแบบฟอร์ม)
อาร์กิวเมนต์: $ directory_name
"config_file_path" กำหนดตำแหน่งที่ไฟล์การกำหนดค่าจะถูกค้นหาหากไม่ได้รับพา ธ สัมบูรณ์ให้กับ "load_config_file"
ค่าเริ่มต้น: ไม่ได้กำหนดไว้
วิธีนี้เป็น 'accessor ที่สืบทอดมา' พิเศษซึ่งหมายความว่าสามารถตั้งค่าในแบบฟอร์มองค์ประกอบบล็อกหรือองค์ประกอบเดียว เมื่อมีการอ่านค่าหากไม่มีการกำหนดค่ามันจะผ่านลำดับชั้นขององค์ประกอบของผู้ปกครองโดยอัตโนมัติผ่านองค์ประกอบบล็อกใด ๆ และขึ้นอยู่กับแบบฟอร์มค้นหาค่าที่กำหนดไว้
เป็นอุปกรณ์เสริมที่สืบทอดมา
อาร์กิวเมนต์: $ field_name
อาร์กิวเมนต์: & coderef
หาก "ตัวบ่งชี้" ถูกตั้งค่าเป็นชื่อฟิลด์ "ส่ง" จะส่งคืนจริงหากส่งค่าสำหรับชื่อฟิลด์นั้น
หาก "ตัวบ่งชี้" ถูกตั้งค่าเป็นรหัส-รีฟมันจะถูกเรียกว่าเป็นรูทีนย่อยที่มีทั้งสองอาร์กิวเมนต์ $form และ $query และค่าส่งคืนจะถูกใช้เป็นค่าส่งคืนสำหรับ "ส่ง"
หากไม่ได้ตั้งค่า "ตัวบ่งชี้" "ส่ง" จะส่งคืนจริงหากมีการส่งค่าสำหรับชื่อฟิลด์ที่รู้จักใด ๆ
อาร์กิวเมนต์: 1
อาร์กิวเมนต์: ตัวเลือก %
ค่าส่งคืน: $ fieldset
การตั้งค่านี้เหมาะสำหรับรูปแบบพื้นฐานส่วนใหญ่และหมายความว่าโดยทั่วไปคุณสามารถเพิกเฉยต่อการเพิ่มฟิลด์ด้วยตัวเอง
การโทร $form->auto_fieldset(1) เพิ่มองค์ประกอบ FieldSet ลงในแบบฟอร์มทันที หลังจากนั้น, $form->elements() จะเพิ่มองค์ประกอบทั้งหมด (ยกเว้น FieldSets) ลงใน FieldSet นั้นแทนที่จะไปยังแบบฟอร์มโดยตรง
หากต้องการเฉพาะองค์ประกอบจะถูกเพิ่มลงในชุดฟิลด์ สุดท้าย ในแบบฟอร์มดังนั้นหากคุณเพิ่มชุดฟิลด์อื่นองค์ประกอบใด ๆ เพิ่มเติมจะถูกเพิ่มลงในชุดฟิลด์นั้น
นอกจากนี้คุณอาจผ่าน Hashref ไปยัง Auto_fieldSet () และสิ่งนี้จะถูกใช้เพื่อตั้งค่าเริ่มต้นสำหรับชุดแรกที่สร้างขึ้น
ตัวอย่างและผลลัพธ์ของพวกเขาเพื่อแสดงให้เห็น:
2 องค์ประกอบที่ไม่มีชุดฟิลด์
---
elements:
- type: Text
name: foo
- type: Text
name: bar
<form action="" method="post">
<div class="text">
<input name="foo" type="text" />
</div>
<div class="text">
<input name="bar" type="text" />
</div>
</form>2 องค์ประกอบที่มี "auto_fieldset"
---
auto_fieldset: 1
elements:
- type: Text
name: foo
- type: Text
name: bar
<form action="" method="post">
<fieldset>
<div class="text">
<input name="foo" type="text" />
</div>
<div class="text">
<input name="bar" type="text" />
</div>
</fieldset>
</form>องค์ประกอบที่ 3 อยู่ในชุดฟิลด์ใหม่
---
auto_fieldset: { id: fs }
elements:
- type: Text
name: foo
- type: Text
name: bar
- type: Fieldset
- type: Text
name: baz
<form action="" method="post">
<fieldset id="fs">
<div class="text">
<input name="foo" type="text" />
</div>
<div class="text">
<input name="bar" type="text" />
</div>
</fieldset>
<fieldset>
<div class="text">
<input name="baz" type="text" />
</div>
</fieldset>
</form>เนื่องจากพฤติกรรมนี้หากคุณต้องการ FieldSets ซ้อนคุณจะต้องเพิ่มชุดฟิลด์ซ้อนกันแต่ละรายการโดยตรงไปยังผู้ปกครองที่ตั้งใจไว้
my $parent = $form->get_element({ type => 'Fieldset' });
$parent->element('fieldset'); อาร์กิวเมนต์: $ สตริง
โดยปกติข้อผิดพลาดในการป้อนข้อมูลจะทำให้ข้อความแสดงข้อผิดพลาดปรากฏขึ้นพร้อมกับฟิลด์ฟอร์มที่เหมาะสม หากคุณต้องการข้อความแสดงข้อผิดพลาดทั่วไปที่จะแสดงที่ด้านบนของแบบฟอร์มคุณสามารถตั้งค่าข้อความด้วย "form_error_message"
หากต้องการตั้งค่าคลาส CSS สำหรับข้อความดู "form_error_message_class"
หากต้องการเปลี่ยนมาร์กอัปที่ใช้เพื่อแสดงข้อความให้แก้ไขไฟล์เทมเพลต form_error_message ดู "render_method"
เป็น accessor เอาท์พุท
ถ้าเป็นจริงบังคับให้ "form_error_message" จะแสดงแม้ว่าจะไม่มีข้อผิดพลาดของฟิลด์ก็ตาม
อาร์กิวเมนต์: %ค่าเริ่มต้น
ตั้งค่าเริ่มต้นซึ่งจะถูกเพิ่มเข้าไปในทุกองค์ประกอบข้อ จำกัด ฯลฯ ของประเภทที่กำหนดซึ่งจะถูกเพิ่มในแบบฟอร์มในภายหลัง
ตัวอย่างเช่นเพื่อให้ทุกองค์ประกอบ Text มีขนาด 10 โดยอัตโนมัติและทำให้เครื่องฟอกข้อมูล Strftime ทุกตัวจะได้รับการตั้งค่า strftime โดยอัตโนมัติเป็น %d/%m/%Y :
default_args:
elements:
Text:
size: 10
deflators:
Strftime:
strftime: '%d/%m/%Y'ตัวอย่างที่จะทำให้องค์ประกอบ dateTime ทั้งหมดจะได้รับเครื่องฟอกข้อมูล strftime ที่เหมาะสมโดยอัตโนมัติและ dateTime inflator:
default_args:
elements:
DateTime:
deflators:
type: Strftime
strftime: '%d-%m-%Y'
inflators:
type: DateTime
parser:
strptime: '%d-%m-%Y' เป็นกรณีพิเศษคุณยังสามารถใช้บล็อก elements Block Field และ Input เพื่อให้ตรงกับองค์ประกอบใด ๆ ที่สืบทอดมาจาก html :: formfu :: องค์ประกอบ :: does หรือ html :: formfu :: role :: element :: field หรือ html :: formfu :: role :: olle :: olde :: input
แต่ละปุ่ม elements สามารถมีรายการ any โดยใช้ | ตัวแบ่ง: เช่น
# apply the given class to any Element of type Password or Button
default_args:
elements:
'Password|Button':
attrs:
class: novalidate รายการคีย์แต่ละ elements สามารถมีประเภทที่เริ่มต้นด้วย + เพื่อจับคู่องค์ประกอบกับบรรพบุรุษของประเภทที่กำหนด: เช่น
# only apple the given class to an Input field within a Multi block
default_args:
elements:
'Input|+Multi':
attrs:
class: novalidate รายการคีย์แต่ละ elements สามารถมีประเภทที่เริ่มต้นด้วย - เพื่อจับคู่องค์ประกอบที่ไม่มีบรรพบุรุษของประเภทที่กำหนด: เช่น
# apply the given class only to Input fields that are not in a Multi block
default_args:
elements:
'Input|-Multi':
attrs:
class: validate อาร์กิวเมนต์ถูกนำไปใช้ในลำดับอย่างน้อยถึงเฉพาะเจาะจงมากที่สุด: Block , Field , Input , $type ภายในแต่ละข้อโต้แย้งจะถูกนำไปใช้ตามลำดับที่สั้นที่สุดก่อนถึงยาวที่สุด
คีย์ type จะต้องตรงกับค่าที่ส่งคืนตาม type เช่น "ประเภท" ใน html :: ormitfu :: องค์ประกอบ ตัวอย่างเช่นถ้าคุณมีองค์ประกอบที่กำหนดเองด้านนอกของ HTML::FormFu::Element::* namespace ซึ่งคุณโหลดผ่าน $form->element({ type => '+My::Custom::Element' }) + type() ให้ ไว้ กับ "default_args" ตัวอย่าง:
# don't include the leading '+' here
default_args:
elements:
'My::Custom::Element':
attrs:
class: whatever
# do include the leading '+' here
elements:
- type: +My::Custom::Element"default_args" สร้าง Hashref เดี่ยวเพื่อส่งผ่านไปยัง "เติม" การรวมอาร์กิวเมนต์สำหรับแต่ละประเภทในทางกลับ - หมายถึง "เติม" เรียกว่าเพียงครั้งเดียวทั้งหมด - ไม่ใช่หนึ่งครั้งสำหรับแต่ละประเภท เนื่องจากค่าสเกลาร์ ไม่ได้ รวมเข้าด้วยกัน - หมายความว่าค่าในภายหลังจะแทนที่ค่าก่อนหน้านี้: เช่น
# Normally, calling $field->add_attrs({ class => 'input' })
# then calling $field->add_attrs({ class => 'not-in-multi' })
# would result in both values being retained:
# class="input not-in-multi"
#
# However, default_args() creates a single data-structure to pass once
# to populate(), so any scalar values will overwrite earlier ones
# before they reach populate().
#
# The below example would result in the longest-matching key
# overwriting any others:
# class="not-in-multi"
#
default_args:
elements:
Input:
add_attrs:
class: input
'Input:-Multi':
add_attrs:
class: not-in-multi หมายเหตุ: แตกต่างจากวิธีการที่เหมาะสมซึ่งมีนามแฝงเช่น "องค์ประกอบ" ซึ่งเป็นนามแฝงสำหรับ "องค์ประกอบ" - ปุ่มที่กำหนดให้กับ default_args ต้องเป็นรูปแบบพหูพจน์เช่น:
default_args:
elements: {}
deflators: {}
filters: {}
constraints: {}
inflators: {}
validators: {}
transformers: {}
output_processors: {} หากตั้งค่าเนื้อหาจะแสดงผลภายในแท็ก script ภายในด้านบนของแบบฟอร์ม
อาร์กิวเมนต์: $ url
อาร์กิวเมนต์: @urls
เพิ่มแท็ก script สำหรับแต่ละ URL ทันทีก่อนที่ส่วน "JavaScript" ใด ๆ
อาร์กิวเมนต์: [%private_stash]
ค่าส่งคืน: %สะสม
จัดเตรียมแฮชรีฟซึ่งคุณสามารถจัดเก็บข้อมูลใด ๆ ที่คุณอาจต้องการเชื่อมโยงกับแบบฟอร์ม
---
stash:
foo: value
bar: value อาร์กิวเมนต์: $ ประเภท
อาร์กิวเมนต์: ตัวเลือก %
ค่าส่งคืน: $ องค์ประกอบ
อาร์กิวเมนต์: @arrayref_of_types_or_options
ค่าส่งคืน: @Elements
เพิ่มองค์ประกอบใหม่ในแบบฟอร์ม ดู "ฟิลด์ฟอร์มหลัก" ใน html :: formfu :: องค์ประกอบและ "องค์ประกอบหลักอื่น ๆ " ใน html :: formfu :: องค์ประกอบสำหรับรายการองค์ประกอบหลัก
หากคุณต้องการโหลดองค์ประกอบจากเนมสเปซนอกเหนือจาก HTML::FormFu::Element:: คุณสามารถใช้ชื่อแพ็คเกจที่ผ่านการรับรองได้อย่างสมบูรณ์โดยนำหน้าด้วย +
---
elements:
- type: +MyApp::CustomElement
name: foo หากไม่ได้ให้ type ใน %options Text เริ่มต้นจะถูกใช้
"องค์ประกอบ" เป็นนามแฝงสำหรับ "องค์ประกอบ"
อาร์กิวเมนต์: $ ประเภท
อาร์กิวเมนต์: ตัวเลือก %
ค่าส่งคืน: $ deflator
อาร์กิวเมนต์: @arrayref_of_types_or_options
ค่าส่งคืน: @deflators
ตัว deflator อาจเชื่อมโยงกับฟิลด์ฟอร์มใด ๆ และอนุญาตให้คุณให้ $ ฟิลด์-> ค่าเริ่มต้นด้วยค่าซึ่งอาจเป็นวัตถุ
หากวัตถุไม่ได้กำหนดค่าที่เหมาะสมสำหรับการแสดงผล deflator สามารถมั่นใจได้ว่าฟิลด์ฟอร์มจะได้รับค่าสตริงที่เหมาะสมแทน
ดู "core deflators" ใน html :: formfu :: deflator สำหรับรายการ deflators หลัก
หากไม่มีการให้ name แอตทริบิวต์ตัวกำหนดค่าใหม่จะถูกสร้างขึ้นและเพิ่มลงในทุกฟิลด์ในแบบฟอร์ม
หากคุณต้องการโหลด deflator ในเนมสเปซอื่นนอกเหนือจาก HTML::FormFu::Deflator:: คุณสามารถใช้ชื่อแพ็คเกจที่มีคุณสมบัติครบถ้วนโดยนำหน้าด้วย +
"deflator" เป็นนามแฝงสำหรับ "deflators"
อาร์กิวเมนต์: $ new_element, $ appialing_element
ค่าส่งคืน: $ new_element
อาร์กิวเมนต์ที่ 1 จะต้องเป็นองค์ประกอบที่คุณต้องการเพิ่มอาร์กิวเมนต์ที่ 2 จะต้องเป็นองค์ประกอบที่มีอยู่ซึ่งควรวางองค์ประกอบใหม่มาก่อน
my $new = $form->element(%specs);
my $position = $form->get_element({ type => $type, name => $name });
$form->insert_before( $new, $position ); ในบรรทัดแรกของตัวอย่างข้างต้นองค์ประกอบ $new จะถูกเพิ่มเข้ามาในตอนท้ายของแบบฟอร์ม อย่างไรก็ตามเมธอด insert_before จะทำการคืนค่าองค์ประกอบ $new ดังนั้นมันจะไม่อยู่ในตอนท้ายของแบบฟอร์มอีกต่อไป ด้วยเหตุนี้ถ้าคุณพยายามคัดลอกองค์ประกอบจากแบบฟอร์มหนึ่งไปอีกรูปแบบหนึ่งมันจะ 'ขโมย' องค์ประกอบแทนที่จะคัดลอก ในกรณีนี้คุณต้องใช้ clone :
my $new = $form1->get_element({ type => $type1, name => $name1 })
->clone;
my $position = $form2->get_element({ type => $type2, name => $name2 });
$form2->insert_before( $new, $position ); อาร์กิวเมนต์: $ new_element, $ appialing_element
ค่าส่งคืน: $ new_element
อาร์กิวเมนต์ที่ 1 จะต้องเป็นองค์ประกอบที่คุณต้องการเพิ่มอาร์กิวเมนต์ที่ 2 จะต้องเป็นองค์ประกอบที่มีอยู่ซึ่งควรวางองค์ประกอบใหม่หลังจาก
my $new = $form->element(%specs);
my $position = $form->get_element({ type => $type, name => $name });
$form->insert_after( $new, $position ); ในบรรทัดแรกของตัวอย่างข้างต้นองค์ประกอบ $new จะถูกเพิ่มเข้ามาในตอนท้ายของแบบฟอร์ม อย่างไรก็ตามเมธอด insert_after reparents องค์ประกอบ $new ดังนั้นมันจะไม่อยู่ในตอนท้ายของแบบฟอร์มอีกต่อไป ด้วยเหตุนี้ถ้าคุณพยายามคัดลอกองค์ประกอบจากแบบฟอร์มหนึ่งไปอีกรูปแบบหนึ่งมันจะ 'ขโมย' องค์ประกอบแทนที่จะคัดลอก ในกรณีนี้คุณต้องใช้ clone :
my $new = $form1->get_element({ type => $type1, name => $name1 })
->clone;
my $position = $form2->get_element({ type => $type2, name => $name2 });
$form2->insert_after( $new, $position ); อาร์กิวเมนต์: $ องค์ประกอบ
ค่าส่งคืน: $ องค์ประกอบ
ลบ $element ออกจากแบบฟอร์มหรืออาร์เรย์ของเด็ก
$form->remove_element( $element );องค์ประกอบกำพร้าไม่สามารถใช้เป็นประโยชน์สำหรับสิ่งใด ๆ จนกว่าจะถูกเชื่อมต่อกับแบบฟอร์มหรือบล็อกด้วย "insert_before" หรือ "insert_after" อีกครั้ง
HTML :: FormFU จัดเตรียมหลายขั้นตอนสำหรับสิ่งที่อธิบายไว้แบบดั้งเดิมเป็นการ ตรวจสอบความถูกต้อง นี่คือ:
ขั้นตอนแรกตัวกรองอนุญาตให้ล้างข้อมูลผู้ใช้เช่นการเข้ารหัสหรือลบช่องว่างชั้นนำ/ต่อท้ายหรือลบอักขระที่ไม่ใช่ตัวเลขจากหมายเลขบัตรเครดิต
ขั้นตอนต่อไปนี้ทั้งหมดอนุญาตให้มีการประมวลผลที่ซับซ้อนมากขึ้นและแต่ละขั้นตอนมีกลไกที่จะอนุญาตให้มีการโยนข้อยกเว้นเพื่อแสดงข้อผิดพลาดในการป้อนข้อมูล ในแต่ละขั้นตอนฟิลด์ฟอร์มทั้งหมดจะต้องดำเนินการโดยไม่มีข้อผิดพลาดสำหรับขั้นตอนต่อไปเพื่อดำเนินการต่อ หากมีข้อผิดพลาดใด ๆ แบบฟอร์มควรจะแสดงใหม่ให้กับผู้ใช้เพื่อให้พวกเขาป้อนค่าที่ถูกต้อง
ข้อ จำกัด มีไว้สำหรับการตรวจสอบค่าระดับต่ำเช่น "นี่เป็นจำนวนเต็มหรือไม่", "ค่านี้อยู่ภายในขอบเขตหรือไม่" หรือ "ที่อยู่อีเมลที่ถูกต้องหรือไม่"
Inflators มีวัตถุประสงค์เพื่อให้ค่ากลายเป็นวัตถุที่เหมาะสม วัตถุที่ได้จะถูกส่งผ่านไปยังตัวตรวจสอบและหม้อแปลงที่ตามมาและจะถูกส่งคืนโดย "params" และ "param"
ผู้ตรวจสอบมีไว้สำหรับการตรวจสอบระดับที่สูงขึ้นเช่นข้อ จำกัด ทางธุรกิจและฐานข้อมูลเช่น "ชื่อผู้ใช้นี้เป็นเอกลักษณ์หรือไม่" การตรวจสอบความถูกต้องจะทำงานเฉพาะในกรณีที่ข้อ จำกัด และเครื่องฉีดน้ำทั้งหมดทำงานโดยไม่มีข้อผิดพลาด คาดว่าผู้ตรวจสอบส่วนใหญ่จะเป็นแอปพลิเคชันเฉพาะและแต่ละคนจะถูกนำไปใช้เป็นคลาสแยกต่างหากที่เขียนโดยผู้ใช้ HTML :: FormFU
อาร์กิวเมนต์: $ ประเภท
อาร์กิวเมนต์: ตัวเลือก %
ค่าส่งคืน: $ filter
อาร์กิวเมนต์: @arrayref_of_types_or_options
ค่าส่งคืน: @Filters
หากคุณระบุ name หรือ names ตัวกรองจะถูกเพิ่มเข้าไปในฟิลด์ชื่อนั้น หากคุณไม่ได้ระบุ name หรือ names กรองจะถูกเพิ่มในฟิลด์ทั้งหมดที่แนบมากับแบบฟอร์มแล้ว
ดู "ตัวกรองหลัก" ใน html :: formfu :: ตัวกรองสำหรับรายการตัวกรองหลัก
หากคุณต้องการโหลดตัวกรองในเนมสเปซอื่นนอกเหนือจาก HTML::FormFu::Filter:: คุณสามารถใช้ชื่อแพ็คเกจที่มีคุณสมบัติครบถ้วนโดยนำหน้าด้วย +
"ตัวกรอง" เป็นนามแฝงสำหรับ "ตัวกรอง"
อาร์กิวเมนต์: $ ประเภท
อาร์กิวเมนต์: ตัวเลือก %
ค่าส่งคืน: $ ข้อ จำกัด
อาร์กิวเมนต์: @arrayref_of_types_or_options
ค่าส่งคืน: @Constraints
ดู "ข้อ จำกัด หลัก" ใน html :: formfu :: ข้อ จำกัด สำหรับรายการข้อ จำกัด หลัก
หากไม่มีแอตทริบิวต์ name ข้อ จำกัด ใหม่จะถูกสร้างขึ้นและเพิ่มลงในทุกฟิลด์ในแบบฟอร์ม
หากคุณต้องการโหลดข้อ จำกัด ในเนมสเปซอื่นนอกเหนือจาก HTML::FormFu::Constraint:: คุณสามารถใช้ชื่อแพ็คเกจที่ผ่านการรับรองได้อย่างสมบูรณ์โดยนำหน้าด้วย +
"ข้อ จำกัด " เป็นนามแฝงสำหรับ "ข้อ จำกัด "
อาร์กิวเมนต์: $ ประเภท
อาร์กิวเมนต์: ตัวเลือก %
มูลค่าคืน: $ inflator
อาร์กิวเมนต์: @arrayref_of_types_or_options
ค่าส่งคืน: @inflators
ดู "core inflators" ใน html :: formfu :: inflator สำหรับรายการของตัวควบคุมหลัก
หากไม่ได้ให้ name แอตทริบิวต์ชื่อ Inflator ใหม่จะถูกสร้างขึ้นและเพิ่มลงในทุกฟิลด์ในแบบฟอร์ม
หากคุณต้องการโหลด inflator ใน namespace อื่นนอกเหนือจาก HTML::FormFu::Inflator:: คุณสามารถใช้ชื่อแพ็คเกจที่มีคุณสมบัติครบถ้วนโดยนำหน้าด้วย +
"Inflator" เป็นนามแฝงสำหรับ "inflator"
อาร์กิวเมนต์: $ ประเภท
อาร์กิวเมนต์: ตัวเลือก %
ค่าส่งคืน: $ validator
อาร์กิวเมนต์: @arrayref_of_types_or_options
ค่าส่งคืน: @Validators
ดู "ตัวตรวจสอบหลัก" ใน HTML :: FormFU :: Validator สำหรับรายการผู้ตรวจสอบหลัก
หากไม่มีแอตทริบิวต์ name ตัวตรวจสอบใหม่จะถูกสร้างขึ้นและเพิ่มลงในทุกฟิลด์ในแบบฟอร์ม
หากคุณต้องการโหลดผู้ตรวจสอบในเนมสเปซนอกเหนือจาก HTML::FormFu::Validator:: คุณสามารถใช้ชื่อแพ็คเกจที่ผ่านการรับรองอย่างสมบูรณ์โดยนำหน้าด้วย +
"Validator" เป็นนามแฝงสำหรับ "ผู้ตรวจสอบ"
อาร์กิวเมนต์: $ ประเภท
อาร์กิวเมนต์: ตัวเลือก %
ค่าส่งคืน: $ transformer
อาร์กิวเมนต์: @arrayref_of_types_or_options
ค่าส่งคืน: @transformers
ดู "Core Transformers" ใน HTML :: FormFU :: Transformer สำหรับรายการของหม้อแปลงหลัก
หากไม่มีแอตทริบิวต์ name หม้อแปลงใหม่จะถูกสร้างขึ้นและเพิ่มลงในทุกฟิลด์ในแบบฟอร์ม
หากคุณต้องการโหลดหม้อแปลงในเนมสเปซนอกเหนือจาก HTML::FormFu::Transformer:: คุณสามารถใช้ชื่อแพ็คเกจที่ผ่านการรับรองอย่างสมบูรณ์โดยนำหน้าด้วย +
"Transformer" เป็นนามแฝงสำหรับ "Transformers"
พฤติกรรมเริ่มต้นเมื่อแสดงแบบฟอร์มอีกครั้งหลังจากการส่งคือฟิลด์มีค่าที่ผู้ใช้ไม่เปลี่ยนแปลงดั้งเดิม
หาก "render_processed_value" เป็นความจริงค่าฟิลด์จะเป็นผลลัพธ์สุดท้ายหลังจากตัวกรองทั้งหมดเครื่องฉีดน้ำและหม้อแปลงได้รับการเรียกใช้ deflators จะถูกเรียกใช้กับค่า
หากคุณตั้งค่าสิ่งนี้ในฟิลด์ที่มีตัวขยาย แต่ไม่มี deflator ที่เทียบเท่าคุณควรตรวจสอบให้แน่ใจว่า inflators stringify กลับสู่ค่าที่ใช้งานได้เพื่อไม่ให้สับสน / รบกวนผู้ใช้
ค่าเริ่มต้น: เท็จ
วิธีนี้เป็น 'accessor ที่สืบทอดมา' พิเศษซึ่งหมายความว่าสามารถตั้งค่าในแบบฟอร์มองค์ประกอบบล็อกหรือองค์ประกอบเดียว เมื่อมีการอ่านค่าหากไม่มีการกำหนดค่ามันจะผ่านลำดับชั้นขององค์ประกอบของผู้ปกครองโดยอัตโนมัติผ่านองค์ประกอบบล็อกใด ๆ และขึ้นอยู่กับแบบฟอร์มค้นหาค่าที่กำหนดไว้
เป็นอุปกรณ์เสริมที่สืบทอดมา
บังคับให้ข้อ จำกัด ล้มเหลวโดยไม่คำนึงถึงการป้อนข้อมูลของผู้ใช้
หากสิ่งนี้เรียกว่ารันไทม์หลังจากประมวลผลแบบฟอร์มแล้วคุณต้องเรียกว่า "กระบวนการ" ใน HTML :: FormFU อีกครั้งก่อนที่จะแสดงแบบฟอร์มให้กับผู้ใช้อีกครั้ง
ค่าเริ่มต้น: เท็จ
วิธีนี้เป็น 'accessor ที่สืบทอดมา' พิเศษซึ่งหมายความว่าสามารถตั้งค่าในแบบฟอร์มองค์ประกอบบล็อกองค์ประกอบหรือข้อ จำกัด เดียว เมื่อมีการอ่านค่าหากไม่มีการกำหนดค่ามันจะผ่านลำดับชั้นขององค์ประกอบของผู้ปกครองโดยอัตโนมัติผ่านองค์ประกอบบล็อกใด ๆ และขึ้นอยู่กับแบบฟอร์มค้นหาค่าที่กำหนดไว้
เป็นอุปกรณ์เสริมที่สืบทอดมา
ถ้าเป็นจริงทำให้เกิด "params", "param" และ "ถูกต้อง" เพื่อละเว้นฟิลด์ใด ๆ ที่ชื่อเริ่มต้นด้วยขีดล่าง _
ฟิลด์ยังคงดำเนินการตามปกติและข้อผิดพลาดจะทำให้ "ส่ง _and_valid" เพื่อส่งคืนเท็จ
ค่าเริ่มต้น: เท็จ
แอตทริบิวต์ทั้งหมดจะถูกเพิ่มเข้าไปในแท็กเริ่มต้นของฟอร์มการแสดงผล
# Example
---
attributes:
id: form
class: fancy_formเป็นแอตทริบิวต์ accessor
เป็นคุณลักษณะทางลัด
ค่าเริ่มต้น: ""
รับหรือตั้งค่าการกระทำที่เกี่ยวข้องกับแบบฟอร์ม ค่าเริ่มต้นคือไม่มีการดำเนินการซึ่งทำให้เบราว์เซอร์ส่วนใหญ่ส่งไปยัง URI ปัจจุบัน
เป็นคุณลักษณะทางลัด
รับหรือตั้งค่าประเภทการเข้ารหัสของแบบฟอร์ม ค่าที่ถูกต้องคือ application/x-www-form-urlencoded และ multipart/form-data
หากแบบฟอร์มมีองค์ประกอบไฟล์ Enctype จะถูกตั้งค่าเป็น multipart/form-data โดยอัตโนมัติ
เป็นคุณลักษณะทางลัด
ค่าเริ่มต้น: "โพสต์"
รับหรือตั้งค่าวิธีการที่ใช้ในการส่งแบบฟอร์ม สามารถตั้งค่าเป็น "โพสต์" หรือ "รับ"
เป็นคุณลักษณะทางลัด
รับหรือตั้งค่าแอตทริบิวต์ชื่อของฟอร์ม
เป็นคุณลักษณะทางลัด
แอตทริบิวต์คลาสสำหรับข้อความแสดงข้อผิดพลาดที่แสดงที่ด้านบนของแบบฟอร์ม
ดู "form_error_message"
อาร์กิวเมนต์: [ @Languages]
รายการภาษาที่จะถูกส่งผ่านไปยังวัตถุการแปล
ค่าเริ่มต้น: ['en']
อาร์กิวเมนต์: [$ class_name]
className ที่จะใช้สำหรับวัตถุการแปลเริ่มต้น
ค่าเริ่มต้น: 'html :: formfu :: i18n'
อาร์กิวเมนต์: [$ key, @arguments]
เข้ากันได้กับวิธี maketext ใน locale :: maketext
อาร์กิวเมนต์: $ locale
ปัจจุบันใช้โดย html :: formfu :: deflator :: formatnumber และ html :: formfu :: filter :: formatNumber
วิธีนี้เป็น 'accessor ที่สืบทอดมา' พิเศษซึ่งหมายความว่าสามารถตั้งค่าในแบบฟอร์มองค์ประกอบบล็อกหรือองค์ประกอบเดียว เมื่อมีการอ่านค่าหากไม่มีการกำหนดค่ามันจะผ่านลำดับชั้นขององค์ประกอบของผู้ปกครองโดยอัตโนมัติผ่านองค์ประกอบบล็อกใด ๆ และขึ้นอยู่กับแบบฟอร์มค้นหาค่าที่กำหนดไว้
เป็นอุปกรณ์เสริมที่สืบทอดมา
อาร์กิวเมนต์: [$ query_object]
อาร์กิวเมนต์: %params
จัดเตรียมวัตถุแบบสอบถามที่เข้ากันได้กับ CGI หรือแฮชรีฟของชื่อ/ค่าที่ส่งมา อีกทางเลือกหนึ่งวัตถุแบบสอบถามสามารถส่งผ่านไปยังวัตถุ "กระบวนการ" โดยตรง
อาร์กิวเมนต์: [$ query_type]
ตั้งค่าโมดูลที่ใช้เพื่อให้ "การสืบค้น"
ตัวเร่งปฏิกิริยา :: คอนโทรลเลอร์ :: html :: formfu ตั้งค่าสิ่งนี้เป็น Catalyst โดยอัตโนมัติ
ค่าที่ถูกต้องคือ CGI , Catalyst และ CGI::Simple
ค่าเริ่มต้น: 'CGI'
อาร์กิวเมนต์: [$ query_object]
อาร์กิวเมนต์: [%params]
ประมวลผลวัตถุแบบสอบถามหรือค่าอินพุตที่ให้ไว้ process จะต้องถูกเรียกก่อนเรียกวิธีการใด ๆ ที่ระบุไว้ภายใต้ "ค่าฟอร์มที่ส่งและข้อผิดพลาด" และ "การแก้ไขแบบฟอร์มที่ส่ง"
process จะต้องถูกเรียกอย่างน้อยหนึ่งครั้งก่อนที่จะพิมพ์แบบฟอร์มหรือเรียก "render" หรือ "render_data"
หมายเหตุถึงผู้ใช้ตัวเร่งปฏิกิริยา :: คอนโทรลเลอร์ :: html :: formfu: เพราะ "กระบวนการ" ถูกเรียกโดยอัตโนมัติโดยตัวควบคุม Catalyst; หากคุณทำการปรับเปลี่ยนแบบฟอร์มใด ๆ ภายในวิธีการดำเนินการของคุณเช่นการเพิ่มหรือเปลี่ยนองค์ประกอบการเพิ่มข้อ จำกัด ฯลฯ คุณต้องเรียก "กระบวนการ" อีกครั้งด้วยตัวคุณเองก่อนที่จะใช้ "ส่ง _and_valid" วิธีการใด ๆ ที่ระบุไว้ภายใต้ "ค่าฟอร์มที่ส่งและข้อผิดพลาด" หรือ "แก้ไขแบบฟอร์มที่ส่ง" หรือแสดงแบบฟอร์ม
ส่งคืนจริงหากส่งแบบฟอร์มแล้ว ดู "ตัวบ่งชี้" สำหรับรายละเอียดเกี่ยวกับวิธีการคำนวณนี้
ชวเลขสำหรับ $form->submitted && !$form->has_errors
ค่าส่งคืน: %params
ส่งคืนแฮชรีฟของอินพุตที่ถูกต้องทั้งหมดซึ่งไม่มีข้อผิดพลาด
อาร์กิวเมนต์: $ field_name
"param" ที่น่าเชื่อถือและน่าเชื่อถือยิ่งขึ้น รับประกันว่าจะส่งคืนค่าเดียวเสมอไม่ว่าจะเรียกในบริบทของรายการหรือไม่ก็ตาม หากมีการส่งหลายค่าจะส่งคืนค่าแรกเท่านั้น หากค่าไม่ถูกต้องหรือไม่ได้ส่งแบบฟอร์มจะส่งคืน undef สิ่งนี้ทำให้เหมาะสำหรับใช้ในบริบทรายการซึ่งจำเป็นต้องมีค่าเดียว
$db->update({
name => $form->param_value('name'),
address => $form->param_value('address),
}); อาร์กิวเมนต์: $ field_name
รับประกันว่าจะส่งคืนค่าอาร์เรย์ของค่าโดยไม่คำนึงถึงบริบทและไม่ว่าจะมีการส่งค่าหลายค่าหรือไม่ก็ตาม หากค่าไม่ถูกต้องหรือไม่ได้ส่งแบบฟอร์มจะส่งคืนอาร์เรย์ที่ว่างเปล่า
อาร์กิวเมนต์: $ field_name
รับประกันว่าจะส่งคืนรายการของค่าเสมอโดยไม่คำนึงถึงบริบท หากค่าไม่ถูกต้องหรือไม่ได้ส่งแบบฟอร์มจะส่งคืนรายการที่ว่างเปล่า
อาร์กิวเมนต์: [$ field_name]
ค่าส่งคืน: $ input_value
ค่าส่งคืน: @valid_names
ไม่แนะนำให้ใช้อีกต่อไปเนื่องจากพฤติกรรมของมันยากที่จะทำนาย ใช้ "param_value", "param_array" หรือ "param_list" แทน
วิธี A (อ่านอย่างง่าย) คล้ายกับของ CGI
หากชื่อฟิลด์ได้รับในรายการบริบทส่งคืนค่าที่ถูกต้องใด ๆ ที่ส่งสำหรับฟิลด์นั้นและในสเกลาร์บริบทจะส่งคืนค่าแรกของค่าที่ถูกต้องใด ๆ ที่ส่งสำหรับฟิลด์นั้น
หากไม่มีการโต้แย้งให้ส่งคืนรายการชื่อฟิลด์อินพุตที่ถูกต้องทั้งหมดโดยไม่มีข้อผิดพลาด
การผ่านการโต้แย้งมากกว่า 1 ครั้งเป็นข้อผิดพลาดร้ายแรง
อาร์กิวเมนต์: [$ field_name]
ค่าส่งคืน: @valid_names
ค่าส่งคืน: $ bool
หากชื่อฟิลด์หากได้รับให้ส่งคืน true หากฟิลด์นั้นไม่มีข้อผิดพลาดและ false หากมีข้อผิดพลาด
หากไม่มีการโต้แย้งให้ส่งคืนรายการชื่อฟิลด์อินพุตที่ถูกต้องทั้งหมดโดยไม่มีข้อผิดพลาด
อาร์กิวเมนต์: [$ field_name]
ค่าส่งคืน: @names
ค่าส่งคืน: $ bool
หากชื่อฟิลด์หากได้รับให้ส่งคืน true ถ้าฟิลด์นั้นมีข้อผิดพลาดและ false หากไม่มีข้อผิดพลาด
หากไม่มีการโต้แย้งให้ส่งคืนรายการชื่อฟิลด์อินพุตทั้งหมดที่มีข้อผิดพลาด
อาร์กิวเมนต์: [ตัวเลือก%]
อาร์กิวเมนต์: [ตัวเลือก %]
ค่าส่งคืน: @errors
ส่งคืนอาเรย์รีฟของวัตถุข้อยกเว้นจากทั้งหมดในฟิลด์ในรูปแบบ
ยอมรับทั้ง name type และ stage เพื่อ จำกัด ผลลัพธ์ที่ส่งคืน
$form->get_errors({
name => 'foo',
type => 'Regex',
stage => 'constraint'
}); อาร์กิวเมนต์: [ตัวเลือก%]
อาร์กิวเมนต์: [ตัวเลือก %]
ค่าส่งคืน: $ ข้อผิดพลาด
ยอมรับอาร์กิวเมนต์เดียวกันกับ "get_errors" แต่จะส่งคืนข้อผิดพลาดครั้งแรกเท่านั้น
ดู html :: formfu :: รุ่นสำหรับรายละเอียดเพิ่มเติมและรุ่นที่มีอยู่
อาร์กิวเมนต์: $ model_name
ค่าเริ่มต้น: 'dbic'
อาร์กิวเมนต์: [$ model_name]
ค่าส่งคืน: $ รุ่น
อาร์กิวเมนต์: %config
อาร์กิวเมนต์: $ name, $ value
ค่าส่งคืน: $ มูลค่า
ค่าที่ให้มาแทนที่ค่าปัจจุบันใด ๆ สำหรับฟิลด์ที่มีชื่อ ค่านี้จะถูกส่งคืนในการเรียกร้องให้ "params" และ "param" ในภายหลังและฟิลด์ชื่อจะรวมอยู่ในการคำนวณสำหรับ "ถูกต้อง"
ลบข้อผิดพลาดทั้งหมดจากแบบฟอร์มที่ส่ง
ค่าส่งคืน: $ สตริง
คุณต้องเรียกว่า "กระบวนการ" หนึ่งครั้งหลังจากสร้างแบบฟอร์มและก่อนที่จะโทรหา "เรนเดอร์"
ค่าส่งคืน: $ สตริง
ส่งคืนแท็กเริ่มต้นแบบฟอร์มและผลลัพธ์ใด ๆ ของ "form_error_message" และ "JavaScript"
ค่าส่งคืน: $ สตริง
ส่งคืนแท็กปลายแบบฟอร์ม
ค่าส่งคืน: $ สตริง
ส่งคืนฟิลด์ฟอร์มที่ซ่อนอยู่ทั้งหมด
HTML::FormFu จัดเตรียมระบบปลั๊กอินที่อนุญาตให้เพิ่มปลั๊กอินในรูปแบบหรือองค์ประกอบเพื่อเปลี่ยนพฤติกรรมเริ่มต้นหรือเอาต์พุต
ดู html :: formfu :: ปลั๊กอินสำหรับรายละเอียด
โดยค่าเริ่มต้น FormFU แสดงผลมาร์กอัปที่สอดคล้องกับ "XHTML 1.0 ที่เข้มงวด" โดยมีมาร์กอัปพิเศษน้อยที่สุดเท่าที่จะทำได้ ตะขอจำนวนมากมีให้เพื่อเพิ่มชื่อคลาส CSS ที่สร้างขึ้นตามโปรแกรมเพื่อให้สามารถสร้างรูปแบบเอาต์พุตช่วงกว้างโดยการเปลี่ยนเฉพาะ CSS
การปรับแต่งขั้นพื้นฐานของมาร์กอัปสามารถทำได้ผ่านวิธีการเลย์เอาต์และแบบมัลติ_layout สิ่งนี้ช่วยให้คุณสามารถจัดลำดับตำแหน่งของส่วนต่าง ๆ ของแต่ละฟิลด์ใหม่ได้เช่นฉลากความคิดเห็นข้อความแสดงข้อผิดพลาดและแท็กอินพุต - รวมถึงการแทรกแท็กอื่น ๆ ที่คุณต้องการ
หากสิ่งนี้ไม่เพียงพอคุณสามารถปรับแต่งมาร์กอัปได้อย่างสมบูรณ์โดยบอก HTML :: FormFU ให้ใช้เอ็นจิ้นการเรนเดอร์ภายนอกเช่นชุดเครื่องมือเทมเพลตหรือเทมเพลต :: โลหะผสม ดู "render_method" และ "tt_module" สำหรับรายละเอียด
แม้ว่าคุณจะตั้งค่า html :: formfu เพื่อใช้เทมเพลต :: toolkit เพื่อแสดงผลรูปแบบ, html :: formfu ยังคงสามารถใช้ร่วมกับระบบ <TMPL_VAR form> อื่น ๆ ที่คุณต้องการใช้สำหรับรูป <form tal:replace="form"></form> เพจของคุณ <!-- {form} -->
จาก HTML::FormFu v1.00 , TT ไม่ได้ระบุไว้ในข้อกำหนดเบื้องต้นที่จำเป็นอีกต่อไป - ดังนั้นคุณจะต้องติดตั้งด้วยตนเองหากคุณต้องการใช้ไฟล์เทมเพลต
ค่าเริ่มต้น: string
สามารถตั้งค่าเป็น tt เพื่อสร้างแบบฟอร์มด้วยไฟล์เทมเพลตภายนอก
ในการปรับแต่งมาร์กอัปคุณจะต้องมีสำเนาของไฟล์เทมเพลตท้องถิ่นไปยังแอปพลิเคชันของคุณ ดู "การติดตั้งเทมเพลต TT" ใน html :: formfu :: คู่มือ :: ตำราอาหารสำหรับรายละเอียดเพิ่มเติม
คุณสามารถปรับแต่งมาร์กอัปสำหรับองค์ประกอบเดียวโดยการตั้งค่า "render_method" ขององค์ประกอบเป็น tt ในขณะที่ส่วนที่เหลือของแบบฟอร์มใช้วิธีการเรนเดอร์ string เริ่มต้น หมายเหตุว่าถ้าคุณลองตั้งค่าแบบฟอร์มหรือ "render_method" ของบล็อกเป็น tt จากนั้นตั้งค่าองค์ประกอบของเด็ก "render_method" เป็น string การตั้งค่านั้นจะถูกละเว้นและองค์ประกอบของเด็กจะยังคงใช้วิธีการเรนเดอร์ tt
---
elements:
- name: foo
render_method: tt
filename: custom_field
- name: bar
# in this example, 'foo' will use a custom template,
# while bar will use the default 'string' rendering methodวิธีนี้เป็น 'accessor ที่สืบทอดมา' พิเศษซึ่งหมายความว่าสามารถตั้งค่าในแบบฟอร์มองค์ประกอบบล็อกหรือองค์ประกอบเดียว เมื่อมีการอ่านค่าหากไม่มีการกำหนดค่ามันจะผ่านลำดับชั้นขององค์ประกอบของผู้ปกครองโดยอัตโนมัติผ่านองค์ประกอบบล็อกใด ๆ และขึ้นอยู่กับแบบฟอร์มค้นหาค่าที่กำหนดไว้
เป็นอุปกรณ์เสริมที่สืบทอดมา
เปลี่ยนชื่อไฟล์เทมเพลตที่ใช้สำหรับแบบฟอร์ม
ค่าเริ่มต้น: "ฟอร์ม"
อาร์กิวเมนต์: [%constructor_arguments]
ยอมรับแฮชรีฟของอาร์กิวเมนต์ที่ส่งผ่านไปยัง "render_method" ซึ่งเรียกว่าภายในโดย "render"
ภายใน TT_ARGS คีย์ RELATIVE และ RECURSION จะถูกแทนที่ให้เป็นจริงเสมอเพราะสิ่งเหล่านี้เป็นข้อกำหนดพื้นฐานสำหรับเอ็นจิ้นเทมเพลต
ไดเรกทอรีระบบที่มีไฟล์เทมเพลต HTML :: ของ FormFU จะถูกเพิ่มเข้ามาในตอนท้ายของ INCLUDE_PATH เสมอเพื่อให้พบไฟล์เทมเพลตหลัก คุณจะต้องตั้งค่าด้วยตัวเองหากคุณมีสำเนาไฟล์เทมเพลตของคุณเองเพื่อวัตถุประสงค์ในการปรับแต่ง
วิธีนี้เป็น 'accessor ที่สืบทอดมา' พิเศษซึ่งหมายความว่าสามารถตั้งค่าในแบบฟอร์มองค์ประกอบบล็อกหรือองค์ประกอบเดียว เมื่อมีการอ่านค่าหากไม่มีการกำหนดค่ามันจะผ่านลำดับชั้นขององค์ประกอบของผู้ปกครองโดยอัตโนมัติผ่านองค์ประกอบบล็อกใด ๆ และขึ้นอยู่กับแบบฟอร์มค้นหาค่าที่กำหนดไว้
อาร์กิวเมนต์: [%constructor_arguments]
ตรวจสอบให้แน่ใจว่าอาร์กิวเมนต์แฮชรีฟถูกรวมเข้ากับค่าแฮชรีฟที่มีอยู่ของ "tt_args"
ค่าเริ่มต้น: เทมเพลต
โมดูลที่ใช้เมื่อ "render_method" ถูกตั้งค่าเป็น tt ควรให้อินเทอร์เฟซที่เข้ากันได้กับเทมเพลต
วิธีนี้เป็น 'accessor ที่สืบทอดมา' พิเศษซึ่งหมายความว่าสามารถตั้งค่าในแบบฟอร์มองค์ประกอบบล็อกหรือองค์ประกอบเดียว เมื่อมีการอ่านค่าหากไม่มีการกำหนดค่ามันจะผ่านลำดับชั้นขององค์ประกอบของผู้ปกครองโดยอัตโนมัติผ่านองค์ประกอบบล็อกใด ๆ และขึ้นอยู่กับแบบฟอร์มค้นหาค่าที่กำหนดไว้
มักจะเรียกโดยปริยายโดย "render" ส่งคืนโครงสร้างข้อมูลที่ปกติจะถูกส่งไปยัง string หรือวิธีการเรนเดอร์ tt
เช่นเดียวกับ "เรนเดอร์" คุณต้องเรียกกระบวนการ "กระบวนการ" หนึ่งครั้งหลังจากสร้างแบบฟอร์มและก่อนที่จะเรียกว่า "render_data"
เช่น "render_data" แต่ไม่รวมข้อมูลสำหรับการเลือกตั้งเด็ก
อาร์กิวเมนต์: [ตัวเลือก%]
อาร์กิวเมนต์: [ตัวเลือก %]
ค่าส่งคืน: @Elements
ส่งคืนฟิลด์ทั้งหมดในรูปแบบ (โดยเฉพาะองค์ประกอบทั้งหมดที่มี "is_field" จริงใน html :: formfu :: ค่าองค์ประกอบ)
ยอมรับทั้ง name และ type อาร์กิวเมนต์เพื่อ จำกัด ผลลัพธ์ที่ส่งคืน
$form->get_fields({
name => 'foo',
type => 'Radio',
});ยอมรับ regexp เพื่อค้นหาผลลัพธ์
$form->get_elements({
name => qr/oo/,
}); อาร์กิวเมนต์: [ตัวเลือก%]
อาร์กิวเมนต์: [ตัวเลือก %]
ค่าส่งคืน: $ องค์ประกอบ
ยอมรับอาร์กิวเมนต์เดียวกันกับ "get_fields" แต่จะส่งคืนฟิลด์แรกที่พบเท่านั้น
อาร์กิวเมนต์: [ตัวเลือก%]
อาร์กิวเมนต์: [ตัวเลือก %]
ค่าส่งคืน: @Elements
ส่งคืนองค์ประกอบระดับบนทั้งหมดในรูปแบบ (ไม่ใช่การเรียกซ้ำ) ดู "get_all_elements" สำหรับเวอร์ชันซ้ำ
ยอมรับทั้ง name และ type อาร์กิวเมนต์เพื่อ จำกัด ผลลัพธ์ที่ส่งคืน
$form->get_elements({
name => 'foo',
type => 'Radio',
});ยอมรับ regexp เพื่อค้นหาผลลัพธ์
$form->get_elements({
name => qr/oo/,
}); อาร์กิวเมนต์: [ตัวเลือก%]
อาร์กิวเมนต์: [ตัวเลือก %]
ค่าส่งคืน: $ องค์ประกอบ
ยอมรับอาร์กิวเมนต์เดียวกันกับ "get_elements" แต่จะส่งคืนองค์ประกอบแรกที่พบเท่านั้น
ดู "get_all_element" สำหรับเวอร์ชันซ้ำ
อาร์กิวเมนต์: [ตัวเลือก%]
อาร์กิวเมนต์: [ตัวเลือก %]
ค่าส่งคืน: @Elements
ส่งคืนองค์ประกอบทั้งหมดในแบบฟอร์มซ้ำ
เลือกรับทั้ง name และ type อาร์กิวเมนต์เพื่อ จำกัด ผลลัพธ์ที่ส่งคืน
# return all Text elements
$form->get_all_elements({
type => 'Text',
});ยอมรับ regexp เพื่อค้นหาผลลัพธ์
$form->get_elements({
name => qr/oo/,
});ดู "get_elements" สำหรับรุ่นที่ไม่ได้รับการฟื้นฟู
อาร์กิวเมนต์: [ตัวเลือก%]
อาร์กิวเมนต์: [ตัวเลือก %]
ค่าส่งคืน: $ องค์ประกอบ
ยอมรับอาร์กิวเมนต์เดียวกันกับ "get_all_elements" แต่จะส่งคืนองค์ประกอบแรกที่พบเท่านั้น
# return the first Text field found, regardless of whether it's
# within a fieldset or not
$form->get_all_element({
type => 'Text',
});ยอมรับ regexp เพื่อค้นหาผลลัพธ์
$form->get_elements({
name => qr/oo/,
});ดู "get_all_elements" สำหรับเวอร์ชันที่ไม่ซ้ำกัน
อาร์กิวเมนต์: [ตัวเลือก%]
อาร์กิวเมนต์: [ตัวเลือก %]
ค่าส่งคืน: @deflators
ส่งคืน deflators ระดับบนทั้งหมดจากทุกฟิลด์
ยอมรับทั้ง name และ type อาร์กิวเมนต์เพื่อ จำกัด ผลลัพธ์ที่ส่งคืน
$form->get_deflators({
name => 'foo',
type => 'Strftime',
}); อาร์กิวเมนต์: [ตัวเลือก%]
อาร์กิวเมนต์: [ตัวเลือก %]
ค่าส่งคืน: $ องค์ประกอบ
ยอมรับอาร์กิวเมนต์เดียวกันกับ "get_deflators" แต่จะส่งคืนเครื่องฟอกข้อมูลแรกเท่านั้น
Arguments: [%options]
Arguments: [%options]
Return Value: @filters
Returns all top-level filters from all fields.
Accepts both name and type arguments to narrow the returned results.
$form->get_filters({
name => 'foo',
type => 'LowerCase',
}); Arguments: [%options]
Arguments: [%options]
Return Value: $filter
Accepts the same arguments as "get_filters", but only returns the first filter found.
Arguments: [%options]
Arguments: [%options]
Return Value: @constraints
Returns all constraints from all fields.
Accepts both name and type arguments to narrow the returned results.
$form->get_constraints({
name => 'foo',
type => 'Equal',
}); Arguments: [%options]
Arguments: [%options]
Return Value: $constraint
Accepts the same arguments as "get_constraints", but only returns the first constraint found.
Arguments: [%options]
Arguments: [%options]
Return Value: @inflators
Returns all inflators from all fields.
Accepts both name and type arguments to narrow the returned results.
$form->get_inflators({
name => 'foo',
type => 'DateTime',
}); Arguments: [%options]
Arguments: [%options]
Return Value: $inflator
Accepts the same arguments as "get_inflators", but only returns the first inflator found.
Arguments: [%options]
Arguments: [%options]
Return Value: @validators
Returns all validators from all fields.
Accepts both name and type arguments to narrow the returned results.
$form->get_validators({
name => 'foo',
type => 'Callback',
}); Arguments: [%options]
Arguments: [%options]
Return Value: $validator
Accepts the same arguments as "get_validators", but only returns the first validator found.
Arguments: [%options]
Arguments: [%options]
Return Value: @transformers
Returns all transformers from all fields.
Accepts both name and type arguments to narrow the returned results.
$form->get_transformers({
name => 'foo',
type => 'Callback',
}); Arguments: [%options]
Arguments: [%options]
Return Value: $transformer
Accepts the same arguments as "get_transformers", but only returns the first transformer found.
Returns a deep clone of the $form object.
Because of scoping issues, code references (such as in Callback constraints) are copied instead of cloned.
For the basic method, eg /attributes :
Arguments: [%attributes]
Arguments: [%attributes]
Return Value: $form
As a special case, if no arguments are passed, the attributes hash-ref is returned. This allows the following idioms.
# set a value
$form->attributes->{id} = 'form';
# delete all attributes
%{ $form->attributes } = ();All methods documented as 'attribute accessors' also have the following variants generated:
*_xml can be used as a setter, and ensures that its argument is not XML-escaped in the rendered form.
*_loc can he used as a setter, and passes the arguments through "localize".
add_* can be used to append a word to an attribute without overwriting any already-existing value.
# Example
$form->attributes({ class => 'fancy' });
$form->add_attributes({ class => 'pants' });
# class="fancy pants" add_*_xml , like add_* , but ensures it doesn't get XML-escaped.
add_*_loc , like add_* , but passing the arguments through "localize".
del_* can be used to remove a word from an attribute value.
# Example
$form->attributes({ class => 'fancy pants' });
$form->del_attributes({ class => 'pants' });
# class="fancy" del_*_xml , like del_* , but ensures it doesn't get XML-escaped.
del_*_loc , like del_* , but passing the arguments through "localize".
Also, any attribute method-name which contains the word attributes also has aliases created for all these variants, with the word attributes replaced by attrs .
# For example, the attributes() method would have all these variant
# methods available
$form->attributes({ class => 'fancy' });
$form->attributes_xml({ title => '<b>fancy</b>' });
$form->attributes_loc({ title => 'fancy' });
$form->add_attributes({ class => 'fancy' });
$form->add_attributes_xml({ title => '<b>fancy</b>' });
$form->add_attributes_loc({ title => 'fancy' });
$form->del_attributes({ class => 'fancy' });
$form->del_attributes_xml({ title => '<b>fancy</b>' });
$form->del_attributes_loc({ title => 'fancy' });
# Because the method contains the word 'attributes', it also gets the
# following short-forms
$form->attrs({ class => 'fancy' });
$form->attrs_xml({ title => '<b>fancy</b>' });
$form->attrs_loc({ title => 'fancy' });
$form->add_attrs({ class => 'fancy' });
$form->add_attrs_xml({ title => '<b>fancy</b>' });
$form->add_attrs_loc({ title => 'fancy' });
$form->del_attrs({ class => 'fancy' });
$form->del_attrs_xml({ title => '<b>fancy</b>' });
$form->del_attrs_loc({ title => 'fancy' });All methods documented as 'attribute short-cuts' are short-cuts to directly access individual attribute key/values.
# Example
$form->id( 'login' );
$id = $form->id;
# is equivalent to:
$form->attributes({ id => 'login' });
$id = $form->attributes->{id}; All attribute short-cuts also have a *_xml variant.
# Example
$form->id_xml( $xml );
# is equivalent to:
$form->attributes_xml({ id => $xml }); All attribute short-cuts also have a *_loc variant.
# Example
$form->title_loc( $key );
# is equivalent to:
$form->attributes_loc({ title => $key });All methods documented as 'inheriting accessors' can be set on the form, a block element or a single field element. When the value is read, if no value is defined it automatically traverses the element's hierarchy of parents, searching for a defined value.
All inherited accessors also have a *_no_inherit variant, which can be used as a getter to fetch any defined value, without traversing the hierarchy of parents. This variant cannot be used as a setter.
Eg, the "auto_id" has a variant named auto_id_no_inherit .
All methods documented as 'output accessors' also have *_xml and *_loc variants.
The *_xml variant can be used as a setter, and ensures that its argument is not XML-escaped in the rendered form.
The *_loc variant can be used as a setter, and passes the arguments through "localize".
Eg, the label method has variants named label_xml and label_loc .
To support boolean attributes, whose value should either be equal to the attribute name, or empty. Any true value will switch the attribute 'on', any false value will remove the attribute.
# Example
$field->autofocus(1);
# equivalent to:
$field->attributes({ autofocus => 'autofocus' });
$field->autofocus(0);;
# equivalent to:
delete $field->attributes->{autofocus};Some attributes support character substitutions: the following substitutions are possible:
%f # $form->id
%n # $field->name
%t # lc( $field->type )
%r # $block->repeatable_count
%s # $error->stageThese allow each field to have consistent attributes, while remaining unique.
We try our best to not make incompatible changes, but if they're required we'll make every effort possible to provide backwards compatibility for several release-cycles, issuing a warnings about the changes, before removing the legacy features.
v1.00 dropped most of the default HTML class-names, with the intention that each application should define just what it needs, without needing to reset unwanted options first. We also gain the benefit of less markup being generated, speeding up both render and HTTP transfers.
To restore the previous behaviour, set the following options.
If you're using best practices, you'll only need to set these once per-application in your app-wide config file.
---
auto_container_class: '%t'
auto_container_label_class: 'label'
auto_container_comment_class: 'comment'
auto_comment_class: 'comment'
auto_container_error_class: 'error'
auto_container_per_error_class: 'error_%s_%t'
auto_error_class: 'error_message error_%s_%t'See "DEPRECATED METHODS" in HTML::FormFu::Role::Element::Field.
See also "REMOVED METHODS" in HTML::FormFu::Element.
Has been removed; see "default_args" instead.
Has been removed; use "default_model" instead.
Has been removed; use "default_values" in HTML::FormFu::Model instead.
Has been removed; use "update" in HTML::FormFu::Model instead.
It is advisable to keep application-wide (or global) settings in a single config file, which should be loaded by each form.
See "load_config_file".
HTML::FormFu::Manual::Cookbook
HTML::FormFu::Manual::Unicode
The distribution directory examples/vertically-aligned contains a form with example CSS for a "vertically aligned" theme.
This can be viewed by opening the file vertically-aligned.html in a web-browser.
If you wish to experiment with making changes, the form is defined in file vertically-aligned.yml , and the HTML file can be updated with any changes by running the following command (while in the distribution root directory).
perl examples/vertically-aligned/vertically-aligned.pl This uses the Template Toolkit file vertically-aligned.tt , and the CSS is defined in files vertically-aligned.css and vertically-aligned-ie.css .
HTML::FormFu::Imager
Catalyst::Controller::HTML::FormFu
HTML::FormFu::Model::DBIC
Brian Cassidy
Ozum Eldogan
Ruben Fonseca
Ronald Kimball
Daisuke Maki
Andreas Marienborg
Mario Minati
Steve Nolte
Moritz Onken
Doug Orleans
Matthias Dietrich
Dean Hamstead
Karen Etheridge
Nigel Metheringham
Based on the original source code of HTML::Widget, by Sebastian Riedel, [email protected] .
Carl Franks <[email protected]>
This software is copyright (c) 2018 by Carl Franks.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.