Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Ассоциативные многомерные массивы для страницы товара с кнопкой предзаказа (https://javascript.ru/forum/misc/73002-associativnye-mnogomernye-massivy-dlya-stranicy-tovara-s-knopkojj-predzakaza.html)

Mikael86 13.03.2018 00:24

Ассоциативные многомерные массивы для страницы товара с кнопкой предзаказа
 
Доброго времени суток, я являюсь полным нубом в JS, но возникла необходимость разбираться в боевых условиях. На 3-й день понял что не справлюсь сам и решил отписаться тут, может что-то подскажете.

Есть массив имеющий вид:
список товаров -> общее описание, и в общем описании строка с вторичным массовом технических характеристик, количество которых может отличаться
var cmodels = {
                            "id1" : {
                            "Название" : "",
                            "Описание" : "",
                            "Изображение" : "",
                            "Цена" : "",

                            "Param" : {
                                                 "ТХ1" : "",
                                                 "ТХ2" : "",
                                                 "ТХ3" : "",
                                                 "ТХ4" : "",
                                                 "ТХ5" : ""
                                          }
},


Изначально я хотел делать массив в виде список->товар->значение с обработчиком.
Но такой вариант не прокатил потому что там где переменная ттх отсутствовала мне выдавало текст с надпистью undefined, что логично.
теперь я хочу чтоб ТТХ были отдельным массивом считываемым полностью внутри массива основного.

//Массив начало//
var cmodels = {
    "idcmodels1" : {
    "Название" : "",
    "Описание" : "<p></p>",
    "Изображение" : "",
    "Цена" : "",
    "ТТХ1" : "<li></li>",
    "ТТХ2" : "<li></li>",
    "ТТХ3" : "<li></li>",
    "ТТХ4" : "<li></li>",
    "ТТХ5" : "<li></li>"   
  }
};
//Массив конец//

//Вывод в консоль//
console.log(cmodels);

//Вывод на страницу//
  var out = '';
  for (var key in cmodels)
  {
    out+= '<h5>'+cmodels[key].Название+'</h5>';
    out+= '<p>'+cmodels[key].Описание+'</p>';
    out+= '<p>'+cmodels[key].Цена+'</p>';
    out+= '<ul>';
    out+= '<img" src="';
    out+= cmodels[key].Изображение;
    out+= '">';
    out+= cmodels[key].ТТХ1;
    out+= cmodels[key].ТТХ2;
    out+= cmodels[key].ТТХ3;
    out+= cmodels[key].ТТХ4;
    out+= cmodels[key].ТТХ5;
  }
document.getElementById('out').innerHTML = out;
.

Ещё нужно иметь возможность резать массив чтоб можно было вставить обработчик в 2 блока и вывести часть товара в одной половине экрана и часть в другой, чтото типа var cmodelsfirst = cmodels.slice(1, 3);

или если подскажите как можно-ли вызвать данные частично через for или while по ключу
(может есть какая то комбинация как в php).

for ($row = 0; $row < 4; $row++) {
foreach($cmodels[$row] as $key => $value)
{}
};


также нужно добавить в список кнопку с id товара по которой будет открываться блок фиксированный в центре экрана с формой обратной связи и описанием товара автоматом вставляемого в эту форму и отсылаемого на почту

чтото типо этого но тут тоже непонятка как вставить именно нужные данные в div по id и главное как грамотно это прописать
window.onload= function() {
	document.getElementById('toggler').onclick = function() {
			openbox('box', this);
			return false;
	};
};

function openbox(id, toggler) {
	var div = document.getElementById(id);
	if(div.style.display == 'block') {
			div.style.display = 'none';
			toggler.innerHTML = '<i class="fa fa-bars fa-2x" 
                                                        aria-hidden="true"></i>';
	}
	else {
			div.style.display = 'block';
			toggler.innerHTML = '<i class="fa fa-times fa-2x" 
                                                          aria-hidden="true"></i>';

	}

}

Вообщем если не сложно или кто-то сталкивался с подобным киньте упрощённый пример или подскажите что можно почитать в этом направлении. Заранее благодарен.

ksa 13.03.2018 08:53

Цитата:

Сообщение от Mikael86
подскажите что можно почитать в этом направлении

Может подойти любая книга по роектированию БД... ;)

рони 13.03.2018 09:13

Mikael86,
:write:
"Param": [{
    title: "",
    content: ""
}, {
    title: "",
    content: ""
}, {
    title: "",
    content: ""
}, {
    title: "",
    content: ""
}]

Mikael86 13.03.2018 18:25

А что даст дополнительная квадратная скобка во вторичном массиве?

Есть одна мысль, проверю её отпишусь с результатом, но проблемма грамотного обработчика осталась. Если что выложу что получиться.

И по поводу изучения баз данных это хорошо, но я так понимаю MySql это больше по PHP и нагружает сервер, а если делать через JS то нагрузка на комп пользователя, да и в JS привязать вывод окна заказа с товаром. К тому же как я говорил учу в бою, по ночам, после основной работы которая с программированием абсолютно не совместима, времени мало чтоб полноценно читать, хотелось бы короткий ответ с примерами.

laimas 13.03.2018 18:56

Цитата:

Сообщение от Mikael86
но я так понимаю MySql это больше по PHP и нагружает сервер

То есть есть все делать на клиенте, то и запроса к базе не будет? Вы в любом случае будете тревожить базу. Но только MySQL не сможет вам выдать готовое дерево, если вы этого хотите. Но зато он может подготовить данные в виде, которое позволит получить дерево на клиенте меньшей кровью.

И в JS нет ассоциативных массивов.

Mikael86 14.03.2018 22:49

Решил через PHP и плагин JS magnificPopup
По итогам на данный момент имеем массив вида
$cmodels = array(
        array(
                "Название" => '',
                "Описание" => '<p></p>',
                "Изображение" => '',
                "Цена" => '',
                "ТТХ1" => '<li></li>',
                "ТТХ2" => '<li></li>',
                "ТТХ3" => '<li></li>',
                "ТТХ4" => '<li></li>',
                "ТТХ5" => '<li>Цветной дисплей/li>',
                "CmodelsId" => 'CmodelsId1'
                ),
);


И обработчик корявый и обьёмный, но рабочий
for ($row = 4; $row < 10; $row++) {
foreach($cmodels[$row] as $key => $value)
    {
      $counter = 1;
      echo '<div class="row">' ;
      echo '<div class="col-1"></div>' ;
      echo '<div class="col-10">' ;
      echo '<center>' . '<h5>' . $cmodels[$row]["Название"] . '</h5>' . '</center>';
      echo '<p>' . $cmodels[$row]["Описание"] . '</p>';
      echo '</div>';
      echo '<div class="col-1"></div>' ;
      echo '<div class="col-12">' ;
      echo '<p>' . $cmodels[$row]["Цена"] . '</p>';

      echo '<ul>';
      echo '<img class="RightImg30" src="'; echo $cmodels[$row]["Изображение"]; echo '">';
      echo $cmodels[$row]["ТТХ1"]; echo $cmodels[$row]["ТТХ2"]; echo $cmodels[$row]["ТТХ3"];
      echo $cmodels[$row]["ТТХ4"]; echo $cmodels[$row]["ТТХ5"]; echo $cmodels[$row]["ТТХ6"];
      echo $cmodels[$row]["ТТХ7"]; echo $cmodels[$row]["ТТХ8"]; echo $cmodels[$row]["ТТХ9"];
      echo $cmodels[$row]["ТТХ10"]; echo $cmodels[$row]["ТТХ11"]; echo $cmodels[$row]["ТТХ12"];
      echo $cmodels[$row]["ТТХ13"]; echo $cmodels[$row]["ТТХ14"]; echo $cmodels[$row]["ТТХ15"];
      echo $cmodels[$row]["ТТХ16"]; echo $cmodels[$row]["ТТХ17"]; echo $cmodels[$row]["ТТХ18"];
      echo $cmodels[$row]["ТТХ19"]; echo $cmodels[$row]["ТТХ20"]; echo $cmodels[$row]["ТТХ21"];
      echo $cmodels[$row]["ТТХ22"]; echo '</ul>';

      echo '<a class="BuyButton popup-with-zoom-anim" href="#'; echo $cmodels[$row]["CmodelsId"]; echo '">открыть</a>';

      echo '</div>';
      echo '</div>';

      echo '<div id="'; echo $cmodels[$row]["CmodelsId"]; echo '" class="popup-window zoom-anim-dialog mfp-hide">' ;
      echo '<center><h4>'; echo $cmodels[$row]["Название"]; echo '</h4></center>';

      echo '<ul>';
      echo '<img class="RightImg30" src="'; echo $cmodels[$row]["Изображение"]; echo '">';
      echo $cmodels[$row]["ТТХ1"]; echo $cmodels[$row]["ТТХ2"]; echo $cmodels[$row]["ТТХ3"];
      echo $cmodels[$row]["ТТХ4"]; echo $cmodels[$row]["ТТХ5"]; echo $cmodels[$row]["ТТХ6"];
      echo $cmodels[$row]["ТТХ7"]; echo $cmodels[$row]["ТТХ8"]; echo $cmodels[$row]["ТТХ9"];
      echo $cmodels[$row]["ТТХ10"]; echo $cmodels[$row]["ТТХ11"]; echo $cmodels[$row]["ТТХ12"];
      echo $cmodels[$row]["ТТХ13"]; echo $cmodels[$row]["ТТХ14"]; echo $cmodels[$row]["ТТХ15"];
      echo $cmodels[$row]["ТТХ16"]; echo $cmodels[$row]["ТТХ17"]; echo $cmodels[$row]["ТТХ18"];
      echo $cmodels[$row]["ТТХ19"]; echo $cmodels[$row]["ТТХ20"]; echo $cmodels[$row]["ТТХ21"];
      echo $cmodels[$row]["ТТХ22"]; echo '</ul>';

      echo '<div class="SeparateRow"></div>';
      echo '<form id="form">';
      echo '<div class="container"><div class="row">';
      echo '<div class=" col-md-12 col-lg-4">';
      echo '<input type="text" name="nameBuyform" required="required" placeholder="Как к вам обращаться"/>';
      echo '</div><div class=" col-md-12 col-lg-4">';
      echo '<input type="text" name="phoneBuyform" required="required" placeholder="Ваш телефон"/>';
      echo '</div><div class=" col-md-12 col-lg-4">';
      echo '<input type="text" name="mailBuyform" required="required" placeholder="Адресс электронной почты"/>';
      echo '<input type="submit" value="Заказать звонок"/>';
      echo '</div>';
      echo '</div></div>';
      echo '</form>';
      echo '</div>';

      $counter ++;
      if ($counter>1) break; //количество товаров
    }
}

Для того чтоб вызывать всплывающие окна использовано

В Head сайта
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/magnific-popup.js/1.1.0/magnific-popup.min.css" integrity="sha256-PZLhE6wwMbg4AB3d35ZdBF9HD/dI/y4RazA3iRDurss=" crossorigin="anonymous" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/magnific-popup.js/1.1.0/jquery.magnific-popup.min.js" integrity="sha256-P93G0oq6PBPWTP1IR8Mz/0jHHUpaWL0aBJTKauisG7Q=" crossorigin="anonymous"></script>

Так же небольшая стилизация css контейнера всплывающего окна

и скрипт инициализатор под обработчиками массивов
$(document).ready(function() {
	$('.popup-with-zoom-anim').magnificPopup({
		type: 'inline',

		fixedContentPos: true,
		fixedBgPos: true,

		overflowY: 'auto',

		closeBtnInside: true,
		preloader: false,

		midClick: true,
		removalDelay: 300,
		mainClass: 'my-mfp-zoom-in'
	});

	$('.popup-with-move-anim').magnificPopup({
		type: 'inline',

		fixedContentPos: true,
		fixedBgPos: true,

		overflowY: 'auto',

		closeBtnInside: true,
		preloader: false,

		midClick: true,
		removalDelay: 300,
		mainClass: 'my-mfp-slide-bottom'
	});
});

PHP как и JS ток начал учить, так что за кривизну кода не бейте. Осталось вживить в этот конструктив форму обратной связи с данными для обратной связи и передачей полного описания товара поставщику, но вдруг кому то пригодиться в таком виде.

j0hnik 14.03.2018 23:25

Mikael86,
В PHP циклы пока не изобрели еще?
Хорошо что не начал его изучать ;)

