Cytat(nospor @ 12.01.2023, 12:50:37 )

Czemu w config tworzysz/zaciagasz DB i Product i PageDisplay?
Tak mi się wydawało rozsądnie na bazie tego co przerobiłem ze wspomnianej nie raz książki, której przerobienia teraz żałuję. A gdzie mam wtedy zaciągać DB i PageDisplay (Product na razie powstało ale nic jeszcze nie robi

)? W index.php ?
Cytat(nospor @ 12.01.2023, 12:50:37 )

No i skoro PageDisplay zarzadza caloscia, to $db masz przekazac do PageDisplay, to wtedy rzeczy w PageDisplay beda widziec $db. No to sa podstawy z Zasiegu Zmiennych
https://www.php.net/manual/en/language.variables.scope.phpZasięg zmiennych to jeszcze ogarniam. Chyba... :| Ale zaraz to się wyjaśnie jak opiszę moją strukturę.
Tak więc w index.php mam niewiele:
use nameOne\PageDisplay;
use nameOne\DB;
require('pagefiles/config.php');
$displayPage = new PageDisplay($_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], $db);
$displayPage->decideOnContent();
w configu definuję stałe do DB (to dobre miejsce na to , tak?) oraz zaciągam DB.php oraz PageDisplay.php.
Teraz PageDisplay wg mojego założenia miała sprawdzać którą z dwóch podstron wybrano (liste produktów lub dodawanie produktu). W index.php ją wywołuję i przekazuję w parametrach $request oraz $db. Jeszcze nie zabrałem się za jej porządkowanie, więc wiem że idzie zwymiotować jak się na nią patrzy. Tak - zaciąga stałe a nie powinna, ma w sobie $_POST a powinna go dostać w parametrze. Wiem to wszystko już, i zamierzam ją oczyścić. A zacząłem od $db.
Wygląda ona tak:
namespace nameOne;
class PageDisplay
{
private $request;
private array $recordsIds; private $db;
public function __construct($request, $db)
{
$this->db = $db;
$requestString = explode("?", $request); $this->request = $requestString[0];
}
public function decideOnContent()
{
if (!$this->request) {
return;
}
switch ($this->request) {
case PRODUCT_LIST_LANDING . '/':
$title = 'Product List';
$pageContent = "ProductList";
include("ProductList.php");
if (isset($_POST['mass_delete']) && isset($_POST['product_check'])) { $this->massDelete($_POST['product_check']);
}
break;
case PRODUCT_ADD_LANDING:
$title = 'Product Add';
$pageContent = "ProductAdd";
include("ProductAdd.php");
if (isset($_POST['save']) && isset($_POST['sku'])) { $productObject = new ProductAdd($db);
if (!$productObject->checkExistingSKU($_POST['sku'])) {
$productObject->insertNewProduct();
}
header("Location:http://" . PRODUCT_LIST_LANDING
); }
break;
default:
$title = 'Product List';
$pageContent = "ProductList";
include("ProductList.php");
break;
}
$this->displayHeader($title);
require('views/' . $pageContent . '.view.php');
$this->displayFooter();
}
public static function displayHeader
($title) {
require_once("views/html/header.html");
}
public static function displayFooter
() {
require_once("views/html/footer.html");
}
//nie miałem pomysłu gdzie ta metoda ma być, czy jako oddzielna klasa, czy jak...
private function massDelete
(array $recordsIds) {
$this->db->query("DELETE FROM `product_property` WHERE `product_property`.`product_id` IN ($idsToDel)");
$this->db->execute();
$this->db->query("DELETE FROM `product` WHERE `product`.`id` IN ($idsToDel)");
$this->db->execute();
}
}
Teraz jak widać switch decyduje o tym (poprzez include) która strona ma się wyświetlić. Nie wiem czy chcę się tutaj dzielić ProductAdd.php i ProductList.php bo tam to już jest kompletny p1erdolnik i mi wstyd :|
EDIT:
to moje ProductList.php
Chyba nie wygląda jeszcze, aż tak źle, żeby mnie postawić przed ścianą egzekucyjną.
namespace nameOne;
class ProductList
{
private $db;
public function __construct($db){
$this->db = $db;
}
public function listProducts()
{
$products = $this->getProducts();
return $products;
}
private function getProducts
(): array {
// $db = new DB();
$this->db->query("SELECT product.id prodId, product.sku, product.name, product.price, property.id, property.type, property.property, property.label, product_property.id, product_property.value FROM product_property INNER JOIN property ON product_property.property_id = property.id INNER JOIN product ON product_property.product_id = product.id ORDER BY product.id DESC
");
$results = $this->db->resultSet();
return $results;
}
public function listGroupedProducts
(): array {
foreach ($this->listProducts() as $row) {
$pid = $row['sku'];
if (!isset($products[$pid])) { $products[$pid] = array('name' => $row['name'], 'price' => $row['price'], 'id' => $row['prodId'], 'properties' => array()); }
if (!empty($row['value'])) { $products[$pid]['properties'][] = array('value' => $row['value'], 'label' => $row['label']); }
}
return $products;
}