Ограничить выбор по Entity Reference

26 апреля 2013 в 11:48

Есть задача: Ограничить пользователя в выборе по Entity Reference

Есть материал допустим Color
Есть еще один материал допустим Desk который имеет ссылку на Color

Пользователю разрешено добавлять материалы Desk где он в обязательном порядке должен выбрать из списка Color
Стоит задача ограничить пользователя в выборе Color только теми позициями которые не участвовали в ранее добавленных материалах.

Скажем пользователь добавил материал Desk1 с Color Red. Ему нужно запретить добавить материал Desk2 с Color Red. Хорошо бы было если можно было бы отфильтровать непосредственно список выбора, хуже если выдавать сообщение при сохранении, но подойдет любой из вариантов.

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

Комментарии

"<a href="mailto:sas@drupal.org">sas@drupal.org</a>" wrote:
content_access

Спасибо, но по моему мне это не подойдет т.к. этот модуль позволяет задавать права для доступа на этапе конфигурирования, а мне нужно динамически. Пользователь добавил материал с цветом, все еще один с таким цветом он не может добавить только с другим. Удалил материал - добавляй. И так для каждого пользователя у кого есть доступ до материала.

26 апреля 2013 в 18:36

Тогда надо динамически формировать список для селекта, но особо быстро работать не будет, на большом количестве юзверей.

26 апреля 2013 в 22:05

"<a href="mailto:sas@drupal.org">sas@drupal.org</a>" wrote:
Тогда надо динамически формировать список для селекта, но особо быстро работать не будет, на большом количестве юзверей.

Ясно. Спасибо. Буду думать.

26 апреля 2013 в 22:08

"<a href="mailto:sas@drupal.org">sas@drupal.org</a>" wrote:
hook_theme_registry_alter(&$theme_registry) {
...
if(isset($theme_registry['form_element'])){
$theme_registry['form_element']['function'] = 'theme_my_form_element';
}

Алексей, так ведь не будет валидировать потом, если через темизацию селекта чисто убирать лишние..

27 апреля 2013 в 10:19

Спасибо за предложения, буду разбираться.

"<a href="mailto:sas@drupal.org">sas@drupal.org</a>" wrote:
Возможно, надо проверять, а что в селекте валидировать, я там понимаю он только уменьшать список будет?

Да мне достаточно только уменьшить список.

27 апреля 2013 в 11:09

"<a href="mailto:sas@drupal.org">sas@drupal.org</a>" wrote:
а что в селекте валидировать, я там понимаю он только уменьшать список будет

Если только при темизации лишние опции вырезать, то есть возможность послать в post запросе значение (ясное дело не просто из браузера форму сабмитить), которое мы вырезали, но друпал не пикнет даже и сохранит, а вот если на уровне формирования формы (уж простите за тавтологию:)) вырезать лишние опции, то выдаст пользователю ошибку - недопустимое значение и не сохранит.

27 апреля 2013 в 16:53

Да Вы правы, полностью безопасно - hook_field_widget_form_alter или form_alter(), но в некоторых случаях вполне модельной более быстрой Theme.

27 апреля 2013 в 18:48

"<a href="mailto:sas@drupal.org">sas@drupal.org</a>" wrote:
hook_field_widget_form_alter или form_alter()

Я пробовал как-то через form_alter до элементов, создаваемых полями добраться - не получилось..

27 апреля 2013 в 21:59

"gorr" wrote:
не получилось..

Все на месте

<?php
function hook_form_alter(&$form, &$form_state$form_id) {
    
ob_start();
    
print_r($form);
    
$plain ob_get_contents();
    
ob_end_clean();
    
    if (
$handle fopen($_SERVER['DOCUMENT_ROOT'] . base_path() . "tmp/temp_103_{$form_id}_".  microtime() .".txt"'w+')) {
        
fwrite($handle$plain"\n");
        
fclose($handle);
    }
}
?>
27 апреля 2013 в 22:43

Хм, проверил, да, действительно в hook_form_alter все на месте, можно менять, с чем-то другим спутал, прошу прощения за дезинформацию.

27 апреля 2013 в 23:25

Удалось ли как-нибудь решить эту задачу? Может модуль какой отыскали/написали? Сейчас пытаюсь сделать такое же

22 января 2020 в 0:51