Nexus 15.03.2018 00:18

Цитата:

Сообщение от j0hnik
В PHP циклы пока не изобрели еще?

Тс же использует "for" и "foreach"...

j0hnik 15.03.2018 00:34

Nexus,
echo $cmodels[$row]["ТТХ1"]; echo $cmodels[$row]["ТТХ2"]; echo $cmodels[$row]["ТТХ3"];
      echo $cmodels[$row]["ТТХ4"]; echo $cmodels[$row]["ТТХ5"]; echo $cmodels[$row]["ТТХ6"];
      echo $cmodels[$row]["ТТХ7"]; echo $cmodels[$row]["ТТХ8"]; echo $cmodels[$row]["ТТХ9"];
      echo $cmodels[$row]["ТТХ10"]; echo $cmodels[$row]["ТТХ11"]; echo $cmodels[$row]["ТТХ12"];
      echo $cmodels[$row]["ТТХ13"]; echo $cmodels[$row]["ТТХ14"]; echo $cmodels[$row]["ТТХ15"];
      echo $cmodels[$row]["ТТХ16"]; echo $cmodels[$row]["ТТХ17"]; echo $cmodels[$row]["ТТХ18"];
      echo $cmodels[$row]["ТТХ19"]; echo $cmodels[$row]["ТТХ20"]; echo $cmodels[$row]["ТТХ21"];
      echo $cmodels[$row]["ТТХ22"];


