如何使用webpack在CakePHP webroot中设置React?
我有一个现有的CakePHP项目(使用Model,View,Controller).我想在其webroot()中设置迷你React项目.将对控制器中定义的api进行ajax调用.Project/Miniproject/index.html
index.html
- Project
| - app
| | - Controller
| | - View
| | - Model
| | - webroot
| | | - Miniproject
| | | | - index.html [Mini react project]
Run Code Online (Sandbox Code Playgroud)
我已经尝试安装React Transform Boilerplate.但它使用web dev服务器(并在localhost:3000上呈现文件).但我想要从运行CakePHP项目的nginx服务器渲染的文件.
当我访问url(Project/Miniproject/index.html
)时,它找不到,dist/bundle.js
因为它在内存中.那么如何使用webpack在CakePHP webroot中设置React?
关于验证的多个问题可能属于一起,因为它们都是在CakePHP 3中解决新的验证概念.
我已阅读的章节(1,2,3的食谱多次),但老实说,我不明白怎么做的正确方法.我也知道GitHub目前有一个关于CakePHP3验证的问题/讨论可能涉及同一主题.
例如使用patchEntity触发验证错误.所以我认为在执行保存操作之前始终检查/显示错误会更好:
// src/Controller/UsersController.php
public function add() {
$user = $this->Users->newEntity();
if ($this->request->is('post')) {
$user = $this->Users->patchEntity($user, $this->request->data, ['validate' => 'default'] );
if ( $user->errors() ) {
$this->Flash->error('There was a Entity validation error.');
} else {
// Optional: Manipulate Entity here, e.g. add some automatic values
// Be aware: Entity content will not be validated again by default
if ( $this->Users->save($user) ) {
$this->Flash->succeed('Saved successfully.');
return $this->redirect(['controller' => …
Run Code Online (Sandbox Code Playgroud) 如何使用 CakePHP 3 中的电子邮件传输类“调试”查看结果(最终邮件)?或者哪里可以找到返回的结果?书中没有关于电子邮件调试的详细信息。
里面config/app.php
说
// Each transport needs a `className`. Valid options are as follows:
// - Mail : Send using PHP mail function
// - Smtp : Send using SMTP
// - Debug : Do not send the email, just return the result
Run Code Online (Sandbox Code Playgroud)
所以我设置
'EmailTransport' => [
'default' => [
'className' => 'Debug',
],
],
Run Code Online (Sandbox Code Playgroud)
在测试控制器中:
namespace App\Controller;
use App\Controller\AppController;
use Cake\Event\Event;
use Cake\Network\Exception\NotFoundException;
use Cake\Mailer\Email;
class TestsController extends AppController {
public …
Run Code Online (Sandbox Code Playgroud) 我有两张桌子.我的主要表是学生.我的次要表是考试.我正在尝试使用hasMany和belongsToMany Association 保存这两个表.但它仅在学生表中保存数据,而不是在考试中保存.任何人都可以帮我解决这个问题.
学生型号:
class StudentsTable extends Table {
public function initialize(array $config) {
$this->addBehavior('Timestamp');
parent::initialize($config);
$this->table('students');
$this->primaryKey(['id']);
$this->hasMany('Exams', [
'className' => 'Exams',
'foreignKey' => 'student_id',
'dependent'=>'true',
'cascadeCallbacks'=>'true']);
}
}
Run Code Online (Sandbox Code Playgroud)
考试模型:
class ExamsTable extends Table {
public function initialize(array $config) {
parent::initialize($config);
$this->table('exams');
$this->primaryKey(['id']);
$this->belongsToMany('Students',[
'className'=>'Students',
'foreignKey' => 'subject_id',
'dependent'=>'true',
'cascadeCallbacks'=>'true']);
}
}
Run Code Online (Sandbox Code Playgroud)
我的school.ctp:
echo $this->Form->create();
echo $this->Form->input('name');
echo $this->Form->input('exams.subject', array(
'required'=>false,
'multiple' => 'checkbox',
'options' => array(
0 …
Run Code Online (Sandbox Code Playgroud) 我是CakePHP的新手,有以下问题:
我有"图像","关键字"和"KeywordCategories"表.每个图像都可以有许多关键字(多对多),每个关键字都有一个类别(多对一).使用检索图像列表
$images = $this->Images->find()->contain(['Keywords', 'Keywords.KeywordCategories']);
Run Code Online (Sandbox Code Playgroud)
返回如下结果结构:
[
{
"id":1,
"keywords":[
{
"keyword":"Dog",
"keyword_category":{
"title":"Animal"
}
},
{
"keyword":"Cat",
"keyword_category":{
"title":"Animal"
}
},
{
"keyword":"Black",
"keyword_category":{
"title":"Color"
}
}
]
}
]
Run Code Online (Sandbox Code Playgroud)
这没关系,但我想在这样的结构中按关键字类别对关键字进行分组:
[
{
"id":1,
"keyword_categories":[
{
"title":"Animal",
"keywords":[
{
"keyword":"Dog"
},
{
"keyword":"Cat"
}
]
},
{
"title":"Color",
"keywords":[
{
"keyword":"Black"
}
]
}
]
}
]
Run Code Online (Sandbox Code Playgroud)
知道如何通过CakePHP查询实现这一目标吗?
如果结果对象包含任何条目,如何在视图模板中检查?
以CakePHP 3博客教程为例.他们展示了如何在一个页面上列出所有文章:
// src/Controller/ArticlesController.php
public function index() {
$this->set('articles', $this->Articles->find('all'));
}
Run Code Online (Sandbox Code Playgroud)
和视图模板:
<!-- File: src/Template/Articles/index.ctp -->
<table>
<tr>
<th>Id</th>
<th>Title</th>
</tr>
<?php foreach ($articles as $article): ?>
<tr>
<td><?= $article->id ?></td>
<td>
<?= $this->Html->link($article->title, ['action' => 'view', $article->id]) ?>
</td>
</tr>
<?php endforeach; ?>
</table>
Run Code Online (Sandbox Code Playgroud)
缺点:如果数据库中没有条目,则仍会呈现HTML表.
如何防止这种情况并显示一条简单的消息,例如"抱歉没有结果"的内容?
在CakePHP 2
我用过
if ( !empty($articles['0']['id']) ) {
// result table and foreach here
} else {
echo '<p>Sorry no …
Run Code Online (Sandbox Code Playgroud) 我DebugKit
使用以下方法下载了插件:
php composer.phar require --dev cakephp/debug_kit "~3.0"
Run Code Online (Sandbox Code Playgroud)
但它仍然显示警告error.log
并且DebugKit
不起作用:
警告:未启用 DebugKit。您需要安装 pdo_sqlite,或定义“debug_kit”连接名称
那么如何定义debug_kit
连接名称app.php
以及如何启用调试工具包??
使用屏幕阅读器用户<nav>
的嵌套<ul>
列表增强网站地标的语义可访问性的最佳做法是什么?(aria-label 和 list level 目前并非所有屏幕阅读器都能发音)
我在 iOS 9 上使用 Voiceover、Android 5 上的 Talkback 和 Win10(在 Firefox 中)上的 NVDA 2016-1 进行了测试。我在屏幕阅读器应用程序中使用了(大部分)默认设置。
我认为以下列表应该是为屏幕阅读器用户准备的最佳选择:
演示代码 1
<nav>
<ul aria-label="product navigation">
<li><a href="product-a.html">Product A</a>
<ul aria-label="sub menu Product A">
<li><a href="product-a-spec.html">Specifications</a></li>
<li><a href="product-a-acce.html">Accessories</a></li>
</ul>
</li>
<li><a href="product-b.html">Product B</a>
<ul aria-label="sub menu Product B">
<li><a href="product-b-spec.html">Specifications</a></li>
<li><a href="product-b-acce.html">Accessories</a></li>
</ul>
</li>
</ul>
</nav>
Run Code Online (Sandbox Code Playgroud)
预期结果:屏幕阅读器这样说:
- 导航地标的起点
- 具有两个元素的开始列表级别 1 “产品导航”
- “产品 A”链接
- 具有两个元素的起始列表级别 2 “子菜单产品 A”
- “规格”链接
- “附件”链接 …
错误还是功能?如果我更改了请求数据beforeMarshal
并且存在验证错误,则不会返回修改请求数据.
这个问题可能与如何在验证NotEmpty之前使用Trim()有关?.
在构建实体之前修改请求数据 如果需要在将请求数据转换为实体之前对其进行修改,则可以使用Model.beforeMarshal事件.此事件允许您在创建实体之前操作请求数据.来源:CakePHP 3文档
根据该书,无论是否存在验证错误,我都希望请求数据始终更改.
示例或测试用例:
// /src/Model/Table/UsersTable.php
namespace App\Model\Table;
use Cake\ORM\Table;
// Required for beforeMarshal event:
use Cake\Event\Event;
use ArrayObject;
// Required for Validation:
use Cake\Validation\Validator;
class UsersTable extends Table {
public function beforeMarshal(Event $event, ArrayObject $data, ArrayObject $options) {
$data['firstname'] = trim($data['firstname']);
}
public function validationDefault(Validator $validator) {
$validator
->add('firstname', [
'minLength' => [ 'rule' => ['minLength', 2], 'message' => 'Too short.' ],
])
;
return $validator;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我输入"d"(Space-d),则会显示验证错误,但空格本身不会在表单中删除.我会表示只显示"d"的表单,因为使用beforeMarshal事件从请求数据中删除了空格.那么......错误还是功能?
我的解决方案是在控制器中使用trim() - …
我正在创建一个CakePHP 3.0 REST API.我按照这个说明(书中的路由)并在json中收到了回复.这是我的代码.
01 src/config/rout.php
Router::extensions('json');
Run Code Online (Sandbox Code Playgroud)
02 src/controler/UsersController.php
public function view($id = null) {
$data = array('status' => 'o','status_message' => 'ok' );
$this->set('data', $data);
$this->set('_serialize', 'data');
}
Run Code Online (Sandbox Code Playgroud)
03发送一个帖子请求到这个URL
输出:
{
"status": "o",
"status_message": "ok"
}
Run Code Online (Sandbox Code Playgroud)
但是我想把json放在没有.json扩展名的情况下.先感谢您.
cakephp-3.0 ×6
cakephp-3.x ×4
cakephp ×3
php ×3
associations ×1
cakephp-3.1 ×1
debugging ×1
html ×1
json ×1
mysql ×1
nested-lists ×1
nginx ×1
orm ×1
reactjs ×1
url-routing ×1
validation ×1
wai-aria ×1