如何在订单合同中存储一系列产品合同
How to store in an orders contract an array of products contract
我是 solidity 和整个区块链概念的新手,我正在尝试做一个简单的电子商务网站,用户可以在其中 select 一些产品,将它们放入购物车并下订单.
问题是我不知道如何进行这项工作。我正在尝试使用包含一系列产品的模拟订单来初始化订单合同,但我收到如下类型错误:
“TypeError:成员“createProduct”在类型(合同产品)中进行参数相关查找后未找到或不可见。”
这是我的Products.sol
pragma solidity ^0.5.0;
contract Products {
uint256 public productsCount = 0;
struct Product {
uint256 id;
string name;
string category;
int256 price;
}
mapping(uint256 => Product) public products;
event ProductCreated(
uint256 id,
string name,
string category,
int256 price
);
event ProductEdited(uint256 id, string name, string category, int256 price);
event ProductDeleted(
uint256 id,
string name,
string category,
int256 price
);
constructor() public {
createProduct("Test", "Test", 53);
}
function createProduct(
string memory _name,
string memory _category,
int256 _price
) public {
productsCount++;
products[productsCount] = Product(
productsCount,
_name,
_category,
_price
);
emit ProductCreated(productsCount, _name, _category, _price);
}
function editProduct(
uint256 _id,
string memory _name,
string memory _category,
int256 _price
) public {
Product memory _product = products[_id];
_product.name = _name;
_product.category = _category;
_product.price = _price;
products[_id] = _product;
emit ProductEdited(_id, _name, _category, _price);
}
function deleteProduct(uint256 _id) public {
Product memory _product = products[_id];
delete products[_id];
productsCount--;
emit ProductDeleted(
_id,
_product.name,
_product.category,
_product.price
);
}
}
这是我的 Orders.sol
pragma solidity ^0.5.0;
import "./Products.sol";
contract Orders {
uint256 public ordersCount = 0;
struct Order {
uint256 id;
int256 totalPrice;
string date;
Products[] products;
}
mapping(uint256 => Order) public orders;
constructor() public {
createOrder(
150,
"01.01.2021",
[Products.createProduct("name", "category", 1)]
);
}
function createOrder(
int256 _totalPrice,
string memory _date,
Products[] memory _products
) public {
ordersCount++;
orders[ordersCount] = Order(ordersCount, _totalPrice, _date, _products);
}
}
可能是个简单的问题,但我以前从未使用过solidity,youtube上的所有教程都太简单了,没有解释这种嵌套数据。
非常感谢您的帮助:D
我认为错误在于您按原样对待合同 类。
要从另一个合约访问一个合约,你必须用它的地址实例化它。
您可以将产品id存储在订单合约中,当您需要获取产品信息时与产品合约进行交互。
如果你想创建带有订单合同的产品,你应该这样做
function createProduct(address addr) public {
Products p = Products(addr);
p.createProduct("name", "category", 1);
}
你的 createProduct
方法 return 什么都没有。正是出于这个原因,它不起作用。你可以改变你的方法,比如
function createProduct(
string memory _name,
string memory _category,
int256 _price
) public returns (Product) {
productsCount++;
products[productsCount] = Product(
productsCount,
_name,
_category,
_price
);
emit ProductCreated(productsCount, _name, _category, _price);
return products[productsCount];
}
或者您可以创建另一个方法来调用 createProduct
来创建产品,然后 return 它。
我是 solidity 和整个区块链概念的新手,我正在尝试做一个简单的电子商务网站,用户可以在其中 select 一些产品,将它们放入购物车并下订单.
问题是我不知道如何进行这项工作。我正在尝试使用包含一系列产品的模拟订单来初始化订单合同,但我收到如下类型错误:
“TypeError:成员“createProduct”在类型(合同产品)中进行参数相关查找后未找到或不可见。”
这是我的Products.sol
pragma solidity ^0.5.0;
contract Products {
uint256 public productsCount = 0;
struct Product {
uint256 id;
string name;
string category;
int256 price;
}
mapping(uint256 => Product) public products;
event ProductCreated(
uint256 id,
string name,
string category,
int256 price
);
event ProductEdited(uint256 id, string name, string category, int256 price);
event ProductDeleted(
uint256 id,
string name,
string category,
int256 price
);
constructor() public {
createProduct("Test", "Test", 53);
}
function createProduct(
string memory _name,
string memory _category,
int256 _price
) public {
productsCount++;
products[productsCount] = Product(
productsCount,
_name,
_category,
_price
);
emit ProductCreated(productsCount, _name, _category, _price);
}
function editProduct(
uint256 _id,
string memory _name,
string memory _category,
int256 _price
) public {
Product memory _product = products[_id];
_product.name = _name;
_product.category = _category;
_product.price = _price;
products[_id] = _product;
emit ProductEdited(_id, _name, _category, _price);
}
function deleteProduct(uint256 _id) public {
Product memory _product = products[_id];
delete products[_id];
productsCount--;
emit ProductDeleted(
_id,
_product.name,
_product.category,
_product.price
);
}
}
这是我的 Orders.sol
pragma solidity ^0.5.0;
import "./Products.sol";
contract Orders {
uint256 public ordersCount = 0;
struct Order {
uint256 id;
int256 totalPrice;
string date;
Products[] products;
}
mapping(uint256 => Order) public orders;
constructor() public {
createOrder(
150,
"01.01.2021",
[Products.createProduct("name", "category", 1)]
);
}
function createOrder(
int256 _totalPrice,
string memory _date,
Products[] memory _products
) public {
ordersCount++;
orders[ordersCount] = Order(ordersCount, _totalPrice, _date, _products);
}
}
可能是个简单的问题,但我以前从未使用过solidity,youtube上的所有教程都太简单了,没有解释这种嵌套数据。
非常感谢您的帮助:D
我认为错误在于您按原样对待合同 类。
要从另一个合约访问一个合约,你必须用它的地址实例化它。
您可以将产品id存储在订单合约中,当您需要获取产品信息时与产品合约进行交互。
如果你想创建带有订单合同的产品,你应该这样做
function createProduct(address addr) public {
Products p = Products(addr);
p.createProduct("name", "category", 1);
}
你的 createProduct
方法 return 什么都没有。正是出于这个原因,它不起作用。你可以改变你的方法,比如
function createProduct(
string memory _name,
string memory _category,
int256 _price
) public returns (Product) {
productsCount++;
products[productsCount] = Product(
productsCount,
_name,
_category,
_price
);
emit ProductCreated(productsCount, _name, _category, _price);
return products[productsCount];
}
或者您可以创建另一个方法来调用 createProduct
来创建产品,然后 return 它。