Я вот про это. Тут явно повторяющийся код.

laimas 15.03.2018 06:03

Цитата:

Сообщение от j0hnik
В PHP циклы пока не изобрели еще?

PHP намного богаче инструментарием обработки данных, а уж табличных тем более. Но эти портянки не следствие бедности ЯП, такое можно было бы наблюдать и на клиенте, и не потому, что JS беден, а потому, что не думали надо представлением данных.

Mikael86 15.03.2018 19:27

Цитата:

Сообщение от j0hnik (Сообщение 480566)
Nexus,
echo $cmodels[$row]["ТТХ1"]; echo $cmodels[$row]["ТТХ2"]; echo $cmodels[$row]["ТТХ3"];
      echo $cmodels[$row]["ТТХ4"]; echo $cmodels[$row]["ТТХ5"]; echo $cmodels[$row]["ТТХ6"];
      echo $cmodels[$row]["ТТХ7"]; echo $cmodels[$row]["ТТХ8"]; echo $cmodels[$row]["ТТХ9"];
      echo $cmodels[$row]["ТТХ10"]; echo $cmodels[$row]["ТТХ11"]; echo $cmodels[$row]["ТТХ12"];
      echo $cmodels[$row]["ТТХ13"]; echo $cmodels[$row]["ТТХ14"]; echo $cmodels[$row]["ТТХ15"];
      echo $cmodels[$row]["ТТХ16"]; echo $cmodels[$row]["ТТХ17"]; echo $cmodels[$row]["ТТХ18"];
      echo $cmodels[$row]["ТТХ19"]; echo $cmodels[$row]["ТТХ20"]; echo $cmodels[$row]["ТТХ21"];
      echo $cmodels[$row]["ТТХ22"];


Я вот про это. Тут явно повторяющийся код.

Как я говорил я пока ещё полный нуб, так что код кривой, но на данный момент это хотя бы какое то решение задачи. Я вообще хотел решить через JS, но понятного мне ответа не получил, разрулил как смог. Скинул на тот случай если ктото будет биться головой об стол над подобной задачкой.

laimas 15.03.2018 19:34

Цитата:

Сообщение от Mikael86
Скинул на тот случай если ктото будет биться головой об стол над подобной задачкой.

:)

Чтобы не биться головой о твердые предметы так поступать как вы сделали как раз и не стоит. Ваша проблема в именовании массива данных, отсюда и такие портянки кода.

Mikael86 17.03.2018 01:11

Цитата:

Сообщение от laimas (Сообщение 480636)
:)

Чтобы не биться головой о твердые предметы так поступать как вы сделали как раз и не стоит. Ваша проблема в именовании массива данных, отсюда и такие портянки кода.

Не спорю, тогда подскажите как вывести его правильно с учётом того что есть
Имя товара - заголовок,
Изображение товара,
Описание - абзац,
Цена - абзац или заголовок.
И какое то количество характеристик которые являются элементами списка и их количество в зависимости от компоновки и наименования товара меняеться.
И всё это надо продублировать во всплывающем окне и форме обратной связи скрытыми строками.
В данный момент я этого добился, но к сожалению только такой портянкой. В Гугле понятных мне примеров с такой раскладкой не нашёл, или не понял их по причине абсолютной неопытности

laimas 17.03.2018 06:00

Цитата:

Сообщение от Mikael86
И всё это надо продублировать во всплывающем окне и форме обратной связи скрытыми строками.

Во-первых - нет никаких всплывающих окон в вашем случае, все это в общем-то бред или мягко сказать "вольная трактовка" поведения обычного слоя на странице. Существует всего два модальных диалога которые действительно могут представлять и формы, и табличные данные, но эти диалоги поддерживаются только IE.

Во-вторых - визуализация табличных данных на странице клиента никак не может определять их структуру. А вот представление их на клиенте, а тем более в форме, может быть любым. РНР может за вас упаковать ее поля в массив такой, какой будет удобен для обработки на сервере, и только это будет определяющим, а не потому что всплывает или еще что либо.

Писать о заголовке, описании, цене (цена между прочим не может иметь ни абзаца, ни заголовка, цена это вещественная характеристика сущности, и имеет непосредственно величину и денежный номинал), и других характеристиках, но при этом все это описывать как ТТХ1, ТТХ2, ..., это и есть кошмар для любого языка программирования.

Архитектура данных и принципы нормализации, это будет определять структуру табличных данных, а не окна, формы и прочее. И в такой структуре как товары и их характеристики будет всегда первичная таблица описывающая основные характеристики товара, и вторичная таблица (вторичные таблицы) описывающая значения (набор) какой либо характеристики.

Эти характеристики имеют, должны иметь, "осязаемые" имена и связываться между собой уникальными идентификаторами - name, price, unit, weight, ... для каждого из товаров с его id. И эти имена на сервере будут ключами ассоциативного массива с первичным ключом id, указывающем какому товару принадлежит каждый из наборов массива. А на клиенте, это будут имена свойств объекта.

А вернуть эти данные серверу будет означать - связать эти свойства по id товара как индексу ключей name, price, unit, weight, ... или name, price, unit, weight, ... это будет вложенный массив под первичным ключом, индексом которого будет id. А не ТТХ1, ТТХ2, ..., и подобное, ибо это и есть корень зла в вашем и представлении, и, соответственно, обработке таких данных "костылями".

Mikael86 17.03.2018 13:21

Цитата:

Сообщение от laimas (Сообщение 480732)
Во-первых - нет никаких всплывающих окон в вашем случае, все это в общем-то бред или мягко сказать "вольная трактовка" поведения обычного слоя на странице. Существует всего два модальных диалога которые действительно могут представлять и формы, и табличные данные, но эти диалоги поддерживаются только IE.

