Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Помогите разобраться в коде


Recommended Posts

Всем привет! 

Помогите, пожалуйста, разобраться с кодом. Сайт с очень сильно перепиленным OpenCart 2.3. 

 

В файле отображения (тот который с расширением tpl) используется вот такой код

 

<?php if ($products) { ?>

Т.е., используется переменная

$product

Но, где она инициализируется? В соответствующем файле контроллера (или мне он кажется соответствующим) я такую переменную не нахожу. Вызов отображения выполняется вот этим кодом

$this->response->setOutput($this->load->view('product/category', $data));

Т.е.,  передаётся переменная

$data

, которая в контроллере инициализируется. Помогите, пожалуйста, понять откуда берётся этот $product и как он связан, если вообще связан, с переменной $data. 

 

Спасибо!

Надіслати
Поділитися на інших сайтах


8 минут назад, Dioksin сказал:

Всем привет! 

Помогите, пожалуйста, разобраться с кодом. Сайт с очень сильно перепиленным OpenCart 2.3. 

 

В файле отображения (тот который с расширением tpl) используется вот такой код

 


<?php if ($products) { ?>

Т.е., используется переменная


$product

Но, где она инициализируется? В соответствующем файле контроллера (или мне он кажется соответствующим) я такую переменную не нахожу. Вызов отображения выполняется вот этим кодом


$this->response->setOutput($this->load->view('product/category', $data));

Т.е.,  передаётся переменная


$data

, которая в контроллере инициализируется. Помогите, пожалуйста, понять откуда берётся этот $product и как он связан, если вообще связан, с переменной $data. 

 

Спасибо!

Вам стоит почитать документацию по работе с tpl, потому что это вообще базовые вещи.

Если коротко - то в data лежит по ключу products массив продуктов - вот он и является переменной products в tpl

  • +1 1
Надіслати
Поділитися на інших сайтах

Спасибо за ответы. Я документацию по работе с tpl почитаю, если подскажете, где её взять. :)

По существу моего вопроса я понял, что делать. Ещё раз спасибо.

Надіслати
Поділитися на інших сайтах


29 минут назад, Dioksin сказал:

Спасибо за ответы. Я документацию по работе с tpl почитаю, если подскажете, где её взять. :)

По существу моего вопроса я понял, что делать. Ещё раз спасибо.

https://yandex.ru/search/?text=tpl&&lr=213

Надіслати
Поділитися на інших сайтах

Ещё вопрос. Вот, что я нашёл в коде

foreach ($results as $result) {

                $filter = array(
                    'product' => $result,
                    'width'   => $this->config->get($this->config->get('config_theme') . '_image_product_width'),
                    'height'  => $this->config->get($this->config->get('config_theme') . '_image_product_height')
                );
				// Это изначальный код, который я переделал
                //$data['products'][] = $this->product->getProduct($filter);
                
				// Ниже мой код. Добавляю к информациии о товаре данные по скидкам
                //Dioksin
                $products = $this->product->getProduct($filter);
                foreach($products as $product){
                    $discounts_data = $this->model_catalog_product->getProductDiscounts($product['product_id']);
                    $discounts = array();
                    foreach ($discounts_data as $discount) {
                        $discounts[] = array(
                        'quantity' => $discount['quantity'],
                        'price'    => $this->currency->format($this->tax->calculate($discount['price'],  $result['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']));
                    }
                    $product['discounts'][] = $discounts;
              }  
              $data['products'][] = $products;
             //End Dioksin
            }

Соответственно в файле отображения, добавляю следующий код

<?php if ($product['price']) { ?>
                    <div class="price-box">
                        <?php if (!$product['special']) { ?>                        
                            <span class="price"><?php echo $product['price']; ?></span>
                            <!-- Добавлен код для вывода информации о скидках-->
                            <?php if ($product['discounts']) { ?>
                                <hr style="margin: 5px 0;">
                                <ul class="list-unstyled">
                                <?php foreach ($product['discounts'] as $discount) { ?>
                                    <li><?php echo $discount['quantity']; ?><?php echo 'за' ?><?php echo $discount['price']; ?></li>
                                <?php } ?>
                                </ul>
                                <hr style="margin: 5px 0;">
                            <?php }?>                             
                               <!--End added by OSA --> 
                        <?php } else { ?>
                            <span class="old-price"><?php echo $product['price']; ?></span>
                            <span class="price"><?php echo $product['special']; ?></span>
                        <?php } ?>
                    </div>
                <?php } ?>

 

Информация о скидках не выводится. Где я ошибся? Спасибо.

Надіслати
Поділитися на інших сайтах


3 часа назад, Shureg сказал:

По вашей ссылке ТС найдет что угодно, только не то, что надо. 

Я конечно не знаю что у вас там отображается, но у меня первые 3 ссылки в поиске прям точное попадание ))))

