Перейти к содержимому


Пользователь месяца
Ixman Ixman 1-й за Октябрь
Очков активности: 693 0 тем, 33 сообщения, 14 баллов репутации
Сайт: o5cat.ru
ТОП самых активных за этот месяц
  • Фотография yuran
    #1

    yuran (yurbol.ru)
    Очков активности: 78 0 тем, 52 сообщения, 1 балл репутации

  • Фотография ShowPrint
    #2

    ShowPrint (ShowPrint.ru)
    Очков активности: 58.5 Вне конкурса за определение пользователя месяца

  • Фотография BLIK
    #3

    BLIK
    Очков активности: 48 Вне конкурса за определение пользователя месяца

  • Фотография WGN
    #4

    WGN (worldgamenews.com)
    Очков активности: 37.5 Вне конкурса за определение пользователя месяца

  • Фотография Mandarin
    #5

    Mandarin
    Очков активности: 34.5 0 тем, 23 сообщения, 1 балл репутации

  • Фотография Ixman
    #6

    Ixman (o5cat.ru)
    Очков активности: 30 Вне конкурса за определение пользователя месяца

  • Фотография pozitron123
    #7

    pozitron123
    Очков активности: 30 2 темы, 14 сообщений, 1 балл репутации

  • Фотография Mariko
    #8

    Mariko
    Очков активности: 15 1 тема, 7 сообщений, 1 балл репутации

  • Фотография RosenRot
    #9

    RosenRot (abuzov.com)
    Очков активности: 13.5 1 тема, 6 сообщений, 1 балл репутации

  • Фотография Triniti_Wel
    #10

    Triniti_Wel (triniti-wel.ru)
    Очков активности: 12 1 тема, 5 сообщений, 1 балл репутации

  • Показать весь ТОП 10
Поддержите форум! =)
Апдейты
  • Яндекс ИКС: 31.10.2018
  • Яндекс выдача: 13.11.2018
Топ 5 участников по репутации


Передача кирилицы ajax-ом

#1 ShowPrint

ShowPrint
  • Пользователь PRO
  • 3069 сообщений
  • Репутация: 843
0

Отправлено 15 September 2017 - 18:26

Подмогните советом любителю, не бросайте в бидэ, плиззз...

 

По порядку:

Есть задумка отправить клиенту письмо сформированное из контента на странице.

Собственно данные собираются скриптом и передаются обработчику ajax-ом:

Спойлер
ну и кусок обработчика стандартный:
Спойлер
Все данные передаются норм, засада с передачей/приемом 'table':sendHtml - табличка с цифрами и текстом кирилицы

Через "инструменты вебмастера" (остальной обработчик пока не коддил) вижу вместо кирилицы "корябушки"  :(

 

Начал разбираться, нагуглил в инете инфу что передача данных обработчику производится сугубо в utf-8 и попробовал предложенную "таблэтку":

а) при передаче данных обработчику:

data:{'email':sendemailval,'style':cssBlock,'image':imgSrc,'table':encodeURIComponent(sendHtml)}

б) получение данных обработчиком:

$_TableSizes=iconv('utf-8', 'windows-1251', trim($_POST['table']));

Результат тот-же: "корябушки"  :angry:

 

Что не так делаю? Памажите, люди добрые, кто чем может...  :rolleyes:


 

 

  • 0
MasterWEBS: третий дом - моё хобби и увлечение... Второй дом: работа - не меньше 12 часов в день...
Первый дом - под охраной: "Осторожно - злая жена!" (дрессировалась долго и надёжно) /*ссылку не просите - не дам!*/


#2 TimurR

TimurR
  • Пользователь PRO
  • 979 сообщений
  • Репутация: 239

Отправлено 16 September 2017 - 01:19

в utf-8 передавать надо жеж) или я не догнал?  


  • 0

Разработка сайтов.



#3 ShowPrint

ShowPrint
    Topic Starter
  • Пользователь PRO
  • 3069 сообщений
  • Репутация: 843

Отправлено 16 September 2017 - 02:31

