我开始构建一个drupal 8自定义模块但无法运行它。它显示Page Not Found Error。
我的模块名称是my_form,这是 my_form.module 文件
<?php
function my_form_menu()
{
$items = array();
$items['hello'] = array(
'title' => 'Hello World',
'description' => 'This is my First page.',
'route' => 'my_form.hello',
//'type' => MENU_LOCAL_TASK,
);
$items['form'] = array(
'title' => 'First form',
'description' => 'This is a example form.',
'route' => 'my_form.formpage',
//'type' => MENU_LOCAL_TASK,
);
return $items;
}
?>
这里是 my_form.routing.yml 文件
<?php
my_form.hello:
path: 'my_form/myformcontroller'
defaults:
_controller: '\Drupal\my_form\Controller\myformcontroller::hello'
_title: 'My first form in Drupal 8'
requirements:
_permission: 'access content'
my_form.formpage:
path: 'my_form/form'
defaults:
_form: '\Drupal\my_form\Form\form'
_title: 'Form page'
requirements:
_permission: 'access content'
?>
我认为他的主要冲突是这个文件,请告诉路由路径或命名是否有问题。(我仍然不确定在定义路由时是否为PATH字段提供了正确的路径。) 这是 myformcontroller.php ,其路径为[module] \ src \ Controller \
<?php
namespace Drupal\my_form\Controller;
class myformcontroller
{
public function hello()
{
$element['markUp'] = array(
#markup' => 'Hello world!',
);
return $element;
}
}
?>
这是 form.php ,位于[module] \ src \ Form \ form.php
<?php
namespace Drupal\my_form\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Component\Utility\UrlHelper;
class formpage extends FormBase {
public function getFormId() {
return 'my_form_formpage_form';
}
public function buildForm(array $form, FormStateInterface $form_state) {
$form['name'] = array(
'#type' => 'textfield',
'#title' => 'name',
'#required' => TRUE,
);
$form['email'] = array(
'#type' => 'textfield',
'#title' => 'email',
'#required' => TRUE,
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Submit'),
);
return $form;
}
public function validateForm(array &$form, FormStateInterface $form_state) {
$email = $form_state['values']['email'];
if (!filter_var($email, FILTER_VALIDATE_EMAIL))
{
form_set_error('email', t('Invalid email format'));
}
}
public function submitForm(array &$form, FormStateInterface $form_state) {
foreach ($form_state->getValues() as $key => $value)
{
drupal_set_message($key . ': ' . $value);
}
}
}
?>
请帮帮我。
答案 0 :(得分:1)
基本上这就是你所需要的:
<强> my_form.routing.yml 强>:
my_form.formpage:
path: '/my_form/form'
defaults:
_form: '\Drupal\my_form\Form\MyForm'
_title: 'Form page'
requirements:
_permission: 'access content'
<强> my_form.info.yml 强>:
name: My Form
type: module
description: My form module.
core: 8.x
MyForm.php (位置为my_form / src / Form / MyForm.php):
<?php
namespace Drupal\my_form\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
class MyForm extends FormBase {
public function getFormId() {
return 'my_form_formpage_form';
}
public function buildForm(array $form, FormStateInterface $form_state) {
$form['name'] = array(
'#type' => 'textfield',
'#title' => 'name',
'#required' => TRUE,
);
$form['email'] = array(
'#type' => 'textfield',
'#title' => 'email',
'#required' => TRUE,
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Submit'),
);
return $form;
}
public function validateForm(array &$form, FormStateInterface $form_state) {
$email = $form_state['values']['email'];
if (!filter_var($email, FILTER_VALIDATE_EMAIL))
{
form_set_error('email', t('Invalid email format'));
}
}
public function submitForm(array &$form, FormStateInterface $form_state) {
foreach ($form_state->getValues() as $key => $value)
{
drupal_set_message($key . ': ' . $value);
}
}
}
我已将 form.php 文件重命名为 MyForm.php ,并在其中使用 class MyForm 。这被认为是更好的做法(来自Symfony和其他一些已知的框架) - 对文件中的类和文件名本身使用相同的名称。
P.S。不要忘记启用您创建的模块并清理缓存。
答案 1 :(得分:0)
我刚刚遇到了完全相同的问题。问题在于路由YAML。 Drupal没有告诉你关于YAML的拼写错误!
module.add_thing:
path: '/admin/config/development/module/add'
default:
_form: '\Drupal\module\Form\ModuleForm'
_title: 'Add New Thing'
requirements:
_permission: 'administer module'
让我们玩发现拼写错误!
回答 :default
...应该是defaults
。那s
花费了我2小时的开发时间。
在此之前我也失去了30分钟的开发时间,因为另一条路线的定义(例如module.overview
)缺少一个尾随的分号。
这些&#34;语法&#34; Drupal报告了样式错误。 Drupal没有抱怨丢失的分号,也没有抱怨缺少默认值。