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

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

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

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

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

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

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

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

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

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

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

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

В таком случае, можно сделать и без залезания в бекенд. Можно сделать средствами 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 выключенного блока, который надо вывести по таким условиям.
1 лайк

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

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

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

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

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

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

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

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

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

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

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

Ну, тогда создавать контроллер.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);
}

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

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

Попробуйте так
в 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 везде заменить на нужное вам название

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

1 лайк

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

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

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

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

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

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