@TimurR, ты догнал )))

Я это насерфил и стал передавать через encodeURIComponent (насколько понимаю именно в utf-8

Вопрос в том, что после того как обработчик принимает utf и я его пытаюсь преобразовать через iconv в инструментах разраба хрома я вижу крокозябры. (Выдаю через echo)

Или так и должно быть? Можно писать обработчик дальше и при отправке письма на почту с кодировкой все будет гуд?
  • 0
MasterWEBS: третий дом - моё хобби и увлечение... Второй дом: работа - не меньше 12 часов в день...
Первый дом - под охраной: "Осторожно - злая жена!" (дрессировалась долго и надёжно) /*ссылку не просите - не дам!*/


#4 miketomlin

miketomlin
  • Пользователь
  • 515 сообщений
  • Репутация: 109

Отправлено 16 September 2017 - 14:14

@ShowPrint, не совсем понял, как просматриваете поступившие на сервер данные в результате AJAX-запроса. Просто сохраните в файл POST-параметр и посмотрите в каком-нибудь hex-редакторе или текстовом редакторе, позволяющем отобразить/переключить тек. кодировку, что за кодировка (должна быть utf-8 вне зависимости от кодировки станицы с формой), например:

file_put_contents('table.log',$_POST['table']);

Письмо может быть и в utf-8, и в windows-1251. Это отдельная история.

 

P.S. На всяк. случай явно укажите формат передачи. Не помню, как это в jQuery. В оригинале примерно так:

xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');

Сообщение отредактировал miketomlin: 16 September 2017 - 14:14

  • 1


#5 ShowPrint

ShowPrint
    Topic Starter
  • Пользователь PRO
  • 3069 сообщений
  • Репутация: 843

Отправлено 18 September 2017 - 10:42

@miketomlin, спасибо что откликнулся, тёзка =)

 

не совсем понял, как просматриваете поступившие на сервер данные в результате AJAX-запроса

Php-обработчиком выводил через echo и смотрел через хром-инстр-разраба:

Untitled-1.png

 

Что-то я ступил и в голову не пришла мысль сохранить в файл значение переменной - попробую когда освобожусь, результат сообщу.

 

$.ajax передает именно в utf-8 судя по:

При отправлении запроса на сервер, данные передаются в формате, указанном в contentType. По умолчанию используется 'application/x-www-form-urlencoded', который подходит в большинстве случаев. Если указать этот параметр явно, то он будет передан серверу (даже если туда не были отправлены никакие данные). Стоит отметить, что данные всегда будут передаваться в кодировке UTF-8. Это стоит учитывать при обработке данных на стороне сервера.

на всяк. случай попробую указать явно - хуже не будет  :)


  • 0
MasterWEBS: третий дом - моё хобби и увлечение... Второй дом: работа - не меньше 12 часов в день...
Первый дом - под охраной: "Осторожно - злая жена!" (дрессировалась долго и надёжно) /*ссылку не просите - не дам!*/


#6 miketomlin

miketomlin
  • Пользователь
  • 515 сообщений
  • Репутация: 109

Отправлено 18 September 2017 - 11:45

Судя по многочисленным Р/С, это utf, так что все в порядке. А причин появления кракозябл в браузере может быть несколько, например пытаетесь отобразить utf на windos-1251-странице, Web-сервер плевать хотел на ваш Content-Type, потому что у него в настройках прописано сообщать строго windows-1251, и т.п.


  • 0


#7 ShowPrint

ShowPrint
    Topic Starter
  • Пользователь PRO
  • 3069 сообщений
  • Репутация: 843

Отправлено 18 September 2017 - 11:57

Судя по многочисленным Р/С, это utf, так что все в порядке.
Спасибо, Михаил.

 

Соответственно если это действительно utf-8 (вечерком проверю) и я собираюсь эти данные вставлять в текст письма, то мне достаточно сделать 

$_TableSizes=iconv('utf-8', 'windows-1251', $_POST['table']);

и с этой переменной формировать текст письма для отправки надеясь что всё будет норм?

