Cake PHP 3.8 Изменение данных формы на основе выбора пользователя - PullRequest
0 голосов
/ 27 января 2020

Я нахожусь в среде 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>

Ответы [ 3 ]

1 голос
/ 28 января 2020

Вы можете создать новые виджеты или любые новые узлы DOM, используя javascript. Рассмотрите этот фрагмент jQuery для случайного проекта, который я собираюсь описать:

$(this).replaceWith(
    '<a class="remove" id="' + $(this).attr('id') 
        + '" href="' + webroot + 'shop/remove/' + $(this).attr('id') 
        + '" title="Remove item">' 
        + '<img src="' + webroot + 'img/icon-remove.gif" alt="Remove" />' +
    '</a>'
);

Вы можете легко получить ссылку на свою вторую форму:

$('form#id_of_form')

Но все же я нахожу все эта суета в jQuery и javascript немного утомительна для создания заполненной формы, когда Cake находится всего в ajax вызове.

Так что ваша функция успеха может быть чем-то вроде

$('form#id_of_form').replaceWith(new_form_from_ajax_call);
0 голосов
/ 28 января 2020

Я понимаю, что вы имеете в виду, так что на самом деле это дало бы мне два варианта ..

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

В результате я успешно заполнил поле 'title' во второй форме, но при нажатии на кнопку "Сохранить категорию", Мои данные сохраняются в исходной статье вместо категории статьи, поэтому ссылка на первую форму.

Есть ли какой-нибудь способ получить доступ к ссылке (возможно, через значение $ id?) Второй формы из jquery? Так есть ли способ изменить контекст формы с JQuery?

            $.ajax({
                type: 'post',
                url: targeturl,
                headers: {'X-CSRF-Token': csrf_token},
                data: {category: category_selected},
                success: function(result){

                    console.log(result);

                    // POPULATE AN EXISTING FORM WITH NEW DATA AND TOGGLE DISPLAY VALUE! 
                    var article = JSON.parse(result); 

                    // you can populate existing form fields
                    // how can you access the form id field? 
                    // id = "article_cat_create"
                    $("#article_cat_create").val(article);
                    console.log(article[0]['title']);
                    $("#article_cat_title").val(article[0]['title']);                        

                    // which value do you need to set in formhelper?? 
                    $('#article_cat_create').css("display", "block");                        


                }
            });

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

0 голосов
/ 27 января 2020

Вы можете написать функцию успеха вашего вызова axaj для построения элементов DOM из json, а затем вставить их в форму.

Но я думаю, что более простое решение - отправить ваш ArticleController :: editcategory ( ) data ($ articlecat_data) в элемент, который будет отображать нужные элементы формы.

Верните HTML в вашу ajax функцию успеха и попросите эту функцию вставить ее в вашу форму.

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

Немного внимания уделите атрибутам id и class как на исходной странице, так и на * 1015. * возвращенный фрагмент должен облегчить либо замену всей формы, только ее внутренней html, либо добавление дополнительных входных данных к существующей форме.

Так что мой конкретный c ответ на вопрос "МОЖУ ИСПОЛЬЗУЙТЕ ТОРТ PHP FORMHELPER, ЧТОБЫ ДЕЛАТЬ ТАК "- это да.

...