diff --git a/mirzaev/skillparts/system/controllers/MainController.php b/mirzaev/skillparts/system/controllers/MainController.php index c6f71ef..0cd57f9 100644 --- a/mirzaev/skillparts/system/controllers/MainController.php +++ b/mirzaev/skillparts/system/controllers/MainController.php @@ -22,11 +22,9 @@ class MainController extends Controller } /** - * Displays homepage. - * - * @return string + * Главная страница */ - public function actionIndex() + public function actionIndex(): string|array { if (Yii::$app->request->isAjax) { // AJAX-POST-запрос diff --git a/mirzaev/skillparts/system/controllers/ProfileController.php b/mirzaev/skillparts/system/controllers/ProfileController.php index 5054382..09c51a7 100644 --- a/mirzaev/skillparts/system/controllers/ProfileController.php +++ b/mirzaev/skillparts/system/controllers/ProfileController.php @@ -1,4 +1,5 @@ request->post('Supply') ?? Yii::$app->request->get('Supply')); + $model = Yii::$app->user->identity; + + // Генерация + $sidebar = $this->renderPartial('sidebar'); if (Yii::$app->request->isAjax) { // AJAX-POST-запрос @@ -67,13 +75,39 @@ class ProfileController extends Controller Yii::$app->response->format = Response::FORMAT_JSON; return [ - 'main' => $this->renderPartial('index'), + 'main' => $this->renderPartial('index', compact('model', 'sidebar')), 'redirect' => '/profile', '_csrf' => Yii::$app->request->getCsrfToken() ]; } - return $this->render('index', compact('model')); + return $this->render('index', compact('model', 'sidebar')); + } + + /** + * Страницка поставок + */ + public function actionSupplies(): string|array + { + // Инициализация + $model = new Supply(Yii::$app->request->post('Supply') ?? Yii::$app->request->get('Supply')); + + // Генерация + $sidebar = $this->renderPartial('sidebar', compact('model')); + + if (Yii::$app->request->isAjax) { + // AJAX-POST-запрос + + Yii::$app->response->format = Response::FORMAT_JSON; + + return [ + 'main' => $this->renderPartial('supplies', compact('model', 'sidebar')), + 'redirect' => '/profile/supplies', + '_csrf' => Yii::$app->request->getCsrfToken() + ]; + } + + return $this->render('supplies', compact('model', 'sidebar')); } public function actionImport() @@ -82,6 +116,9 @@ class ProfileController extends Controller $model = new Supply(Yii::$app->request->post('Supply') ?? Yii::$app->request->get('Supply')); $model->scenario = $model::SCENARIO_IMPORT; + // Генерация + $sidebar = $this->renderPartial('sidebar', compact('model')); + if (Yii::$app->request->isAjax) { // AJAX-POST-запрос @@ -94,12 +131,12 @@ class ProfileController extends Controller } return [ - 'main' => $this->renderPartial('index', compact('model')), + 'main' => $this->renderPartial('supplies', compact('model', 'sidebar')), '_csrf' => Yii::$app->request->getCsrfToken() ]; } - return $this->render('index', compact('model')); + return $this->render('supplies', compact('model', 'sidebar')); } public static function readGroups() diff --git a/mirzaev/skillparts/system/controllers/SearchController.php b/mirzaev/skillparts/system/controllers/SearchController.php index 8894b13..39156a2 100644 --- a/mirzaev/skillparts/system/controllers/SearchController.php +++ b/mirzaev/skillparts/system/controllers/SearchController.php @@ -13,7 +13,7 @@ class SearchController extends Controller public function actionIndex(): array|string { // Инициализация - $request = Yii::$app->request->post('request') ?? Yii::$app->request->get('q'); + $query = Yii::$app->request->post('request') ?? Yii::$app->request->get('q'); if (Yii::$app->request->post('type') === 'product' || Yii::$app->request->get('type') === 'product') { // Поиск по продуктам @@ -51,8 +51,10 @@ class SearchController extends Controller // Здесь запись истории запросов (в базе данных) // - if ($response = Product::search($request)) { - // Данные найдены + $limit = Yii::$app->request->isAjax ? 10 : 30; + + if ($response = Product::searchByCatn($query, $limit)) { + // Данные найдены по поиску в полях Каталожного номера // Запись ответа $return = [ @@ -66,9 +68,10 @@ class SearchController extends Controller // Запись ответа $return['main'] = $this->renderPartial('/search/index', compact('response')); $return['search_line_window_hide'] = 1; - $return['redirect'] = '/search?type=product&q=' . $request; + $return['redirect'] = '/search?type=product&q=' . $query; } } else { + // Данные не найдены Yii::$app->response->statusCode = 404; diff --git a/mirzaev/skillparts/system/models/Account.php b/mirzaev/skillparts/system/models/Account.php index 5a9cdb3..08f3193 100644 --- a/mirzaev/skillparts/system/models/Account.php +++ b/mirzaev/skillparts/system/models/Account.php @@ -1,23 +1,39 @@ 'Аутентификационный хеш', + 'mail' => 'Почта', + 'pswd' => 'Пароль', + 'name' => 'Имя', + 'simc' => 'Номер', + 'sity' => 'Город', + 'comp' => 'Компания', + 'taxn' => 'ИНН', + 'onec' => 'Данные 1C', + 'opts' => 'Параметры' + ] + ); + } + + /** + * Правила + */ + public function rules(): array { return array_merge( parent::rules(), @@ -42,24 +84,13 @@ class Account extends Document implements IdentityInterface, PartnerInterface ); } - public function attributeLabels() - { - return array_merge( - parent::attributeLabels(), - [ - 'mail' => 'Почта', - 'pswd' => 'Пароль', - 'name' => 'Имя', - 'simc' => 'Номер', - 'sity' => 'Город', - 'comp' => 'Компания', - 'taxn' => 'ИНН', - 'auth' => 'Аутентификационный хеш' - ] - ); - } - - public function beforeSave($data) + /** + * Перед сохранением + * + * @todo Подождать обновление от ебаного Yii2 и добавить + * проверку типов передаваемых параметров + */ + public function beforeSave($data): bool { if (parent::beforeSave($data)) { if ($this->isNewRecord) { @@ -71,70 +102,143 @@ class Account extends Document implements IdentityInterface, PartnerInterface return false; } - public function getExportFields1c($context = null) + /** + * Чтение полей для экспорта из 1С + */ + public function getExportFields1c($context = null): array { - return [ - 'Ид' => 'id', - 'Наименование' => 'username', - 'ПолноеНаименование' => 'full_name', - 'Фамилия' => 'surname', - 'Имя' => 'name', - ]; + return []; } + /** + * Чтение идентификатора + * + * @see IdentityInterface + */ public function getId(): string { - return $this->_key; + return self::collectionName() . '/' . $this->_key; } + /** + * Чтение идентификатора + */ public function readId(): string { - return self::collectionName() . '/' . $this->getId(); + return $this->getId(); } - public function getAuthKey() + /** + * Чтение аутентификационного ключа + */ + public function getAuthKey(): string { return $this->auth; } - public static function findIdentity($_key) + /** + * Идентификация + * + * @todo Подождать обновление от ебаного Yii2 и добавить + * проверку типов передаваемых параметров + */ + public static function findIdentity($_id): self { - return static::findByKey($_key); + return static::findById($_id); } - public static function findIdentityByAccessToken($pass, $type = null) + /** + * Поиск по ключу + * + * @todo Подождать обновление от ебаного Yii2 и добавить + * проверку типов передаваемых параметров + */ + public static function findIdentityByAccessToken($pass, $type = null): self { return static::findOne(['pass' => $pass]); } - public static function findByMail($mail) + /** + * Поиск по почте + * + * @todo Подождать обновление Yii2 и добавить + * проверку типов передаваемых параметров + */ + public static function findByMail($mail): self { return static::findOne(['mail' => $mail]); } - public static function findByKey($_key) + /** + * Поиск по идентификатору + * + * @todo Подождать обновление Yii2 и добавить + * проверку типов передаваемых параметров + */ + public static function findById($_id): self { - return static::findOne(['_key' => $_key]); + return static::searchById($_id); } - public static function validateMail($mail) + /** + * Проверка почты + */ + public static function validateMail(string $mail): bool { if (static::findByMail($mail)) { // Почта найдена в базе данных - return false; + return true; } - return true; + return false; } - public function validatePassword($pswd) + /** + * Проверка пароля + */ + public function validatePassword(string $pswd): bool { return Yii::$app->security->validatePassword($pswd, $this->pswd); } - public function validateAuthKey($auth) + /** + * Проверка аутентификационного ключа + * + * @todo Подождать обновление Yii2 и добавить + * проверку типов передаваемых параметров + */ + public function validateAuthKey($auth): bool { return $this->getAuthKey() === $auth; } + + /** + * Записать параметр + * + * @param string $name Название параметра + * @param mixed $value Значение параметра + */ + public function writeOption(string $name, mixed $value = null): bool + { + // Запись + $this->opts[$name] = $value; + + // Отправка + return $this->save(); + } + + /** + * Удалить параметр + * + * @param string $name Название параметра + */ + public function deleteOption(string $name): bool + { + // Удаление + unset($this->opts[$name]); + + // Отправка + return $this->save(); + } } diff --git a/mirzaev/skillparts/system/models/AccountForm.php b/mirzaev/skillparts/system/models/AccountForm.php index 8dfc105..934db4d 100644 --- a/mirzaev/skillparts/system/models/AccountForm.php +++ b/mirzaev/skillparts/system/models/AccountForm.php @@ -56,7 +56,7 @@ class AccountForm extends Model $account = $this->getAccount(); - if (!$account || !$account->validateMail($this->mail)) { + if (!$account || $account->validateMail($this->mail)) { // Проверка не пройдена $this->addError($attribute, 'Почта уже привязана'); diff --git a/mirzaev/skillparts/system/models/Document.php b/mirzaev/skillparts/system/models/Document.php index 6e379d1..27dedd6 100644 --- a/mirzaev/skillparts/system/models/Document.php +++ b/mirzaev/skillparts/system/models/Document.php @@ -1,13 +1,31 @@ 'Дата', @@ -24,25 +45,36 @@ abstract class Document extends ActiveRecord ]; } - public function rules() + + /** + * Правила + * + * @todo Добавить проверку существования аккаунта + */ + public function rules(): array { return [ [ 'writer', 'string' - // Надо добавить проверку существования аккаунта ] ]; } - public function beforeSave($data) + /** + * Перед сохранением + * + * @todo Подождать обновление от ебаного Yii2 и добавить + * проверку типов передаваемых параметров + */ + public function beforeSave($data): bool { if (parent::beforeSave($data)) { if ($this->isNewRecord) { } $this->date = time(); - $this->writer = $this->writer ?? Yii::$app->user->identity->readId(); + $this->writer = $this->writer ?? Yii::$app->user->id; return true; } @@ -50,11 +82,25 @@ abstract class Document extends ActiveRecord return false; } + /** + * Чтение идентификатора + */ public function readId(): ?string { - return isset($this->_key) ? static::collectionName() . '/' . $this->_key : null; + return isset($this->_key) && static::collectionName() ? static::collectionName() . '/' . $this->_key : null; } + /** + * Поиск по идентификатору + */ + public static function searchById(string $_id): ?static + { + return static::findOne(['_id' => $_id]); + } + + /** + * Чтение количества записей + */ public static function readAmount(): int { return static::find()->count(); diff --git a/mirzaev/skillparts/system/models/Edge.php b/mirzaev/skillparts/system/models/Edge.php index b18950d..49a4b75 100644 --- a/mirzaev/skillparts/system/models/Edge.php +++ b/mirzaev/skillparts/system/models/Edge.php @@ -1,10 +1,17 @@ _key) ? $this : new static; + $edge = new static; // Настройка $edge->_from = $_from; @@ -77,7 +90,14 @@ abstract class Edge extends Document return $edge; } - public function beforeSave($data) + + /** + * Перед сохранением + * + * @todo Подождать обновление от ебаного Yii2 и добавить + * проверку типов передаваемых параметров + */ + public function beforeSave($data): bool { if (parent::beforeSave($data)) { if ($this->isNewRecord) { diff --git a/mirzaev/skillparts/system/models/Product.php b/mirzaev/skillparts/system/models/Product.php index 0f8c06e..a105a8f 100644 --- a/mirzaev/skillparts/system/models/Product.php +++ b/mirzaev/skillparts/system/models/Product.php @@ -1,23 +1,52 @@ 'Название (name)', + 'ocid' => 'Идентификатор 1C (ocid)', + 'catn' => 'Каталожный номер (catn)', + 'oemn' => 'OEM номера (oemn)', + // 'data' => 'Данные товара (data)', + // 'cost' => 'Цены (cost)', + // 'time' => 'Сроки доставки (time)', + 'file' => 'Документ', + 'group' => 'Группа' + ] + ); + } + + /** + * Правила + */ public function rules(): array { return array_merge( @@ -70,25 +123,13 @@ class Product extends Document ); } - public function attributeLabels(): array - { - return array_merge( - parent::attributeLabels(), - [ - 'name' => 'Название (name)', - 'ocid' => 'Идентификатор 1C (ocid)', - 'catn' => 'Каталожный номер (catn)', - 'oemn' => 'OEM номера (oemn)', - // 'data' => 'Данные товара (data)', - // 'cost' => 'Цены (cost)', - // 'time' => 'Сроки доставки (time)', - 'file' => 'Документ', - 'group' => 'Группа' - ] - ); - } - - public function import() + /** + * Импорт товаров + * + * На данный момент обрабатывает только импорт из + * файлов с расширением .excel + */ + public function import(): bool { // Инициализация массива данных $data = []; @@ -140,47 +181,15 @@ class Product extends Document return false; } - public static function search(string $text): array - { - return (new Query)->limit(10)->search('product_search', ['id' => '_key', 'catn' => 'catn'], ['catn' => $text], 1); - } - - private static function writeEdgeBetweenGroup(string $from, string $to): bool - { - // Инициализация - $edge = new SupplyEdgeSupplyGroup(); - - // Настройка - $edge->_from = $from; - $edge->_to = $to; - - // Запись - return $edge->save(); - } - - private static function writeEdgeBetweenRequisite(string $from, string $to): bool - { - // Инициализация - $edge = new SupplyEdgeRequisite(); - - // Настройка - $edge->_from = $from; - $edge->_to = $to; - - // Запись - return $edge->save(); - } - - public static function readById(string $_key): ?Product - { - return self::findOne(['_key' => $_key]); - } - /** * Поиск по каталожному номеру */ - public static function readByCatn(string $catn): ?Product + public static function searchByCatn(string $query, int $limit = 1): Product|array|null { - return self::findOne(['catn' => $catn]); + if ($limit <= 1) { + return static::findOne(['catn' => $query]); + } + + return self::find()->limit($limit)->view('product_search', ['id' => '_key', 'catn' => 'catn'], ['catn' => $query], 'START'); } } diff --git a/mirzaev/skillparts/system/models/ProductGroup.php b/mirzaev/skillparts/system/models/ProductGroup.php index 28d1527..a09fe68 100644 --- a/mirzaev/skillparts/system/models/ProductGroup.php +++ b/mirzaev/skillparts/system/models/ProductGroup.php @@ -1,26 +1,56 @@ 'Название (name)' + ] + ); + } + + /** + * Правила + */ + public function rules(): array { return array_merge( parent::rules(), @@ -34,34 +64,18 @@ class ProductGroup extends Document implements GroupInterface ); } - public function attributeLabels() + /** + * Запись члена группы + */ + public function writeMember(Product $member): ProductEdgeProductGroup { - return array_merge( - parent::attributeLabels(), - [ - 'name' => 'Название (name)', - 'onec_id' => 'Название 1C (onec_id)', - 'onec_prnt_id' => 'Название родителя 1C (onec_prnt_id)', - ] - ); - } - - public function writeMember(Document $member, string $group) - { - if (isset($member->_key)) { - return static::writeEdgeBetweenMember($member->collectionName() . '/' . $member->_key, $this->collectionName() . '/' . $group); - } - - return false; + return ProductEdgeProductGroup::write($member->readId(), $this->readId(), 'member'); } /** - * Создание дерева групп - * в параметр передаётся массив всех групп (import.xml > Классификатор > Группы) - * $groups[0]->parent - родительская группа - * $groups[0]->children - дочерние группы + * Запись рёбер групп * - * @param Group[] $groups + * Создание взаимоотношений между группами по типу древовидной системы */ public static function createTree1c($groups): Document|null { @@ -88,10 +102,11 @@ class ProductGroup extends Document implements GroupInterface } /** - * Создаём группу по модели группы CommerceML - * проверяем все дерево родителей группы, если родителя нет в базе - создаём + * Запись группы * - * @param Group $group + * Создаём группу по модели группы CommerceML + * проверяем все дерево родителей группы, + * если родителя нет в базе - создаём */ public static function createByML(Group $group): static|array|null { @@ -124,19 +139,6 @@ class ProductGroup extends Document implements GroupInterface return $model; } - private static function writeEdgeBetweenMember(string $from, string $to): bool - { - // Инициализация - $edge = new ProductEdgeProductGroup(); - - // Настройка - $edge->_from = $from; - $edge->_to = $to; - - // Запись - return $edge->save(); - } - private static function writeEdgeBetweenGroup(string $from, string $to): bool { // Инициализация diff --git a/mirzaev/skillparts/system/models/Supply.php b/mirzaev/skillparts/system/models/Supply.php index 8d2226c..3882a26 100644 --- a/mirzaev/skillparts/system/models/Supply.php +++ b/mirzaev/skillparts/system/models/Supply.php @@ -1,24 +1,46 @@ 'Данные 1C' + 'onec' => 'Данные 1С' ] ); } + /** + * После сохранения + */ public function afterSave($data, $vars): void { // Запись ребра: АККАУНТ -> ПОСТАВКА - (new AccountEdgeSupply)->write(Yii::$app->user->identity->readId(), $this->readId(), 'import'); + (new AccountEdgeSupply)->write(Yii::$app->user->id, $this->readId(), 'import'); } + /** + * Запись реквизитов из 1С + */ public function setRequisite1c($name, $value): mixed { return true; } /** - * Установка группы, где находится продукт + * Запись группы из 1С */ public function setGroup1c($group): mixed { @@ -64,23 +95,66 @@ class Supply extends Product implements ProductInterface return true; } - public static function createProperties1c($properties): mixed + /** + * Запись данных свойств по UUID 1C + * + * Ищет записанные свойства из 1C по их идентификатору и добавляет к ним + * недостающие данные. Это костыль оставшийся от реляционных баз данных + */ + public static function createProperties1c($properties): void { - return true; + // Инициализация + $models = static::searchOnecByAccountId(Yii::$app->user->id, true); + $properties = self::xml2array($properties->xml); + + foreach ($models as $model) { + // Перебор записей + + // Инициализация + $changes = false; + + foreach ($model->onec['ЗначенияСвойств'] as &$attribute) { + // Перебор аттрибутов + + foreach ($properties as $property) { + // Перебор свойств + + if ($attribute['ЗначенияСвойства']['Ид'] === $property['Свойство']['Ид']) { + // Совпадение идентификаторов + + // Объединение данных + array_merge($attribute, $property); + + // Запись индикатора наличия изменений + $changes = true; + } + } + } + + if ($changes) { + $model->save(); + } + } } + /** + * Запись параметров из 1С + */ public function setProperty1c($property): mixed { return true; } + /** + * Запись изображений из 1С + */ public function addImage1c($path, $caption): mixed { return true; } /** - * Запись ребра (предложения от поставки к продукту) + * Запись ребра (предложения от поставок к продуктам) из 1С */ public function getOffer1c($offer): SupplyEdgeProduct { @@ -89,7 +163,7 @@ class Supply extends Product implements ProductInterface // Разработчику библеотеки надо дать по жопе return new SupplyEdgeProduct; - } else if (!$catn = Product::readByCatn($this->catn)) { + } else if (!$product = Product::searchByCatn($this->catn)) { // Продукт не найден if (!$this->initProduct()) { @@ -100,12 +174,12 @@ class Supply extends Product implements ProductInterface } } - $catn = Product::readByCatn($this->catn); + $product = Product::searchByCatn($this->catn); // Запись ребра: ПОСТАВКА -> ПРОДУКТ return (new SupplyEdgeProduct)->write( $this->readId(), - $catn->readId(), + $product->readId(), 'sell', [ 'onec' => self::xml2array($offer->xml) @@ -114,26 +188,27 @@ class Supply extends Product implements ProductInterface } /** - * Создать продукт + * Запись продукта из 1С */ - public static function createModel1c($product): self + public static function createModel1c($product): ?self { // Инициализация - $model = self::readByOnecId($id = (string) $product->Ид) ?? new self; + $model = self::searchByOnecId($id = (string) $product->Ид) ?? new self; - // Настройки + // Настройка $model->ocid = $id ?? null; $model->catn = (string) $product->Артикул; $model->oemn = null; $model->onec = self::xml2array($product->xml); // Запись - $model->save(); - - return $model; + return $model->save() ? $model : null; } - protected function initProduct(): bool + /** + * Инициализация продукта + */ + protected function initProduct(): ?Product { // Надо не забыть сделать выборку полей и ручное подключение @@ -141,7 +216,7 @@ class Supply extends Product implements ProductInterface // Не передан каталожный номер return false; - } else if (Product::readByCatn($this->catn)) { + } else if (Product::searchByCatn($this->catn)) { // Продукт уже был инициализирован return true; @@ -154,34 +229,79 @@ class Supply extends Product implements ProductInterface $product->catn = $this->catn; // Запись - return $product->save(); + return $product->save() ? $product : null; } - - public function setPrice1c($price): void + /** + * Запись цены из 1С + */ + public function setPrice1c($price): mixed { + return true; } + /** + * Запись данных на случай ошибки при экспорте из 1С + */ public function setRaw1cData($cml, $object): bool { - return false; + return true; } - public static function readByOnecId(string $ocid): ?Supply + /** + * Поиск по идентификатору из 1С + * + * @param string $ocid Идентификатор из 1С + * + * @return Supply|null + */ + public static function searchByOnecId(string $ocid): ?Supply { - return self::findOne([self::getIdFieldName1c() => $ocid]); + return static::findOne([static::getIdFieldName1c() => $ocid]); } - public function getGroup1c(): SupplyGroup + /** + * Чтение группы из 1С + */ + public function getGroup1c(): ?SupplyGroup { return $this->group; } /** - * Название поля в котором хранится ID из 1C + * Чтение названия поля в котором хранится идентификатор из 1С */ public static function getIdFieldName1c(): string { return 'ocid'; } + + public static function searchOnecByAccountId(string $id, bool $full = false): array + { + $subquery = static::find() + ->for(['account', 'account_edge_supply']) + ->traversal('supply')->in('account_edge_supply') + ->where(['account._id' => $id]) + ->select('account_edge_supply') + ->createCommand(); + + $query = static::find() + ->addParams($subquery->getBindVars()) + ->let('account_edge_supply', '(' . (string) $subquery . ')') + ->where('supply._id == account_edge_supply[0]._to') + ->andWhere('supply.onec["ЗначенияСвойств"] != null'); + + if ($full) { + // Если указан полный поиск + return $query->select('supply')->all(); + } + + $query = $query->select('supply.onec["ЗначенияСвойств"]')->createCommand()->execute()->getAll(); + + foreach ($query as &$attribute) { + $attribute = $attribute->getAll(); + } + + return $query; + } } diff --git a/mirzaev/skillparts/system/models/SupplyGroup.php b/mirzaev/skillparts/system/models/SupplyGroup.php index adbeb8d..0261cc5 100644 --- a/mirzaev/skillparts/system/models/SupplyGroup.php +++ b/mirzaev/skillparts/system/models/SupplyGroup.php @@ -1,37 +1,18 @@ _from = $from; - $edge->_to = $to; - - // Запись - return $edge->save(); - } - - protected static function writeEdgeBetweenGroup(string $from, string $to): bool - { - // Инициализация - $edge = new SupplyGroupEdgeSupplyGroup(); - - // Настройка - $edge->_from = $from; - $edge->_to = $to; - - // Запись - return $edge->save(); - } } diff --git a/mirzaev/skillparts/system/views/account.php b/mirzaev/skillparts/system/views/account.php index 2fa994d..9dcc74b 100644 --- a/mirzaev/skillparts/system/views/account.php +++ b/mirzaev/skillparts/system/views/account.php @@ -1,5 +1,7 @@ @@ -11,21 +10,15 @@ use app\models\Supply;
-
-

Личный кабинет

- -

Не знаю что сюда пока добавить

+
+

Настройки аккаунта

+

Пока не сделана нормальная панель управления я просто буду добавлять все настройки сюда

'form_product_import_excel', + 'id' => 'form_profile_options', 'action' => false, 'fieldConfig' => [ 'template' => '{label}{input}', @@ -37,20 +30,26 @@ use app\models\Supply; ] ]); - $model = $model ?? new Supply; - $groups = ProfileController::readGroups(); + $model = $model ?? Yii::$app->user->identity; + var_dump($attributes = Supply::searchOnecByAccountId(Yii::$app->user->id)); + + // $list = []; + + // // + // foreach ($attributes as $attribute) { + // $id = $attribute['ЗначенияСвойства']['Ид']; + + // if (in_array($id, $list, true)) { + // continue; + // } + + // $list[] = $id; + // } ?> - - field($model, 'group', ['options' => ['class' => "mb-3"]])->dropDownList($groups ?? ['Нет данных']); ?> - field($model, 'file', ['enableLabel' => false])->fileInput(['multiple' => true, 'onChange' => 'supply_import(this.parentElement.parentElement)']) ?> - - errorSummary($model, ['header' => 'В документе были допущены ошибки:' /*, 'footer' => 'Исправьте их и попробуйте снова'*/]); ?> + field($model, 'opts[import_sections_oem]', ['options' => ['class' => "mb-3"]])->dropDownList($list ?? ['Нет данных']); ?> - -

