01.12.2019, 14:43
|
Профессор
|
|
Регистрация: 23.04.2010
Сообщений: 354
|
|
Сообщение от laimas
|
Что именно?
|
Модификаторы..
Нашёл шаблон: `catalog/view/theme/soniya-shop/template/extension/module/featured.twig`
Туплю жестоко. Думал взять опенкарт нахрапом, ан не получается.
Надо сначала почитать что-то типа этого http://forum.opencart-russia.ru/thre...botchika.6107/
А то как слепой котёнок там брожу в нём наугад.
|
|
01.12.2019, 14:50
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Сообщение от Триви
|
Модификаторы..
|
Ну так прочесть что это такое.
|
|
03.12.2019, 18:52
|
Профессор
|
|
Регистрация: 23.04.2010
Сообщений: 354
|
|
Нужно вывести `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 запихать ещё и соответствующий ему опшен?
По сути уже в модуль лезу и это настораживает.
В ту ли сторону я вообще начал ковырять? Или есть что-то уже написанное и не нужно вовсе лезть в эти дебри?
Последний раз редактировалось Триви, 03.12.2019 в 19:02.
|
|
03.12.2019, 19:30
|
Профессор
|
|
Регистрация: 23.04.2010
Сообщений: 354
|
|
Ну вот я перебрал только что в массиве массива в контроллере все опшенсы, затем засунул их как массив $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' %}
...
Ошибок нет, но нифига не работает.
Последний раз редактировалось Триви, 03.12.2019 в 19:32.
|
|
03.12.2019, 19:51
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Сообщение от Триви
|
По сути уже в модуль лезу и это настораживает.
|
Если плевать на контроль версий и все для частного пользования, то хоть весь движок переписывайте. В противном случае конечно же это не верный подход, для этого и существуют модификаторы. Можно расширить любую модель своим методом, дополнить любой контроллер любыми операциями и шаблоне создать соответствующее представление, а также дополнить файл языкового ресурса. В этом случае после обновления версии достаточно будет подправить модификатор или потребуется только очистить и обновить их кеш.
|
|
03.12.2019, 20:00
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
{% for product in products %}
{% if product.options %}
как, если
[products] => Array (
[3] => Array
?
На чем тренировки производятся, на удаленном сервере? Ставьте локальный сервер и тренируйтесь на нем, делая вывод в браузер данных дабы проверить себя, и прочее, что на реальном сервере конечно же делать не стоит.
Для изучения twig можно создать виртуальный хост только из него.
|
|
03.12.2019, 22:42
|
Профессор
|
|
Регистрация: 23.04.2010
Сообщений: 354
|
|
Сообщение от laimas
|
{% for product in products %}
{% if product.options %}
как, если
[products] => Array (
[3] => Array
?
|
А как? Сначала же мы листаем массив products в шаблоне:
{% for product in products %}
Все эти {{ product.name }} и прочие в шаблоне выводятся, но когда дело доходит до того, чтобы пролистать вложенный в products массив options, то ничего не получается.
Сообщение от laimas
|
На чем тренировки производятся, на удаленном сервере? Ставьте локальный сервер и тренируйтесь на нем, делая вывод в браузер данных дабы проверить себя, и прочее, что на реальном сервере конечно же делать не стоит.
Для изучения twig можно создать виртуальный хост только из него.
|
Локально на openServer -е и гоняю.
|
|
03.12.2019, 22:51
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Сообщение от Триви
|
Сначала же мы листаем массив products в шаблоне
|
В twig нет цикла foreach, массив:
$arr = [
3 => [
12,
45
]
];
цикл for выведет Array. И только {% for itm in arr[3] %} отобразит его содержимое. Так что либо цикл в цикле, либо готовить структуру необходимую перед передачей в шаблон.
|
|
03.12.2019, 23:07
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Триви, просто проверяйте тип:
{% 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>
Хотя зная структуру массива проще проверять является ли значение итерируемым и соответственно поступать. Проверка ключа потребуется, например, если каждый из них будет иметь различный вывод.
Последний раз редактировалось laimas, 04.12.2019 в 00:49.
|
|
04.12.2019, 01:06
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Создайте домен для 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]);
И файл шаблона. Будет легче что-то проверить.
|
|
|
|