Форма поиска CakePHP 3.x с 11 различными моделями - PullRequest
0 голосов
/ 02 мая 2018

У меня есть приложение в CakePHP 3.5.13. Приложение подключено к унаследованной базе данных, то есть оно не было написано в соответствии с соглашениями по присвоению имен Cake.

Я запек приложение, которое сгенерировало несколько классов Table и Entity.

Часть приложения позволяет пользователю выполнять поиск. Я хочу использовать Form Helper , но не знаю, как назвать / настроить вещи:

Файл шаблона, в котором находится форма поиска, содержит 11 текстовых вводов. Каждый из них относится к данным, хранящимся в базе данных. Для краткости рассмотрим первые 3 поля. Они связаны с Table классами:

  • Номер CAS - относится к CasTable
  • Номер ЕС - относится к EcsTable
  • Название вещества - относится к SubstancesTable

При открытии тега формы я сделал следующее:

<?php echo $this->Form->create(null, [
'url' => ['controller' => 'Front', 'action' => 'search'] ]); ?>

Причина, по которой я передал null в качестве первого параметра, заключается в том, что я не знаю, должен ли я использовать экземпляр Entity (как упомянуто в документах ), но не был уверен, какой именно, так как есть 11 входов, каждый из которых связан с различными Table классами. Поэтому я считаю, что null здесь будет правильным - Пожалуйста, кто-нибудь может уточнить это?

Я также не уверен, как назвать мои входы. Например, для ввода «CAS Number» необходимо выполнить поиск в поле базы данных cas.value. Так я бы назвал входные данные, как это?

echo $this->Form->control('cas.value' ... );

Я хочу иметь возможность проверять каждое поле в соответствии с правилами, которые будут в соответствующих моделях. Поскольку существует 11 различных полей, и форма не действует как функция «добавить» (SQL INSERT) или «редактировать» (SQL UPDATE), я не могу следовать документации Cake, чтобы понять, как я должен закодировать это.

Итак, я пытаюсь создать HTML-форму - используя синтаксис Cake Form Helper - с 11 полями, каждое из которых связано с соответствующими моделями. Я хочу иметь возможность проверять поля в соответствии с правилами этих моделей. Как я могу это сделать? Я провел исследование в этом, но не вижу никаких примеров, которые делают это - большинство сосредоточено на вставке / обновлении данных. Я также посмотрел на немодальные формы , но не думаю, что это правильно, потому что в этом случае у меня есть модели для поисковых данных.

На данный момент я просто написал форму в виде ванильного HTML и могу получить доступ к данным, отправленным с FrontController::search() по $this->request->data(). Хотя это работает, я считаю, что это плохая идея, поскольку мне придется каким-то образом запускать методы проверки, и это может вызвать проблемы с повторным заполнением формы или использованием ORM позже. Возможно, я здесь ошибаюсь, но я ищу решение, в котором используются условные обозначения Cake, особенно с упором на правильное использование помощника по формам в подобных ситуациях.

Буду признателен за любую помощь или совет.

1 Ответ

0 голосов
/ 02 мая 2018

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

Соглашения об использовании имен

Прежде всего, используйте g именование тортов для ваших элементов управления, как объяснено здесь и здесь

Это работает, даже если имя вашей БД не соответствует стандарту тортов.

Создание правил проверки

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

Таким образом, в ваших таблицах (в каждой таблице!) Вы можете создать метод с именем validationSearch

public function validationSearch($validator)
{
    $validator
        ->add('title', 'notEmpty', [
            'rule' => 'notEmpty',
            'message' => __('You need to provide a title'),
        ]);
    return $validator;
}

Патч сущности

тогда в вас FrontController вы можете сделать

$this->loadModel('Substances');
$substance = $this->Substances->newEntity(
    $this->request->getData(),
    [
        'validate' => 'search', // tells cake to use validateSearch
                                // for Substances Table
        'associated' => [
            'Cas' => [
                'validate' => 'search', // you want to use validateSearch
                                        // even for this table
            ],
            'Ecs'=> [
                'validate' => 'search', // and for this table, too
            ],
            // list of other related tables here
            // you can nest the array if you have
            // nested relationships
        ]
    ]
);

это создаст объект, содержащий ваши данные, но прежде всего он проверит наличие проблем с проверкой и сохранит ошибки в объекте $substance.

$this->set('substance', $substance );

вышеизложенное передаст вашу вновь созданную сущность в форму

Создать форму

и наконец в поле зрения

<?php echo $this->Form->create($substance , [ /*... */ ]); ?>

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

Создание элементов управления

Предположим, у вас есть «главная» таблица, то есть все остальные таблицы как-то связаны с этим. Допустим, это Вещества. Так что следуйте соглашениям.

<?= $this->Form->control('name', ['label' => 'Substance name') ?> 
//                        ^ No need to prepend the table here
<?= $this->Form->control('cas.number', ['label' => 'Cas number') ?>
<?= $this->Form->control('ecs.number', ['label' => 'Ecs number') ?>

Используйте плагин

И рассмотрите возможность использования плагина FriendsOfCake / search. С таким количеством полей, чтобы проверить это упростит вашу жизнь

...