Во-вторых - визуализация табличных данных на странице клиента никак не может определять их структуру. А вот представление их на клиенте, а тем более в форме, может быть любым. РНР может за вас упаковать ее поля в массив такой, какой будет удобен для обработки на сервере, и только это будет определяющим, а не потому что всплывает или еще что либо.

Писать о заголовке, описании, цене (цена между прочим не может иметь ни абзаца, ни заголовка, цена это вещественная характеристика сущности, и имеет непосредственно величину и денежный номинал), и других характеристиках, но при этом все это описывать как ТТХ1, ТТХ2, ..., это и есть кошмар для любого языка программирования.

Архитектура данных и принципы нормализации, это будет определять структуру табличных данных, а не окна, формы и прочее. И в такой структуре как товары и их характеристики будет всегда первичная таблица описывающая основные характеристики товара, и вторичная таблица (вторичные таблицы) описывающая значения (набор) какой либо характеристики.

Эти характеристики имеют, должны иметь, "осязаемые" имена и связываться между собой уникальными идентификаторами - name, price, unit, weight, ... для каждого из товаров с его id. И эти имена на сервере будут ключами ассоциативного массива с первичным ключом id, указывающем какому товару принадлежит каждый из наборов массива. А на клиенте, это будут имена свойств объекта.

А вернуть эти данные серверу будет означать - связать эти свойства по id товара как индексу ключей name, price, unit, weight, ... или name, price, unit, weight, ... это будет вложенный массив под первичным ключом, индексом которого будет id. А не ТТХ1, ТТХ2, ..., и подобное, ибо это и есть корень зла в вашем и представлении, и, соответственно, обработке таких данных "костылями".

1е Ну я даже хз как можно назвать окно которое появляеться при нажатии на кнопку, подобный результат я увидел только когда загуглил "как сделать всплывающее окно на сайте".

2е Как вы предлагаете мне стандартизировать характеристики электро-оборудования например, когда для магнитного пускателя мне надо вывести максимальный ток силовых контактов, напряжение срабатывания, количество дополнительных контактов, для автоматического выключателя, ток срабатывания, кривую срабатывания, количество полюсов, а для микропроцессорного контроллера надо прописать количество модулей с аналоговыми и дискретными входами и выходами, количество контактов в них, рабочее напряжение, все показатели аналоговых входов и выходов?
Лично мне кажеться что будет проще вписать в массив характеристику и вывести её как ТХ(техническая характеристика)1, а не прописывать каждое значение поимённо.

3е Я примерно понимаю что что вы имеете ввиду описывая построение структуры, но проблемма в том что я не знаю как это прописать кодом, потому и попросил подсказать как это сделать или ссылку на решение подобной задачи, чтоб было на чём основываться перестраивая её под себя.
4е по поводу цены, чтоб её стилизовать её надо обернуть в какой то тег с каким то классом и прописать для неё CSS, а будет это заголовок <h>Цена</h> или абзац <p>Цена</p> мне в принципе всё равно. Вчера в 2 ночи решение которое меня устраивает уже нашёл, ток думал что тут будет быстрее получить подсказку от гуру, но в любом случае спасибо за советы, будет что почитать и обдумать.

Mikael86 17.03.2018 13:24

Кстати решил отказаться от вывода по ключам и foreach в пользу for, и сократил обработчик до такого вида, таким образом сохранился вывод инфы на странице, в блоке всплывающем по клике на кнопку "Заказать" и отправка скрытых данных в почтовой форме.
<?php for ($row = 4; $row < 10; $row++) {
echo '<hr/>';
    echo '<div class="row"><div class="col-1"></div>';
    echo '<div class="col-10">';
    echo '<center>'.'<h5>'.$cmodels[$row][1].'</h5>'.'</center>';
    echo '</div><div class="col-1"></div>';
    echo '<div class="col-12">';
    echo '<ul>'.'<img class="RightImg40" src="'.$cmodels[$row][2].'">';
    for ($col = 3; $col < count($cmodels[$row]); $col++) {
        echo "<li>".$cmodels[$row][$col]."</li>";}
    echo '</ul>';
    echo '<a class="BuyButton popup-with-zoom-anim Red" href="#'.$cmodels[$row][0].'">Заказать</a>';
    echo '</div></div>';
    echo '<hr/>';

    echo '<div id="'.$cmodels[$row][0].'" class="popup-window zoom-anim-dialog mfp-hide">' ;
    echo '<center><h4>'.$cmodels[$row][1].'</h4></center>';
    echo '<ul>'.'<img class="RightImg30" src="'.$cmodels[$row][2].'">';
    for ($col = 3; $col < count($cmodels[$row]); $col++) {
        echo "<li>".$cmodels[$row][$col]."</li>";}
    echo '</ul>';
    echo '<div class="SeparateRow"></div>';

    echo '<form id="form'.$cmodels[$row][0].'">';
    echo '<div class="row">';
    echo '<div class="col-sm-12 col-lg-4"><input type="text" class="name" name="name" placeholder="Ваше имя"></div>';
    echo '<div class="col-sm-12 col-lg-4"><input type="text" class="phone" name="phone" placeholder="Ваш телефон"></div>';
    echo '<div class="col-sm-12 col-lg-4"><input type="text" class="email" name="email" placeholder="Ваш Email">';
    echo '<button class="btn-default" name="submit" type="submit" style="float:right">Отправить</button>';
    echo '</div></div>';
    echo '<input type="hidden" name="formData" value="Заказать">';
    echo '<input type="hidden" name="formName" value="'.$cmodels[$row][1].'">';
    for ($col = 3; $col < count($cmodels[$row]); $col++) {
        echo '<input type="hidden" name="formTX'.$col.'" value="'.$cmodels[$row][$col].'">';}
    echo '</form>';
    echo '</div>';
}

