[Помогите] Добавление полей

Тема в разделе "OpenCart", создана пользователем alexsofdev, 30 янв 2013.

  1. alexsofdev

    alexsofdev

    Регистрация:
    13 янв 2013
    Сообщения:
    239
    Симпатии:
    46
    Интересует возможность расширения стандартных объектов opencart. Вот к примеру к категориям мне надо добавить еще одно поле - short_description. Я понимаю как это замутить в админке, как это замутить в веб-морде, но пока не понимаю как это элегантно реализовать на уровне базы.

    Т.е. понятно что никто синтаксис SQL не отменял и можно добавить поле по образу и подобию, но может есть какие-то штатные средства по управлению полями объекта?
     
  2. nix

    nix php, MySQL, UNIX, MikroTik ROSAPI

    Регистрация:
    16 янв 2013
    Сообщения:
    1.000
    Симпатии:
    890
    штатних нет, руками прочивать надо - шаблон, контролер, модель
     
  3. alexsofdev

    alexsofdev

    Регистрация:
    13 янв 2013
    Сообщения:
    239
    Симпатии:
    46
    Дабавление поля в модель гарантирует автоматическое создание его в базе или надо рядом с модулем держать sql-файлик, в качестве памяти так сказать?
     
  4. nix

    nix php, MySQL, UNIX, MikroTik ROSAPI

    Регистрация:
    16 янв 2013
    Сообщения:
    1.000
    Симпатии:
    890
    Для начала создаете дополнительное поле в таблице категории в БД потом ето поле в моделе дописиваете до существующих ся в места где есть функция адд и апдейт, потом контролер прописиваете и наконец шаблон правите
    --- добавлено: 30 янв 2013 в 01:15 ---
    Вот почитайте аналогично и с категориями и любими полями
     
    alexsofdev нравится это.
  5. alexsofdev

    alexsofdev

    Регистрация:
    13 янв 2013
    Сообщения:
    239
    Симпатии:
    46
    Супер, только хотел попросить что-то для примера :smile:
    --- добавлено: 30 янв 2013 в 01:19 ---
    Кстати, была еще мысль сделать виртуальные поля. Т.е. в базе физически хранится одно поле, в котором два значения, разделенные через "|". А уже на уровне модели эти два значения транслируются в два поля.

    Плюсом такого варианта была бы обратная совместимость со старой базой и, соответственно, тривиальная установка :smile:. Но думаю пора завязывать с хаками.
     
  6. nix

    nix php, MySQL, UNIX, MikroTik ROSAPI

    Регистрация:
    16 янв 2013
    Сообщения:
    1.000
    Симпатии:
    890
    Дак там есть пример только с товаром, категория все аналогично... Если хоть чтото понимаете в php то без проблем розберетесь, и розделитель зделаете(если ето нужно и логично) )
     
  7. alexsofdev

    alexsofdev

    Регистрация:
    13 янв 2013
    Сообщения:
    239
    Симпатии:
    46
    Такс, а теперь послание потомкам.

    Опенкарт я выбрал потому что на __первый взгляд__ там все было построено логично и просто, на базе MVC, а это означало простоту обработки напильником. Беру свои слова обратно :Smile: :coffee:

    Когда я столкнулся с задачей добавления поля, то вполне здоровый прагматизм, разбавленный обычной человеческой ленцой, помешал мне сразу полезть в код. И я полез по форумам искать готовые решения в виде ... ну конечно, модулей. Помнится я долго не мог понять почему же так и не нашлось готового модуля, ведь архитектура расширяемая.

    Так и не найдя готовых решений, я полез в код. Мать моя женщина :banghead:. Очевидно разработчики поставили себе целью внедрить MVC, но при этом совершенно не понимали что это такое. Ну вот по логике, что нужно сделать, чтобы добавить одно поле к объекту? Верно, вначале добавить его в код сериализации в модель, потом заюзать во вьюхе. При этом в нормальном коде должно быть затронуто всего ... 2 участка кода в модели - сохранение и чтение. В опенкарте я нарисовал десяток заплаток, прежде чем впал в ступор:

    Код:
    $this->db->query("INSERT INTO `" . DB_PREFIX . "order` SET invoice_prefix = '" . $this->db->escape($invoice_prefix) . "', store_id = '" . (int)$data['store_id'] . "', store_name = '" . $this->db->escape($store_name) . "',store_url =
    '" . $this->db->escape($store_url) . "', customer_id = '" . (int)$data['customer_id'] . "', customer_group_id = '" . (int)$data['customer_group_id'] . "', firstname = '" . $this->db->escape($data['firstname']) . "', lastname = '" . $this->db
    ->escape($data['lastname']) . "', email = '" . $this->db->escape($data['email']) . "', telephone = '" . $this->db->escape($data['telephone']) . "', fax = '" . $this->db->escape($data['fax']) . "', payment_firstname = '" . $this->db->escape($
    data['payment_firstname']) . "', payment_lastname = '" . $this->db->escape($data['payment_lastname']) . "', payment_company = '" . $this->db->escape($data['payment_company']) . "', payment_company_id = '" . $this->db->escape($data['payment_c
    ompany_id']) . "', payment_tax_id = '" . $this->db->escape($data['payment_tax_id']) . "', payment_address_1 = '" . $this->db->escape($data['payment_address_1']) . "', payment_address_2 = '" . $this->db->escape($data['payment_address_2']) . "
    ', payment_city = '" . $this->db->escape($data['payment_city']) . "', payment_postcode = '" . $this->db->escape($data['payment_postcode']) . "', payment_country = '" . $this->db->escape($payment_country) . "', payment_country_id = '" . (int)
    $data['payment_country_id'] . "', payment_zone = '" . $this->db->escape($payment_zone) . "', payment_zone_id = '" . (int)$data['payment_zone_id'] . "', payment_address_format = '" . $this->db->escape($payment_address_format) . "', payment_me
    thod = '" . $this->db->escape($data['payment_method']) . "', payment_code = '" . $this->db->escape($data['payment_code']) . "', shipping_firstname = '" . $this->db->escape($data['shipping_firstname']) . "', shipping_lastname = '" . $this->db
    ->escape($data['shipping_lastname']) . "', shipping_company = '" . $this->db->escape($data['shipping_company']) . "', shipping_address_1 = '" . $this->db->escape($data['shipping_address_1']) . "', shipping_address_2 = '" . $this->db->escape(
    $data['shipping_address_2']) . "', shipping_city = '" . $this->db->escape($data['shipping_city']) . "', shipping_postcode = '" . $this->db->escape($data['shipping_postcode']) . "', shipping_country = '" . $this->db->escape($shipping_country)
     . "', shipping_country_id = '" . (int)$data['shipping_country_id'] . "', shipping_zone = '" . $this->db->escape($shipping_zone) . "', shipping_zone_id = '" . (int)$data['shipping_zone_id'] . "', shipping_address_format = '" . $this->db->esc
    ape($shipping_address_format) . "', shipping_method = '" . $this->db->escape($data['shipping_method']) . "', shipping_code = '" . $this->db->escape($data['shipping_code']) . "', comment = '" . $this->db->escape($data['comment']) . "', order_
    status_id = '" . (int)$data['order_status_id'] . "', affiliate_id  = '" . (int)$data['affiliate_id'] . "', language_id = '" . (int)$this->config->get('config_language_id') . "', currency_id = '" . (int)$currency_id . "', currency_code = '" .
     $this->db->escape($currency_code) . "', currency_value = '" . (float)$currency_value . "', date_added = NOW(), date_modified = NOW()");
    
    На тот случай, если разметка побьется - это одна строка. Нет, вы не поняли, это ОДНА СТРОКА. Это одна гребанная строка. И да, я могу сделать vqmod\file\operation=replace. Но как бы ... что с ним делать, если понадобится еще одно поле ( а мне нужно сразу 4 и я хотел это отдельными модулями организовать ).

    Прониклись?

    Теперь возвращаемся к канонам MVC: одна сущность - один комплект модели, вьюшки и контроллера. И под сущностью понимается ... верно, логический объект. Например отчет или страничка редактирования заказов. Тут, естественно, этого нет. А зачем? Все смешано в одну единственную модель и таких МОНОЛИТНЫХ строк в ней пачка.

    К чему это я... Ах да! Забудьте про vqMod и простоту накатывания апдейтов, если хотите расширить модель. Вам придется либо активно редактировать имеющиеся файлы, что будет теряться при апдейте движка, либо придется делать свой комплект файлов, что будет вызывать конфликты совместимости при апдейте движка. А между тем на улице уже появился 1.5.5.1.

    P.S. я обязательно добавлю гребанные поля в заказе и отпишусь. Почему? Потому что другие решения для интернет магазинов еще ужасней по тем или иным причинам. :coffee: