Как спрятать поле CCK в друпал в зависимости от текущего языка

Поскольку выяснилось, что для базаданноподобных структур на основе CCK, i18n от Drupal слабо годится, то пришлось эти типы контента формировать в виде некоторого набора полей для каждого языка: field_cck1_field1_en, field_cck1_field1_de и field_cck1_field1_fr.

И сразу стала задача как спрятать поля CCK в друпал в зависимости от текущего языка, которая требовала решения и желательно автоматического.

В 7-м друпале для препроцессинга полей изобрели уже более кошерное решение, но и для 6-го друпала таки нашлось работающее решение.

В свою тему из CCK копирую шаблон поля: content-field.tpl.php и в нём провожу некоторый набор правок.

Для автоматизации процесса выкидывания из отображения полей не текущего языка нужно придерживаться правил именования. У меня это обычно следующим образом: field_<тип контента CCK>_<название поля в конкретном CCK>_<двубуквенный код языка>.

А вот собственно код в шаблона поля, который вставляется до умолчательного обработчика:

<?php
global $language; //Структура, содержащая текущий ящык
$aLanguage = language_list(); //Добываю список языков
unset($aLanguage[$language->language]);    //Выкидываю текущий язык из массива языков
if(preg_match('/_([a-z]{2})$/',$field_name,$regs) and isset($aLanguage[$regs[1]])){
  //Если поле попало под условие, то говорю что он пустое, 
  //и дальше оно само погибнет в умолчательной части шаблона
 $field_empty=true;
}
?>

Коменты всегда велком.

RSSAdd to Google