Или с учетом того что в обработчике указан заголовок

header("Content-Type: text/html; charset=UTF-8");

перекодировка iconv является лишней?

Просто формирую текст письма в utf-8, а кодировку самого письма назначаю уже при отправке почтовой функцией, так?


  • 0
MasterWEBS: третий дом - моё хобби и увлечение... Второй дом: работа - не меньше 12 часов в день...
Первый дом - под охраной: "Осторожно - злая жена!" (дрессировалась долго и надёжно) /*ссылку не просите - не дам!*/


#8 miketomlin

miketomlin
  • Пользователь
  • 515 сообщений
  • Репутация: 109

Отправлено 18 September 2017 - 12:07

У письма кодировка задается отдельно, соответственно если письмо отправляете в windows-кодировке, делаете преобразование, а если в utf-, то нет.
 
header тут по барабану, т.к. формируемый ей заголовок относится к выводу в браузер, а не к письму. Для письма вот почитайте: Как сделать отправку письма?

P.S. Еще разведите обычный и AJAX- серверные обработчики, чтобы при отключенном JS вы случайно не получили данные в windows-1251.
  • 0


#9 ShowPrint

ShowPrint
    Topic Starter
  • Пользователь PRO
  • 3069 сообщений
  • Репутация: 843

Отправлено 18 September 2017 - 12:27

У письма кодировка задается отдельно
Эт я уже "проходил" и понимание есть  :)

 

За ссыль спасибо - сведу инфу с топиком "избранного" (здесь) и буду ваять  :rolleyes:

 

Еще разведите обычный и AJAX- серверные обработчики, чтобы при отключенном JS вы случайно не получили данные в windows-1251.

Не совсем понял смысл слова "развести"  :wacko:

P.S. Судя по моей "средней" метрике JS отключен у 1 посетителя из 20к. Кроме того у меня кнопа "отправить" подгружается в асинхроне через jQuery (JS) и при отключенном JS посетитель её никогда не увидит )))


  • 0
MasterWEBS: третий дом - моё хобби и увлечение... Второй дом: работа - не меньше 12 часов в день...
Первый дом - под охраной: "Осторожно - злая жена!" (дрессировалась долго и надёжно) /*ссылку не просите - не дам!*/


#10 miketomlin

miketomlin
  • Пользователь
  • 515 сообщений
  • Репутация: 109

Отправлено 18 September 2017 - 12:34

Не совсем понял смысл слова "развести"

Разделите на два отдельных. Если вообще не планируется использовать отправку данных формы обычным POST-запросом, пропишите в action адрес какой-нибудь заглушки или просто страницы, игнорирующей данные POST-запроса.
  • 0


#11 ShowPrint

ShowPrint
    Topic Starter
  • Пользователь PRO
  • 3069 сообщений
  • Репутация: 843

Отправлено 18 September 2017 - 12:45

@miketomlin, у меня формы вообще нет: отправка по событию клика, а сами данные берутся не из формы, а как содержимое div-а с определенным селектором. Так что обычного обработчика у меня просто нет  :)


  • 0
MasterWEBS: третий дом - моё хобби и увлечение... Второй дом: работа - не меньше 12 часов в день...
Первый дом - под охраной: "Осторожно - злая жена!" (дрессировалась долго и надёжно) /*ссылку не просите - не дам!*/


#12 miketomlin

miketomlin
  • Пользователь
  • 515 сообщений
  • Репутация: 109

Отправлено 18 September 2017 - 12:48

Понял.
  • 0


#13 ShowPrint

ShowPrint
    Topic Starter
  • Пользователь PRO
  • 3069 сообщений
  • Репутация: 843

Отправлено 18 September 2017 - 12:52

Понял
Пасиб, за участие. Буду по свободе продолжать реализацию. Если наткнусь на проблему которую не смогу одолеть, то ещё "приду в душу" (с) Адская белочка  ;)
  • 0
MasterWEBS: третий дом - моё хобби и увлечение... Второй дом: работа - не меньше 12 часов в день...
Первый дом - под охраной: "Осторожно - злая жена!" (дрессировалась долго и надёжно) /*ссылку не просите - не дам!*/


#14 ShowPrint

ShowPrint
    Topic Starter
  • Пользователь PRO
  • 3069 сообщений
  • Репутация: 843

Отправлено 19 September 2017 - 00:28

Пошло, но "со скрипом" (((

Отчитываюсь.

 

Не обошлось без подсказки

сохраните в файл POST-параметр

В общем выяснил что передаётся всё-таки в utf-8, но работать с полученной переменной нельзя... Чтоб она превратилась в то, что нужно "выцарапанное" из POST значение переменной надо ещё пропустить через urldecode()  :)

После этого всё заработало... Относительно... С неувязочками...

 

1) При вёрстке html на странице старался делать таблицу "по-уму", используя caption, thead, tfoot. При передаче этой таблицы обработчику и "всовывая" её в html-письмо выяснилось что в письме тег caption не отображается - раз, а tfoot отображается не в конце таблицы, а в том порядке, в котором указан в коде, то есть после thead и перед основным содержимым страницы.

Это победимо, по крайней мере понимаю что с этим делать - скриптом переверстать таблицу в вид который будет подходить под html-письмо.

 

2) Осознал что спарсить стили страницы, передать их обработчику - реально, а вот вставить в html-письмо затея по всей видимости пустая. html-письмо по всей видимости не понимает классы (и свойства описанные в них) прописанные как 

<html>
  <style>
    [перечень классов и их свойств]
  </style>
  <body>
    [html-код тела письма со стилевыми классами]
  </body>
</html>

Хотя... Фиг знает, может этого не понимает мой почтовый агент (пользую The Bat), так как при открытии html-письма в браузере стили цепляются как надо... В общем с этим предстоит разбираться.

Кстати, нет случаем "волшебной таблетки"-функции (про которую я не знаю), чтоб возвращала все стили объекта, которые можно было бы просто засунуть в атрибут style соответствующего тега?  :unsure:

 

3) Не смог "подцепить" (приаттачить) в письмо вторую картинку - одна (лого в подписи) цепляется, вторая - не хочет  :(

Делал по аналогии с той которая цепляется нормально - результат: во вложении не вижу, а при открытии письма в браузере отображается альтернативный текст. Сейчас родилось подозрение что напулал что-то с путями и это происходит из-за того что по указанному пути не находится файл. Буду проверять - поставлю проверку наличия файла и посмотрю, но это уже завтра... =)

@miketomlin, не посоветуешь где/что почитать на тему нескольких вложений? Если под рукой ничего нет, то буду разбираться с тем, что насерфил


  • 0
MasterWEBS: третий дом - моё хобби и увлечение... Второй дом: работа - не меньше 12 часов в день...
Первый дом - под охраной: "Осторожно - злая жена!" (дрессировалась долго и надёжно) /*ссылку не просите - не дам!*/


#15 miketomlin

miketomlin
  • Пользователь
  • 515 сообщений
  • Репутация: 109

Отправлено 19 September 2017 - 01:20

Чтоб она превратилась в то, что нужно "выцарапанное" из POST значение переменной надо ещё пропустить через urldecode()

Это наверно следствие вашего вызова encodeURIComponent. Видимо, jQuery это автоматом делает, а тут еще вы :)

 

Ознакомьтесь с шаблонами HTML-писем. Там вся стилизация прямо в тегах делается.

 

 

 

не посоветуешь где/что почитать на тему нескольких вложений?

Я только спеки могу порекомендовать, ну или продолжение моей статьи про отправку писем, которое я еще не написал :) Ваши подозрения скорее всего верные: если смогли прикрепить один файл, то с прикреплением нескольких не должно быть никаких проблем – там идут абсолютно однотипные блоки, по одному для каждого файла. Покажите целиком код сообщения.

 

P.S. А зачем граббить контент со страницы собственного сайта? Сделайте по аналогии с выводом: вычитайте фактические данные из БД, прогоните их через шаблон в памяти (ob_start, include, ob_get_clean) и загоните результат в письмо, предварительно закодировав как полагается.

 

