За последние 24 часа нас посетил 21951 программист и 1103 робота. Сейчас ищут 725 программистов ...

Передать POST запрос.

Тема в разделе "PHP для новичков", создана пользователем mario512, 7 окт 2018.

Метки:
  1. mario512

    mario512 Активный пользователь

    С нами с:
    4 фев 2018
    Сообщения:
    27
    Симпатии:
    1
    Добрый день. В корне сайта есть файл, который по задумке должен принимать GET запрос, в котором в качестве параметра указал id товара, и формировать POST запрос на добавления товара в корзину.

    Код файла:
    PHP:
    1. <?php
    2. $product_id = $_GET[product_id];
    3. $url = 'index.php?route=checkout/cart/add';
    4.     'http' => [
    5.         'method' => 'POST',
    6.         'content' => http_build_query([
    7.             'product_id' => $product_id,
    8.            
    9.         ])
    10.     ]
    11. ]);
    12. echo file_get_contents($url, false, $context);
    13. ?>
    Целый день пытаюсь реализовать идею. Подскажите, почему не работает?
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    PHP:
    1. <?php
    2.  
    3. error_reporting ( E_ALL );
     
  3. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    @mario512, если пытаться вырвать гланды через задницу, найти помощников будет трудно.
     
  4. mario512

    mario512 Активный пользователь

    С нами с:
    4 фев 2018
    Сообщения:
    27
    Симпатии:
    1
    @miketomlin Больше на ум ничего не приходит((
     
  5. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Что хотите сделать? Зачем вам промежуточное звено в виде GET-обработчика? Или лишний хвост в виде POST-обработчика?
     
  6. mario512

    mario512 Активный пользователь

    С нами с:
    4 фев 2018
    Сообщения:
    27
    Симпатии:
    1
    @miketomlin Затеял это для того что-бы из amp страницы добавить товар в корзину. amp не любят onclick на кнопках. Вот и пришла в голову эта идея. Передать айди товара в файл в виде get а он сформирует post. Вот фрагмент файла, который принимает пост запрос:
    PHP:
    1.     public function add() {
    2.         $this->load->language('checkout/cart');
    3.  
    4.         $json = array();
    5.  
    6.         if (isset($this->request->post['product_id'])) {
    7.             $product_id = (int)$this->request->post['product_id'];
    8.         } else {
    9.             $product_id = 0;
    10.         }
    11.  
    12.         $this->load->model('catalog/product');
    13.  
    14.         $product_info = $this->model_catalog_product->getProduct($product_id);
    15.  
    16.         if ($product_info) {
    17.             if (isset($this->request->post['quantity']) && ((int)$this->request->post['quantity'] >= $product_info['minimum'])) {
    18.                 $quantity = (int)$this->request->post['quantity'];
    19.             } else {
    20.                 $quantity = $product_info['minimum'] ? $product_info['minimum'] : 1;
    21.             }
    22.  
    23.             if (isset($this->request->post['option'])) {
    24.                 $option = array_filter($this->request->post['option']);
    25.             } else {
    26.                 $option = array();
    27.             }
    28.  
    29.             $product_options = $this->model_catalog_product->getProductOptions($this->request->post['product_id']);
    30.  
    31.             foreach ($product_options as $product_option) {
    32.                 if ($product_option['required'] && empty($option[$product_option['product_option_id']])) {
    33.                     $json['error']['option'][$product_option['product_option_id']] = sprintf($this->language->get('error_required'), $product_option['name']);
    34.                 }
    35.             }
    36.  
    37.             if (isset($this->request->post['recurring_id'])) {
    38.                 $recurring_id = $this->request->post['recurring_id'];
    39.             } else {
    40.                 $recurring_id = 0;
    41.             }
    42.  
    43.             $recurrings = $this->model_catalog_product->getProfiles($product_info['product_id']);
    44.  
    45.             if ($recurrings) {
    46.                 $recurring_ids = array();
    47.  
    48.                 foreach ($recurrings as $recurring) {
    49.                     $recurring_ids[] = $recurring['recurring_id'];
    50.                 }
    51.  
    52.                 if (!in_array($recurring_id, $recurring_ids)) {
    53.                     $json['error']['recurring'] = $this->language->get('error_recurring_required');
    54.                 }
    55.             }
    56.  
    57.             if (!$json) {
    58.                 $this->cart->add($this->request->post['product_id'], $quantity, $option, $recurring_id);
    59.  
    60.                 $json['success'] = sprintf($this->language->get('text_success'), $this->url->link('product/product', 'product_id=' . $this->request->post['product_id']), $product_info['name'], $this->url->link('checkout/cart'));
    61.  
    62.                 // Unset all shipping and payment methods
    63.                 unset($this->session->data['shipping_method']);
    64.                 unset($this->session->data['shipping_methods']);
    65.                 unset($this->session->data['payment_method']);
    66.                 unset($this->session->data['payment_methods']);
    67.  
    68.                 // Totals
    69.                 $this->load->model('extension/extension');
    70.  
    71.                 $totals = array();
    72.                 $taxes = $this->cart->getTaxes();
    73.                 $total = 0;
    74.        
    75.                 // Because __call can not keep var references so we put them into an array.            
    76.                 $total_data = array(
    77.                     'totals' => &$totals,
    78.                     'taxes'  => &$taxes,
    79.                     'total'  => &$total
    80.                 );
    81.  
    82.                 // Display prices
    83.                 if ($this->customer->isLogged() || !$this->config->get('config_customer_price')) {
    84.                     $sort_order = array();
    85.  
    86.                     $results = $this->model_extension_extension->getExtensions('total');
    87.  
    88.                     foreach ($results as $key => $value) {
    89.                         $sort_order[$key] = $this->config->get($value['code'] . '_sort_order');
    90.                     }
    91.  
    92.                     array_multisort($sort_order, SORT_ASC, $results);
    93.  
    94.                     foreach ($results as $result) {
    95.                         if ($this->config->get($result['code'] . '_status')) {
    96.                             $this->load->model('extension/total/' . $result['code']);
    97.  
    98.                             // We have to put the totals in an array so that they pass by reference.
    99.                             $this->{'model_extension_total_' . $result['code']}->getTotal($total_data);
    100.                         }
    101.                     }
    102.  
    103.                     $sort_order = array();
    104.  
    105.                     foreach ($totals as $key => $value) {
    106.                         $sort_order[$key] = $value['sort_order'];
    107.                     }
    108.  
    109.                     array_multisort($sort_order, SORT_ASC, $totals);
    110.                 }
    111.  
    112.                 $json['total'] = sprintf($this->language->get('text_items'), $this->cart->countProducts() + (isset($this->session->data['vouchers']) ? count($this->session->data['vouchers']) : 0), $this->currency->format($total, $this->session->data['currency']));
    113.             } else {
    114.                 $json['redirect'] = str_replace('&amp;', '&', $this->url->link('product/product', 'product_id=' . $this->request->post['product_id']));
    115.             }
    116.         }
    117.  
    118.         $this->response->addHeader('Content-Type: application/json');
    119.         $this->response->setOutput(json_encode($json));
    120.     }
     
  7. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Обычного GET-обработчика достаточно. Это норма дублировать AJAX и т.п. обычными обработчиками, правда для добавления в корзину чаще используется POST, но вы можете в качестве эксперимента использовать GET, по тому же адресу или по др., как пытаетесь это сделать сейчас.
    --- Добавлено ---
    Т.е. тело обработчика будет тем же самым. Вы можете использовать для разделения «алиасы», выполняя отличающиеся действия по условию с именем алиаса, либо из двух разных обработчиков вызывать «основное тело».
     
    mario512 нравится это.
  8. mario512

    mario512 Активный пользователь

    С нами с:
    4 фев 2018
    Сообщения:
    27
    Симпатии:
    1
    @miketomlin Ничего не понятно!))) Можно немного разжевачки?))
     
  9. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Выполняйте аналогичный код и по GET-запросу. Чтобы не дублировать код физически, используйте подпрограммы и т.п. Использовать в данном случае «вложенный» HTTP-запрос – это тот еще костыль. Вынужден это сказать, хотя обычно отношусь к выкладываемому другими коду не столь критично. В общем без обид.