Podczas czytania dokumentacji środowiska Ajax natknąłem się na wzmiankę o tej #ajaxwłaściwości. Wiem, po przejrzeniu kodu, że są inne z tych właściwości ze znakami skrótu przed nimi. Co oznacza znak skrótu? Na czym polegają te właściwości?
Podczas czytania dokumentacji środowiska Ajax natknąłem się na wzmiankę o tej #ajaxwłaściwości. Wiem, po przejrzeniu kodu, że są inne z tych właściwości ze znakami skrótu przed nimi. Co oznacza znak skrótu? Na czym polegają te właściwości?
Odpowiedzi:
Ma to ogólnie związek z tablicami renderowania , nie dotyczy tylko AJAX ani interfejsu API formularza (chociaż interfejs API formularza używa tablic renderowania wyłącznie do budowania zawartości).
Mówiąc prościej, klucze tablicy w tablicy renderowania bez znaku #przed nazwą są postrzegane jako dzieci tablicy renderowania, a następnie są renderowane same (rekurencyjnie).
Te z# przed nimi widoczne są jako dane meta / zmiennych dla tablicy nadania do stosowania w miarę potrzeby, i nie są same w sobie renderowane.
Dokumenty tablicy renderowania (powiązane z powyższym) faktycznie przedstawiają to ładnie i zwięźle:
Tablica renderująca to klasyczna tablica strukturalna Drupal, która dostarcza danych (prawdopodobnie zagnieżdżonych) wraz ze wskazówkami, jak powinna być renderowana (właściwości, takie jak #type).
Te #klucze są „wskazówki”, że powyższy akapit mówi, że nie- #klucze są dane zagnieżdżone.
Całkowicie poleciłbym odczytanie tej strony, dobrze odwzorowuje całą tablicę renderowania i podaje przykłady kodu.
Jest też inne małe wyjaśnienie / przykład kodu w dokumentacji Theming the page, które mogą być przydatne.
Tablice renderowania są używane wszędzie w Drupal (formularze, motywy, ogólne znaczniki itp.), Więc wiedza na ich temat bardzo pomoże w przyszłym rozwoju Drupala.
Interfejs API formularza używa znaku # przed wszystkimi właściwościami, aby wprowadzić rozróżnienie między właściwościami a elementami potomnymi. W poniższym kodzie $form['choice_wrapper']['choice']jest elementem potomnym, a $form['choice_wrapper']['#tree']właściwością.
// Add a wrapper for the choices and more button.
$form['choice_wrapper'] = array(
'#tree' => FALSE,
'#weight' => -4,
'#prefix' => '<div class="clearfix" id="poll-choice-wrapper">',
'#suffix' => '</div>',
);
// Container for just the poll choices.
$form['choice_wrapper']['choice'] = array(
'#prefix' => '<div id="poll-choices">',
'#suffix' => '</div>',
'#theme' => 'poll_choices',
);
Wszystkie te właściwości są wymienione w odwołaniu do interfejsu API formularza . Istnieje wiele właściwości, ale wszystkie dotyczą renderowania, sprawdzania poprawności i przesyłania.
Powodem użycia prefiksu dla właściwości jest możliwość szybkiego odfiltrowania właściwości z elementów potomnych, co jest przydatne, gdy trzeba je renderować, na przykład za pomocą drupal_render () , który zawiera następujący kod.
// Get the children of the element, sorted by weight.
$children = element_children($elements, TRUE);
// Initialize this element's #children, unless a #pre_render callback already
// preset #children.
if (!isset($elements['#children'])) {
$elements['#children'] = '';
}
// Call the element's #theme function if it is set. Then any children of the
// element have to be rendered there.
if (isset($elements['#theme'])) {
$elements['#children'] = theme($elements['#theme'], $elements);
}
// If #theme was not set and the element has children, render them now.
// This is the same process as drupal_render_children() but is inlined
// for speed.
if ($elements['#children'] == '') {
foreach ($children as $key) {
$elements['#children'] .= drupal_render($elements[$key]);
}
}
Jeśli spojrzysz na element_children () , zauważysz, że kod do odfiltrowania właściwości jest następujący.
// Filter out properties from the element, leaving only children.
$children = array();
$sortable = FALSE;
foreach ($elements as $key => $value) {
if ($key === '' || $key[0] !== '#') {
$children[$key] = $value;
if (is_array($value) && isset($value['#weight'])) {
$sortable = TRUE;
}
}
}