2015-11-24 174 views
2

我開始構建一個drupal 8自定義模塊,但無法運行它。它顯示Page Not Found Error。自定義模塊不工作drupal8

我模塊的名稱是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字段提供了正確的路徑,同時定義了r歐特。) 這裏是myformcontroller.php的路徑是[模塊] \ SRC \控制器\

<?php 
namespace Drupal\my_form\Controller; 
class myformcontroller 
{ 
public function hello() 
{ 
$element['markUp'] = array(
#markup' => 'Hello world!', 
); 
return $element; 
} 
} 
?> 

這裏是form.php的位於[模塊] \ SRC \表格\形式。 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

而不是使用my_form.module來描述菜單,菜單項必須在module_name.links.menu.yml文件中定義[https://www.drupal.org/node/2122241](https://www。 drupal.org/node/2122241) – pavlovich

回答

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和使用類MyForm的內。這被認爲是更好的做法(來自Symfony和一些其他已知框架) - 對文件內部的類和文件名本身使用相同的名稱。

P.S.別忘了啓用您創建的模塊,並且也清除緩存

+0

模塊已啓用,並且清除了所有的緩存,但仍然無效,我認爲該模塊無法選擇路由yaml文件。您能否告訴您路由和路徑的名稱是否在與它有關。它們是否共享任何相同的參數,因爲我已經通過了許多文件,其中路由以不同的方式定義。 – ronit

+0

@ronit - 你解決了嗎?我有完全相同的問題。 – Nick

+1

解決了這個問題...... @pavlovich從我那裏獲得了+1的簡單提綱。逐行閱讀和比較,顯示了我的方法錯誤;) – Nick

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)的定義缺少尾隨分號。

Drupal沒有報告這些「語法」風格錯誤。 Drupal沒有抱怨缺少分號,也沒有抱怨缺少缺省值。