自定义模块不工作drupal8

时间:2015-11-24 07:49:05

标签: controller routing drupal-modules drupal-8

我开始构建一个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);
   }
   }
   }
  ?>

请帮帮我。

2 个答案:

答案 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没有抱怨丢失的分号,也没有抱怨缺少默认值。