Всего товаров:

-

Всего поставок:

diff --git a/mirzaev/skillparts/system/views/profile/sidebar.php b/mirzaev/skillparts/system/views/profile/sidebar.php new file mode 100644 index 0000000..1b7a052 --- /dev/null +++ b/mirzaev/skillparts/system/views/profile/sidebar.php @@ -0,0 +1,34 @@ + + +
+
+

Почта:

+

user->identity->mail ?>

+
+ +
+
+ Настройки аккаунта +
+
+ Управление поставками +
+
+ +
+

Товары:

+

+
+
+

Поставки:

+

+
+
\ No newline at end of file diff --git a/mirzaev/skillparts/system/views/profile/supplies.php b/mirzaev/skillparts/system/views/profile/supplies.php new file mode 100644 index 0000000..497acb5 --- /dev/null +++ b/mirzaev/skillparts/system/views/profile/supplies.php @@ -0,0 +1,51 @@ + + + +
+
+ +
+
+

Управление поставками

+ 'form_product_import_excel', + 'action' => false, + 'fieldConfig' => [ + 'template' => '{label}{input}', + 'options' => ['class' => ''] + ], + 'options' => [ + 'class' => 'mb-3', + 'onsubmit' => 'return false;' + ] + ]); + + $model = $model ?? new Supply; + $groups = ProfileController::readGroups(); + + ?> + + field($model, 'group', ['options' => ['class' => "mb-3"]])->dropDownList($groups ?? ['Нет данных']); ?> + field($model, 'file', ['enableLabel' => false])->fileInput(['multiple' => true, 'onChange' => 'supply_import(this.parentElement.parentElement)']) ?> + + errorSummary($model, ['header' => 'В документе были допущены ошибки:' /*, 'footer' => 'Исправьте их и попробуйте снова'*/]); ?> + + +
+
+
+
+ + \ No newline at end of file diff --git a/mirzaev/skillparts/system/web/debug.txt b/mirzaev/skillparts/system/web/debug.txt deleted file mode 100644 index e69de29..0000000