Блог пользователя - MarinaMim

Wrap в почтовых сообщениях некорректно работает с UTF-8

20 февраля 2009 в 12:31

в почтовых сообщениях строки обрезаются очень коротко. Это происходит из-за того, что функция php wordwrap некорректно работает с UTF-8 - русские символы у нее имеют длину 2, а английские - 1. Из-за этого нельзя просто в 2 раза увеличить границу - строки с английскими словами (например, url) разъедутся.

Я добавила функцию _wordwrap, и изменила на нее вызов в _drupal_wrap_mail_line (файл includes/mail.inc)

Кстати, во втором вызов wordwrap, которые предполагает обрезать слова, пропущен 4й параметр, который, собственно и должен указывать на обрезание. Иначе вызов функции с шириной 996 после ширины 77 не имеет смысла.

function _drupal_wrap_mail_line(&$line, $key, $values) {
  // Use soft-breaks only for purely quoted or unindented text.
  $line = wordwrap($line, 77 - $values['length'], $values['soft'] ? "  \n" : "\n");
  // Break really long words at the maximum width allowed.
  $line = wordwrap($line, 996 - $values['length'], $values['soft'] ? " \n" : "\n");
}

->

function _drupal_wrap_mail_line(&$line, $key, $values) {
  // Use soft-breaks only for purely quoted or unindented text.
  $line = _wordwrap($line, 77 - $values['length'], $values['soft'] ? " \n" : "\n");
  // Break really long words at the maximum width allowed.
  $line = wordwrap($line, 996 - $values['length'], $values['soft'] ? " \n" : "\n", 1);
}

function _wordwrap( $str, $width, $break="\n") {
    $formatted = '';
    $position = -1;
    $prev_position = 0;
    $last_line = -1;
   
    /// looping the string stop at each space

Профили пользователей, флажок отмечен по умолчанию (патч)

18 февраля 2009 в 16:50

продолжаю патчить профайл.
Я хочу, чтобы у меня флажок "получать новости сайта" был отмечен по умолчанию.
Что я делаю:

profile.admin.inc, function profile_field_form(&$form_state, $arg = NULL), line 245

  $form['fields']['visibility'] = array('#type' => 'radios',

->

  if ($type == 'checkbox') {
    $form['fields']['options'] = array('#type' => 'checkbox',
      '#title' => t('Checked by default'),
      '#default_value' => isset($edit['options']) ? $edit['options'] : '',
      '#description' => t('Specifies wether this checkbox should be checked by default'),
    );
  }
  $form['fields']['visibility'] = array('#type' => 'radios',

profile.module, function profile_form_profile($edit, $user, $category, $register = FALSE), line 389

          '#default_value' => isset($edit[$field->name]) ? $edit[$field->name] : '',

->

          '#default_value' => isset($edit[$field->name]) ? $edit[$field->name] : ($field->options ? 1 : ''),

(!) если в системе уже есть пользователи, это не применит флажок к ним.

Переводы полей в профилях пользователей (патч)

18 февраля 2009 в 12:55

Я создаю многоязычный сайт с использованием профилей пользователей. К сожалению, drupal забыл включить поддержку переводов в поля профилей, название категорий, значения в выпадающих списках. Пришлось патчить. Делюсь с общественностью, поскольку найти такой полный патч в интернете не удалось. Я создала issue на drupal.org: http://drupal.org/node/376182

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

File profile.module

function profile_view_field($user, $field), line 264

         return $browse ? l($field->title, "profile/$field->name") : check_plain($field->title);

->

         return $browse ? l(t($field->title), "profile/$field->name") : check_plain(t($field->title));

function profile_view_profile(&$user), line 312

      $title = ($field->type != 'checkbox') ? check_plain($field->title) : NULL;

->

      $title = ($field->type != 'checkbox') ? check_plain(t($field->title)) : NULL;

function _profile_form_explanation($field), line 334

  $output = $field->explanation;

->

  $output = t($field->explanation);

function profile_form_profile($edit, $user, $category, $register = FALSE), line 352

    $category = $field->category;

->

    $category = t($field->category);
    $field->title = t($field->title);

line 399

            $options[$line] = $line;

->

            $options[$line] = t($line);