Работа с БД при разработке плагина доставки

Здравствуйте! Пишу модуль доставки, в модуле необходимо создать несколько таблиц в базе данных. Плагин собираюсь размещать в Магазине Webasyst. Допустим, нужны 2 таблицы: myshipping_cities, myshipping_rates. Соответственно, вопросы:

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

2) необходимо ли для каждой таблицы создавать модели или я могу обойтись работой с этими таблицами, выполняя запросы в явном виде (например, waCountryModel::getInstance()->query() с подстановкой плейсхолдеров)?

9 ответов

  • 1

    Тема старая а вопрос актуальный.

  • 1
    MDcode 22 ноября 2018 15:12 #

    У системных плагинов не может быть БД

  • 1
    enso_studio@mail.ru 23 ноября 2018 00:55 #

    На данный момент нормальной поддержки моделей и работы с бд в системных плагинах нет, это не значит что её там нельзя реализововать или что wa против, просто нет штатных средств для этого.

    Но лучше пересмотреть позицию и пока что разкидать данные в кеше.

    • +1
      Syrnik.com Syrnik.com 23 ноября 2018 03:17 #

      я в xml сохраняю и не парюсь

      а так-то да. реализовать можно, но это совсем костыль от безысходности

      • +1
        enso_studio@mail.ru enso_studio@mail.ru 23 ноября 2018 10:17 #

        я перел на waVarExportCache, нативные массивы грузятся побыстрее :)

        • +1
          Syrnik.com Syrnik.com 23 ноября 2018 11:02 #

          По XML можно искать, как по бд. Ну почти. С помощью xpath.

          • +1
            enso_studio@mail.ru enso_studio@mail.ru 24 ноября 2018 00:58 #

            по массиву тоже) парсить каждый раз xml слишком ресурсоемко.

  • 2
    enso_studio@mail.ru 23 ноября 2018 01:13 #

    Если все-таки без своих таблиц ну никак, то вот пример кода моего плагина:

    class grastinShipping extends waShipping
    {
        private $models = array();
        /**
         * Get plugin's model.
         * @param string $name
         * @return waModel
         */
        private function getModel($name)
        {
            if (!isset($this->models[$name])) {
                $model = __CLASS__.ucfirst($name);
                $class = $model.'Model';
                require_once $this->path.'/lib/models/'.$model.'.model.php';
                $this->models[$name] = new $class;
            }
            return $this->models[$name];
        }
        /**
         * Init plugin.
         * @return void
         */
        protected function init()
        {
            parent::init();
            if (!$this->getSettings('db_tables_created')) {
                $this->dbTables();
            }
        }
        /**
         * @param string $name
         * @param mixed $value
         * @return void
         */
        private function saveSetting($name, $value)
        {
            $settings = $this->getSettings();
            $settings[$name] = $value;
            $this->setSettings($settings);
            $this->getAdapter()->setSettings($this->id, $this->key, $name, $value);
        }
        /**
         * Create or delete DB tables.
         * @param bool $delete
         * @return void
         */
        private function dbTables($delete = false)
        {
            $model = new waModel;
            $schema = include $this->path.'/lib/config/db.php';
            
            if ($delete) {
                foreach ($schema as $table => $fields) {
                    $model->exec('DROP TABLE IF EXISTS '.$table);
                }
                $this->saveSetting('db_tables_created', 0);
            } else {
                $model->createSchema($schema);
                $this->saveSetting('db_tables_created', 1);
            }
        }
    }

    lib\config\db.php:

    return array(
        'wa_shipping_grastin_pickups' => array(
            'id' => array('int', 11, 'null' => 0, 'autoincrement' => 1),
            // ...
            ':keys' => array('PRIMARY' => 'id'),
        ),
    );

    lib\models\grastinShippingPickup.model.php:

    class grastinShippingPickupModel extends waModel
    {
        protected $table = 'wa_shipping_grastin_pickups';
    }

Добавить ответ

Чтобы добавить комментарий, зарегистрируйтесь или войдите