Запретить редактировать поле "Ссылка на термин"

Главные вкладки

Аватар пользователя nikolasun nikolasun 5 ноября 2018 в 15:47

Друзья, есть поле со ссылкой на термин. В это поле пользователь вводит название компании, в которой он работает, создавая тем самым термин таксономии. Как запретить редактировать это поле, если оно уже заполнено, дабы не захламлять словарь? Есть самописный модуль, при помощи которого я запрещаю пользователям редактировать обычные текстовые поля, но на поле ссылка на термин, этот модуль не работает.
Вот модуль:

<?php/**
 * Implements hook_menu().
 */
function field_acces_form_alter(&$form, $form_state, $form_id) {

global $user;
// Check if the user has the 'Неактивный' role.
if (in_array('Неактивный', $user->roles)) {
if (arg(0) == 'user' && arg(2) == 'edit') {
 
$form['field_name']['und']['0']['value']['#attributes']['disabled'] = TRUE;?>

Комментарии

Аватар пользователя bumble bumble 5 ноября 2018 в 16:17
1

А откуда у Вас такие пути??
Там должно быть что-то вроде:

<?php
$form
['field_name']['#disabled'] = TRUE;
// Или
$form['field_name']['#access'] = FALSE;
?>

И, вместо этой дичи:

<?php
if (arg(0) == 'user' && arg(2) == 'edit')
?>

нужно сделать нормальный альтер формы юзера:

<?php
function modulename_form_user_profile_form_alter(&$form, &$form_state$form_id) {}
?>
Аватар пользователя bumble bumble 5 ноября 2018 в 21:49

Проверить наличие значения. Вот тут уже ['value']['#default_value'].

Можно так же, в цикле:

<?php
$field_name 
'FIELD_NAME'// Машинное имя поля
$langcode LANGUAGE_NONE// Код языковой версии
if (isset($form[$field_name][$langcode])) {
  
$items element_children($form[$field_name][$langcode]);
  foreach (
$items as $i) {
    
// Если значение поля заполнено
    
if ($form[$field_name][$langcode][$i]['value']['#default_value']) {
      
$form[$field_name]['#disabled'] = TRUE// Выключаем поле
      
break; // И выходим из цикла
    
}
  }
}
?>
Аватар пользователя nikolasun nikolasun 5 ноября 2018 в 22:39

Почему-то не работает:

<?phpfunction field_acces_if_form_user_profile_form_alter(&$form, &$form_state, $form_id) {

$field_name = 'field_user_company_name'; // Машинное имя поля
$langcode = LANGUAGE_NONE; // Код языковой версии
if (isset($form[$field_name][$langcode])) {
  $items = element_children($form[$field_name][$langcode]);
  foreach ($items as $i) {
    // Если значение поля заполнено
    if ($form[$field_name][$langcode][$i]['value']['#default_value']) {
      $form[$field_name]['#disabled'] = TRUE; // Выключаем поле
      break; // И выходим из цикла
    }
  }
}
}?>

Аватар пользователя bumble bumble 5 ноября 2018 в 22:43
  1. Проверьте, имя модуля - "field_acces_if"?
  2. Убедитесь что поле не переводимое ('und').
  3. Убедитесь что сохранили измененную копию файла с кодом на сервер.
  4. Очистите кеш.
Аватар пользователя nikolasun nikolasun 5 ноября 2018 в 22:55

1.да,имя модуля field_acces_if
2. поле непереводимое field_user_company_name[und]
3. Перезаписал на всякий случай
4. Очистил, конечно
Ничего не происходит. Поле можно менять

Аватар пользователя nikolasun nikolasun 6 ноября 2018 в 1:24

алтьер срабатывает.
Пробовал так:

<?php$langcode = LANGUAGE_NONE;
if (isset($form['field_user_company_name'][$langcode])) {
  $items = element_children($form['field_user_company_name'][$langcode]);
  foreach ($items as $i) {
    $form['field_user_company_name'][$langcode][$i]['#disabled'] = TRUE;
  }
}?>

тоже не хочет работать.

Ошибок в отчетах нет...

Аватар пользователя bumble bumble 5 ноября 2018 в 16:32

Если прям сильно нужно пройтись по каждому элементу мультиполя, нужно как-то так:

<?php
$langcode 
LANGUAGE_NONE;
if (isset(
$form['field_name'][$langcode])) {
  
$items element_children($form['field_name'][$langcode]);
  foreach (
$items as $i) {
    
$form['field_name'][$langcode][$i]['#disabled'] = TRUE;
  }
}
?>