Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #21 (permalink)  
Старый 01.12.2019, 14:43
Профессор
Отправить личное сообщение для Триви Посмотреть профиль Найти все сообщения от Триви
 
Регистрация: 23.04.2010
Сообщений: 336

Сообщение от laimas Посмотреть сообщение
Что именно?
Модификаторы..

Нашёл шаблон: `catalog/view/theme/soniya-shop/template/extension/module/featured.twig`
Туплю жестоко. Думал взять опенкарт нахрапом, ан не получается.
Надо сначала почитать что-то типа этого http://forum.opencart-russia.ru/thre...botchika.6107/
А то как слепой котёнок там брожу в нём наугад.
Ответить с цитированием
  #22 (permalink)  
Старый 01.12.2019, 14:50
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 11,326

Сообщение от Триви
Модификаторы..
Ну так прочесть что это такое.
Ответить с цитированием
  #23 (permalink)  
Старый 03.12.2019, 18:52
Профессор
Отправить личное сообщение для Триви Посмотреть профиль Найти все сообщения от Триви
 
Регистрация: 23.04.2010
Сообщений: 336

Нужно вывести `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.
Ответить с цитированием
  #24 (permalink)  
Старый 03.12.2019, 19:30
Профессор
Отправить личное сообщение для Триви Посмотреть профиль Найти все сообщения от Триви
 
Регистрация: 23.04.2010
Сообщений: 336

Ну вот я перебрал только что в массиве массива в контроллере все опшенсы, затем засунул их как массив $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.
Ответить с цитированием
  #25 (permalink)  
Старый 03.12.2019, 19:51
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 11,326

Сообщение от Триви
По сути уже в модуль лезу и это настораживает.
Если плевать на контроль версий и все для частного пользования, то хоть весь движок переписывайте. В противном случае конечно же это не верный подход, для этого и существуют модификаторы. Можно расширить любую модель своим методом, дополнить любой контроллер любыми операциями и шаблоне создать соответствующее представление, а также дополнить файл языкового ресурса. В этом случае после обновления версии достаточно будет подправить модификатор или потребуется только очистить и обновить их кеш.
Ответить с цитированием
  #26 (permalink)  
Старый 03.12.2019, 20:00
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 11,326

{% for product in products %}
{% if product.options %}

как, если

[products] => Array (
[3] => Array

?

На чем тренировки производятся, на удаленном сервере? Ставьте локальный сервер и тренируйтесь на нем, делая вывод в браузер данных дабы проверить себя, и прочее, что на реальном сервере конечно же делать не стоит.

Для изучения twig можно создать виртуальный хост только из него.
Ответить с цитированием
  #27 (permalink)  
Старый 03.12.2019, 22:42
Профессор
Отправить личное сообщение для Триви Посмотреть профиль Найти все сообщения от Триви
 
Регистрация: 23.04.2010
Сообщений: 336

Сообщение от laimas Посмотреть сообщение
{% for product in products %}
{% if product.options %}

как, если

[products] => Array (
[3] => Array

?
А как? Сначала же мы листаем массив products в шаблоне:
{% for product in products %}

Все эти {{ product.name }} и прочие в шаблоне выводятся, но когда дело доходит до того, чтобы пролистать вложенный в products массив options, то ничего не получается.

Сообщение от laimas Посмотреть сообщение
На чем тренировки производятся, на удаленном сервере? Ставьте локальный сервер и тренируйтесь на нем, делая вывод в браузер данных дабы проверить себя, и прочее, что на реальном сервере конечно же делать не стоит.

Для изучения twig можно создать виртуальный хост только из него.
Локально на openServer -е и гоняю.
Ответить с цитированием
  #28 (permalink)  
Старый 03.12.2019, 22:51
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 11,326

Сообщение от Триви
Сначала же мы листаем массив products в шаблоне
В twig нет цикла foreach, массив:

$arr = [
    3 => [
        12,
        45       
    ]
];


цикл for выведет Array. И только {% for itm in arr[3] %} отобразит его содержимое. Так что либо цикл в цикле, либо готовить структуру необходимую перед передачей в шаблон.
Ответить с цитированием
  #29 (permalink)  
Старый 03.12.2019, 23:07
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 11,326

Триви, просто проверяйте тип:

{% 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.
Ответить с цитированием
  #30 (permalink)  
Старый 04.12.2019, 01:06
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 11,326

Создайте домен для 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]);


И файл шаблона. Будет легче что-то проверить.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите с многомерным массивом dima*** Общие вопросы Javascript 8 03.04.2013 00:04