first commit

This commit is contained in:
2023-06-08 01:35:51 +03:00
commit 30c7844d96
7 changed files with 333 additions and 0 deletions

23
src/CGSelect.php Normal file
View File

@ -0,0 +1,23 @@
<?php
namespace Itguild\PhpCgSelect;
class CGSelect
{
protected $driver;
public function __construct(string $selector, array $options = [])
{
$this->driver = new CGSelectDriver($selector, $options);
}
public function getJS(){
return $this->driver->getJS();
}
public static function renderCDN($version = 'latest')
{
CGSelectDriver::renderCDN($version);
}
}

182
src/CGSelectDriver.php Normal file
View File

@ -0,0 +1,182 @@
<?php
namespace Itguild\PhpCgSelect;
/**
*
*/
class CGSelectDriver
{
public array $initData = [];
public string $itemsStr = '';
public string $stylesStr = '';
public string $paramsStr = '';
public string $html = '';
public string $js = '';
public function __construct(string $selector, array $options = [])
{
$this->initData['selector'] = $selector;
$this->initData = array_merge($this->initData, $options);
}
/**
* @return void
*/
public function createJS(): void
{
$this->js .= 'const dropdown = new CGSelect({';
$this->js .= $this->getParams();
$this->js .= $this->getItems();
$this->js .= $this->getStyles();
$this->js .= '});';
}
/**
* @return string
*/
public function getJS(): string
{
$this->createJS();
return $this->js;
}
/**
* @param string $version
* @return void
*/
public static function renderCDN(string $version = 'latest'): void
{
echo "<script src='https://cdn.itguild.info/items/cg-select/$version/main.js'></script>";
}
/**
* @return string
*/
public function getParams(): string
{
return $this->createParams($this->initData);
}
/**
* @param array $data
* @return string
*/
private function createParams(array $data): string
{
foreach ($data as $key => $datum) {
if (is_string($datum)) {
$this->paramsStr .= "$key: '$datum',";
}
if (is_integer($datum)) {
$this->paramsStr .= "$key: $datum,";
}
if (is_bool($datum)) {
$this->paramsStr .= "$key: $datum,";
}
}
return $this->paramsStr;
}
/**
* @param array $data
* @return string
*/
private function createParamsLocal(array $data): string
{
$paramsStr = '';
foreach ($data as $key => $datum) {
if (is_string($datum)) {
$paramsStr .= "$key: '$datum',";
}
if (is_integer($datum)) {
$paramsStr .= "$key: $datum,";
}
if (is_bool($datum)) {
$paramsStr .= "$key: $datum,";
}
}
return $paramsStr;
}
/**
* @return string|bool
*/
public function getItems(): string|bool
{
if (isset($this->initData['items'])) {
$this->createItems($this->initData['items']);
return $this->itemsStr;
}
return false;
}
/**
* @param array $data
* @return void
*/
private function createItems(array $data): void
{
$this->itemsStr .= "items: [";
foreach ($data as $datum) {
if (is_string($datum)) {
$this->itemsStr .= "'$datum',";
}
if (is_array($datum)) {
$this->itemsStr .= "{";
if (isset($datum['category']) && isset($datum['categoryItems'])) {
$this->itemsStr .= "category: '" . $datum['category'] . "',";
$this->itemsStr .= "categoryItems: [";
foreach ($datum['categoryItems'] as $item) {
if (is_string($item)) {
$this->itemsStr .= "'$item',";
}
if (is_array($item)) {
$this->itemsStr .= "{";
$this->itemsStr .= $this->createParamsLocal($item);
$this->itemsStr .= "},";
}
}
$this->itemsStr .= "],";
} else {
$this->itemsStr .= $this->createParamsLocal($datum);
}
$this->itemsStr .= "},";
}
}
$this->itemsStr .= "],";
}
/**
* @return string|bool
*/
public function getStyles(): string|bool
{
if (isset($this->initData['styles'])) {
$this->createStyle($this->initData['styles']);
return $this->stylesStr;
}
return false;
}
/**
* @param array $styles
* @return void
*/
public function createStyle(array $styles): void
{
$this->stylesStr .= "styles: {";
foreach ($styles as $key => $style) {
$this->stylesStr .= "$key: {" . $this->createParamsLocal($style) . "}";
}
$this->stylesStr .= "},";
}
}