Drupal 7 API изменение данных вне формы

Главные вкладки

Аватар пользователя spectra spectra 13 октября 2016 в 22:50

В файле прикреплена часть скрина, где приведена сама идея

Имеется форма

<?phpfunction cart_form($form, &$form_state, $nid){

    $form['#prefix'] = '<div id="cart_form'.$nid.'" class="cart-form">';
    $form['#suffix'] = '</div>';

    $form['count'] = array(
        '#type' => 'textfield', 
        '#default_value' => '1', 
        '#prefix' => '<a class="minus" onclick="var input=jQuery(this).next().children(); var val=parseInt(input.val()); if (val > 1) { input.val(val-1); } return false;">-</a>', 
        '#suffix' => '<a class="plus" onclick="var input=jQuery(this).prev().children(); input.val(parseInt(input.val())+1); return false;">+</a>', 
        '#attributes' => array('size' => 2, 'maxlength' => 3),
    );

    $form['cart'] = array(
        '#type' => 'submit',
        '#value' => t('В корзину'),
        '#attributes' => array('class' => array('submit-cart-form')),
        '#ajax' => array(
            'wrapper' => 'cart_form'.$nid,
            'callback' => 'cart_form_ajax_callback',
        ),    
    );
    
    $form_state['storage']['nid'] = $nid;
    
    return $form;
}?>

С помощью ее с легкостью выводится "Товар добавлен в корзину" или "Ошибка ввода". Вопрос в другом. Корзина, которая располагается вверху экрана, находится далеко за пределами формы. С помощью каких методов можно изменить, а точнее как именно, содержимое блока корзины через код API.

ВложениеРазмер
Иконка изображения question.png130.87 КБ

Лучший ответ

Аватар пользователя spectra spectra 14 октября 2016 в 9:50

LEVEL UP!

Отлично! Учитывая, что сама форма никак не меняется, выкинул function cart_form_submit и валидацию.

В колбеке указал, что нужно и все летает как задумывалось.

<?php
function cart_form_ajax_callback($form$form_state) {
  
    if (
preg_match("|^[\d]*$|"$form['count']['#value'])) {
    
        
$_SESSION['count'] += $form['count']['#value'];
    
        
$price db_select('field_data_field_price')
            ->
fields('field_data_field_price')
            ->
condition('entity_id'$form_state['storage']['nid'])
            ->
execute()
            ->
fetchObject();
        
        
$_SESSION['summa'] += $form['count']['#value'] * $price->field_price_value;
        
        
$commands = array();
        
$commands[] = ajax_command_append('#cart-form''<div class="cart-message">Товар добавлен в корзину</div>');
        
$commands[] = ajax_command_html('#small-cart''<div class="text">
                    <div class="title">Ваш заказ</div>
                    <div class="value"><a href="/">'
.$_SESSION['count'].' позиций</a> на <span class="summ">'.$_SESSION['summa'].' руб.</span></div>
                </div>'
);
    
    } else {
    
        
$commands = array();
        
$commands[] = ajax_command_append('#cart-form''<div class="cart-message error">Введите целое число</div>');
    
    }
    
    return (array(
'#type' => 'ajax''#commands' => $commands));
    
}
?>

Комментарии

Аватар пользователя spectra spectra 14 октября 2016 в 9:50

LEVEL UP!

Отлично! Учитывая, что сама форма никак не меняется, выкинул function cart_form_submit и валидацию.

В колбеке указал, что нужно и все летает как задумывалось.

<?php
function cart_form_ajax_callback($form$form_state) {
  
    if (
preg_match("|^[\d]*$|"$form['count']['#value'])) {
    
        
$_SESSION['count'] += $form['count']['#value'];
    
        
$price db_select('field_data_field_price')
            ->
fields('field_data_field_price')
            ->
condition('entity_id'$form_state['storage']['nid'])
            ->
execute()
            ->
fetchObject();
        
        
$_SESSION['summa'] += $form['count']['#value'] * $price->field_price_value;
        
        
$commands = array();
        
$commands[] = ajax_command_append('#cart-form''<div class="cart-message">Товар добавлен в корзину</div>');
        
$commands[] = ajax_command_html('#small-cart''<div class="text">
                    <div class="title">Ваш заказ</div>
                    <div class="value"><a href="/">'
.$_SESSION['count'].' позиций</a> на <span class="summ">'.$_SESSION['summa'].' руб.</span></div>
                </div>'
);
    
    } else {
    
        
$commands = array();
        
$commands[] = ajax_command_append('#cart-form''<div class="cart-message error">Введите целое число</div>');
    
    }
    
    return (array(
'#type' => 'ajax''#commands' => $commands));
    
}
?>