div에 두 개의 렌더 배열 요소를 어떻게 래핑합니까?


12

이 렌더링 가능 배열이 주어지면 :

$output = array(
    'twitter-icon' => array(
      '#type' => 'markup',
      '#markup' => '<div class="twitter-icon"></div>'
    ),
    'twitter-link' => array(
      '#type' => 'markup',
      '#markup' => l('follow us on Twitter', 'https://twitter.com/#!/zujava'),
    ), 
  );

이 두 요소를 하나의 DIV로 어떻게 포장합니까?

답변:


29

#containerform 요소와 다음 코드와 유사한 코드를 사용할 수도 있습니다 .

$wrapper = array(
  '#type' => 'container',
  '#attributes' => array(
    'class' => array('class-name'),
  ),
);

$wrapper['twitter-icon'] => array(
  '#type' => 'markup',
  '#markup' => '<div class="twitter-icon"></div>'
);

$wrapper['twitter-link'] => array(
  '#type' => 'markup',
  '#markup' => l(t('follow us on Twitter'), 'https://twitter.com/#!/zujava'),
); 

#container의 요소는와 그 자식 요소를 래핑 <div>CSS 클래스에 전달 된 하나입니다 태그, #attributes속성을.

"twitter-icon"요소에 컨테이너를 사용할 수도 있지만 다음 코드와 같이 요소를 추가 할 수있는 경우를 제외하고는 아무런 이점이 없습니다.

$wrapper = array(
  '#type' => 'container',
  '#attributes' => array(
    'class' => array('class-name'),
  ),
);

$wrapper['twitter-icon'] => array(
  '#type' => 'container',
  '#attributes' => array(
    'class' => array('twitter-icon'),
  ),
);

if ($condition) {
  $wrapper['twitter-icon']['twitter-icon-text'] => array(
    '#type' => 'markup',
    '#markup' => t('Icon text'),
  );
}

$wrapper['twitter-link'] => array(
  '#type' => 'markup',
  '#markup' => l(t('follow us on Twitter'), 'https://twitter.com/#!/zujava'),
); 

나에게 이것은 실제 배열 구조를 사용하여 감싸고있는 것을 표현하고 더 잘 복사하여 붙여 넣을 것입니다 (@ninjascorner 응답의 요소를 이동하면 시작 / 닫는 DIV가 깨질 수 있음). 추가가 필요하지 않으므로 가장 좋은 대답입니다. 테마 기능. 감사!
저스틴

맞습니다. #suffix마지막 요소의 #prefix속성 이나 첫 번째 요소 의 속성을 새로 추가 된 요소로 이동하지 않고 동일한 컨테이너에 렌더링되는 다른 요소를 추가 할 수 있습니다 . 당신이 말했듯이, 이것은 덜 오류가 발생하기 쉽습니다.
kiamlaluno

6

이것이 당신이 찾고있는 것입니까?

$output = array(
    'twitter-icon' => array(
      '#type' => 'markup',
      '#markup' => '<div class="twitter-icon"></div>'
      '#prefix' => '<div class="test">',
    ),
    'twitter-link' => array(
      '#type' => 'markup',
      '#markup' => l('follow us on Twitter', 'https://twitter.com/#!/fdgf'),
      '#suffix' => '</div>',
    ), 
);

희망이 도움이됩니다!


@nija + 1ed, 그 대답을 잊어 버린 위대한 대답. 내 답변을 읽으십시오. 접미사와 접두사에 대한 테마 기반 대안을 통해이를 달성 할 수 있습니까?
stefgosselin

@stefgosselin, 테마로 tpl 파일을 만들고 싶습니까?
ninjascorner

이 답변에 감사드립니다. 한 요소 에서이 작업을 수행하는 방법을 알고 있었지만 접미사와 접두사를 나누지 못했습니다. 흥미 롭군 그것은 나에게 지저분하게 느껴지지만, 왜 그런지 분명히 말할 수 없으므로 실제로 문제가 없습니다.
저스틴

@ninjascorner 지연해서 죄송합니다.이 주제에 관한 메모를 찾을 수 없습니다. 테마 후크를 사용하는 테마 또는 모듈에서 사용할 수있는 다른 답변보다 우아하지 않은 방법도 있습니다. api.drupal.org/api/examples/…theme_render_example_add_div 참조 )
stefgosselin

두 요소가 항상 렌더링되도록 확신하는 경우에만 유용합니다. 이와 같이 분할하면 닫히지 않은 <div>로 끝나기가 쉽습니다.
kufeiko 2016 년

2

이것에 대한 테마를 만들 수도 있습니다.

$form['twitter']['#theme'] = 'my_twitter_theme';

$form['twitter']['icon'] = array(
'twitter-icon' => array(
  '#type' => 'markup',
  '#markup' => '<div class="twitter-icon"></div>'
);

$form['twitter']['link'] = array(
  '#type' => 'markup',
  '#markup' => l('follow us on Twitter', 'https://twitter.com/#!/zujava'),
);

그리고 당신의 테마 훅에서 :

function my_hook_theme(){
  return array(
    'my_twitter_theme' => array('form' => NULL)
  );
} 

그리고 테마 기능에서 :

function theme_my_twitter_theme($form){
  $output = "";

  $output .= "<div class=\"twitter\">";
  $output .= drupal_render($form['icon']);
  $output .= drupal_render($form['link']);
  $output .= "</div>";    

  $output .= drupal_render($form);
  return $output;
}

Drupal 6에서 이것을 사용합니다 .D7에서도 작동하는지 확실하지 않지만 그렇게 희망합니다


예, 게시 후이 방법을 알아 냈습니다 (예, 예제 모듈을 복사합니다). 그것은 잘 작동하지만 (올바르게 이해한다면) 클래스 이름을 함수에 넣어야하고 재사용 성을 줄이기 때문에 최선의 방법이라고 생각하지 않습니다.
저스틴
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.