Передача значения checkbox из бэкенда во фронтенд


#1

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

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

Такое ощущение, что в CS-Cart мой приёмчик с JS не проскочит, и всё идёт к PHP-шной истории. Может быть подскажите, кто с этим сталкивался, куда мне деваться, – копать варианты со скриптом или это достигается только с PHP?

Может быть есть примеры или готовые решения, пожалуйста, поделитесь.


#2

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


#3

А что не работает то?

А так, чекбокс в форму, форма передает массив на сервер, сервер обрабатывает массив поступивший, можно передать на фронт то что вышло после обработки. Если нужно, используя ajax. А что нужно сделать?


#4

Расковыривал, но там PHP, а я пошел путём JS. Если делать по аналогии других модулей, то мне вряд ли под силу вычленить нужный Код, чтобы применить его для своих нужд – просто не секу в PHP.


#5

Вы имеете ввиду упаковать чекбокс в форму и отправлять POST-запросом? А как потом передать результат обратно? Теоретические представляю, что как-то можно это делать, но на практике не сталкивался.

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


#6

Так а зачем тогда это всё? Так понимаю, чекбокс создали через поля профиля вендора, блок так же находится в магазине вендора?

В таком случае, можно сделать и без залезания в бекенд. Можно сделать средствами Smarty, получить значение поля с чекбокосом и по условию вывести блок. Если в код самого блока не лезть, можно сделать примерно так:
Нужный блок добавить в макет для всех выключить. Рядом создать блок с содержимым Smarty и в нем прописать:

{assign var="company_data" value=$company_id|fn_get_company_data}
{if $company_data.fields.54="Y"}
{render_block block_id=249 use_cache=false parse_js=false}
{/if}


54 - id вашего поля профиля типа чекбокс. А block_id - id выключенного блока, который надо вывести по таким условиям.

#7

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


#8

Вот в этом месте вы имели ввиду Администрирование → Поля профиля → Покупатели и администраторы? Я что-то не догадался попробовать, только пока не понимаю, как это будет работать.


#9

Да, через это можно добавить. Иначе - надо дописывать обработку, где-то хранить и передавать в шаблон поле добавленное. Ничего сложного, просто зачем, если по сути всё то же можно получить ничего не дописывая.


#10

Но, чекбокс отобразится на вкладке “Общее”, тогда как этот чекбокс разместить на нужной вкладке, а не в общей куче опций?


#11

Ну, это уже только мудрить.


#12

Лучший вариант на штатной вкладке “Модули”, но ведь чекбокс появится “ни к селу, ни к городу” во вкладке “Общее”, в этом загвоздка. Может быть и можно на общей вкладке чекбокс скрыть стилями, а на нужной вкладке продублировать код. Но, опять же, надо экспериментировать, и ещё пока непонятно как будет достигать цели нужная команда от чекбокса к блоку.


#13

Так делать не стоит точно.

Ну а так - да, создать свою вкладку модулем, туда чекбокс. Добавить поле в таблицу companies, которое заполнять можно и стандартными средствами. А на витрине… ну кстати, скорее всего, то же самое прокатит, только вместо {if $company_data.fields.54=“Y”} будет {if $company_data.[название_поля_в_бд]=“Y”}. Хотя, если уж и делать совсем модулем, наверное будет смысл делать уже всё иначе.


#14

Понятно, что через базу всё упрощает с одной стороны, но и усложняет, по тому я и хотел обойтись JS, чтобы не лезть в чего не знаю. Дополнительные таблицы создавал, а вот в существующую таблицу поля ни разу не добавлял.


#15

Хм… ну так может, средствами js и перенести поле в нужную вкладку? Костыль, конечно, но… почему нет)


#16

Да нет никаких проблем с вёрсткой, она вообще за скобками. Проблема в том, что как бы я не создавал чекбокс, штатно или костылями, я не могу передать значение поля из админки продавца на его витрину.


#17

Ну, тогда создавать контроллер.post.php, в нем получать необходимые данные, подключать класс Tygh\Registry, после чего передавать данные в шаблон. Примерно так, в шаблоне будет доступно значение переменной в смарти, $alexa_checkbox:

<?php
use Tygh\Registry;
defined('BOOTSTRAP') or die('Access denied');

if ($mode == 'view')
{
	$alexa_checkbox = fn_get_alexa_checkbox_value;
	Tygh::$app['view']->assign('alexa_checkbox', $alexa_checkbox);
}

#18

В смысле в папке my_changes ?

Вот как раз это сложно и не понятно, особенно когда не шаришь в php. :grin: Если бы js, тогда ещё можно что-то не сложное, но разница в Коде ощутимая, плюс ещё надо хорошо знать сущность платформы.


#19

Попробуйте так
в app/addons/my_changes/addon.xml добавить блок queries примерно так

<addon scheme="3.0">
/**
другие данные 
*/
<default_language>en</default_language>
<queries>
    
    <item>
        ALTER TABLE `?:companies`
        ADD COLUMN `name_checkbox` char(1) DEFAULT 'N';
    </item>
</queries>
</addon>

после переустановки модуля в таблице companies появиться столбец бля хранения вашего чекбокса

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

далее создаете design\backend\templates\addons\my_changes\hooks\companies\detailed_content.post.tpl

с примерно таким содержимым

<div class="control-group">
	
	<label class="control-label" for="elm_moderation_import">{__("id язвковой переменной ")}:</label>
	
	<div class="controls">
		<input type="hidden" name="company_data[name_checkbox]" value="{"YesNo::NO"|enum}">
		<input type="checkbox" class="" name="company_data[name_checkbox]" value="{"YesNo::YES"|enum}" {if $company_data.name_checkbox =="YesNo::YES"|enum}checked="checked"{/if}>
	</div>
</div>

если версия старая {“YesNo::NO”|enum} и {“YesNo::YES”|enum} заменить на N и Y

после это этого чистим кэш ставим галочку нажимаем сохранить и на витрине на странице с данными продавца должны появиться нужные вам данные в $company_data.name_checkbox

name_checkbox везде заменить на нужное вам название

ну и экспериментировать лучше на демке вашего сайта


#20

Дошли руки, чтобы перепробывать все любезно предложенные варианты, но похоже, я пока только на половине пути. :slightly_smiling_face:

Пожалуйста, уточните с какой версии можно считать не старой?

Чётко прошёл до этого момента, и встрял на том, что с параметром $company_data.name_checkbox при переключении чекбокса на Вкл/Выкл, на витрину передаётся само значение в виде букв Y и N.

Формально значения вытянулись на витрину, но оказывается их ещё и приземлять как-то надо. По логике, если сейчас чек отмечен (Y), то это show, если чек пустой (N), то это hide. Пытаюсь получить действие, чтобы скрывать либо отображать содержимое блока, и пока безуспешно.

Что-то у меня пошёл крен уже не в ту сторону. Даже подумал, уж не проще создать таблицу под контент, сразу натолкать в неё всё что надо, тем более редактировать контент вряд ли когда либо понадобится, и прямо с БД вытягивать в готовом виде. Просто из админки отключать блок в макете страницы. Или так не проще, или проще? Что делать-то, аж зубы заныли. :smirk:

Грандиозную работу провернул хотел же ещё три чекбокса, чтобы варианты выбирать, по сути осталось только соединить, и тут на тебе, из-за такой вроде бы мелочи упёрся. Вот, сижу как сундук, коплю мысли, как хотя бы с одной справиться, уже про три и думать забыл. :grin: