Ok, to ProductList wkleiłem wyżej a tutaj największy burdel - ProductAdd. Zaznaczam, że jeszcze tutaj jest zupełnie przed czyszczeniem tych klas - używają $_POST wewnątrz, nie ma konstruktorów, setter/getter itd. Nie ma wszędzie typowania zmiennych czy tego co ma zwracać metoda. To wszystko do poprawienia jeszcze.
namespace nameOne;
use Product;
class ProductAdd extends Product
{
private $db;
public function __construct($db){
$this->$db = $db;
}
public function listProperties()
{
$properties = $this->getDistinctProperties();
return $properties;
}
private function getDistinctProperties()
{
// $db = new DB();
$this->db->query("SELECT DISTINCT type FROM property ORDER BY type ASC");
$results = $this->db->resultSet();
return $results;
}
public function listFullProperties()
{
$properties = $this->getFullProperties();
return $properties;
}
private function getFullProperties()
{
// $db = new DB();
$this->db->query("SELECT * FROM property ORDER BY type ASC");
$results = $this->db->resultSet();
return $results;
}
public function groupFullProperties
(): array {
foreach ($this->getFullProperties() as $row) {
$property = $row['property'];
$newProperty = $row['type'];
if (!isset($properties[$newProperty])) { $properties[$newProperty] = array(); }
$properties[$newProperty][] = [
'id' => $row['id'],
'property' => $property,
'label' => $row['label'],
'description' => $row['description']
];
}
return $properties;
}
public function checkExistingSKU(string $skuToCheck)
{
// $db = new DB();
$this->db->query("SELECT sku FROM product WHERE sku = :sku");
$this->db->bind(':sku', $skuToCheck);
if ($this->db->single()) {
return true;
}
return false;
}
public function insertNewProduct()
{
if ($this->ensureNoEmpytValues() === false)
return false;
// $db = new DB();
$sku = $this->sku;
$productName = $this->productName;
$price = $this->price;
$selectedType = $this->productType;
$properties = $this->groupFullProperties();
foreach ($properties[$selectedType] as $propertyData) {
$postIndex = $propertyData['property'];
if (empty($_POST[$postIndex])) return false;
}
$queryInsertProduct = "INSERT INTO `product` (`id`, `sku`, `name`, `price`, `type`) VALUES (null, :sku, :productName , :price, :selectedType)";
$this->db->query($queryInsertProduct);
$this->db->bind(':sku', $sku);
$this->db->bind(':productName', $productName);
$this->db->bind(':price', $price);
$this->db->bind(':selectedType', $selectedType);
$this->db->execute();
$lastProductId = $this->db->lastInsertId();
foreach ($properties[$selectedType] as $propertyData) {
$propertyId = (int) $propertyData['id'];
$productValue = $_POST[(string) $propertyData['property']];
$queryInsertProductProperty = "INSERT INTO `product_property` (`id`, `product_id`, `property_id`, `value`) VALUES (null, $lastProductId , $propertyId, :productValue )";
$this->db->query($queryInsertProductProperty);
$this->db->bind(':productValue', $productValue);
$this->db->execute();
}
}
}
No i Product.php. Jednak coś tam robi. Nawet zapomniałem, że to napisałem.
class Product
{
public $productName;
public $sku;
public $price;
public $productType;
public function __construct()
{
$this->productName = isset($_POST['name']) ?
(string
) $_POST['name'] : null; $this->sku = isset($_POST['sku']) ?
(string
) $_POST['sku'] : null; $this->price = isset($_POST['price']) ?
(float
) $_POST['price'] : null; $this->productType = isset($_POST['productType']) ?
(string
) $_POST['productType'] : null; }
function ensureNoEmpytValues()
{
if (empty($this->productName) || empty($this->sku) || empty($this->price) || empty($this->productType)) return false;
return true;
}
}
EDIT:
Cytat(nospor @ 12.01.2023, 13:14:44 )

Gorzej juz nie bedzie pokazuj, a potrzebuje tego by widziec co z tym $db dalej robic
No dobra, tu masz blad
$productObject = new ProductAdd($db);
przeciez nie $db a $this->db
$productObject = new ProductAdd($this->db);
zakladam ze z produktList jest podobnie
A no tak, przecież $db to ona jest w index, a wewnątrz klasy to już jest $this->db (IMG:
style_emoticons/default/smile.gif)
Lecę na zakupy na obiad i za 45 minut zabieram się za porządkowanie tego bałaganu. Czy w międzyczasie byłbyś uprzejmy mi z grubsza opisać jak naprawić konstrukcję tej strony, żeby choć przypominała jakiś wzorzec projektowy? W którym miejscu najlepiej porobić setter/getter żeby wykazać że wiem o co w nich chodzi (wymóg projektu)? Jest tu jakaś klasa z której można zrobić abstrakcyjną i byloby to uzasadnione?
Ten post edytował sadistic_son 12.01.2023, 13:20:29