UMIhelp

Разработка сайта на UMI.CMS => Макросы UMI.CMS => Тема начата: Aisamiery от 15 Августа 2013, 14:05:02

Название: Свои обязательные поля для незарегистрированного покупателя
Отправлено: Aisamiery от 15 Августа 2013, 14:05:02
Здравствуйте, пришла и моя пора писать темы :)

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

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

Ну тут как всегда полез в код, нашел такой метод
public function checkRequiredData(iUmiObjectType $objectType, $data, $objectId, $isNew)

Воткнул для дебага такую конструкцию
print_r($field->getTitle().' = '. $field->getIsRequired());

Отправил форму и увидел интересный факт, моё поле даже не попадает в эту проверку
Имя = 1Фамилия = 1Отчество = E-mail = 1Телефон = 1

Собственно вопрос: в чем прикол? :D
Название: Re:Свои обязательные поля для незарегистрированного покупателя
Отправлено: Aisamiery от 15 Августа 2013, 14:30:57
А тут все ещё интереснее, метод проверяет только те поля, которые отправлены на сервер, а checkbox не отправляется на сервер, если не выбран :-D
Название: Re:Свои обязательные поля для незарегистрированного покупателя
Отправлено: Aisamiery от 15 Августа 2013, 16:04:11
Видимо пообщался сам с собой ;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

Вот как то так...
Название: Re:Свои обязательные поля для незарегистрированного покупателя
Отправлено: e.ioffe от 15 Августа 2013, 17:29:13
Пробовали использовать такое?

<input type="hidden" name="checkbox_field" value="0" />
<input type="checkbox" name="checkbox_field" value="1" />
Название: Re:Свои обязательные поля для незарегистрированного покупателя
Отправлено: Aisamiery от 15 Августа 2013, 17:36:50
Ага видимо не ищу легких путей :D
Название: Re:Свои обязательные поля для незарегистрированного покупателя
Отправлено: Aisamiery от 15 Августа 2013, 17:44:20
Пробовали использовать такое?

<input type="hidden" name="checkbox_field" value="0" />
<input type="checkbox" name="checkbox_field" value="1" />

Я придумал себе оправдание, если вдруг запамятую оформить какой нибудь тип поля в xslt, система не выкинет исключения при попытки сохранить объект, так как все обязательные поля все равно инициализируются ))))
Название: Re:Свои обязательные поля для незарегистрированного покупателя
Отправлено: admin от 16 Августа 2013, 10:54:44
Пробовали использовать такое?

<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>