Jak ukryć i / lub uniemożliwić dostęp do pól w formularzu, takim jak grupa_odbiorów dla grup organicznych

9

Przez jakiś czas mnie to niepokoiło. Kiedy próbuję ukryć pola takie jak pole grupy odbiorców lub ustawienie publikowania przed formularzem, po sprawdzeniu poprawności zestaw obu pól ma wartość zerową, mimo że wartość defaut jako został poprawnie zadeklarowany.

Próbowałem użyć Invisible, #access, rozbroić ukryte, nic nie działa! Jest to bardzo kłopotliwe, ponieważ w moim obecnym projekcie użytkownicy mogą edytować tylko małe fragmenty swojego profilu w danym momencie, na przykład tylko adres lub zdjęcie, więc jeśli ukryję grupę odbiorców, użytkownik zostanie wyrzucony z grup, do których należy edytować.

Skończyło się na użyciu poniższego kodu, aby ukryć te pola, jednocześnie utrzymując użytkownika w grupie.

$variables['user_edit_about']['group_audience']= $temp['group_audience'];       
$variables['user_edit_about']['group_audience']['#prefix'] = '<div style="display:none;">';
$variables['user_edit_about']['group_audience']['#suffix'] = '</div>';

Czy ktoś pomyślałby o lepszym sposobie osiągnięcia tego?

Dzięki

silkAdmin
źródło
Ta odpowiedź nie jest idealna, ponieważ użycie wciąż może zmienić wartość za pomocą manipulacji DOM
iStryker

Odpowiedzi:

6

Edytować:

Ok, rozgryzłem to. Umieść to w swoim module niestandardowym:

function example_form_alter(&$form, &$form_state, $form_id) {
    if($form_id == 'story_node_form') {
        $form['title']['#value'] = 'hot stuff';
        $form['title']['#access'] = FALSE;

    }
}

Spowoduje to ustawienie tytułu węzła opowieści na „gorące rzeczy” i NIE będzie renderowane na stronie, ponieważ #access = FALSE;

Możesz dodać więcej kontroli ziarnistości wewnątrz hook_form_alter () jak

  global $user;

  // Check to see if $user has does not have the administrator role.
  if (!in_array('administrator', array_values($user->roles))) {
    $form['title']['#access'] = FALSE;
  }

Działa to dla Drupal 6 i 7.

Stara odpowiedź (zignoruj):

Minęło trochę czasu, odkąd zrobiłem coś takiego, więc mogę się mylić. Jeśli ustawisz [#value]element formularza, nie będzie on widoczny w formularzu.

Zrobiłem to w Drupal 6, hook_form_alter()w module niestandardowym. Nie wiem, czy to zadziała w Drupal 7 i nie wiem, czy możesz to zrobić w funkcji przetwarzania wstępnego

iStryker
źródło
Dziękuję za odpowiedź, chociaż niestety w moim przypadku nie zadziałało, pola formularza mają już # wartość wstępnie wypełnione, ponieważ są formularzami edycji
silkAdmin
@silkAdmin Proszę zobaczyć nowe zmiany
iStryker
Dzięki Strykerowi za poświęcenie czasu na obejrzenie tego, choć powyższa technika działa ukryć pola, wydaje się, że domyślna wartość nie jest brana pod uwagę podczas przesyłania. Tak więc kończę z tym, że użytkownik jest ciągle wyrzucany ze swojej grupy przy każdej edycji profilu. Jak dotąd tylko sztuczka #prefiks # wydaje się sprawiać, że zachowuje się normalnie.
silkAdmin
do $ form ['title'] ['# value'] = $ form ['title'] ['# default_value']
iStryker
5

Możesz także dodać klasę CSS „ukrytą pod elementem” do elementu formularza

$form['user_edit_about']['group_audience']['#attributes']['class'][] = 'element-hidden';

Jak wspomniano wcześniej iStryker, nadal można zmienić wartość za pomocą manipulacji DOM. Jest to jednak przyjemny i łatwy sposób na ukrycie pola formularza (lub dowolnego innego elementu renderowania). element-hiddenKlasa jest zdefiniowana w system.base.css.

Chaulky
źródło
Kolego, uratowałeś mnie. Dzięki. Wszystkie inne metody, które widziałem, nie wyświetlają elementów w samym formularzu. W moim przypadku chcę ukryć elementy formularza w module contrib, który oczekuje, że te elementy będą w formie, w przeciwnym razie nie będzie działać poprawnie. Twoja poprawka CSS ukrywa niepożądane elementy, ale wszystko nadal działa. Dziękujemy również za zauważenie, że nie jest to „odporne na hakerów” i działa tylko wtedy, gdy wszystko, czego potrzebujesz, to uproszczenie interfejsu prezentowanego zaufanym użytkownikom edytora.
Mario Awad,