Надіслати
Поділитися на інших сайтах

3 часа назад, Dioksin сказал:

Ещё вопрос. Вот, что я нашёл в коде


foreach ($results as $result) {

                $filter = array(
                    'product' => $result,
                    'width'   => $this->config->get($this->config->get('config_theme') . '_image_product_width'),
                    'height'  => $this->config->get($this->config->get('config_theme') . '_image_product_height')
                );
				// Это изначальный код, который я переделал
                //$data['products'][] = $this->product->getProduct($filter);
                
				// Ниже мой код. Добавляю к информациии о товаре данные по скидкам
                //Dioksin
                $products = $this->product->getProduct($filter);
                foreach($products as $product){
                    $discounts_data = $this->model_catalog_product->getProductDiscounts($product['product_id']);
                    $discounts = array();
                    foreach ($discounts_data as $discount) {
                        $discounts[] = array(
                        'quantity' => $discount['quantity'],
                        'price'    => $this->currency->format($this->tax->calculate($discount['price'],  $result['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']));
                    }
                    $product['discounts'][] = $discounts;
              }  
              $data['products'][] = $products;
             //End Dioksin
            }

 

 

Информация о скидках не выводится. Где я ошибся? Спасибо.

$product['discounts'][] = $discounts;

такое выражение не добавит данных в исходный массив $products. Оно добавляет данные в переменную $product просто и всё, больше это ничего не делает. Надо либо & в цикле поставить примерно так: foreach ($products as &$product) { либо переписать цикл в нормальном виде с сохранением данных непосредственно в $data['products'][] = $product; внутри цикла.

  • +1 1
Надіслати
Поділитися на інших сайтах

Цитата

$product['discounts'][] = $discounts;

такое выражение не добавит данных в исходный массив $products. Оно добавляет данные в переменную $product просто и всё, больше это ничего не делает. Надо либо & в цикле поставить примерно так: foreach ($products as &$product) { либо переписать цикл в нормальном виде с сохранением данных непосредственно в $data['products'][] = $product; внутри цикла.

Спасибо за ваш ответ. Я правильно понимаю, что в указанном вами месте создаётся локальная копия переменной $product. В силу этого, любые изменения, внесённые в эту переменную, не отображаются на данные, которые хранятся в массиве $products?

Надіслати
Поділитися на інших сайтах


43 минуты назад, OtezVikentiy сказал:

Я конечно не знаю что у вас там отображается, но у меня первые 3 ссылки в поиске прям точное попадание ))))

А вы почитать свое "точное попадание" не пробовали? Узнали бы много интересного. Например, что в opencart шаблон tpl ни разу не такой, как у всех.  С одной стороны, в нем не пройдут вещи вроде {TITLE}, с другой, в нем запросто можно использовать php.
Так что  не то что в трех первых результатах поиска, на трех первых страницах результатов ничего подходящего нет. 
Прежде чем советовать, проверяйте, что советуете.

Надіслати
Поділитися на інших сайтах


34 минуты назад, Dioksin сказал:

Спасибо за ваш ответ. Я правильно понимаю, что в указанном вами месте создаётся локальная копия переменной $product. В силу этого, любые изменения, внесённые в эту переменную, не отображаются на данные, которые хранятся в массиве $products?

foreach без & просто перебирает знгачения массива, не изменяя их

  • +1 1