Обсуждение:

  • Автор: (Анонимус)
  • Тема: CCK, i18n
  • > ..для базаданноподобных структур на основе CCK, i18n от Drupal слабо годится..

    Это связано с поисковой оптимизацией?

  • Отправлено:
  • Автор: Dmitrii Varvashenia
  • Тема: Базаданноподобные структур на основе CCK
  • Нет - seo тут не причём.
    Если использовать CCK для создания сложных взаимосвязанных структур, например через node refence, то во многоязычных сайтах возникают проблемы однозначности объектов и связей, т.к. каждый перевод ноды порождает новую ноду с другим id и всё придётся дублировать для каждого языка и в конечном итоге получится N сайтов в одном, где N=количеству языков. Плюс изменения в сайте размером больше страниц эдак ста превратятся в сущий ад.
    Применение вышеописанного метода для ключевых объектов (которые должны быть уникальными) позволяет сделать сайт управляемым. Да и собственно сделать сайт в разумные сроки и деньги без погружения в разработку мега супер пупер своего движка :)
  • Отправлено:
  • Автор: (Анонимус)
  • Тема: Структур на основе CCK
  • Я вот как понял:
    1) Копирую content-field.tpl.php в папку темы.
    2) Вставляю в него приведенный код.
    3) В CCK создаю для одного content type одинаковые поля для разных языков, различающиеся обозначением языка (field_example_ru, field_example_en, field_example_ua).

    И при переключении в Language switchere будет показываться только выбранный язык.

    Но поскольку это не работает - я все понял неправильно.

  • Отправлено:
  • Автор: Dmitrii Varvashenia
  • А шаблон поля подхватился?

    Обычно его приходится пинать через очистку кэша (и его аналоги в виде рескана темы): 'On the "Administer > Site configuration > Performance"; page, click on the "Clear cached data" button'.

    И можно вставить какой-нить echo '<h2>'.$field_name' - выкинули</h2>'; в if и добавить ему else типа echo '<h2>'.$field_name.' не выкинули</h2>'; для того, что-бы понять что там вообще происходит внутри.

  • Отправлено:
  • Автор: (Анонимус)
  • > ..click on the "Clear cached data" button

    [Ура!] Заработало, только пока немного странно. Отображает в двух случаях по два языка, а в одном - один.
    Надо еще поковыряться.

  • Отправлено:
  • Автор: Dmitrii Varvashenia
  • Ура! Остались мелочи - отладка..
    Возможно что-то глючит.. А возможно, если не до конца настроить многоязычность, то drupal может выпадать в межязычье - такое поведение особо заметно, если английский не основной язык.

  • Отправлено:
  • Автор: (Анонимус)
  • В admin/settings/language код украинского языка uk, вместо моего ua.

    Вот все и заработало как надо.

  • Отправлено:
  • Автор: (Анонимус)
  • Добрый вечер опять.

    Спасибо Вам за Ваш сайт и за все что Вы делаете -)

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

    В создаваемых в CCK полях text>text area напрочь перестают работать html теги, в том числе абзацы и переносы строки - просто выводятся как текст.

    А еще - как отключить Title, который идет по умолчанию в любом Content type. Ведь его невозможно перевести методом формирования некоторого набора полей для каждого языка.

    Убрать php print $title из page.tpl.php это нормально?

  • Отправлено:
  • Автор: Dmitrii Varvashenia
  • Пропавшие теги html очень похожи на Input Format типа Filtered HTML. Его нужно переключить на Full HTML или настроить используемый формат в admin/settings/filters/list.

    Title не отключается стандартными средствами - можно грохнуть из page.tpl.php, но тогда нужно обязательно позаботиться о наличии его аналога внутри тега <h1>, иначе это будет кошмар с точки зрения SEO.

    Как вариант можно создать свои page-шаблоны для типов контента, где $title не нужен в том виде, в котором он есть в друпале.

    Или в template.php сделать функцию ВАША-ТЕМА_preprocess_page(&$vars), которая надёргает нужных значений в $vars['title'] (который и преобразуется в $title шаблона page.tpl.php) из полей $vars['node'] (тут хранится текущая нода). Последний вариант выглядит самым предпочтительным для используемого способа локализации ноды: поля, заменяющие title нужно поменить как пустые, а в title подсунуть название из текущего языка.

    По поводу темизации и шаблонов читать тут и тут (на англицком, но очень толково).

  • Отправлено:
  • Автор: (Анонимус)
  • Спасибо, буду изучать.

    Попробовал Full HTML - не получилось. Потом заметил, что при создании поля необходимо в Global settings выбирать Text processing: Filtered text, вместо Plain text.

  • Отправлено:
  • Автор: Dmitrii Varvashenia
  • Да, точно - свойства поля. При Filtered HTML хотя-бы параграфы остаются...
  • Отправлено:
  • Автор: (Анонимус)
  • Тема: Отправка содержания поля текущей ноды в title.
  • > ..в title подсунуть название из текущего языка

    Не получаетcя текущего..

    Максимум вот так:
    function mythemename_preprocess_page(&$variables){
    $variables['title'] = $variables['node']->field_myfieldname_en[0][view] ;
    } и т.п.

    Конечно, это уже от знания PHP зависит.
    Без него, оказывается, никак.

    Дайте мне пожалуйста подсказку,
    или подарите этот код.
    Или продайте :)

  • Отправлено:
  • Автор: Dmitrii Varvashenia
  • Тема: Отправка содержания поля текущей ноды в title.
  • Можно примерно вот так:

    	global $language;
    	$sField='field_myfieldname_'.$language->language;
    	if(isset($variables['node']->$field)){
    		$aField=$variables['node']->$sField;
    		if(isset($aField[0]['view'])){
    			$variables['title'] = $aField[0]['view'] ; 
    		}
    	}
    

    Или банально через if или case текущий язык.

  • Отправлено:
  • Автор: (Анонимус)
  • Тема: Отправка содержания поля текущей ноды в title.
  • К сожалению, Ваш вариант применить не смог.


    > Или банально через if

    А вот так очень хорошо все получилось:

    function yourtheme_preprocess_page(&$variables)
    {
    global $language;
    if($language->language == "en")
    {
    $variables['title'] = $variables['node']->field_yourfieldname_en[0][view] ;
    } elseif($language->language == "ru")
    {
    $variables['title'] = $variables['node']->field_yourfieldname_ru[0][view] ;
    } elseif($language->language == "uk")
    {
    $variables['title'] = $variables['node']->field_yourfieldname_uk[0][view] ;
    }
    }

    Все работает,
    Спасибо.

    (Вот это: "=="("is equal to"), - доставило хлопот до него дотумкать.)
  • Отправлено:
  • Автор: Dmitrii Varvashenia
  • Куча if-else как-то некошерно выглядит.

    <?php
    function yourtheme_preprocess_page(&$variables){
     global $language;
     switch($language->language){
      case 'en':
       $variables['title'] = $variables['node']->field_yourfieldname_en[0][view];
      break;
      case 'ru':
       $variables['title'] = $variables['node']->field_yourfieldname_ru[0][view];
      break;
      case 'uk':
       $variables['title'] = $variables['node']->field_yourfieldname_uk[0][view];
      break;
     }
    }
    ?>
    
  • Отправлено:

Как вам материальчик? *



















Тема:

Мысль:

Как звать-то:

Почта:

PS: Комментарии публикуются только после проверки модератором.

PPS: E-mail'ы не публикуются.

* обязательные поля