Работа с БД при разработке плагина доставки
Здравствуйте! Пишу модуль доставки, в модуле необходимо создать несколько таблиц в базе данных. Плагин собираюсь размещать в Магазине Webasyst. Допустим, нужны 2 таблицы: myshipping_cities, myshipping_rates. Соответственно, вопросы:
1) где в модуле мне описывать вставку данных в эти таблицы при установке модуля? Например, в таблице myshipping_rates будут содержаться тысячи комбинаций сроков доставки, эти комбинации заранее известны.
2) необходимо ли для каждой таблицы создавать модели или я могу обойтись работой с этими таблицами, выполняя запросы в явном виде (например, waCountryModel::getInstance()->query() с подстановкой плейсхолдеров)?
1) где в модуле мне описывать вставку данных в эти таблицы при установке модуля? Например, в таблице myshipping_rates будут содержаться тысячи комбинаций сроков доставки, эти комбинации заранее известны.
2) необходимо ли для каждой таблицы создавать модели или я могу обойтись работой с этими таблицами, выполняя запросы в явном виде (например, waCountryModel::getInstance()->query() с подстановкой плейсхолдеров)?
Эта тема в архиве. Добавление комментариев к ней отключено.










9 ответов
Тема старая а вопрос актуальный.
У системных плагинов не может быть БД
не бд, а таблиц
На данный момент нормальной поддержки моделей и работы с бд в системных плагинах нет, это не значит что её там нельзя реализововать или что wa против, просто нет штатных средств для этого.
Но лучше пересмотреть позицию и пока что разкидать данные в кеше.
я в xml сохраняю и не парюсь
а так-то да. реализовать можно, но это совсем костыль от безысходности
я перел на waVarExportCache, нативные массивы грузятся побыстрее :)
По XML можно искать, как по бд. Ну почти. С помощью xpath.
по массиву тоже) парсить каждый раз xml слишком ресурсоемко.
Если все-таки без своих таблиц ну никак, то вот пример кода моего плагина:
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'; }