Analitycs

Показаны сообщения с ярлыком javascript. Показать все сообщения
Показаны сообщения с ярлыком javascript. Показать все сообщения

понедельник, 1 октября 2012 г.

Как вывести массив из PHP в JSON без всяких UTF конвертаций?

Если нужно вывести кириллический массив в JSON для последующей обработки в Javascript, генерируя его посредством PHP, да еще и в Windows-1251 (без всяких UTF-8, encoding и прочего)  - да, да - "мсье знает толк в извращениях" (с) ;-) ,

то можно воспользоваться вот такой жуткой конструкцией.

function php2js($a=false)
{
  if (is_null($a)) return 'null';
  if ($a === false) return 'false';
  if ($a === true) return 'true';
  if (is_scalar($a))
  {
    if (is_float($a))
    {
      // Always use "." for floats.
      $a = str_replace(",", ".", strval($a));
    }

    // All scalars are converted to strings to avoid indeterminism.
    // PHP's "1" and 1 are equal for all PHP operators, but
    // JS's "1" and 1 are not. So if we pass "1" or 1 from the PHP backend,
    // we should get the same result in the JS frontend (string).
    // Character replacements for JSON.
    static $jsonReplaces = array(array("\\", "/", "\n", "\t", "\r", "\b", "\f", '"'),
    array('\\\\', '\\/', '\\n', '\\t', '\\r', '\\b', '\\f', '\"'));
    return '"' . str_replace($jsonReplaces[0], $jsonReplaces[1], $a) . '"';
  }
  $isList = true;
  for ($i = 0, reset($a); $i < count($a); $i++, next($a))
  {
    if (key($a) !== $i)
    {
      $isList = false;
      break;
    }
  }
  $result = array();
  if ($isList)
  {
    foreach ($a as $v) $result[] = php2js($v);
    return '[ ' . join(', ', $result) . ' ]';
  }
  else
  {
    foreach ($a as $k => $v) $result[] = php2js($k).': '.php2js($v);
    return '{ ' . join(', ', $result) . ' }';
  }
}

Страшно, да...  но работает ;-). "Костыли - это кошерно" (с)

Найдено в дебрях PHP.net

понедельник, 30 января 2012 г.

Javascript+Flash мультизагрузчики картинок (SWFUpload, Uploadify) и Error #2038

Иногда мультизагрузчики изображений с использованием Flash (SWFUpload, Uploadify и т.д) дают ошибку #2038 при загрузке на случайных картинках без всяких видимых причин.

Как выяснилось - может быть целая куча разномастных серверных проблем - причем проблем преимущественно backend'овских.

TODO-list
  • обновляем Flash загрузчик до последней версии;
  • проверяем, что POST приходит на сервер в скрипт загрузки нормально - без всяких HTTP авторизаций, сессии нормально передаются, пользователь распознается залогиненным и т.д.;
  • и внимание - ЭПИЧНАЯ ОШИБКА: Размер разрешенных вложений должен быть <= размеру upload_max_filesize в php.ini;

И только потом лезем в настройки сервера - для nginx решение

Открываем nginx.conf и в http секцию добавляем директиву

client_max_body_size 500m;  

И удаляем из конфига директиву keepalive_timeout

Через некоторое время, когда у пользователей обновится кеш браузера - начинает все работать

понедельник, 9 января 2012 г.

Как подключить Яндекс-Спеллер (Yandex-Speller) к PHPBB?

Есть у Яндекс одна хорошая штука, до которой у меня долго не доходили руки...  а именно - проверка орфографии в формочках ввода - Яндекс-Спеллер. Оказалось, что зря откладывал - не так сложно.

Как подключить к форуму PHPBB2 (как модуль на RunCMS)? По идее - в чистом PHPBB2/3 не должно сильно отличаться, разве что файлы  будут другие, скорей всего...

1) Разместить на сайте папку с самим спеллером в /class/xoopsform/yandex_speller/ Затем

2) файл include/viewtopic_quickreply.php
 
$addon_html = '
<script type="text/javascript" src="'.XOOPS_URL.'/class/xoopsform/yandex_speller/spell.js"></script>

// YandexSpeller 

var speller = 

new Speller({ url:"/class/xoopsform/yandex_speller", lang:"ru", options:Speller.IGNORE_URLS });
// Настройка параметров проверки http://api.yandex.ru/speller/doc/dg/reference/speller-js.xml  

<button name="cmdSpell_message" onclick="speller.check([document.getElementById(\'message\')])" type="button">'._CORE_CHECK_ORPHO.'</button>
';

$template->assign_vars(array(
  'U_POST_SQR_TOPIC' => 'javascript:sqr_show_hide();',
  'SQR_IMG' => $images['quickreply'],
  'L_POST_SQR_TOPIC' => $lang['Show_hide_quick_reply_form'],

  'L_EMPTY_MESSAGE' => $lang['Empty_message'],
  'L_QUICK_REPLY' => $lang['Quick_Reply'],
  'L_USERNAME' => $lang['Username'],
  'L_NO_TEXT_SELECTED' => $lang['Qreply_no_text_selected'],
  'L_SUBJECT' => $lang['Subject'],
  'L_MESSAGE_BODY' => $lang['Message_body'],
  'L_PREVIEW' => $lang['Preview'],
  'L_SUBMIT' => $lang['Submit'],
  'S_POST_ACTION' => append_sid("posting.php"),
  'S_HIDDEN_FORM_FIELDS' => $hidden_form_fields,
  'ADDON_HTML' => $addon_html,
  )
);

где _CORE_CHECK_ORPHO - наш новый языковой дефайн, 'ADDON_HTML' => $addon_html, - добавленная строчка в код и шаблон.

3) правим шаблон

Особо расписывать не вижу смысла - все просто как грабли.


Как подключить спеллер к формам - читать тут.
Полное API
Навеяно вот этим хаком

четверг, 15 сентября 2011 г.

Как исправить ошибку Python datetime.datetime() is not JSON serializable?

Немного о сериализации через simplejson даты/времени, полученной из MySQL

При попытке сдампить результат из fetchall - чтобы отдать данные наружу во фронтендовский в Javascript в стиле

            sql  ='SELECT * FROM xxx WHERE id=%d'                                                          
            self._query(sql % id)
            data = self._cursor.fetchall()

получаем Exception

datetime.datetime(2011, 9, 14, 10, 18, 57) is not JSON serializable

Исправляется дополнительным форматом через лямбда-функцию

            dthandler = lambda obj: obj.isoformat() if isinstance(obj, datetime) else None
            response = json.dumps(data, ensure_ascii=False, default=dthandler)
Найдено, как водится - на StackOverflow