laimas 17.03.2018 15:44

Цитата:

Сообщение от Mikael86
Как вы предлагаете мне стандартизировать характеристики электро-оборудования например

СУБД не занимается стандартизацией, она описывает данные, их структуру, связи и т.д. Хотите понять как все это делается, читайте о реляционных базах данных и принципах нормализации их.

Допустим мы хотим иметь базу данных городов, их улиц и характеристику этих улиц. Что будет первично а данной структуре данных - курица или яйцо? Конечно курица, то есть город, ибо улицы в городе, а не наоборот. Значит первичная таблица, это таблица:

cities с двумя полями: id_city - уникальный идентификатор города, формируемый автоматически и являющийся первичным ключом таблицы, и city_name - название города. Таблица имеет значения:

1, Кукуево
2, Гадюкино

Связанные с первичной таблицей таблицы, это:

streets - таблица улиц с полями: id_street - уникальный идентификатор улицы, формируемый автоматически и являющийся первичным ключом таблицы, и street_name - название улицы, id_surface - характеристика дорожного покрытия улицы, id_lighting - характеристика освещения улицы. Таблица имеет значения:

1, Прямая, 1, 3
2, Кривая, 2, 1
3, Элитная, 4, 4

surfaces - таблица различных дорожных покрытий с полями: id_surface - уникальный идентификатор характеристики, формируемый автоматически и являющийся первичным ключом таблицы, surface_value - значение характеристики. Таблица имеет значения:

1, Грязь
2, Песок
3, Гравий
4, Асфальт

lightings - таблица различных дорожных покрытий с полями: id_lighting - уникальный идентификатор характеристики, формируемый автоматически и являющийся первичным ключом таблицы, lighting_value - значение характеристики. Таблица имеет значения:

1, Лампады
2, Свечи
3, Костры
4, Фонари электрические

Если нужно узнать удобно ли гулять в сандалиях по улице Прямой, достаточно сделать запрос к таблице streets объединив его с запросом к таблицам surface и lighting объединив их по идентификаторам id_surface и id_lighting для улицы id_street = 1. Результатом будет: Прямая, Грязь, Костры.

А вот улицы для города уже так не объединить, ибо в городе может быть множество улиц. Для такого объединения потребуется внешняя таблица связей - city_streets, с полями id_city и id_street. Если она будет содержать записи:

1, 1
1, 2
2, 3

значит у города Кукуево две улицы - Прямая и Кривая, а город Гадюкино, это город развитого коммунизма с одной Элитной улицей.

Если представить эти данные в форме как:

<input name="city[1]" value="Кукуево" />
<input name="street[1][1]" value="Прямая" />
<input name="surface[1][1][1]" value="Грязь" />
<input name="lighting[1][1][3]" value="Костры" />
<input name="street[1][2]" value="Кривая" />
<input name="lighting[1][2][2]" value="Песок" />
<input name="surface[1][2][1]" value="Лампады" />
<input name="city[2]" value="Гадюкино" />
<input name="street[2][3]" value="Элитная" />
<input name="surface[2][3][4]" value="Асфальт" />
<input name="lighting[2][3][4]" value="Фонари электрические" />


то сервер получит эти данные в виде массива:

Array
(
    [city] => Array
        (
            [1] => Кукуево
            [2] => Гадюкино
        )

    [street] => Array
        (
            [1] => Array
                (
                    [1] => Прямая
                    [2] => Кривая
                )

            [2] => Array
                (
                    [3] => Элитная
                )

        )

    [surface] => Array
        (
            [1] => Array
                (
                    [1] => Array
                        (
                            [1] => Грязь
                        )

                    [2] => Array
                        (
                            [1] => Лампады
                        )

                )

            [2] => Array
                (
                    [3] => Array
                        (
                            [4] => Асфальт
                        )

                )

        )

    [lighting] => Array
        (
            [1] => Array
                (
                    [1] => Array
                        (
                            [3] => Костры
                        )

                    [2] => Array
                        (
                            [2] => Песок
                        )

                )

            [2] => Array
                (
                    [3] => Array
                        (
                            [4] => Фонари электрические
                        )

                )

        )

)


