Я нахожусь в среде Cake PHP 3, в которой я нахожусь на действии редактирования в контроллере статей.
Первая функция на контроллере является стандартной функцией редактирования. Она загружает существующие данные для статьи в форму, чтобы вы могли легко редактировать их.
public function edit($id){
$article_categories = $this->Articles->Articlecats->find('list');
$this->set('article_categories', $article_categories);
$article = $this->Articles->get($id);
// if you are not just landing on page but making the save
if ($this->request->is(['post', 'put'])) {
// disable entity creation, not entirely sure what this does..
$this->Articles->patchEntity($article, $this->request->getData());
// Set the user_id from the session.
$article->user_id = $this->Auth->user('id');
if ($this->Articles->save($article)) {
$this->Flash->success(__('Your article has been updated.'));
return $this->redirect(['action' => 'index']);
}
// check if there are errors in editing and print them
if ($article->getErrors()){
// Entity failed validation
// print_r($article->getErrors());
$this->Flash->error(__('Please correct values and try again.'));
}
$this->Flash->error(__('Unable to update your article.'));
}
$this->set('article_pass', $article);
}
Представление в методе редактирования ArticlesController показывает поля ввода, в которых вы можете редактировать информацию о статье и затем сохранять ее в базовой базе данных. В нижней части окна View есть кнопка «кнопка для проверки функциональности», которая обращается к методу ArticlesController посредством вызова Ajax. Функция editcategory () в ArticlesController извлекает информацию о выбранной категории и затем возвращает визуализированное представление на основе этой информации.
При нажатии на эту кнопку я загружаю информацию о категории и категории в новую форму на экране.
<?php echo $this->Html->script('http://code.jquery.com/jquery.min.js'); ?>
<!-- File: templates/Articles/edit.php -->
<h1>Edit Article</h1>
<?php
echo $this->Form->create($article_pass);
echo $this->Form->control('user_id', ['type' => 'hidden']);
echo $this->Form->control('title');
echo $this->Form->control('body', ['rows' => '3']);
echo $this->Form->select('articlecat_id', $article_categories, ['id' => 'article_cat']);
echo $this->Form->button(__('Save Article'));
echo $this->Form->end();
$csrfToken = $this->request->getParam('_csrfToken');
// self written element in View
// echo $this->articlecatCreate->create();
?>
<button id="edit_category">Button to check functionality</button>
<div id="ajax_data"></div>
<script>
var csrf_token = <?php echo json_encode($csrfToken) ?>;
$(window).load(function() {
// get article category data from controller method through ajax call
// populate the form with them
$('#edit_category').click(function(){
var targeturl = "http://wampprojects/composer_cakephptut/articles/editcategory";
var category_selected = $('#article_cat').children("option:selected").val();
console.log(category_selected);
// need to check if this statement works??
if ($('#article_cat').children("option:selected").val()){
$.ajax({
type: 'post',
url: targeturl,
headers: {'X-CSRF-Token': csrf_token},
data: {category: category_selected},
success: function(result){
console.log(result);
// create a form with a POST action that links to database
$('#ajax_data').html(result);
}
});
}else{
console.log("no cat selected");
}
});
});
</script>
Метод "editcategory ()" в контроллере статей.
public function editcategory(){
$this->loadModel('Articlecats');
$category_id = $this->request->getData('category');
$articlecat_data = $this->Articlecats->get($category_id);
$this->set('articlecat_pass', $articlecat_data);
debug($articlecat_data);
$this->render('element/articlecatcreate', 'ajax');
}
В методе editCategory () контроллера ArticlesController я получаю информацию о выбранной категории. Затем я отображаю вспомогательное представление под названием articlecatcreate, которое опирается на полученные данные.
<h1>Edit ArticleCategory</h1>
<div>
<?php echo $articlecat_pass['id'] ?>
<?php echo $articlecat_pass['title'] ?>
<?php
// you miss a primary key, it does try to save to the right table
echo $this->Form->create($articlecat_pass);
echo $this->Form->control('user_id', ['type' => 'hidden']);
echo $this->Form->control('title');
echo $this->Form->button(__('Save Article'));
echo $this->Form->end();
?>
</div>
Правильно загружает данные категории товаров в новой части представления, которая добавляется к существующему представлению с помощью метода "$ ('# ajax_data'). html (result);" в функции успеха ajax.
При сохранении категории, которую я пытаюсь отредактировать, я получаю следующую ошибку .. ОШИБКА: "Запись не найдена в таблице" articlecats "с первичным ключом [NULL]"
Итак, мой новый созданная форма, добавляемая в представление, пытается сохранить правильную таблицу и модель, но не загружает ключ в методе создания формы.
Как продолжить?
РЕШЕНИЕ НАЙДЕНО
Я нашел решение в настройке контроллера и действия в форме-> создать метод $ options параметры.
Итак, код отображаемого элемента должен быть:
<h1>Edit ArticleCategory</h1>
<div>
<?php
// you miss a primary key, it does try to save to the right table
echo $this->Form->create($articlecat_pass, ['url' => ['controller' => 'Articlecats', 'action' => 'edit']]);
echo $this->Form->control('user_id', ['type' => 'hidden']);
echo $this->Form->control('title');
echo $this->Form->button(__('Save Article'));
echo $this->Form->end();
?>
</div>