OpenCart до текущей стабильной версии 1.5.6 (и версия 1.5.6.1, как она есть в настоящее время) не использует HTML5 (поля ввода и т. д. ) по умолчанию (или в его теме по умолчанию).
Это соответствует: Когда opencart начнет использовать html5? (апрель 2012 г.): "Люди все еще жалуются на поддержку IE6. Когда люди перестанут ныть по этому поводу, тогда мы сможем сосредоточиться на переходе на HTML5"< /эм>.
Например, файл checkout/register.tpl (из версии 1.5.6) (который вы изменили) содержит по умолчанию:
<span class="required">*</span> <?php echo $entry_email; ?><br />
<input type="text" name="email" value="" class="large-field" />
<br />
<br />
<span class="required">*</span> <?php echo $entry_telephone; ?><br />
<input type="text" name="telephone" value="" class="large-field" />
Однако в текущей главной ветке (декабрь 2013 г.) я я наблюдаю непоследовательное использование полей ввода HTML5 на некоторых страницах (например: account/register.tpl
и account/edit.tpl
):
<div class="form-group required">
<label class="col-sm-2 control-label" for="input-email"><?php echo $entry_email; ?></label>
<div class="col-sm-10">
<input type="email" name="email" value="<?php echo $email; ?>" placeholder="<?php echo $entry_email; ?>" id="input-email" class="form-control" />
<?php if ($error_email) { ?>
<div class="text-danger"><?php echo $error_email; ?></div>
<?php } ?>
</div>
</div>
<div class="form-group required">
<label class="col-sm-2 control-label" for="input-telephone"><?php echo $entry_telephone; ?></label>
<div class="col-sm-10">
<input type="tel" name="telephone" value="<?php echo $telephone; ?>" placeholder="<?php echo $entry_telephone; ?>" id="input-telephone" class="form-control" />
<?php if ($error_telephone) { ?>
<div class="text-danger"><?php echo $error_telephone; ?></div>
<?php } ?>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="input-fax"><?php echo $entry_fax; ?></label>
<div class="col-sm-10">
<input type="text" name="fax" value="<?php echo $fax; ?>" placeholder="<?php echo $entry_fax; ?>" id="input-fax" class="form-control" />
</div>
</div>
Обратите внимание, что поле факса имеет type="text"
и отсутствие таблиц (в пользу div) и, наконец, разные имена классов.
Это подводит нас к самой интересной части вашего вопроса: что (почему/как) преобразует <input type="text"
в тип email
/tel
(по-видимому, на основе атрибута имени) и почему это не работает при изменении порядка атрибутов поля ввода ?.
Как видно из HTML-кода, отправляемого PHP в браузер (http://pastebin.com/bCXab6Kb) , атрибуты типа поля ввода уже изменены. Таким образом, это не браузер или часть JavaScript, которые меняют это.
Таким образом, предполагая, что PHP не меняет код сам по себе, должно быть что-то в скриптах, которые PHP запускает для изменения кода в том виде, в котором он хранится. в файлах на жестком диске перед отправкой в браузер: OpenCart и/или (одна из) его «тем», «модулей», «расширений» и т. д.
И поскольку какой-нибудь html-парсер, вероятно, не испортит Для такой простой задачи наиболее вероятным кандидатом является какой-нибудь сценарий, который выполняет базовый поиск и замену.
Так случилось, что есть 2 (тесно связанных) скрипта, общих для OpenCart, которые точно соответствуют этим требованиям.
«Система модификаций» OpenCart
Если вы случайно загрузили/установили «последнюю» (разрабатываемую) основную ветку (или являетесь участником), то вы найдете некоторые файлы, такие как system/engine/modification.php (и некоторые связанные файлы и таблица базы данных), которые могут поиск и добавление/замена строк кода в файлах php/tpl (жестко запрограммированное ограничение) в соответствии с правилами, указанными в файле xml (system/modification.xml) до того, как целевой файл php/tpl будет проанализирован и без изменения исходного файл(ы).
Этот довольно понятный xml-файл в основном содержит «операции» для каждого файла, которые можно изменять на лету, например:
<file name="system/engine/front.php">
<operation>
<search>
<![CDATA[$action->getFile()]]>
</search>
<add position="replace">
<![CDATA[$this->registry->get('modification')->getFile($action->getFile())]]>
</add>
</operation>
</file>
где $action->getFile()
заменяется на $this->registry->get('modification')->getFile($action->getFile())
перед анализом файла system/engine/front.php
!
"vQmod™" (он же Virtual Quick Mod)
vQmod – это отдельно разработанный пакет, По сути, это улучшенная версия системы модификации OpenCart (см. выше), из которой она создана . Он обычно используется надстройками для изменения производственных выпусков OpenCart и установленных (поскольку он по умолчанию не включен в OpenCart) в папку vqmod
(находится в корне OpenCart). Внутри этой папки вы найдете папку vqcache
, содержащую кэшированные измененные файлы, и папку xml
, содержащую xml search/replace files
.
Эти xml-файлы имеют несколько иной синтаксис (в первую очередь атрибут position
) по сравнению с системой модификации OpenCart (выше):
<file name="catalog/view/theme/default/template/checkout/register.tpl">
<operation>
<search position="replace">
<![CDATA[<input type="text" name="email" value="" class="large-field" />]]>
</search>
<add>
<![CDATA[<input type="email" name="email" value="" class="large-field" />]]>
</add>
</operation>
<operation>
<search position="replace">
<![CDATA[<input type="text" name="telephone" value="" class="large-field" />]]>
</search>
<add>
<![CDATA[<input type="tel" name="telephone" value="" class="large-field" />]]>
</add>
</operation>
<operation>
<search position="replace">
<![CDATA[<input type="text" name="fax" value="" class="large-field" />]]>
</search>
<add>
<![CDATA[<input type="tel" name="fax" value="" class="large-field" />]]>
</add>
</operation>
</file>
Примечание: приведенный выше пример взят из "отзывчивой темы embermonkey" и является отличным примером поведения того, что вы испытываете: он заменяет входные атрибуты.
Целью этих сценариев модификации является:
избежать необходимости изменять файлы ядра. Концепция довольно проста... Вместо того, чтобы вносить изменения непосредственно в файлы ядра, изменения создаются в виде XML-файлов сценариев поиска/замены. Эти файлы сценариев анализируются во время загрузки страницы, поскольку каждый «исходный» основной файл загружается с помощью функций «включить» или «требовать» php. Затем исходный код исправляется с изменениями файла сценария и сохраняется во временном файле. Затем этот временный файл заменяется оригиналом во время выполнения. Оригинальный исходный файл никогда не изменяется. Это приводит к «виртуальному» изменению ядра во время выполнения без какой-либо фактической модификации файлов ядра.
Это позволяет «виртуально изменить любой файл php или tpl в OpenCart (кроме основного index.php)», чтобы стало проще и надежнее обновлять основные файлы OpenCart и добавлять/удалять шаблоны. и т. д.
Наконец, действующий адрес электронной почты ([email protected]), который не проходит проверку, когда тип ввода установлен на email
вместо text
...
Это довольно распространенная проблема с (сломанными/устаревшими/частично установленными) «отзывчивые»/«мобильные» темы и т. д. (которые обычно также влияют на поля с телефонами) 1, 2.< br> Проблема не в том, что браузер отклоняет действительные адреса электронной почты (когда тип поля ввода установлен на email
вместо text
); вместо этого это валидатор OpenCart JSON, который не получает типы ввода email
(и tel
и т. д.) по умолчанию (когда вы или тема оставили это без изменений):
$('#button-guest').live('click', function() {
$.ajax({
url: 'index.php?route=checkout/guest/validate',
type: 'post',
data: $('#payment-address input[type=\'text\'], #payment-address input[type=\'checkbox\']:checked, #payment-address input[type=\'radio\']:checked, #payment-address input[type=\'hidden\'], #payment-address select'),
dataType: 'json',
Таким образом, очевидно, что решение состоит в том, чтобы добавить эти типы ввода к AJAX-вызову:
$('#button-guest').live('click', function() {
$.ajax({
url: 'index.php?route=checkout/guest/validate',
type: 'post',
data: $('#payment-address input[type=\'text\']
, #payment-address input[type=\'email\'] // added
// , #payment-address input[type=\'tel\'] // added
, #payment-address input[type=\'checkbox\']:checked
, #payment-address input[type=\'radio\']:checked
, #payment-address input[type=\'hidden\']
, #payment-address select'
),
dataType: 'json',
В заключение, используя то, что объяснено выше:
- Скорее всего, вы либо установили какое-то «Полное»/«Популярное» повторное распространение OpenCart, которое включало vQmod , либо вы обновили существующую установку OpenCart, которая включала vQmod, или вы установили какое-то дополнение, которое зависит от vQmod и устанавливается само по себе.
- Чтобы найти и отключить этот мод, вы должны сначала найти в каталоге OpenCart папку с именем «vQmod». Если вы не можете его найти, вы выполняете текстовый поиск (начиная с вашего каталога OpenCart и включая подкаталоги) строк, содержащих
<input type="email"
(например), и сначала изучаете результаты с файлом типа xml.
- Чтобы использовать мод без сбоя проверки (электронной почты, телефона, факса и т. д.), исправьте вызов JSON (вы можете использовать vQmod, если он уже установлен, и просто добавить это как операцию для затронутых файлов).
- В качестве альтернативы (как вы уже заметили) можно вызвать сбой мода, изменив порядок атрибутов (за счет других модов на этой странице, которые также не работают, как вы заметили).
- Если ничего из вышеперечисленного не работает в вашем случае, я настоятельно рекомендую переустановить чистую версию OpenCart!
PS: теперь вы знаете о vQmod, вам лучше использовать его (вместо изменения файлов ядра), поскольку «производительность на удивление вообще не является фактором», что дает вам преимущество более надежного пути обновления в будущее!
person
GitaarLAB
schedule
28.12.2013
autocomplete="off"
к тегу формы? Это может помочь (для дальнейшего использования), если вы добавите версию Crome, в которой это происходит. (Кстати, разве Chrome недавно не перешел с webkit на blink?) - person GitaarLAB   schedule 22.12.2013autocomplet="off"
и без него)? РЕДАКТИРОВАТЬ: то же самое в FF, что и в хроме? И сюжет закручивается.. Может все-таки какой-то сценарий? - person GitaarLAB   schedule 22.12.2013