в котором все вложенные массивы ключей города, улиц и их характеристик связаны по их идентификаторам. Северу легко такие данные проверить/обработать, и не важно сколько будет городов, улиц и характеристик.

А если данные в форме представить так:

<input name="data[1][city][name]" value="Кукуево" />
<input name="data[1][street][1][name]" value="Прямая" />
<input name="data[1][street][1][surface][1]" value="Грязь" />
<input name="data[1][street][1][lighting][3]" value="Костры" />
<input name="data[1][street][2][name]" value="Кривая" />
<input name="data[1][street][2][surface][2]" value="Песок" />
<input name="data[1][street][2][lighting][1]" value="Лампады" />
<input name="data[2][city][name]" value="Гадюкино" />
<input name="data[2][street][3][name]" value="Элитная" />
<input name="data[2][street][3][surface][4]" value="Асфальт" />
<input name="data[2][street][3][lighting][4]" value="Фонари электрические" />


то сервер получит уже такой массив:

Array
(
    [data] => Array
        (
            [1] => Array
                (
                    [city] => Array
                        (
                            [name] => Кукуево
                        )

                    [street] => Array
                        (
                            [1] => Array
                                (
                                    [name] => Прямая
                                    [surface] => Array
                                        (
                                            [1] => Грязь
                                        )

                                    [lighting] => Array
                                        (
                                            [3] => Костры
                                        )

                                )

                            [2] => Array
                                (
                                    [name] => Кривая
                                    [surface] => Array
                                        (
                                            [2] => Песок
                                        )

                                    [lighting] => Array
                                        (
                                            [1] => Лампады
                                        )

                                )

                        )

                )

            [2] => Array
                (
                    [city] => Array
                        (
                            [name] => Гадюкино
                        )

                    [street] => Array
                        (
                            [3] => Array
                                (
                                    [name] => Элитная
                                    [surface] => Array
                                        (
                                            [4] => Асфальт
                                        )

                                    [lighting] => Array
                                        (
                                            [4] => Фонари электрические
                                        )

                                )

                        )

                )

        )

)


А если все именовать так как у вас ХХХ1, ХХХ2, ..., то есть банально пронумеровать данные, то разобраться что есть что в большом массиве данных будет невозможно. Даже если иметь ключи city1, city2, ..., street1, street2, ..., то это все равно будет сущим кошмаром.

Не важно города ли с улицами описаны, товары ли, всегда должна быть связь между всеми данными сущности, которая однозначно указывает что чему принадлежит.

За один присест всего не рассказать, так что "Ок, Гугл, ...", находить, читать, вникать, учится мыслить.

Mikael86 17.03.2018 16:57

Спасибо за такое широкое раскрытие темы, буду гуглить читать вникать и учиться.

laimas 17.03.2018 17:05

Цитата:

Сообщение от Mikael86
решил отказаться от вывода по ключам и foreach в пользу for, и сократил обработчик до такого вида

И что получим на клиенте, N форм? А зачем?

Mikael86 17.03.2018 17:45

Цитата:

Сообщение от laimas (Сообщение 480791)
И что получим на клиенте, N форм? А зачем?

Некоторые характеристики используются по разу, нет смысла выдумывать им отдельное имя, достаточно просто вывести данные из массива в которых будет и ключ и значение. В данный момент решили добавить новые формы и страницы на сайт, потому для упрощения данные надо вывести в массив и автоматизировать работу. А форма связи будет нужна чтоб сделать пред.заказ, то-есть скинуть данные поставщику, он перезванивает, вносит поправки и уточнения, например наличие в помещении сети 380В, запланированную мощность, возможно уровень пожароопасности помещения, те нюансы о которых большинство обывателей даже не задумывается, но за которые можно отхватить не хилый штраф. Потому решили не делать обычную магазин-корзину, а реализовать так. Слишком много нюансов на изделиях, все учесть нереально, даже несмотря на то что я в смежной отрасли 8 лет работаю

Mikael86 17.03.2018 17:50

Для понимания вот 2 списка характеристик заявленных производителями, совпадений немного

1:Мощность от 3,7 кВт до 7,4 кВт 230 В
Разъем Type 2 / Type 1 (Mode 3)с интегрированным кабелем L- 5м
Степень защиты: IP 54
Световой индикатор состояния
Быстрый монтаж на стену
Размеры: 315 x 180 x 110 мм
Статистика потребления электроэнергии (опция заказывается отдельно)
Опция по регулировке динамической нагрузки (заказывается от- дельно)
Степень защиты : IP54
Рабочая температура: от -30 °C до + 45 °C

