Мне нужно получить доступ к отдельным элементам узла в моем модуле
У меня есть следующий запрос, который извлекает все узлы определенного типа.
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;
}
- Как отобразить в узле страницы такие элементы, как $node-заголовок, $node-тело? Я пробовал как
$render['my_list'][] = node->title
, но, похоже, это не работает. - Мне также нужно добавить форму с кнопкой "Купить" к каждому элементу. Как мне его прикрепить?
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.');
}
Похоже, что это можно сделать с помощью представления, используя список узлов типа представления. Типом отображения должны быть поля, а затем вы выбираете заголовок узла и тизер в качестве полей, а также дополнительное поле, которое необходимо переписать для создания кнопки покупки (в зависимости от того, какое действие должна вызвать кнопка).