Надіслати
Поділитися на інших сайтах


9 часов назад, OtezVikentiy сказал:

Вам стоит почитать документацию по работе с tpl, потому что это вообще базовые вещи.

Если коротко - то в data лежит по ключу products массив продуктов - вот он и является переменной products в tpl

 

а причем тут документация по tpl??? функция extract с массива извлекает ключ products и создает из нее переменную

Надіслати
Поділитися на інших сайтах

15 часов назад, Dioksin сказал:

Спасибо за ваш ответ. Я правильно понимаю, что в указанном вами месте создаётся локальная копия переменной $product. В силу этого, любые изменения, внесённые в эту переменную, не отображаются на данные, которые хранятся в массиве $products?

Да, именно так.

foreach ($products as $product) {
   $product['id'] = 1;
}
В результате этого кода массив $products не поменяется.

foreach ($products as $k => $product) {
   $products[$k]['id'] = 1;
}
В результате выполнения этого кода - данные будут сохранены.

foreach ($products as &$product) {
   $product['id'] = 1;
}
Вот этот код тоже должен сохранить данные.

  • +1 1
Надіслати
Поділитися на інших сайтах

15 часов назад, Shureg сказал:

А вы почитать свое "точное попадание" не пробовали? Узнали бы много интересного. Например, что в opencart шаблон tpl ни разу не такой, как у всех.  С одной стороны, в нем не пройдут вещи вроде {TITLE}, с другой, в нем запросто можно использовать php.
Так что  не то что в трех первых результатах поиска, на трех первых страницах результатов ничего подходящего нет. 
Прежде чем советовать, проверяйте, что советуете.

Окей, уели, докопались )))) Согласен, по прямому запросу не прям easy найти сразу инфу, но вектор гугления думаю все равно был понятен. )))

Надіслати
Поділитися на інших сайтах

10 часов назад, Venter сказал:

 

а причем тут документация по tpl??? функция extract с массива извлекает ключ products и создает из нее переменную

При том, что прежде чем чем-то пользоваться - было бы неплохо почитать как оно работает вообще наверное, нет? Реверсинжиниринг по ядру движка это конечно весело, но не для новичка )))) Проще погуглить и почитать как оно работает ))))

Надіслати
Поділитися на інших сайтах

14 часов назад, Shureg сказал:

foreach без & просто перебирает знгачения массива, не изменяя их

Спасибо. Я разобрался. По значению и по ссылке.

 

Спасибо всем за помощь. Оказалось, что мои изменения кода не работают из-за кэширования. :) Почистил кэш и заработало. А я всё думал, что не тот файл правлю. После изменения файлов отображения, изменения на страничке видны, а после внесений изменений в контроллер - ничего не меняется. А виной-то этому - кэш!

Змінено користувачем Dioksin
Надіслати
Поділитися на інших сайтах


7 часов назад, OtezVikentiy сказал:

При том, что прежде чем чем-то пользоваться - было бы неплохо почитать как оно работает вообще наверное, нет? 

 

Ну если так то вообще то для нормальных правок не копипастить надо а понимать что делаешь, так что при таком варианте в первую очередь не по tpl доку читать, а мануал по пхп. А ПОльзоваться опекнкартом можно и без знаний tpl и тд. 

Надіслати
Поділитися на інших сайтах

29 минут назад, Venter сказал:

А ПОльзоваться опекнкартом можно и без знаний tpl и тд. 

О каких таких знаниях, доках по "опенкартовскому" tpl здесь все время говорят. Это, по сути, обычный php файл с возможностью прямого вывода html без всяких дополнительных echo. Чего там специально изучать.

  • +1 1
Надіслати
Поділитися на інших сайтах


1 час назад, Shureg сказал:

О каких таких знаниях, доках по "опенкартовскому" tpl здесь все время говорят. Это, по сути, обычный php файл с возможностью прямого вывода html без всяких дополнительных echo. Чего там специально изучать.

 

спроси за доки у @OtezVikentiy

Надіслати
Поділитися на інших сайтах

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку

×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.