*/ final class ItemMapper extends DataMapperFactory { /** * Columns. * * @var array * @since 1.0.0 */ public const COLUMNS = [ 'itemmgmt_item_id' => ['name' => 'itemmgmt_item_id', 'type' => 'int', 'internal' => 'id'], 'itemmgmt_item_no' => ['name' => 'itemmgmt_item_no', 'type' => 'string', 'internal' => 'number', 'autocomplete' => true], 'itemmgmt_item_status' => ['name' => 'itemmgmt_item_status', 'type' => 'int', 'internal' => 'status'], 'itemmgmt_item_stockidentifier' => ['name' => 'itemmgmt_item_stockidentifier', 'type' => 'int', 'internal' => 'stockIdentifier'], 'itemmgmt_item_info' => ['name' => 'itemmgmt_item_info', 'type' => 'string', 'internal' => 'info'], 'itemmgmt_item_salesprice' => ['name' => 'itemmgmt_item_salesprice', 'type' => 'Serializable', 'internal' => 'salesPrice'], 'itemmgmt_item_purchaseprice' => ['name' => 'itemmgmt_item_purchaseprice', 'type' => 'Serializable', 'internal' => 'purchasePrice'], 'itemmgmt_item_parent' => ['name' => 'itemmgmt_item_parent', 'type' => 'int', 'internal' => 'parent'], 'itemmgmt_item_unit' => ['name' => 'itemmgmt_item_unit', 'type' => 'int', 'internal' => 'unit'], 'itemmgmt_item_createdat' => ['name' => 'itemmgmt_item_createdat', 'type' => 'DateTimeImmutable', 'internal' => 'createdAt'], ]; /** * Primary table. * * @var string * @since 1.0.0 */ public const TABLE = 'itemmgmt_item'; /** * Primary field name. * * @var string * @since 1.0.0 */ public const PRIMARYFIELD = 'itemmgmt_item_id'; /** * Has many relation. * * @var array * @since 1.0.0 */ public const HAS_MANY = [ 'files' => [ 'mapper' => MediaMapper::class, /* mapper of the related object */ 'table' => 'itemmgmt_item_media', /* table of the related object, null if no relation table is used (many->1) */ 'external' => 'itemmgmt_item_media_media', 'self' => 'itemmgmt_item_media_item', ], 'notes' => [ 'mapper' => EditorDocMapper::class, /* mapper of the related object */ 'table' => 'itemmgmt_item_note', /* table of the related object, null if no relation table is used (many->1) */ 'external' => 'itemmgmt_item_note_doc', 'self' => 'itemmgmt_item_note_item', ], 'l11n' => [ 'mapper' => ItemL11nMapper::class, 'table' => 'itemmgmt_item_l11n', 'self' => 'itemmgmt_item_l11n_item', 'external' => null, ], 'attributes' => [ 'mapper' => ItemAttributeMapper::class, 'table' => 'itemmgmt_item_attr', 'self' => 'itemmgmt_item_attr_item', 'external' => null, ], 'container' => [ 'mapper' => ContainerMapper::class, 'table' => 'itemmgmt_item_container', 'self' => 'itemmgmt_item_container_item', 'external' => null, ], ]; /** * Get the item list * * @param string $language Language * * @return array * * @todo experimental (not 100% working) * * @since 1.0.0 */ public static function getItemList(string $language) : array { // items $query = <<con->query($query); if ($q === false) { return []; } $itemsResult = $q->fetchAll() ?? []; $items = []; foreach ($itemsResult as $res) { $media = null; if ($res['media_id'] !== null) { $mediaType = new MediaType(); $mediaType->id = $res['media_type_id']; $mediaType->name = $res['media_type_name']; $media = new Media(); $media->id = $res['media_id']; $media->setPath($res['media_file']); } $item = new Item(); $item->id = $res['itemmgmt_item_id']; $item->number = $res['itemmgmt_item_no']; $item->salesPrice->setInt($res['itemmgmt_item_salesprice']); if ($media !== null) { $item->files[$media->id] = $media; } $items[$item->id] = $item; } // l11ns $query = <<con->prepare($query); $sth->execute(['lang' => $language]); $l11nsResult = $sth->fetchAll(); foreach ($l11nsResult as $res) { $l11nType = new BaseStringL11nType(); $l11nType->id = $res['itemmgmt_item_l11n_typeref']; $l11nType->title = $res['itemmgmt_item_l11n_type_title']; $l11n = new BaseStringL11n(); $l11n->id = $res['itemmgmt_item_l11n_id']; $l11n->ref = $res['itemmgmt_item_id']; $l11n->type = $l11nType; $l11n->content = $res['itemmgmt_item_l11n_description']; $l11n->language = $res['itemmgmt_item_l11n_lang']; $items[$l11n->ref]->addL11n($l11n); } return $items; } }