CakePHP 3.5.13
我有一个表类Model/Table/SavedSearchesTable.php
和一个对应的实体类Model/Entity/SavedSearch.php
我要做的是向用户显示一个表格,他们可以在其中向1个字段中输入数据,该字段对应于上表中名为search_name
的字段。我想使用用户输入此表单的数据(即请求数据),并在我的Controller中以编程方式设置其他字段。
我不确定这是否正确,但是要使用Cake的Form Helper,我需要执行以下操作:
// Controller/FrontController.php
public function saveSearch()
{
$SavedSearches = TableRegistry::get('SavedSearches');
$save_search = $SavedSearches->newEntity();
$this->set('save_search', $save_search);
}
然后在表单助手中使用$save_search
的模板中:
// Template/Front/save_search.ctp
echo $this->Form->create($save_search, [
'url' => ['controller' => 'Front', 'action' => 'saveSearch'],
'role' => 'form'
]);
echo $this->Form->control('search_name');
我不确定以上内容是否适用于“新记录”,但它似乎可以正常工作并正确发布到/front/save-search
。
因此,我将使用以下内容以编程方式设置一些数据以及请求数据search_name
字段:
$SavedSearches = TableRegistry::get('SavedSearches');
$data = [
'u_id' => $this->_getUserId(), // set programatically, not request data
'search_name' => $this->request->getData('search_name'), // comes from request data
'data' => 'testing' // set programatically, not request data
];
$entity = $SavedSearches->newEntity($data);
if ($SavedSearches->save($entity)) {
debug('saved');
} else {
debug('NOT saved');
}
这总是保存(输出在debug()
语句中“保存”,并进入数据库)。
但是,我认为这不对,因为在Table类中有以下验证规则:
// Model/Table/SavedSearchesTable.php
public function validationDefault(Validator $validator)
{
$validator
->scalar('search_name')
->maxLength('search_name', 255)
->requirePresence('search_name', 'create')
->notEmpty('search_name');
return $validator;
}
如果我输入的search_name
字段超过255个字符(我尝试超过500个字符),则可以保存而不会出错。
那么几个问题:
您如何使用Form Helper以这种方式启动用于保存“新”记录的表单,其中您要保存的所有内容都不是请求数据的一部分?
如何使验证正确运行?该文档建议进行验证的过程分为两个步骤,但是其中第一个应该在将请求数据转换为实体之前触发。
我已经阅读了Validating Data和Saving Data上的文档,但是找不到有关如何进行此类操作的清晰示例,这显然是相当普遍的情况,因为并非所有情况保存的内容必须始终来自网络表单。