Мультиязычное поле

Тема в разделе "Общие вопросы", создана пользователем Sanik, 8 мар 2024.

  1. Sanik

    Sanik Активный пользователь

    Сообщения:
    299
    Симпатии:
    3
    Подскажите, что я делаю не так или что упустил?
    Есть вот такое поле
    Код:
                               
    <td class="text-left">
    <?php if (isset($option_values[$product_option['option_id']])) { ?>
                                    <?php if(array_key_exists($product_option_value['option_value_id'],$option_values[$product_option['option_id']]['ids'])) { ?>
                                        <input type="text" name="product_option[<?php echo $option_row; ?>][product_option_value][<?php echo $option_value_row; ?>][name]" value="<?php echo $option_values[$product_option['option_id']]['ids'][$product_option_value['option_value_id']]['name']; ?>" class="form-control">
                                        <input type="hidden" name="product_option[<?php echo $option_row; ?>][product_option_value][<?php echo $option_value_row; ?>][option_value_id]" value="<?php echo $option_values[$product_option['option_id']]['ids'][$product_option_value['option_value_id']]['option_value_id']; ?>">
                                    <?php } ?>
                                    <?php } ?>
                                    <input type="hidden" name="product_option[<?php echo $option_row; ?>][product_option_value][<?php echo $option_value_row; ?>][product_option_value_id]" value="<?php echo $product_option_value['product_option_value_id']; ?>" /></td>
    
    В контроллере
    Код:
            foreach ($data['product_options'] as $product_option) {
                if ($product_option['type'] == 'select' || $product_option['type'] == 'radio' || $product_option['type'] == 'checkbox' || $product_option['type'] == 'image') {
                    if (!isset($data['option_values'][$product_option['option_id']])) {
                        $data['option_values'][$product_option['option_id']] = $this->model_catalog_option->getOptionValues($product_option['option_id']);
    
            $data['option_values'][$product_option['option_id']]['ids'] = $this->model_catalog_option->getOptionValuesId($product_option['option_id']);
       
                    }
                }
            }
    Если следовать в model_catalog_option->getOptionValuesId, то
    Код:
            public function getOptionValuesId($option_id) {
              $option_value_data = array();
    
              $option_value_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "option_value ov LEFT JOIN " . DB_PREFIX . "option_value_description ovd ON (ov.option_value_id = ovd.option_value_id) WHERE ov.option_id = '" . (int)$option_id . "' AND ovd.language_id = '" . (int)$this->config->get('config_language_id') . "' ORDER BY ov.sort_order, ovd.name");
    
              foreach ($option_value_query->rows as $option_value) {
                $option_value_data[$option_value['option_value_id']] = array(
                  'option_value_id' => $option_value['option_value_id'],
                  'name'            => $option_value['name'],
                  'image'           => $option_value['image'],
                  'sort_order'      => $option_value['sort_order']
                );
              }
    
              return $option_value_data;
            }
            public function getOptionValueIdByName($option_id, $name) {
              $query = $this->db->query("SELECT option_value_id FROM " . DB_PREFIX . "option_value_description WHERE option_id = '".(int)$option_id."' AND name LIKE '".$this->db->escape($name)."' AND language_id = '".(int)$this->config->get('config_language_id')."'");
     
              return isset($query->row['option_value_id']) ? $query->row['option_value_id'] : false;
            }
    
            public function updateOptionValue($data) {
    
              $this->db->query("UPDATE " . DB_PREFIX . "option_value SET sort_order = '" . (int)$data['sort_order'] . "' WHERE option_value_id = '" . (int)$data['option_value_id'] . "'");
    
              $this->db->query("UPDATE " . DB_PREFIX . "option_value_description SET name = '" . $this->db->escape($data['name']) . "' WHERE option_value_id = '" . (int)$data['option_value_id'] . "' AND language_id = '" . (int)$this->config->get('config_language_id') . "'");
    
            }
    
            public function addOptionValue($data) {
    
              $this->db->query("INSERT INTO " . DB_PREFIX . "option_value SET option_id = '" . (int)$data['option_id'] . "', image = '', sort_order = '" . (int)$data['sort_order'] . "'");
    
              $option_value_id = $this->db->getLastId();
    
              $this->db->query("INSERT INTO " . DB_PREFIX . "option_value_description SET option_value_id = '" . (int)$option_value_id . "', language_id = '" . (int)$this->config->get('config_language_id') . "', option_id = '" . (int)$data['option_id'] . "', name = '" . $this->db->escape($data['name']) . "'");
    
              return $option_value_id;
    
            }
    Я сделал вот так
    Код:
                                  <td class="text-left">
                                    <?php if (isset($option_values[$product_option['option_id']])) { ?>
                                    <?php if(array_key_exists($product_option_value['option_value_id'],$option_values[$product_option['option_id']]['ids'])) { ?>
                                    <?php foreach ($languages as $language) { ?>
                                    <div class="input-group"><span class="input-group-addon"><img src="language/<?php echo $language['code']; ?>/<?php echo $language['code']; ?>.png" title="<?php echo $language['name']; ?>" /></span>
                                        <input type="text" name="product_option[<?php echo $option_row; ?>][product_option_value][<?php echo $option_value_row; ?>][<?php echo $language['language_id']; ?>][name]" value="<?php echo isset($option_values[$product_option['option_id']]['ids'][$product_option_value['option_value_id']][$language['language_id']]) ? $option_values[$product_option['option_id']]['ids'][$product_option_value['option_value_id']][$language['language_id']]['name'] : ''; ?>" class="form-control">
                                    </div>
                                        <input type="hidden" name="product_option[<?php echo $option_row; ?>][product_option_value][<?php echo $option_value_row; ?>][option_value_id]" value="<?php echo $option_values[$product_option['option_id']]['ids'][$product_option_value['option_value_id']]['option_value_id']; ?>">
                                 
                                    <?php } ?>
                                    <?php } ?>
                                    <?php } ?>
                                    <input type="hidden" name="product_option[<?php echo $option_row; ?>][product_option_value][<?php echo $option_value_row; ?>][product_option_value_id]" value="<?php echo $product_option_value['product_option_value_id']; ?>" /></td>
    Второе поле для языка появляэться и все без ошибок, но значения почему-то не сохраняються. Вроде в модели есть запрос на айди языка, или еще в контроллере его как-то нужно прописать или вообще не правильно value в <input type="text" код для языков прописал?
     
    Последнее редактирование: 8 мар 2024
  2. Sanik

    Sanik Активный пользователь

    Сообщения:
    299
    Симпатии:
    3
    Добавил сюда в модель language id
    Код:
            foreach ($option_value_query->rows as $option_value) {
                $option_value_data[$option_value['option_value_id']] = array(
                    'option_value_id' => $option_value['option_value_id'],
                    'language_id'            => $option_value['language_id'],
                    'name'            => $option_value['name'],
                    'feed_name'       => $option_value['feed_name'],
                    'image'           => $option_value['image'],
                    'sort_order'      => $option_value['sort_order']
                );
            }
    Через print_r смотрю
    Код:
    <?php echo print_r($option_values[$product_option['option_id']]['ids']); ?>
    language_id выводится, но толькор с одним "1" айди, хотя в БД для двух языков прописано. Что делаю не так?.
     
  3. Sanik

    Sanik Активный пользователь

    Сообщения:
    299
    Симпатии:
    3
    Есть предположения? Пока еще с этим так и не разобрался
    Убрал из модели из строки
    Код:
    $option_value_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "option_value ov LEFT JOIN " . DB_PREFIX . "option_value_description ovd ON (ov.option_value_id = ovd.option_value_id) WHERE ov.option_id = '" . (int)$option_id . "' AND language_id = '".(int)$this->config->get('config_language_id')."' ORDER BY ov.sort_order, ovd.name");
    Вот этот код
    Код:
    AND language_id = '".(int)$this->config->get('config_language_id')."'
    Так как с ним в дампе для двух языков значения не выводятся, а без него выводятся
    В функциях
    Код:
    getOptionValueIdByName($option_id, $name)
    updateOptionValue($data) {
    addOptionValue($data)
    Тоже такой код есть, пробовал заменять на
    Код:
    language_id = '" . (int)$language_id . "'
    Но ничего не дало, либо я в шаблоне в input value не правильно isset прописал?
     
    Последнее редактирование: 19 мар 2024
  4. Ravilr

    Ravilr Специалист

    Сообщения:
    3.878
    Симпатии:
    1.064
    Ну какие предложения :) Многим просто лень... это же нужно внести правки себе. проверить итд. Это не минутка..

    Что за поле у Вас такое? Вы смотрели как сделано описание для опции?
     
  5. Sanik

    Sanik Активный пользователь

    Сообщения:
    299
    Симпатии:
    3
    Это поле в админке товара, во вкладке опции вместо select. Это доработка, которая позволяет создавать или менять значение опции прямо в карточке путем замены select. Все работает с 1-м языком, но оно не рассчитано на мультиязычность. Весь код касающийся этого поля - выше выложил.

    Смотрел как это сделано в опциях и в атрибутах. Но там код input не такой сложной структуры. Вроде все сделал по аналогии, но не знаю, правильно ли и нужно ли еще input hidden изменять. Мне кажется что это еще в модели править нужно еще.
    Когда убрал
    Код:
    AND language_id = '".(int)$this->config->get('config_language_id')."'
    Из строчки
    Код:
    $option_value_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "option_value ov LEFT JOIN " . DB_PREFIX . "option_value_description ovd ON (ov.option_value_id = ovd.option_value_id) WHERE ov.option_id = '" . (int)$option_id . "' AND language_id = '".(int)$this->config->get('config_language_id')."' ORDER BY ov.sort_order, ovd.name");
    То в дампе начали выводится значения для двух языков. Но не в полях для языков, там пусто, и внесенные данные в это поле не сохраняются и не подтягиваются из опций. Хотя этот код в функции в модели для описания опций в аналогичной строчке есть. Странно...
     
    Последнее редактирование: 20 мар 2024
  6. Sanik

    Sanik Активный пользователь

    Сообщения:
    299
    Симпатии:
    3
    Код:
    <?php echo print_r($option_values[$product_option['option_id']]); ?>
    выводит сейчас вот что
    Т.е.. значение опции для разных языков через дамп выводится name rus - 1111111111 и name en - 333333333333, но в поля не попадают
     

    Вложения:

    • 123.png
      123.png
      Размер файла:
      10,1 КБ
      Просмотров:
      11
    Последнее редактирование: 20 мар 2024
  7. Sanik

    Sanik Активный пользователь

    Сообщения:
    299
    Симпатии:
    3
    Кто сможет помочь за оплату? В лс детально расскажу и дам доступы.
     
  8. Tom

    Tom Специалист

    Сообщения:
    686
    Симпатии:
    206
    Видимо помочь никто не может, потому что ваше объяснение задачи, вызывает ещё больше вопросов . И пока вы четко не распишите с чего началась эта neverendless story, помочь вам будет нечем.
    Потому как вытягивать раз за разом зачем все это, никому не нужно.
     
    Tesloz и Blast нравится это.
  9. Sanik

    Sanik Активный пользователь

    Сообщения:
    299
    Симпатии:
    3
    Если описать проще.. Есть модификатор, который заменяет поле select выбора значений опций на поле input с возможностью создавать новые и редактировать старые значения опций во вкладке "Опции" в товаре. Так вот, все работало и работает отлично с одним языком. Но когда добавил второй язык - то поле осталось только для одного языка. Нужно сделать это поле мультиязычным. Там такой какой-то запутанный код, что мне трудно разобрать. Я установил этот мод. на чистый опенкарт и залил на хостинг. Кто хочет посмотреть - в лс.
     
  10. Tom

    Tom Специалист

    Сообщения:
    686
    Симпатии:
    206
    Где сам модификатор?
     
  11. Sanik

    Sanik Активный пользователь

    Сообщения:
    299
    Симпатии:
    3
    Тему в итоге решил. Закрыто.