Получение идентификатора от продукта до и после

#php #opencart

#php #opencart

Вопрос:

Я пытаюсь получить идентификаторы от продуктов до и после продукта, который я сейчас ищу, и поэтому я могу получить информацию из этих продуктов и создать кнопки следующего продукта и предыдущего продукта

Я работаю над Opencart версии 2.3.0.2

Это все в product.php контроллер все это находится в строке 277, после данных[‘product_id’] Я добавил свой код

         $data['product_id'] = (int)$this->request->get['product_id'];

        $results = $this->model_catalog_product->getProduct($data['product_id']);

        foreach ($results as $result) {
            if ($result['product_id'] < $data['product_id']){
                $data['product_before_id'] = $result['product_id'];
            } else {
                $data['product_before_id'] = 0;
            }

            if ($result['product_id'] > $data['product_id']){
                $data['product_after_id'] = $result['product_id'];
            } else {
                $data['product_after_id'] = 0;
            }

        }
  

Я пытался получить его, но получил недопустимое смещение строки

Измененный ответ

         $next_product = $this->model_catalog_product->getProduct($product_id   1);
        while($next_product === false){
            $product_id = $product_id   1;
            $next_product = $this->model_catalog_product->getProduct($product_id);
        }

        $previous_product = $this->model_catalog_product->getProduct($product_id - 1);
        while($previous_product === false){
            $product_id = $product_id - 1;
            $previous_product = $this->model_catalog_product->getProduct($product_id);
        }


        if ($previous_product !== false) {
            if ($previous_product['product_id'] == $data['product_id']) {
                $data['product_before_id'] = 0;
            } else {
                $data['product_before_id'] = $previous_product['product_id'];
            }
        } else {
            $data['product_before_id'] = 0;
        }

        if ($next_product !== false) {
            if ($next_product['product_id'] == $data['product_id']) {
                $data['product_after_id'] = 0;
            } else {
                $data['product_after_id'] = $next_product['product_id'];
            }
        } else {
            $data['product_after_id'] = 0;
        }
  

Комментарии:

1. Увеличьте или уменьшите текущий идентификатор на 1 и используйте запрос get, чтобы проверить, существует ли идентификатор, продолжайте уменьшать или увеличивать, пока не найдете действительный идентификатор. Вы можете опубликовать запрос модели для лучшего понимания вашего запроса

2. Пожалуйста, предоставьте больше информации, например, в каком файле вы работаете. Основываясь на небольшой информации, которую вы предоставили, я предполагаю, что $data['product_id'] она не существует, когда вы передаете ее в свою функцию модели, или $result['product_id'] не существует. Недопустимое смещение строки возникает, когда ассоциативный массив в PHP не имеет элемента с указанным строковым ключом

3. Я отредактировал его с дополнительной информацией

Ответ №1:

Написанный вами код изначально некорректен. getProduct Функция извлекает информацию об одном продукте, а не обо всех продуктах.

В зависимости от того, что вы хотели бы сделать, я бы просто получил идентификатор продукта текущей страницы, а затем проверил идентификаторы по обе стороны от него. Итак, если идентификатор продукта равен 4, проверьте, существуют ли оба идентификатора продукта 3 и 5.

Этого можно достичь, просто запустив getProduct функцию для них обоих, потому что, если аргумент идентификатора продукта не существует в базе данных, функция просто вернет false .

Пример:

 $product_id = (int)$this->request->get['product_id'];

$previous_product_id = $this->model_catalog_product->getProduct($product_id - 1);
$next_product_id = $this->model_catalog_product->getProduct($product_id   1);

if ($previous_product_id !== false) {
    $data['product_before_id'] = $previous_product_id;
} else {
    $data['product_before_id'] = 0;
}

if ($next_product_id !== false) {
    $data['product_after_id'] = $next_product_id;
} else {
    $data['product_after_id'] = 0;
}
  

Убедитесь, что вы используете !== оператор, а не != оператор, поскольку !== проверяет, что тип на самом деле является логическим, и, следовательно, значение false указывает, что продукт не существует для предоставленного идентификатора продукта.

Этот ответ применим только к получению предыдущего и следующего продукта. Для получения полного набора всех продуктов, заказанных по их идентификаторам, потребуется совершенно другой ответ.

Комментарии:

1. Немного изменил его, если между ними есть пустое пространство, поэтому я получаю следующий реальный идентификатор продукта, отредактированный в моем вопросе

Ответ №2:

Чтобы получить предыдущий идентификатор:

Создайте новую функцию в своей модели, которая извлекает предыдущий идентификатор и следующий идентификатор, используя текущий идентификатор:

 function  nextId($currentId) {
   //Replace MyTable with the name of your table
   $q= "SELECT ID FROM MyTable WHERE id >= $currentId ORDER BY id ASC LIMIT 1";
}

function  prevId($currentId) {
   //Replace MyTable with the name of your table
   $q= "SELECT id FROM MyTable WHERE id <= $currentId ORDER BY id DESC LIMIT 1";

}
  

Выше приведен запрос, который будет использоваться .
Теперь запустите запрос, используя предпочитаемую библиотеку базы данных, и верните результат.

Это должно сделать это