Или этот контент сплошной портянкой хранится?


Сообщение отредактировал miketomlin: 19 September 2017 - 01:22

  • 0


#16 miketomlin

miketomlin
  • Пользователь
  • 515 сообщений
  • Репутация: 109

Отправлено 19 September 2017 - 01:48

P.P.S. Многочисленные Р/С на скрине – это фрагменты именно кириллических букв в utf, а не строки в url-кодировке, так что использование urldecode на 100 процентов лишнее! Кроме того, это основной способ кодирования данных с формы – мы же не прогоняем POST-параметры через urldecode при их получении в скрипте ;)


  • 0


#17 ShowPrint

ShowPrint
    Topic Starter
  • Пользователь PRO
  • 3069 сообщений
  • Репутация: 843

Отправлено 19 September 2017 - 12:05

@miketomlin, начну с конца:

Многочисленные Р/С на скрине – это фрагменты именно кириллических букв в utf, а не строки в url-кодировке, так что использование urldecode на 100 процентов лишнее!

Вчера где-то насерфил инфу что urldecode может автоматом делать браузер, так что склонен доверять тому что увидел в сохраненном файле, а там url-кодировка в чистом виде.

 

Или этот контент сплошной портянкой хранится?

Почти...

Untitled-1.png

В отладочном варианте вкладки трёх моделей, в завершенном варианте будет около 10, плюс столько же ещё в двух аналогичных блоках с женскими и детскими футболками.

На каждой вкладке своя картинка с разным количеством разных размеров, соответственно таблицы тоже разные и по числу строк и по числу столбцов и с разными данными.

Плюс еще будут другие страницы аналогичного характера.

В данной ситуации считаю неразумным делать базу и потом выборку из неё с кучей проверок и промежуточными переменными для формирования страниц. Намного быстрее и проще добавить новую вкладку ручками в html.

Поэтому и пытаюсь один раз свать "универсальный" скрипт, который будет работать со всеми блоками на разных страницах.

 

 

Я только спеки могу порекомендовать, ну или продолжение моей статьи про отправку писем, которое я еще не написал ... Покажите целиком код сообщения.

Пока потерзаю сам, упрусь в тупик - спрошу. Никаких секретных разработок и тайн: просто не хочу лишний раз напрягать - раз; не ищу "таблетку" и чтоб "сделал кто-то", хочу постичь сам (и знаний, и практического опыта добавит, а также большее моральное удовлетворение) - два.  :D

 

Тебе и так огромное спасибо за участие. Код скорее всего покажу позже, потому как подозреваю что будут возникать вопросы когда я дойду до реализации кодирования тела письма  :unsure:

Хотя может и сам разберусь - "матчасть" в избранном сохранена  :)

 

Ознакомьтесь с шаблонами HTML-писем. Там вся стилизация прямо в тегах делается.

По первому предложению цитаты - вродь мы в ЛС решали перейти на "ты" ;)  (не настаиваю - как удобно)

 

Про стилизацию в тегах - видимо к этому и я приду. На страницах больше люблю использовать у тегов стилевые классы, но так и быть для таблиц стили важные при формировании письма пропишу в атрибуте style.

Надо будет только поискать и посмотреть примеры адаптивных html-писем - хочется сделать "по феншую" (для десктопов - как на скрине, а для моб.устр. делаю картинку по центру, а таблицу ниже, во всю ширину).

В остальном, поправить скрипт превращающий caption в заголовок таблицы и перенесящий tfoot в конец таблицы - максимум час даже для меня-любителя.  <_<


Сообщение отредактировал ShowPrint: 19 September 2017 - 12:05

  • 0
MasterWEBS: третий дом - моё хобби и увлечение... Второй дом: работа - не меньше 12 часов в день...
Первый дом - под охраной: "Осторожно - злая жена!" (дрессировалась долго и надёжно) /*ссылку не просите - не дам!*/


#18 miketomlin

