Друзья, есть поле со ссылкой на термин. В это поле пользователь вводит название компании, в которой он работает, создавая тем самым термин таксономии. Как запретить редактировать это поле, если оно уже заполнено, дабы не захламлять словарь? Есть самописный модуль, при помощи которого я запрещаю пользователям редактировать обычные текстовые поля, но на поле ссылка на термин, этот модуль не работает.
Вот модуль:
<?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;?>
Комментарии
А откуда у Вас такие пути??
Там должно быть что-то вроде:
<?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) {}
?>
Спасибо! И еще,а как сделать условие: если поле уже заполнено?
Проверить наличие значения. Вот тут уже ['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; // И выходим из цикла
}
}
}
?>
Почему-то не работает:
<?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; // И выходим из цикла
}
}
}
}?>
1.да,имя модуля field_acces_if
2. поле непереводимое field_user_company_name[und]
3. Перезаписал на всякий случай
4. Очистил, конечно
Ничего не происходит. Поле можно менять
Альтер формы срабатывает?
алтьер срабатывает.
Пробовал так:
<?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;
}
}?>
тоже не хочет работать.
Ошибок в отчетах нет...
Нужно отдебажить на каком шаге перестает работать и исправить. Угадывать нет смысла.
Если прям сильно нужно пройтись по каждому элементу мультиполя, нужно как-то так:
<?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;
}
}
?>