Здравствуйте, пришла и моя пора писать темы :)
Так вот, возникла задача, чтоб незарегистрированный покупатель при оформлении заказа вбивая свои данные подтверждал, что ему есть 18 лет.
Все как положено, пошел в админку, сделал поле типа кнопка/флажок, обновил страничку формы, появилось поле со звездочкой на странице оформления заказа, отправил пустую форму и он мне не показал ошибку, что поле не заполнено.
Ну тут как всегда полез в код, нашел такой метод
public function checkRequiredData(iUmiObjectType $objectType, $data, $objectId, $isNew)
Воткнул для дебага такую конструкцию
print_r($field->getTitle().' = '. $field->getIsRequired());
Отправил форму и увидел интересный факт, моё поле даже не попадает в эту проверку
Имя = 1Фамилия = 1Отчество = E-mail = 1Телефон = 1
Собственно вопрос: в чем прикол? :D
Видимо пообщался сам с собой ;D Но какой выход из ситуации с минимальными потерями сделать опишу тут, мало ли кому пригодится.
Без правки ядра тут не обойтись. Точнее чтобы обойтись малой кровью.
Нужно внести вот такие изменения в файл модуля data.
Файл classes/modules/data/__client_reflection.php
1243. public function checkRequiredData(iUmiObjectType $objectType, $data, $objectId, $isNew) {
//Начало тела метода опускаю
$objectFields = $objectType->getAllFields(TRUE);
foreach ($objectFields as $oField) {
if ($oField->getIsRequired() && $oField->getIsVisible()) {
if (isset($data[$oField->getName()]))
continue;
else
$data[$oField->getName()] = false;
}
}
// Перед этим циклом вставляем код выше
foreach($data as $fieldName => &$value) {
$fieldId = $objectType->getFieldId($fieldName);
$field = $fields->getField($fieldId);
.........
Собственно код проверяет все ли видимые и обязательные поля есть в массиве данных и если кого то нет он их инициализирует со значением false
Вот как то так...
Пробовали использовать такое?
<input type="hidden" name="checkbox_field" value="0" />
<input type="checkbox" name="checkbox_field" value="1" />
Пробовали использовать такое?
<input type="hidden" name="checkbox_field" value="0" />
<input type="checkbox" name="checkbox_field" value="1" />
пробовали... именно его и стоит использовать вместо редактирования ядра)
, в дефотлтных шаблонах umi можно встретить такой код для обработки boolean поля (xslt пример)
<xsl:template match="field[@type = 'boolean']" mode="form">
<div>
<label title="{@tip}">
<xsl:apply-templates select="@required" mode="form" />
<span>
<xsl:value-of select="concat(@title, ':')" />
</span>
<input type="hidden" name="{@input_name}" value="0" />
<input type="checkbox" name="{@input_name}" value="1">
<xsl:copy-of select="@checked" />
</input>
</label>
</div>
</xsl:template>