miketomlin
  • Пользователь
  • 515 сообщений
  • Репутация: 109

Отправлено 19 September 2017 - 16:04

Вчера где-то насерфил инфу что urldecode может автоматом делать браузер, так что склонен доверять тому что увидел в сохраненном файле, а там url-кодировка в чистом виде.

Браузер это делает только при отображении ссылок. Причиной получения в скрипте нераскодированной url-строки стали какие-то твои действия при отправке.

 

 

 

На каждой вкладке своя картинка с разным количеством разных размеров, соответственно таблицы тоже разные и по числу строк и по числу столбцов и с разными данными.

Ну т.е. это контент портянкой. Его все равно можно брать непосредственно с сервера, а не граббить с клиента. Для каждого используемого определения class="один или несколько селекторов" можно делать подмену на style="..." (плюс форматирующие теги, если нужно), либо использовать полностью альтернативный вариант, что в общем-то норма.

 

 

 

Пока потерзаю сам, упрусь в тупик - спрошу. Никаких секретных разработок и тайн: просто не хочу лишний раз напрягать - раз; не ищу "таблетку" и чтоб "сделал кто-то", хочу постичь сам (и знаний, и практического опыта добавит, а также большее моральное удовлетворение) - два.

Я имел в виду не программный код, а значение параметра $message ф-ции mail (вместо кода прикрепляемых файлов можно поставить многоточие, только пустые строки не подчищай), чтобы на него взглянуть. Если это не работает, значит код уже есть (сохрани значение в файле перед вызовом mail).

 

 

 

Надо будет только поискать и посмотреть примеры адаптивных html-писем - хочется сделать "по феншую" (для десктопов - как на скрине, а для моб.устр. делаю картинку по центру, а таблицу ниже, во всю ширину).

HTML-письма строятся на основе old-old-school-техник. Максимум резина, т.е. что не помещается в конце тек. строки, перекидывается на следующую. Сделай две примерно одинаковые по ширине картинки, вторую с таблицей, размещенные последовательно, и будет тебе адаптив :)


P.S. Если вложения – это графика для HTML-письма, нужно использовать заголовки Content-ID и соотв. идентификаторы в ссылках, а не краткие имена файлов.

Сообщение отредактировал miketomlin: 19 September 2017 - 15:56

  • 0


#19 ShowPrint

ShowPrint
    Topic Starter
  • Пользователь PRO
  • 3069 сообщений
  • Репутация: 843

Отправлено 19 September 2017 - 16:13

Я имел в виду не программный код, а значение параметра $message ф-ции mail
Сказал же, что нет секретов, и в программном коде тоже ))) Что не хочется в паблик - можно же в ЛС отправить... 

 

Сделаю и зашлю, сейчас вообще пытаюсь понять азы, в голове уже каша от этих заголовков...

Про Content-ID знаю и использую, пока самое большое подозрение что напутал с "логикой" что-то... Открыл для себя что для разных частей письма могут (или должны?) использоваться разные разделители (boundary).

 

В общем сейчас ваяю под свою задачу "мэйлер" с нуля, получившимся поделюсь для критики рекомендаций и исправления багов.

Параметр $message сохраню и зашлю.


  • 0
MasterWEBS: третий дом - моё хобби и увлечение... Второй дом: работа - не меньше 12 часов в день...
Первый дом - под охраной: "Осторожно - злая жена!" (дрессировалась долго и надёжно) /*ссылку не просите - не дам!*/


#20 miketomlin

miketomlin
  • Пользователь
  • 515 сообщений
  • Репутация: 109

Отправлено 19 September 2017 - 16:21

Открыл для себя что для разных частей письма могут (или должны?) использоваться разные разделители (boundary).

Не понял.
...там только разделитель-терминатор немного отличается от прочих разделителей.
...ну точнее в терминаторе к разделителю добавляются две черточки.
  • 0


robot

robot
  • Пользователь PRO
  • 2652 сообщений
  • Репутация: 85


Похожие темы

  Название темы Автор Статистика Последнее сообщение

Оформление форума – IPBSkins.ru