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

Аватар пользователя samodelkin samodelkin 26 апреля 2013 в 11:48

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

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

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

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

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

Комментарии

Аватар пользователя sas@drupal.org sas@drupal.org 26 апреля 2013 в 12:03

В сторону прав доступа в списку выбора - если например список это термины - но tac, если материалы - то content_access

Аватар пользователя samodelkin samodelkin 26 апреля 2013 в 18:36

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

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

Аватар пользователя sas@drupal.org sas@drupal.org 26 апреля 2013 в 22:05

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

Аватар пользователя samodelkin samodelkin 26 апреля 2013 в 22:08

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

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

Аватар пользователя sas@drupal.org sas@drupal.org 27 апреля 2013 в 10:01

hook_theme_registry_alter(&$theme_registry) {
...
if(isset($theme_registry['form_element'])){
$theme_registry['form_element']['function'] = 'theme_my_form_element';
}
...

Аватар пользователя gorr gorr 27 апреля 2013 в 10:19

"<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';
}

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

Аватар пользователя sas@drupal.org sas@drupal.org 27 апреля 2013 в 10:33

Возможно, надо проверять, а что в селекте валидировать, я там понимаю он только уменьшать список будет?

Аватар пользователя samodelkin samodelkin 27 апреля 2013 в 11:09

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

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

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

Аватар пользователя gorr gorr 27 апреля 2013 в 16:53

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

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

Аватар пользователя sas@drupal.org sas@drupal.org 27 апреля 2013 в 18:48

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

Аватар пользователя gorr gorr 27 апреля 2013 в 21:59

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

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

Аватар пользователя sas@drupal.org sas@drupal.org 27 апреля 2013 в 22:43

"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);
    }
}
?>
Аватар пользователя gorr gorr 27 апреля 2013 в 23:25

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

Аватар пользователя shevgeny shevgeny 22 января в 0:51

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