Цитата:
Нашёл шаблон: `catalog/view/theme/soniya-shop/template/extension/module/featured.twig` Туплю жестоко. Думал взять опенкарт нахрапом, ан не получается. Надо сначала почитать что-то типа этого http://forum.opencart-russia.ru/thre...botchika.6107/ А то как слепой котёнок там брожу в нём наугад. |
Цитата:
|
Нужно вывести `select` во всех товарах в разделе Рекомендуем на главной странице.
1. Беру за основу для копирования кода контроллер `mysite\catalog\controller\product/product.php` (1.1) и шаблон к нему `mysite/catalog/view/theme/mysite/template/product/product.twig` (1.2) 2. Открываю контроллер нужного модуля `mysite/catalog/controller/extension/module/featured.php` (2.1) и шаблон к нему `mysite/catalog/view/theme/mysite/template/extension/module/featured.twig` (2.2) 3. Копирую в цикл файла 2.1, перебирающий товары, кусок кода из 1.1, отвечающий за этот option. Меняю `foreach ($this->model_catalog_product->getProductOptions($this->request->get['product_id']) as $option) {...}` на `foreach ($this->model_catalog_product->getProductOptions($product_id) as $option) {...}` Вот этот кусок: $data['options'] = array(); foreach ($this->model_catalog_product->getProductOptions($product_id) as $option) { $product_option_value_data = array(); foreach ($option['product_option_value'] as $option_value) { if (!$option_value['subtract'] || ($option_value['quantity'] > 0)) { if ((($this->config->get('config_customer_price') && $this->customer->isLogged()) || !$this->config->get('config_customer_price')) && (float)$option_value['price']) { $price = $this->currency->format($this->tax->calculate($option_value['price'], $product_info['tax_class_id'], $this->config->get('config_tax') ? 'P' : false), $this->session->data['currency']); } else { $price = false; } $product_option_value_data[] = array( 'product_option_value_id' => $option_value['product_option_value_id'], 'option_value_id' => $option_value['option_value_id'], 'name' => $option_value['name'], 'image' => $this->model_tool_image->resize($option_value['image'], 50, 50), 'price' => $price, 'price_prefix' => $option_value['price_prefix'] ); } } $data['options'][] = array( 'product_option_id' => $option['product_option_id'], 'product_option_value' => $product_option_value_data, 'option_id' => $option['option_id'], 'name' => $option['name'], 'type' => $option['type'], 'value' => $option['value'], 'required' => $option['required'] ); } Далее копирую из шаблона 1.2 в шаблон 2.2 следующее: {% if options %} {% for option in options %} {% if option.type == 'select' %} <div class="form-group{% if option.required %} required {% endif %}"> <label class="control-label" for="input-option{{ option.product_option_id }}">{{ option.name }}</label> <select name="option[{{ option.product_option_id }}]" id="input-option{{ option.product_option_id }}" class="form-control"> <option value="">{{ text_select }}</option> {% for option_value in option.product_option_value %} <option value="{{ option_value.product_option_value_id }}">{{ option_value.name }} {% if option_value.price %} ({{ option_value.price_prefix }}{{ option_value.price }}) {% endif %} </option> {% endfor %} </select> </div> {% endif %} В результате в шаблон передаётся массив данных последнего товара в цикле и всем товарам прописывыется этот селект. Сделал проверку print_r($data); Да, так и есть. Т.о. придётся городить многомерные массивы на PHP, чтобы в product_id запихать ещё и соответствующий ему опшен? По сути уже в модуль лезу и это настораживает. В ту ли сторону я вообще начал ковырять? Или есть что-то уже написанное и не нужно вовсе лезть в эти дебри? |
Ну вот я перебрал только что в массиве массива в контроллере все опшенсы, затем засунул их как массив $options в массив $data. Получилось вот так:
Array ( [products] => Array ( [3] => Array ( [product_id] => 30 [thumb] => https://mysite/image/cache/catalog/demo/canon_eos_5d_1-200x200.jpg [name] => Canon EOS 5D [model] => Product 3 [description] => Canon's press material for the EOS 5D states that it 'defines (a) new D-SLR category', while we'r.. [price] => 50.00р. [special] => 80.00р. [tax] => [rating] => [options] => Array ( [product_option_id] => 226 [product_option_value] => Array ( [0] => Array ( [product_option_value_id] => 15 [option_value_id] => 39 [name] => Red [image] => [price] => [price_prefix] => + ) [1] => Array ( [product_option_value_id] => 17 [option_value_id] => 41 [name] => Green [image] => [price] => 10.00р. [price_prefix] => + ) [2] => Array ( [product_option_value_id] => 16 [option_value_id] => 42 [name] => Yellow [image] => [price] => 50.00р. [price_prefix] => + ) ) [option_id] => 5 [name] => Select [type] => select [value] => [required] => 1 ) [href] => https://soniya-shop/index.php?route=product/product&product_id=30 ) ) ) Далее в шаблоне в цикле по массиву `products` обращаюсь к массиву options вот так: {% for product in products %} {% if product.options %} {% for option in product.options %} {% if option.type == 'select' %} ... Ошибок нет, но нифига не работает. |
Цитата:
|
{% for product in products %}
{% if product.options %} как, если [products] => Array ( [3] => Array ? На чем тренировки производятся, на удаленном сервере? Ставьте локальный сервер и тренируйтесь на нем, делая вывод в браузер данных дабы проверить себя, и прочее, что на реальном сервере конечно же делать не стоит. Для изучения twig можно создать виртуальный хост только из него. |
Цитата:
{% for product in products %} Все эти {{ product.name }} и прочие в шаблоне выводятся, но когда дело доходит до того, чтобы пролистать вложенный в products массив options, то ничего не получается. Цитата:
|
Цитата:
$arr = [ 3 => [ 12, 45 ] ]; цикл for выведет Array. И только {% for itm in arr[3] %} отобразит его содержимое. Так что либо цикл в цикле, либо готовить структуру необходимую перед передачей в шаблон. |
Триви, просто проверяйте тип:
{% for product in products %} {% if product is iterable %} {% for item in product %} {{ item }} {% endfor %} {% else %} {{ product }} {% endif %} {% endfor %} Если охота проверять ключи, то конечно не таким образом if item.name, ибо это проверка его значения на true/false. Непосредственно перебрать ключи/значения вы не сможете так как у вас массив вложенный, а если его структура будет такой (сокращено): $arr = [ 'product_id' => 30, 'thumb' => 'https://mysite/image/cache/catalog/demo/canon_eos_5d_1-200x200.jpg', 'name' => 'Canon EOS 5D', 'model' => 'Product 3', 'description' => 'Canon press material for the EOS 5D', 'price' => '50.00р', 'special' => '80.00р', 'options' => [ 'product_option_id' => 226, 'product_option_value' => [ [ 'product_option_value_id' => 15, 'option_value_id' => 39, 'name' => 'Red' ], [ 'product_option_value_id' => 17, 'option_value_id' => 41, 'name' => 'Green' ], [ 'product_option_value_id' => 16, 'option_value_id' => 42, 'name' => 'Yellow' ] ], 'option_id' => 5, 'name' => 'Select', 'type' => 'select', 'required' => 1 ], 'href' => 'https://soniya-shop/index.php?route=product/product&product_id=30' ]; то можно проверять текущий ключ (для примера проверяется и ключ 'href', чтобы не экранировать &): <ul> {% for key, val in arr %} {% if key == 'options' %} <ul> {% for k, v in val %} {% if k == 'product_option_value' %} <ul> <li>{{ v }} опять вложение, цикл</li> </ul> {% else %} <li>{{ v }}</li> {% endif %} {% endfor %} </ul> {% else %} <li>{% if key == 'href' %}{{ val|raw }}{% else %}{{ val }}{% endif %}</li> {% endif %} {% endfor %} </ul> Хотя зная структуру массива проще проверять является ли значение итерируемым и соответственно поступать. Проверка ключа потребуется, например, если каждый из них будет иметь различный вывод. |
Создайте домен для twig, скопировав в него twig или composer и загрузить. Создать индексный файла, в котором:
include_once('library/template/Twig/Autoloader.php'); Twig_Autoloader::register(); $loader = new Twig_Loader_Filesystem('templates'); $twig = new Twig_Environment($loader); //без кеширования //определяем что-то для передачи в шаблон echo $twig->render('имя файла шаблона', ['name_for_twig' => $data]); И файл шаблона. Будет легче что-то проверить. |
Часовой пояс GMT +3, время: 22:32. |