Intereting Posts
PHP: обслуживать страницы без файлов .php в файловой структуре Сохранение каждой страницы PDF в изображение с помощью Imagick Laravel: Неизвестный столбец 'updated_at' Ошибка руководства Phalcon PhalconException: класс обработчика TestController не может быть загружен как скрыть фактическое местоположение папки загрузки Переменная «ошибка» не существует в FOSUserBundle :: layout.html.twig в строке 5 Как обратиться к public_html корневому файлу, используя include, после того, как вы перейдете к одной файловой директории из public_html Windows 7 php + Symfony2 ужасно медленно Как я могу заставить PHPUnit MockObjects возвращать разные значения на основе параметра? Отображение «требуется» только в одном флажке (динамический дисплей) вывод php-запроса сохранить как текстовый файл Только первое слово строки, появляющееся в форме HTML при использовании строковой ссылки Вывод массива PHP в порядке desc как удалить повторяющиеся значения в таблице mysql Сортировка таблицы с помощью jQuery

Как передать динамически созданный список контроллеру для сохранения в базе данных?

Я работаю в Concrete5 и новичок в концепции MVC. У меня есть некоторый jquery, который создает неупорядоченный список из текстового поля в моем представлении. Если вы знакомы с Concrete5, это представление для блока, к которому я добавляю список. Это в основном список функций для продукта. Это представление должно сохранить список в базовом файле базы данных. Обычно это делается довольно просто, используя переменную, которую информация сохраняется (например, все остальное в представлении сохраняется). Проблема, с которой я сталкиваюсь, заключается в том, что я не знаю, как использовать контроллер для передачи неупорядоченного списка из представления в контроллер в базу данных, чтобы он сохранял его. Любая помощь и образец кода будут оценены. Я уверен, что мне нужно написать php-функцию в моем контроллере, чтобы получить список, но я не уверен, каким будет код.

auto.js

$("#addList").click(function() { var text = $("#inputList").val() + '<button>x</button>'; if(text.length){ $('<li />', {html: text}).appendTo('ul.featureList') }; }); $('ul').on('click','button', function(el){ $(this).parent().remove() }); 

добавить / edit.php

 <div class="ccm-block-field-group"> <h2><?php echo t('Features') ?></h2> 

Прямо сейчас «функции» – это имя поля в моем файле базы данных. Db.xml. Список особенностей области – это список, в который создается список. Я знаю, что его нужно немного изменить, чтобы работать, просто не уверен.

 <?php echo $form->textarea('features', $features, array());?> <input type="test" id="inputList" /> <button type="button" id="addList">Add</button> <ul class="featureList"></ul> </div> 

view.php

 echo "<h2>{$proName}</h2>"; echo "{$description}"; echo "<h3>{$features}</h3>"; echo "<h2>{$price}</h2>"; echo "<p>{$priceInfo}</p>"; 

db.xml

 <field name="features" type="X2"></field> 

С конкретными 5 блоками существуют две разные ситуации:

  1. Пользователь admin редактирует блок (или добавляет новый блок), и вы хотите сохранить эти данные в базе данных.
  2. публичный пользователь просматривает блок, но сам вид блока имеет форму (например, блок формы контакта), и вы хотите что-то сделать, когда публичная форма отправлена ​​(например, отправить электронное уведомление администратору, заполнил форму или сохранил представление в базе данных для последующего рассмотрения).

Если вы говорите о ситуации №1, вам нужно поместить какой-то пользовательский код в метод save() контроллера. Если вы говорите о ситуации №2, вам нужно создать свой собственный метод действий в контроллере, и вам нужно иметь <form> в файле view.php.

ОБНОВЛЕНИЕ: на основе кода примера, добавленного в ваш вопрос, вот решение: единственный способ вернуть ваши данные на сервер через форму POST. Элементы <li> не являются полями формы, и, следовательно, данные в них не получают POST'ed с формой. Поэтому, когда вы добавляете новый элемент <li> на страницу, вы также должны добавить скрытое поле формы, например:

  var listItemCounter = 0; $("#addList").click(function() { listItemCounter++; var text = $("#inputList").val() + '<button data-id="' + listItemCounter + '">x</button>'; //assign a unique id number to this button, so it knows which hidden field to remove when clicked if(text.length){ $('<li />', {html: text}).appendTo('ul.featureList'); $('<input type="hidden" name="features[]" value="' + text + '" data-id="' + listItemCounter + '" />').insertAfter('ul.featureList'); }; }); $('ul').on('click','button', function(el){ $('input[data-id="' + $(this).attr('data-id') + '"]').remove(); //remove the hidden field so it does not get POSTed when user saves $(this).parent().remove(); }); 

Теперь в файле controller.php вашего блока вам нужно будет добавить метод save() который будет извлекать все данные из этих скрытых полей, объединить их и поместить в поле «features», которое вы указали в своем db. Файл xml:

 public function save($args) { $args['features'] = implode("\n", $args['features']); //combine all feature items into one string, separated by "newline" characters parent::save($args); } 

Наконец, в вашем файле view.php вы можете преобразовать список функций (который был сохранен в базе данных как одна строка, причем каждый элемент разделен символом «новой строки») следующим образом:

 <?php echo nl2br($features); ?> 

Или, если вы хотите вывести его как отдельные элементы списка, вы можете сделать что-то вроде этого:

 <ul> <?php $features = explode("\n", $features); foreach ($features as $feature) { echo '<li>' . $feature . '</li>'; } ?> </ul> 

Вы не передаете материал с точки зрения контроллера. Контроллер выполняется перед представлением, поэтому вы только переходите от контроллера к просмотру.

Попробуйте получить доступ к материалам, которые вы передаете из jquery в ваше приложение, используя

 $this->getRequest()->getParam('yourParametersName'); 

внутри контроллера.

Lucian

Я изменил файл auto.js, чтобы он был следующим. Кажется, хорошо работает.

 var listItemCounter = 0; $("#addList").click(function() { listItemCounter++; var text = $("#inputList").val(); //assign a unique id number to this button, so it knows which hidden field to remove when clicked var buttonDataId = text + '<button data-id="' + listItemCounter + '">x</button>'; if(text.length){ $('<li />', {html: buttonDataId}).appendTo('ul.featureList'); $('<input type="hidden" name="features[]" value="' + text + '" data-id="' + listItemCounter + '" />').insertAfter('ul.featureList'); }; }); $('ul').on('click','button', function(el){ $('input[data-id="' + $(this).attr('data-id') + '"]').remove();//remove the hidden field so it does not get POSTed when user saves $(this).parent().remove() }); 

Я оставил точку зрения так же, как и Джордан Лев. (Спасибо!) Затем я сменил controller.php на

public function save($args) { $args['features'] = implode("\n", $args['features']);//combine all feature items into one string, separated by "newline" characters parent::save($args); }

Если кто-нибудь увидит какие-либо проблемы или лучший способ поместить мой код, пожалуйста, дайте мне знать! Моя новая проблема теперь, когда она будет сохранена, если я перейду к редактированию списка, он уничтожит мои прошлые записи и сохранит новый. Если кто-нибудь знает, какую функцию мне нужно написать, чтобы показать текущий список и добавить к нему, когда редактирование будет замечательным. Просьба привести примерный код.