OpenCart изменяет атрибуты типа полей ввода

Я столкнулся со странной вещью здесь. Я работаю над OpenCart, зарегистрируйте форму (index.php?route=checkout/register).
У меня есть форма и 2 таких поля:

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

Теперь: Браузер интерпретирует эти 2 поля как:

<input type="email" name="email" value="" class="large-field">

и

<input type="tel" name="telephone" value="" class="large-field">

НО, если я изменю порядок атрибутов поля электронной почты следующим образом:

<input type="text" value="" class="large-field" name="email" />

тогда поля действительно текстовые, они не трансформируются.
Внимание: я модифицирую только первое (электронная почта), и после этого электронная почта и телефон анализируются правильно.

Я вижу это неожиданное поведение в Firefox, Chrome и Opera,
однако, если я скопирую входные данные в обычный HTML и просмотрю его, все будет в порядке..

Любая идея о том, что происходит, и, конечно, почему?

EDIT:
Полный HTML-код, отправляемый в браузер (полученный с помощью web-sniffer.net) находится в этом pastebin: http://pastebin.com/bCXab6Kb

Это означает, что поля <input type="text" уже изменены, когда php отправляет HTML в браузер.
Итак, что (почему и как) преобразует <input type="text"> в тип email/tel (по-видимому, на основе атрибута имени) и почему это не работает, когда порядок атрибутов поля ввода изменен?


person geryjuhasz    schedule 21.12.2013    source источник
comment
серьезно используйте некоторые \n ... я ничего не могу прочитать в этом беспорядке. благодарю вас   -  person deW1    schedule 22.12.2013
comment
@dan: я отредактировал его, чтобы убрать разметку. Посмотрите сейчас.   -  person Ali Gajani    schedule 22.12.2013
comment
спасибо за редактирование, извините, я торопился: P   -  person geryjuhasz    schedule 22.12.2013
comment
его могут изменить две вещи: JavaScript или браузер, который «умно» автоматически обнаруживает его и, таким образом, преобразует его соответствующим образом, что, как я полагаю, вы, вероятно, используете Chrome?   -  person MackieeE    schedule 22.12.2013
comment
Я тоже думал о js, но это не так. В любом случае это не имеет смысла, потому что js также найдет и изменит этот ввод, он не заботится о порядке атрибутов. Я тоже думаю о браузере. Кстати, да, это Chrome. Я не думаю, что это нормально, я имею в виду, что браузер точно не должен преобразовывать наши атрибуты, это может вызвать серьезные проблемы. Может быть, это только мое мнение...   -  person geryjuhasz    schedule 22.12.2013
comment
Решение для меня было простым, так как я предложил решение в самом вопросе, я хотел поделиться этим опытом с другими, а также хотел найти возможный ответ или объяснение этому.   -  person geryjuhasz    schedule 22.12.2013
comment
Что произойдет, если вы добавите autocomplete="off" к тегу формы? Это может помочь (для дальнейшего использования), если вы добавите версию Crome, в которой это происходит. (Кстати, разве Chrome недавно не перешел с webkit на blink?)   -  person GitaarLAB    schedule 22.12.2013
comment
Извините моя ошибка. Формы нет, это только входы. Значения там публикуются через ajax, но там не определен фактический тег формы.   -  person geryjuhasz    schedule 22.12.2013
comment
вы пробовали это и в других браузерах?   -  person deW1    schedule 22.12.2013
comment
Нет проблем, что, если бы вы обернули поля в форму (с атрибутом autocomplet="off" и без него)? РЕДАКТИРОВАТЬ: то же самое в FF, что и в хроме? И сюжет закручивается.. Может все-таки какой-то сценарий?   -  person GitaarLAB    schedule 22.12.2013
comment
@GitaarLAB тоже самое с формой   -  person geryjuhasz    schedule 22.12.2013
comment
Хм, пришло время настроить быстрый jsfiddle без каких-либо opencart и т. д. и проверить его снова (если все работает нормально, это должно быть что-то с opencart, таким образом, скрипт).   -  person GitaarLAB    schedule 22.12.2013
comment
Это может быть что-то и с opencart, потому что, если я копирую входные данные в обычный html и просматриваю его, они в порядке.   -  person geryjuhasz    schedule 22.12.2013
comment
К сожалению, я не могу отключить js, потому что форма отображается только после выбора опции регистрации, которая обрабатывается javascript. Это происходит на странице оформления заказа, вы можете выбрать вход или регистрацию, я выбираю регистрацию, после чего шаблон для регистрации, содержащий поля, заполняется в div. Обычная регистрация пользователя работает нормально (не через кассу)   -  person geryjuhasz    schedule 22.12.2013
comment
Я обновил ваш вопрос на основе комментариев и прогресса, которого мы достигли в комментариях.   -  person GitaarLAB    schedule 25.12.2013


Ответы (2)


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, которые точно соответствуют этим требованиям.

  1. «Система модификаций» 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!

  2. "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, который не получает типы ввода emailtel и т. д.) по умолчанию (когда вы или тема оставили это без изменений):

$('#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
comment
Я действительно использую vqmod, но пока я даже не думал, что он может быть виноват. Я думаю, что вы абсолютно правы, я тоже использую файл embermonkey vqmod xml. Спасибо за объяснение и копание, я очень ценю. - person geryjuhasz; 29.12.2013

На самом деле поведение, которое вы описываете, вообще не исходит от OpenCart - по крайней мере, не от установки по умолчанию с темой по умолчанию.

Вы можете отключить JS и получить прямой доступ к этой странице: http://your.ocinstall.com/index.php?route=account/register - откроется страница регистрации.

Во всяком случае, в установке по умолчанию (и теме по умолчанию) есть этот HTML:

    <tr>
      <td><span class="required">*</span> <?php echo $entry_email; ?></td>
      <td><input type="text" name="email" value="<?php echo $email; ?>" />
        <?php if ($error_email) { ?>
        <span class="error"><?php echo $error_email; ?></span>
        <?php } ?></td>
    </tr>
    <tr>
      <td><span class="required">*</span> <?php echo $entry_telephone; ?></td>
      <td><input type="text" name="telephone" value="<?php echo $telephone; ?>" />
        <?php if ($error_telephone) { ?>
        <span class="error"><?php echo $error_telephone; ?></span>
        <?php } ?></td>
    </tr>

но в Firefox по-прежнему меняется порядок атрибутов (но не значения атрибутов!):

<input type="text" value="" name="email" />

То же самое в Chrome — значения атрибутов не меняются. Единственной причиной может быть используемая библиотека JavaScript и/или другая тема.

Хотя тип документа HTML темы OpenCart по умолчанию определен как HTML5, OpenCart на самом деле не использует никаких функций HTML5.

В любом случае, если в вашем шаблоне есть что-то, что реально использует HTML5, не бойтесь и наслаждайтесь этими функциями. Например, в самом примере из Вашего вопроса, если ввод имеет тип email или tel, то пользователь не может отправить форму, пока поле email не будет содержать семантически правильный адрес электронной почты, и он даже не сможет заполнить какой-либо литерал (нечисловой) символов в поле tel... (Да, пока пользователь не изменит HTML с помощью инструментов разработчика...)

person shadyyx    schedule 23.12.2013
comment
Я знаю, что эти функции (новые типы ввода) выполняют некоторую проверку, но в моем случае они нарушают форму и выдают неверный адрес электронной почты и номер телефона, даже если они полностью действительны и правильны. И я не говорил о той форме, что с одной все в порядке. Моя проблема в форме регистрации на кассе. Чтобы воспроизвести это, положите что-нибудь в корзину, затем перейдите к оформлению заказа и выберите «Зарегистрироваться». Поля, которые появляются там, вызываются js, поэтому вы не можете получить доступ к этой странице с отключенным js. Спасибо за борьбу, но я думаю, что вы меня неправильно поняли - person geryjuhasz; 24.12.2013
comment
GitaarLAB Скоро проверю, извините, что отсутствовал весь день. Спасибо - person geryjuhasz; 24.12.2013
comment
@geryjuhasz Вы все еще можете получить доступ к этой форме, позвонив по номеру http://your.ocinstall.com/index.php?route=checkout/register (имейте в виду разницу). Он не может пометить недействительный адрес электронной почты, если он действителен (т. е. если он помечает этот адрес электронной почты как недействительный, он действительно недействителен — опубликуйте здесь, пожалуйста, этот адрес электронной почты — просто измените слова/буквы, но оставьте все необычные символы и точки там, где они есть). Я не могу понять, как можно сломать форму, просто изменив типы ввода, но ладно, я согласен, что могу вас неправильно понять. Счастливого Рождества! - person shadyyx; 24.12.2013
comment
это мой адрес электронной почты, gmail. это письма@gmail.com, это абсолютно верно - person geryjuhasz; 25.12.2013
comment
Счастливого Рождества!! @geryjuhasz: но .. используете ли вы тему не по умолчанию (если да, то какую)? Нашли ли ошибки в журнале ошибок вашего браузера/php? Вы отправили нам полный HTML-код, сгенерированный php (index.php?route=checkout/register)? (Я уже спрашивал обо всем этом в комментариях..) Не оставляйте нас здесь колоть в темноте - person GitaarLAB; 25.12.2013
comment
Правда, он доступен с этого URL-адреса. С Рождеством всех :) - person geryjuhasz; 25.12.2013
comment
тема по умолчанию, выходные данные можно найти здесь: страница регистрации Пожалуйста, оставьте обратная связь здесь, когда вы просматривали ссылку, потому что я должен изменить ее обратно, поскольку пользователи не могут зарегистрироваться сейчас, мне придется изменить порядок атрибутов обратно - person geryjuhasz; 25.12.2013
comment
@geryjuhasz: я просмотрел ссылку и получил полный ответ (html) от web-sniffer.net и вставил его. здесь, в pastebin: pastebin.com/bCXab6Kb В разделе "Персональные данные" поле name=email имеет тип email. И name="telephone", и name="fax" относятся к типу tel. Итак, javascript (ни браузер) не проблема, и мы должны посмотреть исходный код php (и вы заявляете, что это тема по умолчанию). Можете ли вы скопировать полный исходный код php, который вы видите в pastebin, и поделиться им здесь? Я еще раз взгляну на этот источник (при условии, что вы используете последнюю версию opencart). - person GitaarLAB; 25.12.2013
comment
Это правда. В коде они имеют текстовый тип, но анализируются как типы электронной почты и телефона. - person geryjuhasz; 26.12.2013
comment
По сути, этот ответ правильный: в настоящее время в opencart нет полей ввода html5, поэтому должно быть что-то добавленное/установленное по умолчанию. Тем не менее, меня интересовала часть вопроса «что/как/почему», и я опубликовал это как ответ, включающий объяснение и решение проблемы с проверкой электронной почты. - person GitaarLAB; 29.12.2013