2.Современный, очень компактный корпус
Зарядная мощность 3,7 кВт до 22 кВт
Доступен с гнездом или зарядным кабелем длинной 5 или 8 метров
Интеллектуальная система зарядки
Оснащен сертифицированным измерителем энергии
SIM разблокирована, бесплатный выбор поставщика услуг и платежной системы
Совместимость с Cohere Maxem Energy Manager
Авторизация с помощью зарядной карты
Оснащаеться LED индикатором состояния станции или 3,5" цветным TFT-дисплеем с разрешением: 320 x 240 пикселей
Доступны подключения сети: GPRS, Ethernet/LAN
Совместимость с протоколами (OCPP 1.5 (JSON), OCPP 1.6 (JSON))
Защита от остаточного тока
Реле питания (дополнительное реле безопастности)
Рабочий диапазон температур (-25 ºC … +40 ºC)
Класс защиты: IP55
Класс механической защиты: IK10

laimas 17.03.2018 19:03

Mikael86,
зачем циклом формируется несколько форм на странице? Это "Некоторые характеристики используются по разу, нет смысла выдумывать им отдельное имя" ничем не лучше TX1, TX2, ... Не надо полемики о штрафах, о пожарной безопасности и т.п., это эмоции, а эмоциями ни СУБД, ни языки программирования не оперируют. Это в будущий искусственный разум научат переживать и ощущать запах гари, но опять таки не абстракциями это будет сделано.

Я даже не знаю какими словами можно комментировать оправдание кучи форм тем, что есть "редкая характеристика".

Цитата:

Сообщение от Mikael86
Для понимания вот 2 списка характеристик заявленных производителями, совпадений немного

Все это описывается в любом случае в СУБД и все это должно быть разложено в ней по полочкам.

Иметь на странице N форм с бог знает каким именованием полей в них, абы лишь бы было, еще можно, если 1 и 2, это некое устройство имеющееся у вас в наличие в единственном экземпляре. И даже в этом случае хоть какое-то описание этого ящика должно быть на сервере, иначе спокойно можно заставить сервер вместо "мощности от 3,7 кВт до 7,4 кВт 230 В" ковыряться в чем угодно и долго.

Mikael86 17.03.2018 20:33

Цитата:

Сообщение от laimas (Сообщение 480811)
Mikael86,
зачем циклом формируется несколько форм на странице? Это "Некоторые характеристики используются по разу, нет смысла выдумывать им отдельное имя" ничем не лучше TX1, TX2, ... Не надо полемики о штрафах, о пожарной безопасности и т.п., это эмоции, а эмоциями ни СУБД, ни языки программирования не оперируют. Это в будущий искусственный разум научат переживать и ощущать запах гари, но опять таки не абстракциями это будет сделано.

Я даже не знаю какими словами можно комментировать оправдание кучи форм тем, что есть "редкая характеристика".



Все это описывается в любом случае в СУБД и все это должно быть разложено в ней по полочкам.

Иметь на странице N форм с бог знает каким именованием полей в них, абы лишь бы было, еще можно, если 1 и 2, это некое устройство имеющееся у вас в наличие в единственном экземпляре. И даже в этом случае хоть какое-то описание этого ящика должно быть на сервере, иначе спокойно можно заставить сервер вместо "мощности от 3,7 кВт до 7,4 кВт 230 В" ковыряться в чем угодно и долго.

1на форма - 1 товар, или есть предложения как через 1ну форму и одно pop up окно передавать разные данные в зависимости от нажатий на разные кнопки? Кстати доступа в админ панель для создания MySql базы у меня нет, пароль похерили, ток FTP.

laimas 17.03.2018 21:19

Цитата:

Сообщение от Mikael86
1на форма - 1 товар, или есть предложения

Предлагать можно что угодно, но для этого нужно знать, что, откуда, как ... Да и времени нет.

Цитата:

Сообщение от Mikael86
доступа в админ панель для создания MySql базы у меня нет, пароль похерили

Есть хостер, а вы у него под документом удостоверяющем личность, обращайтесь, восстановят.

Mikael86 17.03.2018 21:26

Цитата:

Сообщение от laimas (Сообщение 480825)
Предлагать можно что угодно, но для этого нужно знать, что, откуда, как ... Да и времени нет.

Есть хостер, а вы у него под документом удостоверяющем личность, обращайтесь, восстановят.

Сайт делаю не для себя, пароль похерили, и поверьте мне я уже не раз говорил что мне он нужен. Ладно, не заморачивайтесь с этими формами, меня такое решение вполне устраивает устраивает. Может потом когда ещё что-то освою и улучшу но пока пойдёт и так.

laimas 18.03.2018 08:16

Цитата:

Сообщение от Mikael86
Сайт делаю не для себя

Рановато писать для кого-то с такими познаниями. :)

Mikael86 18.03.2018 11:11

Я знаю HTML и СSS, PHP и JS учу, с сайтом попросили помочь знакомые чтоб не переплачивать. и хоть PHP и JS не знаю но согласно ТЗ у меня всё выполняется и в срок.

laimas 18.03.2018 13:31

Цитата:

Сообщение от Mikael86
и хоть PHP и JS не знаю но согласно ТЗ у меня всё выполняется и в срок.

Дай-то бог, но не дай бог кому либо ваш код потом придется править. :)


Часовой пояс GMT +3, время: 19:08.