【问题标题】:custom module not working drupal8自定义模块不工作 drupal8
【发布时间】:2015-11-24 07:49:04
【问题描述】:

我开始构建一个 drupal 8 自定义模块,但无法运行它。它显示页面未找到错误。

我的模块名称是 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;
 }
 }
 ?>

这是位于 [module]\src\Form\form.php

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);
   }
   }
   }
  ?>

请帮帮我。

【问题讨论】:

标签: controller routing drupal-modules drupal-8


【解决方案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 和其他一些已知框架) - 对文件内的类和文件名本身使用相同的名称。

附:不要忘记启用您创建的模块清理缓存

【讨论】:

  • 模块已启用,并清除了所有缓存,仍然无法正常工作,我认为模块无法选择路由yaml文件。请问下定义的路由和路径的名称是否有与它有关。它们是否共享任何相同的参数,因为我已经阅读了许多文档,其中路由以不同的方式定义。
  • @ronit - 你解决了吗?我遇到了完全相同的问题。
  • 解决了它...@pavlovich 从我那里得到了 +1 的简单概述。逐行阅读和比较它向我展示了我的s-ing方式的错误;)
  • @Nick 是的,解决了..routing.yaml 文件中的缩进问题是问题所在。保留一个空格缩进,一切顺利
【解决方案2】:

我刚刚遇到了同样的问题。 be 的问题在于路由 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...应该是defaultss 花了我 2 个小时的开发时间。

在此之前我还损失了 30 分钟的开发时间,因为另一条路线的定义(例如 module.overview)缺少尾随分号。

这些“语法”样式错误均未由 Drupal 报告。 Drupal 没有抱怨缺少分号,也没有抱怨缺少默认值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多