Fields
All columns and fields in DGS are described in the fields
section.
You can create your field
by inheriting from the AbstractField
class.
System fields are located in src/store/field/
.
Foreign Key Field
This field describes the relationship of a column with another table. If you are using DGS to work with a database table, make sure that you have set up a Foreign Key at the database level as well.
<field type="foreignKey"
name="id_city"
caption="City"
width="15%"
foreignTable="cities"
foreignKeyField="id"
foreignValueField="caption"
join="true" />
If you need the foreignKey
to reference a table that is already involved in the query,
you should use the alias
attribute:
<field type="foreignKey"
name="id_parent"
caption="<?php echo __l('Section')?>"
foreignTable="settings"
alias="parent_settings"
foreignKeyField="id"
foreignValueField="caption"
isnull="true"
allowEmpty="true"
width="20%" />
Attributes:
foreignTable
- the name of the table to which the foreign key refers.foreignKeyField
- the name of the column in theforeignTable
to which the foreign key refers.foreignValueField
- the name of the column in theforeignTable
whose value will be used for display and search.foreignOrderBy
- sorting of values.foreignLimit
- limit on the number of loaded values.unique
- load only unique values.autocomplete
- logic for dynamically loading values, see the description of theautocomplete
attribute.showSearchInput
- whether to show search for autocomplete (default istrue
).joinType
- specify join type for the tableforeignTable
, default isLEFT
. (Example:joinType="INNER"
).
<field type="foreignKey"
name="school_id"
foreignTable="school"
foreignKeyField="id"
foreignValueField="name"
sorting="true"
filter="text"
caption="<?php echo __l('School'); ?>"
required="true"
width="30%"
allowEmpty="true"
autocomplete="true"
autocompleteLimit="10" />
Example when we need to load a composite value:
<field type="foreignKey"
name="id_param"
caption="<?php echo __('Setting')?>"
sorting="true"
foreignTable="settings"
foreignKeyField="id"
foreignValueField="CONCAT(settings.caption, ' | ', settings.id)"
width="20%"/>
If you need to add conditions to filter values in the foreign key:
$idParamField = &$store->getModel()->getFieldByName('id_param');
$search = array(
'value' => 12
);
$idParamField->set('search', $search);
Overriding the Value Loading Logic for Foreign Key
You can completely override the logic for loading values for foreignKey
or add parameters to the main logic:
- DGS must have a plugin.
<table charset="UTF-8" name="projects" primaryKey="id" defaultOrderField="id" defaultOrderDirection="DESC" plugin="Games" rowsForPage="50">
- Implement the
IStoreProxyForeignKeyValuesListener
interface and override the method in the pluginonPrepareStoreForeignKeyFieldValues
:public function onPrepareStoreForeignKeyFieldValues( Store &$store, AbstractField &$field, array &$info ): void { if ($field->getName() != "FIELD_NAME") { return; } $parentValues = $store->getParentValues(); $info['where'][] = 'form = '.$this->core->db->quote( $parentValues['ident'] ); return true; }
If you want to completely override the logic, you need to override the values
key in $info
:
public function onPrepareStoreForeignKeyFieldValues(Store &$store, ForeignKeyField &$field, array &$info): void
{
$info['values'] = array(
1 => 'Test',
2 => 'Test 2'
);
}
Autocomplete
autocomplete="true"
- will display a select2 field with fast search, convenient for large lists.
Datetime Field
<field type="datetime"
name="date_order"
caption="Order Date"
width="20%"
sorting="true" />
Attributes:
default
- the default date format.format
- the date format, see datetime format.length
- deprecated, use format.html5
- if set totrue
, a standardhtml5
calendar will be displayed.time
- if set totrue
andhtml5="true"
, a standardhtml5
calendar with time will be displayed.
The format
display does not work with the html5
attribute, so it is recommended to use a framework calendar to display correct formats.
When specifying a format with hours/minutes/seconds, it allows selecting them in the calendar.
The default
attribute must be specified in the correct format that the database and strtotime
can process.
When using externalValues
, the date of this attribute will be stored in the database! Also, you need to write the correct format,
otherwise an Exception will be thrown about the incorrect format.
If it is expected that the field can be empty (nullable), it is necessary to specify inull="true"
for correct operation.
Wysiwyg Field
<field type="wysiwyg"
name="body"
caption="Content"
required="true"
hide="true" />
File Field
<field type="file"
name="file"
caption="Images"
thumb="120x80"
fileName="wphid__ID__.jpg" />
Attributes:
uploadDirPath
- the path where the file will be uploaded. It is used only when the field is used to upload an image.httpPath
- the path that will be used to display the file to the user (relative).fileName
- file name template. You can use the following aliases:link
- custom link to the file. If specified, thehttpPath
attribute will be ignored, and the file name will not be added.
Aliases are available for substitution in attributes from the string via %field_name%
, as well as __EXT__
and __NAME__
from the database.
Only for images:
thumb
- the size of the image thumbnail (a copy of the specified size will be created in[uploadDirPath]/thumbs/
).resize
- the maximum size of the image (the uploaded image will be converted to the specified values if it exceeds them).
Multi File Field
<field type="multiFile"
name="file"
uploadDirPath="/http/myProject/storage/test/"
httpPath="/storage/test/"
caption="Files"
fileName="__INDEX__test__ID__.zip" />
Attributes:
uploadDirPath
- the path where the file will be uploaded.httpPath
- the path that will be used to display the file to the user (relative).fileName
- file name template. You can use the following aliases:link
- custom link to the file. If specified, thehttpPath
attribute will be ignored, and the file name will not be added.
Use aliases to build the file name to avoid overwriting files with the same name.
Image Field
Fully inherits from file
, but limits the upload to images only.
Many2many Field
<field type="many2many"
caption="Relation"
linkTable="infomessages_to"
linkField="message_id"
linkForeignField="group_id"
foreignTable="groups"
foreignKeyField="id"
foreignValueField="group_name" />
<field type="many2many"
caption="<?php echo __('Permissions')?>"
linkTable="festi_sections_user_permission"
linkField="id_user"
linkForeignField="id_section"
foreignTable="company_sections"
foreignKeyField="id_section"
foreignValueField="caption"
hide="true">
<option id="1"><?php echo __('View')?></option>
<option id="2"><?php echo __('Edit')?></option>
</field>
By default, the field is displayed as
checkbox
. To display values as a select2 list, you can use themultiple="true"
attribute.
Attributes:
foreignTable
- the name of the table to which the foreign key refers.foreignKeyField
- the name of the column in theforeignTable
to which the foreign key refers.foreignValueField
- the name of the column in theforeignTable
whose value will be used for display and search.linkTable
- the name of the linking table.linkField
- the name of the column in thelinkTable
to which the foreign key of the current table refers.linkForeignField
- the name of the column in thelinkTable
to which the foreign key of theforeignTable
referscondition
- additional conditions for field values, applied to display values in the DGS list (Store::ACTION_LIST
).unique
- set totrue
when only unique values should be displayed in the list and filter for the field.autocomplete
- logic for dynamically loading values, see the description of theautocomplete
attribute.valuesOrderBy
- sorting for valuesajaxFormFields
- list of fields whose data will be added to the array that will be sent when sending ajax to autocomplete, separate by comma,
If there are many values in foreignTable
, you should use autocomplete to avoid slowing down the form loading:
<field type="many2many"
caption="<?php echo __l('Companies'); ?>"
linkTable="users2companies"
linkField="id_user"
linkForeignField="id_company"
foreignTable="school"
foreignKeyField="id"
foreignValueField="name"
autocomplete="true"
autocompleteLimit="10"
ajaxFormFields="id_site_content,id_author"
width="10%" />
If a composite name for the value is needed:
<field type="many2many"
caption="<?php echo __('Settings')?>"
linkTable="site_contents2settings"
linkField="id_site_content"
linkForeignField="id_setting"
foreignTable="settings"
foreignKeyField="id"
filter="text"
foreignValueField="CONCAT(settings.caption, ' | ', settings.id)">
<option id="1"><?php echo __('View')?></option>
<option id="2"><?php echo __('Edit')?></option>
</field>
Textarea Field
Attributes:
maxChars
- maximum text length in the field.
Select Field
<field type="select"
filter="select"
caption="Status"
orting="true"
name="status"
width="15%">
<option id="active"><?php echo __('Active')?></option>
<option id="deleted"><?php echo __('Remove')?></option>
<option id="hidden"><?php echo __('Hidden')?></option>
</field>
Composite Field
This field is used to display fields merged into one column in the list.
Displayed only in the list, not in the forms
Attributes:
separator
- separator between values.format
- used to describe the display as a simple template.
<field type="composite"
caption="<?php echo __('Customer')?>"
name="customer"
width="10%"
separator=" ">
<option store="users">name</option>
<option store="users">lastname</option>
</field>
<field type="composite"
caption="<?php echo __('Customer')?>"
name="customer"
format="%name% %lastname%<br/>%email%<br/>%phone%"
width="15%">
<option store="users">name</option>
<option store="users">lastname</option>
<option store="users">email</option>
<option store="users">phone</option>
</field>
Handler Field
A field that is processed through a plugin.
<field type="handler"
name="reward"
caption="<?php echo __('Rewards')?>"
autocompleteUrl="<?php echo $autocompleteUrl; ?>"
isnull="true"
method=""
plugin=""
width="15%" />
Attributes:
-
method
- an optional attribute in which you can specify a prefix to the method name in the handler. If this attribute is not specified, the prefix will be:get[Prefix][FieldName]Field[ViewType]
ViewType = ['EditInput', 'ColumnName', 'CellValue', 'Value']
-
plugin
- the name of the plugin that will perform the processing.
In the plugin, you need to implement the following handler methods:
EditInput
- method must return the HTML of the field for creation/editing forms (can be omitted if the field is not displayed in forms).ColumnName
- method must return the name of the column in the table where the value will be placed.CellValue
- method must return the content for displaying in the table cell duringStore::ACTION_LIST
(can be omitted if the field is not displayed in the table).Value
- method must return the value that will be stored in the database.
Example of creating a handler field:
<field type="handler"
name="place"
caption="<?php echo __('Location')?>"
isnull="true"
plugin="Expenses"
hide="true" />
class ExpensesPlugin extends DisplayPlugin
{
public function getPlaceFieldEditInput(AbstractField &$field, $value)
{
$data = false;
$values = $field->getStore()->getActionInstance()->getValues();
if ($values) {
$data = $this->object->get($values['id']);
}
$this->field = $field;
$this->value = $value;
$this->data = $data;
return $this->fetch('field_location.phtml');
}
public function getPlaceFieldValue(AbstractField &$field, $value, $requests)
{
return $value;
}
public function getPlaceFieldColumnName(AbstractField &$field)
{
return $field->getName();
}
}
Virtual Field
If you need to create a field in DGS that will not access the storage to get a value.
<field type="preview"
caption="Info"
width="40%" />
class previewFormField extends abstractFormField
{
public function displayValue(?string $value, array $row = null): ?string
{
return print_r($row, 1);
}
public function isVirtualField($section = false)
{
return true;
}
}
Price Field
A field for working with monetary sums.
<field type="price"
name="cost"
caption="<?php echo __('Cost')?>"
width="10%"
sorting="yes" />
Attributes:
locale
- a field indicating in which format to display the amount. By default,en_US.UTF-8
. Possible values can be found in the description of the PHP function money-format.currency
- USD, EUR, etc.sensitive
- if it set true, values will be concealed by default in cells. In the column name we can click on icon like eye to see original values.
Number Field
For fields that require input of only numbers.
<field type="number"
name="ordered"
caption="<?php echo __('Count')?>"
width="10%"
sorting="yes" />
Sql Field
A field that allows adding nested queries. If you use this field, you probably have an incorrect data structure. We do not recommend using this field.
<field type="sql"
name="ordered"
query="(SELECT COUNT(*) FROM permits WHERE permits.permit_id = permit_contractors.permit_id)"
caption="<?php echo __('Count'); ?>"
width="10%"
sorting="yes"
filter="range" />
Attributes:
query
- required attribute to insert a nested SQL query.
An alternative option is to use the
expression
attribute.
Checkbox Field
In DGS, a checkbox field is used to represent Boolean-like values. While MySQL does not have a native Boolean data type, you can manage checkbox values effectively using integer representation.
<field type="checkbox"
name="is_active"
isnull="true"
caption="<?php echo __('Active')?>"
width="10%"
filter="select"
sorting="yes" />
Attributes:
-
isnull
: This attribute allows the checkbox to be stored asnull
when unchecked. Without this attribute, an unchecked box defaults to0
.Note: The
isnull
attribute influences search logic. When set to true, it enables searches fornull
values, allowing users to filter results based on whether a checkbox is unchecked or has an undefined state. -
isbool
: This attribute allows the checkbox to be stored as1
or0
.
Dependent Fields (Related Fields)
Conditionally, fields can be divided into parents
(values being tracked) and children
(values dependent on parents):
<field type="foreignKey"
name="school_id"
foreignTable="school"
foreignKeyField="id"
foreignValueField="name"
caption="<?php echo __l('School'); ?>"
width="35%"
autocomplete="true"
autocompleteLimit="15"
ajaxChild="studygroup_id" />
<field type="foreignKey"
name="studygroup_id"
foreignTable="school_studygroups"
foreignKeyField="id"
foreignValueField="name"
caption="<?php echo __l('Study Groups'); ?>"
width="25%"
ajaxParent="school_id"
ajaxParentColumn="school_id" />
For the parent, you need to specify ajaxChild
- the name of the child field.
Thus, when updating the parent, there will be an Ajax loading of values for the child, using the logic of ForeignKeyLoadAction
.
For the child, specify ajaxParent
- the name of the parent field. The ajaxParentColumn
parameter is used to specify the name of the column by which the values will be filtered.
Analyzing the example above:
school_id
is a column of the tableschool_studygroups
, which references the tableschool
through a foreign key on the fieldid
;- when the parent select is changed, its new value will be sent for Ajax filtering in the child table based on the field
school_studygroups.school_id
; - the filtered data will be used as options in the select of the child field.
If the conditions are more complex, use valuesWhere
:
<field type="foreignKey"
name="id_parent_param"
caption="Parameter"
width="35%"
foreignTable="parameters"
foreignKeyField="id"
foreignValueField="caption"
ajaxChild="id_parent_param_value" />
<field type="foreignKey"
name="id_parent_param_value"
caption="Parameter Value"
width="35%"
foreignTable="parameter_values"
foreignKeyField="id"
foreignValueField="caption"
ajaxParent="id_parent_param"
valuesWhere="id_param=G%id_parent_param%" />
It is also possible to establish a relationship between multiple children and one parent,
so that when the parent changes, the data in the child selects will also change.
For this purpose, list the names of all children separated by |
in the ajaxChild
parameter.
Examples of such relationships are shown below:
<field type="foreignKey"
name="school_id"
foreignTable="school"
foreignKeyField="id"
foreignValueField="name"
caption="<?php echo __l('School'); ?>"
width="35%"
autocomplete="true"
autocompleteLimit="15"
ajaxChild="studygroup_id|classroom_id" />
<field type="foreignKey"
name="studygroup_id"
foreignTable="school_studygroups"
foreignKeyField="id"
foreignValueField="name"
caption="<?php echo __l('Study Groups'); ?>"
width="25%"
ajaxParent="school_id"
ajaxParentColumn="school_id" />
<field type="foreignKey"
name="classroom_id"
foreignTable="school_classrooms"
foreignKeyField="id"
foreignValueField="name"
caption="<?php echo __l('Study Сlass Rooms'); ?>"
width="25%"
ajaxParent="school_id"
ajaxParentColumn="school_id" />
ajaxParent
can also be used with a select field:
<field type="select"
name="type"
caption="<?php echo __('General Type'); ?>"
required="true"
filter="select"
width="15%"
ajaxChild="type_id" >
<option id="question"><?php echo __('Question'); ?></option>
<option id="info_block"><?php echo __('Info Block'); ?></option>
</field>
<field type="foreignKey"
name="type_id"
required="true"
caption="<?php echo __('Type'); ?>"
foreignTable="hydra_questionnaires_items_types"
foreignKeyField="id"
foreignValueField="caption"
filter="text"
width="15%"
ajaxParent="type"
ajaxParentColumn="type" />
General Attributes for All Fields
Default
Sets the default value for the field, can be used to set values in the record creation form.
Value Filter
This attribute works like filter_var. You can find the full list of values in the PHP Manual
valueFilter="FILTER_VALIDATE_EMAIL"
Only List
If you need the field to be displayed only in the list but not in the forms, use the onlyList
attribute.
onlyList="true"
Allow Empty
Used to add an empty first option in select
and foreignKey
fields.
allowEmpty="true"
Isnull
Indicates whether to write an empty value or null
to the database.
isnull="true"
Hide
Hides the field from the list rows.
hide="true"
Store
This attribute is used to specify the table in which the field is located.
Also, check the routers
tag that describes the relationships between tables.
store="users"
Clicable
This attribute makes the field a link that navigates to a child DGS.
clicable="true"
The parent and child DGS must be described in relations
.
<relations>
<link type="parent"
field="id_parent"
foreignTable="categories"
foreignField="id" />
<link type="child"
field="id"
foreignTable="categories"
foreignField="id_parent"
cascade="true"
treeCaption="caption" />
</relations>
Also, you need to add actions with types parent
and child
for navigation.
<actions>
<action type="parent"
caption="<?php echo __l('Parent Category'); ?>"
relation="categories"
relationType="parent" />
<action type="child"
caption="<?php echo __l('Child Category'); ?>"
relation="categories"
relationType="child" />
</actions>
Expression
This attribute is often used for calculations in columns.
If you use aggregate functions like SUM
, AVG
, etc., inside it,
don't forget to specify the groupBy
attribute in the table
tag.
<fields>
<field type="text"
name="Ordered"
expression="(SUM(QuantityOrdered))"
caption="<?php echo __('Ordered')?>"
width="10%"
sorting="yes" />
<field type="datetime"
name="issue_dates"
expression="(SELECT issue_date FROM permits WHERE permits.permit_id = permit_contractors.permit_id GROUP BY permits.issue_date)"
caption="<?php echo __('Issue Date')?>"
width="15%"
sorting="yes"
filter="range"
format="%m/%d/%Y" />
</fields>
You can also use the alternative way of describing in name
:
<field type="textarea"
name="SUM(amount) as sum_column"
caption="<?php echo __('Sum')?>"
width="40%"
filter="text"
isnull="true" />
Trim
If there is a column in the data list that contains very long text and you need to display only part of it,
for example, 150 characters, use the trim
attribute.
Allowed values:
int
- string length.button
- display a button instead of text.
trim="150"
Trim Mode
A related parameter with trim
, which determines what to do with the truncated part.
Currently, only the popup
value is supported. Popup displays a link [+],
clicking on which opens a dialog with the full text.
trimMode="popup"
Validate Value
If you need to implement custom data validation for the field, you can use this attribute. The value should be written in the format:
[PLUGIN_NAME]::[PLUGIN_METHOD]
onValidateValue = "Geo::onValidateZipFieldValue"
class GeoPlugin
{
public function onValidateZipFieldValue(AbstractField &$field, $value)
{
if ($field->get('required') && empty($value)) {
$msg = __('%s is required field', $field->get('caption'));
$field->setErrorMessage($msg);
return false;
}
return true;
}
}
Cell View Handler
When you need to override the value display in cells in the table,
you can use the cellViewHandler
attribute with the value customView
or using the Store::CELL_VIEW_HANDLER_CUSTOM
constant.
Also, add two additional attributes plugin
and method
, indicating where the view decorator is located.
The specified method will be called with the parameters:
$field
- field.$value
- value.$row
- all row values.
<field type="text"
name="website"
caption="<?php echo __('Website');?>"
width="15%"
filter="text"
cellViewHandler="<?php echo Store::CELL_VIEW_HANDLER_CUSTOM; ?>"
plugin="Companies"
method="getCellView"
disclaimer="<?php echo __('Format: www.dealersite.com');?>"
sectionIdent="contact"
sectionCaption="<?php echo __('Contact'); ?>" />
class CompaniesPlugin
{
public function getCellView(AbstractField $field, $value, $row)
{
$this->value = $value;
return $this->fetch('cell_site.phtml');
} // end getCellView
}
<a href="http://<?php echo $value; ?>" target="_blank"><?php echo $value; ?></a>
Values Where
Attribute for many2many
and foreignKey
fields, used to add conditions for filtering values.
You can also use variables passed to the Store
, for example:
valuesWhere="company_rebates.id_company = C%id_company%"
The annotations supported in the where
attributes are:
- G - Global
G%id_param%
- S - SESSION
S%id_param%
- C - Condition (Search DGS)
C%id_param%
Example of how to obtain the Primary Key Value from the parent table and filter data in the field:
<field type="foreignKey"
name="id_page"
caption="<?php echo __l('On Page')?>"
foreignTable="site_pages"
foreignKeyField="id"
foreignValueField="caption"
valuesWhere="id_site = <?php echo $this->store->getParentValue() ?>"
width="20%"
allowEmpty="true"
isnull="true"
required="true"/>
Filter
Displays a filter above the column in the list, allowing you to search by column. Possible values:
text
- searches for matches in text(LIKE %TERM%).select
- displays a select with unique values for the field (DISTINCT).range
- searches within a range (applied to numbers and dates).checkbox
- searches by flag or presence of a record in the field.datetime
- searches for an exact date match.multiple
- displays a select with unique values for the field (DISTINCT), allowing you to select multiple options.exact
- exact text match for the field.
filter="text"
Mask
Input mask for the field, for more details on the format, see here
mask="'mask': '(999) 999-9999'"
Regexp
Regular expression for value validation, enter without modifiers.
regexp="^[0-9\(\)\/\+ \-]*$"
Is Custom
Indicates a custom field, it will be ignored in queries to the storage.
isCustom = "true"
Format
This attribute controls the external formatting of values in the list, forms, and filters.
Usually used for custom fields (sql
, handler
, etc.), possible values: price
, percent
, number
, and datetime format
- for
number
, an additionaldecimals
parameter can be used:<field type="number" name="log_hours" expression="(log_seconds / 60 / 60)" caption="<?php echo __('Log Time')?>" width="10%" onlyList="true" format="number" decimals="2" sorting="yes" />
For some fields, this attribute is overridden, for example, for
datetime
Crypt
If true, the values will be encrypted in the database using an SSL certificate.
- Generating SSL public and private keys:
openssl genrsa -out PrivateKey.pem 2048
openssl pkcs8 -topk8 -inform pem -in PrivateKey.pem -outform pem -nocrypt -out PrivateKey2.pem
openssl rsa -pubout -in PrivateKey2.pem -out PublicKey.pem
- Pass parameters for the keys to
Core
:
$options = array(
'plugins_folder' => 'plugins',
'http_base' => $GLOBALS['config']['http_base'],
"convert_path" => "/usr/bin/convert",
'storeExceptionMode' => true,
Core::OPTION_SSL_PUBLIC_KEY => $GLOBALS['config']['paths']['public_key'],
Core::OPTION_SSL_PRIVATE_KEY => $GLOBALS['config']['paths']['private_key']
);
$core = Core::getInstance($options);
<field type="price"
caption="<?php echo __('Offer'); ?>"
name="offer"
required="true"
crypt="true"
width="20%" />
Autocomplete
Ajax loading of values for the field, works for all fields. For text, unique values will simply be loaded.
autocomplete="true"
- will use the logic of ForeignKeyLoadAction
autocomplete="<?php echo Core::getInstance()->getUrl('/autocomplete/school/');?>"
When using your link to retrieve values, the response should be in the following format:
{
results: [
{
key: "Caption 1",
value: 2
},
{
key: "Caption 2",
value: 21
}
]
}
Additional attributes:
autocompleteMinLength
- the minimum number of characters to send a request to retrieve values.autocompleteLimit
- the maximum number of values to return in response to an autocomplete request.
Container Css
CSS class names for adding to DGS lists.
<field type="foreignKey"
name="id_author"
width="15%"
required="true"
foreignTable="users"
foreignKeyField="id"
foreignValueField="full_name"
caption="<?php echo __('Author'); ?>"
autocomplete="true"
containerCss="hidden-sm hidden-xs"
filter="text" />
Convenient to use for hiding columns when viewing on mobile.
Disclaimer
A disclaimer for the field, usually displayed below the field.
Where
Additional conditions for filtering data:
Events
StoreFieldEvent::EVENT_ON_GET_EDIT_VIEW
Event in which you can override the field value or its display:
use core\dgs\event\StoreFieldEvent;
use core\dgs\field\IStoreField;
// ...
$fields = &$store->getModel()->getFields();
unset($fields['amount']);
$fields['test_task_url']->set(IStoreField::OPTION_ONLY_LIST, false);
$fields['test_task_url']->set(IStoreField::OPTION_READONLY, true);
$fields['test_task_url']->addEventListener(StoreFieldEvent::EVENT_ON_GET_EDIT_VIEW, function (StoreFieldEvent &$event) {
$this->taskUrl = $event->getValue();
$content = $this->fetch('test_task_field.phtml');
$event->setContent($content);
});