Мне нужно получить доступ к отдельным элементам узла в моем модуле


У меня есть следующий запрос, который извлекает все узлы определенного типа.

function shop_home_page() {
  $render = array();  
  $sql = 'SELECT nid FROM {node} n WHERE n.type = :type AND n.status = :status';
  $result = db_query($sql,
    array(
      ':type' => 'music_albums',
      ':status' => 1,
    )
  );

  foreach ($result as $row) {
    $node = node_load($row->nid);
    $render['my_list'][] = node_view($node, 'teaser');       
   }     
  return $render;
}
  1. Как отобразить в узле страницы такие элементы, как $node-заголовок, $node-тело? Я пробовал как $render['my_list'][] = node->title, но, похоже, это не работает.
  2. Мне также нужно добавить форму с кнопкой "Купить" к каждому элементу. Как мне его прикрепить?
 1
Author: kiamlaluno, 2012-01-17

2 answers

1) Вы можете использовать код, подобный следующему:

$render['my_list'][] = array('#markup' => '<div>'.$node->title.'</div>');
$render['my_list'][] = array('#markup' => $node->body['und'][0]['value']);

2) Формы могут быть добавлены аналогично node_view():

$render['my_list'][] = drupal_get_form('mymodule_buy_form_'.$node->nid, $node->nid);

Я предполагаю, что вы хотите, чтобы формы, созданные с помощью одной функции, но с разными идентификаторами, работали правильно (для этого прилагается $node->nid). Я также добавил дополнительный аргумент ($node->nid), так как вы можете добавить его в каждую форму в скрытом поле, чтобы определить, какая форма была отправлена. Затем вы используете hook_forms(), чтобы получить одну и ту же функцию компоновщика, вызываемую для всех формы покупки:

function mymodule_forms($form_id, $args) {
  $forms = array();
  if (strpos($form_id, 'mymodule_buy_form_') === 0) {
    $forms[$form_id] = array(
      'callback' => 'mymodule_buy_form',
    );
  }
  return $forms;
}

Функция построения форм для этого примера:

function mymodule_buy_form($form, &$form_state, $nid) {
  $form = array();
  $form['nid'] = array(
    '#type' => 'hidden',
    '#value' => $nid,
  );
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Submit'),
  );
  return $form;
}

И обработчик отправки:

function mymodule_buy_form_submit($form, &$form_state) {
  drupal_set_message('Form for node '.$form_state['values']['nid'].' submitted.');
}
 1
Author: Madis, 2012-01-22 13:53:45

Похоже, что это можно сделать с помощью представления, используя список узлов типа представления. Типом отображения должны быть поля, а затем вы выбираете заголовок узла и тизер в качестве полей, а также дополнительное поле, которое необходимо переписать для создания кнопки покупки (в зависимости от того, какое действие должна вызвать кнопка).

 0
Author: Paul, 2012-01-17 10:12:09