Я создал тип контента, который имеет поле выбора списка / выбора, и я ввел пары ключ | значение, необходимые для функционирования списка выбора.
Данные были введены, и было решено, что определенные условия больше не применяются и их следует удалить.
Однако при попытке удалить указанные термины я получаю следующую ошибку:
Allowed values list: some values are being removed while currently in use.
Очевидно, что в жизни проекта ценности будут меняться. Какой практический способ удалить элементы, когда узлы связаны с перечисленными терминами?
Это самая близкая вещь, которую я смог найти:
https://drupal.org/node/1653012
Он ссылается на плагин d6 и некоторые хитрости патчей, к которым я предпочитаю не прибегать. Если бы мне пришлось в конечном итоге прибегнуть к использованию патча для удаления проверки проверки в этом поле, есть ли какой-то вред, если оставить эти элементы бесхозными на узлах, с которыми они были связаны?
Обновление, я снова столкнулся с этой проблемой с государственным клиентом, у которого за последние 7 лет существования сайта на Drupal было 50 штатов и территорий в списке выбора. Теперь политика изменилась, и территории больше не нужно включать. Возможность удалять предметы из списков выбора очень важна, и поэтому я предлагаю вознаграждение.
Я ищу безопасное решение, чтобы иметь возможность удалять элементы из списка выбора. Чего я не знаю, так это того, должно ли это решение обновлять какой-либо из узлов, так как я не уверен, как хранятся значения полей по отношению к общему содержимому узла.
Я счастлив с чистым решением SQL, чтобы работать в MySQL; или я ищу модуль.
Ответы:
Недавно я сделал что-то подобное со следующим подходом.
например:
Таким образом, унаследованные данные сохраняются для справки, форма проверяется, а целостность данных остается неизменной.
источник
Как я знаю, все данные полей хранятся в 2 таблицах: field_data_field_FIELDNAME и field_revision_field_FIELDNAME. И я нашел подтверждение моей мысли здесь: /programming//a/7773117/1300562
Таким образом, чтобы удалить ненужные значения полей, необходимо удалить эти значения из вышеупомянутых таблиц, а затем удалить их из списка допустимых значений.
Шаг 1.
Шаг 2.
Удалите ненужные пары ключ | значение на странице настроек поля и отправьте форму для сохранения изменений.
После этого кэш должен очищаться автоматически, но если вы все еще можете видеть значения удаленных полей на страницах узла, очистите кеш вручную.
PS Недавно я столкнулся с подобной проблемой, и теперь я предпочитаю использовать поля типа «Ссылка на термин» или (еще лучше) «Ссылка на объект» вместо списка текстовых значений. При использовании ссылочного поля вы можете создать отдельный словарь для каждого поля и просто создавать / редактировать / удалять термины в любое время.
источник
Прежде всего, проверьте, есть ли у вас какие-либо допустимые значения, указанные в поле? Если вы это сделаете, другой вариант не будет проверен. Поэтому попробуйте сначала удалить значения из вкладки «Настройки поля».
В качестве альтернативы у вас есть 2 варианта:
1.
Удалите все значения, которые вы поместили в список разрешенных значений, которые используются учетными записями пользователей. Например, вы можете выполнить запрос SQL, чтобы найти эти:
или создайте представление пользователя, которое показывает, какие учетные записи имеют значение, которое вы хотите удалить из списка разрешенных значений.
2.
Если вы не хотите удалять значения из полей, это может быть достигнуто путем взлома.
Внимание, это не предлагаемое решение для производства, и вы должны знать, что вы делаете!
Найдите функцию field_has_data () и добавьте
return TRUE;
в первую строку функции.источник
Я думаю, что вы действительно можете сделать это с помощью модуля Bulk Operations .
источник
Вот улучшение ответа HL, которое я считаю лучшим:
Подводя итог, вам нужно назначить новые значения для контента, который имеет "старые" значения, назначенные для вашего поля выбора.
Помимо Bulk Operations , вам необходимо установить и включить модуль Администрирования Views . С этим модулем у вас уже есть готовое представление с включенными массовыми операциями (просто смотрите admin / content после включения). Потом:
1) Зайдите в админ / структуру / просмотры и отредактируйте представление «Администрирование: Узел»
2) Добавьте отображение новой страницы для просмотра, используя кнопку «Добавить -> Страница» сверху
3) Назначьте путь к новому дисплею: пример admin / content / custom
4) Добавьте новый фильтр для выбранного поля: выберите оператор «is one of», а затем выберите все параметры, которые вы хотите удалить.
5) Сохранить вид
6) Зайдите в admin / content / custom Теперь вы видите весь контент, который вам нужно массово редактировать (измените значение для вашего поля выбора)
7) Выберите все строки, установив первый флажок слева от таблицы (если имеется более одной страницы, также выберите кнопку с надписью «Выбрать все X строк в этом представлении»)
8) Выберите операцию «изменить значение» и нажмите «Выполнить»
9) Для вашего поля выбора выберите новое значение, чтобы перезаписать те, которые вы хотите удалить
10) Установите флажок для этого поля выбора
11) Нажмите Далее, и все готово
источник
Похоже, что ваша проблема Drupal основана на более глубокой проблеме с данными: что происходит с сущностями, которые в настоящее время используют устаревшие значения списка? Этот вопрос лежит в основе сообщения об ошибке, которое посылает вам Drupal.
Давайте внимательнее рассмотрим пример вашего штата / территории. Ваш клиент использует систему, которая обрабатывает штаты и территории одинаково в течение многих лет и создала огромную группу узлов, которые содержат как штаты, так и территории. Затем однажды полномочия решают, что территории должны обрабатываться по-другому, и что раскрывающийся список для присвоения региона больше не должен содержать территории. Отлично. Просто создайте представление, которое использует стандартные фильтры, чтобы отобразить список всех узлов территории, и используйте массовые операции представлений, чтобы изменить все значения их регионов на ... что ... какое-то 51-е состояние называется другим, может быть? Судьба территорий - очень серьезный вопрос. Ваше решение должно включать метод сохранения или изменения статуса территории. Вам может понадобиться создать новое поле списка под названием «Территория»
Вам нужно будет использовать правила с View Bulk Operations для выполнения этих изменений. Если вы мало знаете о правилах, пожалуйста, уделите немного времени, чтобы узнать, как они работают. Правила дают вам возможность манипулировать информацией на основе триггеров, условий и действий. После изучения правил вы можете обнаружить, что ответы, которые вы ищете, будут интуитивно понятны. По сути, вам нужно будет создать правило, которое запускается массовыми операциями, которое будет нацелено на все территории и удалять, переназначать, переименовывать или иным образом отделять их от основной части информации. Правило должно быть в состоянии каким-либо образом сохранять состояние территории, в то же время устанавливая раскрывающийся список состояний в статус «другое» или «N / A». Это может быть все, что нужно. В противном случае...
После переназначения необходимо выполнить простую операцию, чтобы изменить исходное поле списка и удалить названия территорий. Однако, если система по-прежнему не позволяет вам изменять список, вам может потребоваться создать новое поле списка, а затем использовать Bulk Operation и Rules для просмотра всех текущих значений состояния и переназначить их новому списку. Правила могут работать с «Массовыми операциями в представлениях», предназначаясь для всех соответствующих узлов и воздействуя на них на основе значений полей. Задать значение нового поля списка на основе значения существующего поля списка для группы узлов легко при использовании правил.
Также помните, что если у Drupal возникают проблемы с операцией, всегда очищайте кеш, прежде чем рассматривать трудную альтернативу.
источник
Я бы предположил, что ваш клиент хочет, чтобы унаследованный контент сохранил свое первоначальное значение, а это означает, что изменение списка выбора фактически уничтожит все предыдущие данные. Если это не проблема, то любой другой ответ, вероятно, сработает. Однако, если это так, вы не сможете изменить список выбора, не потеряв историю данных. Я мог бы пойти намного более простым путем, чтобы учесть исторические данные, в то же время делая сайт немного более ориентированным на будущее - я бы предложил использовать полевые разрешения:
* установить новое поле для этого списка выбора, используя таксономию вместо статических данных
* установить разрешение поля для существующего списка выбора как ВИД, но не РЕДАКТИРОВАТЬ кем-либо, кроме администратора
При этом старое поле должно оставаться видимым и доступным для поиска (добавить новый заголовок, отражающий его только как устаревший), но не редактировать. Это, конечно, сильно зависит от пользовательских поисков, представлений и т. Д., Которые, возможно, потребуется скорректировать.
Я предлагаю это (как бы беспорядочно это ни звучало), потому что удаление этих данных, удаление истории, и это может в конечном итоге привести к разрушительным последствиям. Вы можете даже использовать css, чтобы скрыть старое поле в узле редактирования, и ловушку, чтобы скрыть его для нового контента (где для него не установлено значение). Таким образом, он будет отображаться только для этого устаревшего контента.
Конечно, вы можете сделать еще один шаг вперед с помощью специального одноразового модуля, чтобы скопировать данные из старого списка выбора в новую таксономию.
источник
Простой скрипт на помощь! Мы обновляем данные полей и таблицы изменений полей и заменяем старые значения новыми, прежде чем вручную изменять настройки полей.
Если у нас есть что-то подобное в наших текущих настройках поля:
и хочу заменить его следующим:
Сначала мы запускаем скрипт drush, а затем меняем настройки поля в интерфейсе администратора.
Примечание. Этот код предназначен для поля с именем машины
field_foo_bar
.источник
Я использовал 2-е предложение kenorb, и оно работало для обновления списка значений в поле Drupal 7.52, Profile2 7.x-1.3. Поэтому, если вы получили предупреждение drupal: «Список допустимых значений: некоторые значения удаляются, когда они используются в данный момент». Следующее позволило мне удалить значения из поля (profile2), не удаляя и не заменяя их в базе данных.
В корневом каталоге ядра Drupal есть папка под названием modules, а файл для редактирования находится по адресу: modules / field / field.module. ЭТО ОСНОВНОЙ ФАЙЛ, вы должны полностью отменить свои изменения, когда закончите обновление значений. Я перевел сайт в автономный режим, временно заменил следующий блок кода в (корень друпала) /modules/field/field.module
ТОЧНО
И друпал перестал жаловаться, и я смог изменить список. (В моем случае это факультет в списке ценностей, которые покинули университет, но все еще связаны с записями студентов, как их советник, наставник и т. Д.)
источник