Silverstripe - Форма с пользовательским шаблоном показывает неправильные ошибки проверки

У меня есть следующая пользовательская форма

$list = DataObject::get('AreaOfExpertise');
foreach ($list as $l) {
$source[$l->ID] = $l->Name;
}
$fields = new FieldSet(
new TextField('Customer'),
new TextField('ProjectName'),
new DateField('WinDate'),
new TextareaField('Details'),
new OptionsetField('AreaOfExpertiseID', 'Area Of Expertise', $source),
new TextField('ProjectValueLength'),
new TextField('DeliverTimeframe'),
new TextField('ProjectTeam'),
new TextField('Contact')
);
$actions = new FieldSet(
new FormAction('doSubmit', 'Submit')
);
$requiredFields = array(
'Customer',
'ProjectName',
'WinDate',
'Details',
'AreaOfExpertiseID',
'ProjectValueLength',
'DeliverTimeframe',
'ProjectTeam',
'Contact',
);
$validator = new RequiredFields($requiredFields);
$form = new Form($this, 'SubmissionForm', $fields, $actions, $validator);
$form->setTemplate('Forms/NewWinForm');
return $form;

и мой шаблон для этой формы

<form $FormAttributes>
<% if Message %>
<p id="{$FormName}_error" class="message $MessageType">$Message</p>
<% else %>
<p id="{$FormName}_error" class="message $MessageType" style="display: none"></p>
<% end_if %>

<fieldset id="formContainer" class="clearfix NewWinForm">

<div id="Customer" class="row field text">
<label class="left" for="{$FormName}_Customer">Customer</label>
<div class="middleColumn">$dataFieldByName(Customer)</div>
</div>
<div id="ProjectName" class="row field text">
<label class="left" for="{$FormName}_ProjectName">Project name</label>
<div class="middleColumn">$dataFieldByName(ProjectName)</div>
</div>
<div id="WinDate" class="row field text">
<label class="left" for="{$FormName}_WinDate">Win date</label>
<div class="middleColumn">$dataFieldByName(WinDate)</div>
</div>
<div id="AreaOfExpertiseID" class="row field text">
<label class="left" for="{$FormName}_AreaOfExpertiseID">Area of expertise</label>
<div class="middleColumn">$dataFieldByName(AreaOfExpertiseID)</div>
</div>

<div id="Details" class="row field textarea">
<label class="left" for="{$FormName}_Details">Project details</label>
<div class="middleColumn">$dataFieldByName(Details)</div>
</div>
<div id="ProjectValueLength" class="row field text">
<label class="left" for="{$FormName}_ProjectValueLength">Project value/length</label>
<div class="middleColumn">$dataFieldByName(ProjectValueLength)</div>
</div>
<div id="DeliverTimeframe" class="row field text">
<label class="left" for="{$FormName}_DeliverTimeframe">Delivery timeframe</label>
<div class="middleColumn">$dataFieldByName(DeliverTimeframe)</div>
</div>
<div id="ProjectTeam" class="row field text">
<label class="left" for="{$FormName}_ProjectTeam">Project team</label>
<div class="middleColumn">$dataFieldByName(ProjectTeam)</div>
</div>
<div id="Contact" class="row field text">
<label class="left" for="{$FormName}_Contact">Contact</label>
<div class="middleColumn">$dataFieldByName(Contact)</div>
</div>
</fieldset>
<div class="Actions">
<% if Actions %>
<% control Actions %>$Field<% end_control %>
<% end_if %>
</div>
</form>

Когда я отправляю форму, вместо "Пожалуйста, заполните "Клиент" требуется". я получаю сообщение «Пожалуйста, заполните это, это необходимо».

Это происходит для всех полей, кроме поля Подробности!

Может кто-нибудь, пожалуйста, скажите мне, что я делаю неправильно? Это убивает меня...


person Optimus    schedule 27.05.2011    source источник
comment
Если я уберу $form->setTemplate('Forms/NewWinForm');, все будет работать нормально.   -  person Optimus    schedule 28.05.2011


Ответы (2)


Хорошо, покопавшись в sapphire/javascript/Validator.js, я обнаружил, что первым классом div-оболочки должен быть field, поэтому я заменил этот <div id="Customer" class="row field text"> на <div id="Customer" class="field text row">, и все работает нормально.

person Optimus    schedule 31.05.2011

Это должно быть сделано путем создания класса формы и реализации функции "forTemplate()". См. Формы SilverStripe.

Кроме того, вместо создания исходного массива AreaOfExpertise, как у вас, есть удобный метод toDropDownMap() сделает это за вас.

$source = $list->toDropDownMap('ID', 'Name');

Надеюсь это поможет.

person Shane Garelja    schedule 29.05.2011
comment
Спасибо за ответ. Но это не сработало. Я по-прежнему получаю это вместо имени поля в сообщениях об ошибках. вот класс формы, который я только что создал ссылка - person Optimus; 31.05.2011