1

ブロック内にフォームを作成しました。初めて表示されましたが、再び表示されません。drupal を初めて使用するため、なぜこれが起こっているのかわかりません。

     <?php

         function my_module_block_info() {
              $blocks = array();
              $blocks['my_block'] = array(
              'info' => t('My Custom Block'),
              );

              return $blocks;
         }
         function hook_block_view($delta = '') {
               switch ($delta) {
               case 'my_block':
               $block['subject'] = t('My form');
               $block['content'] = my_module_my_form();
         }
       }

       function my_module_menu() {
           $items = array();
           $items['my_module/form'] = array(
           'title' => t('My form'),
           'page callback' => 'my_module_form',
           'acess arguments' => array('access content'),
           'description' => t('My form'),
           'type' => MENU_CALLBACK,
           'access callback' => TRUE,
            );
       return $items;
           }

        function my_module_form() {
        return drupal_get_form('my_module_my_form');
            }

        function my_module_my_form($form) {

             $form['name'] = array(
             '#type' => 'textfield',
             '#title' => t('username'),
             '#required' => TRUE,
             '#description' => "enter your username.",
             '#size' => 20,
             '#maxlength' => 20,
             );
             $form['picture'] = array(
             '#type' => 'file',
             '#title' => t('Image'),
             '#description' => t('Upload a file, allowed extensions: jpg, jpeg, png, gif'),
              );
     $form['submit'] = array(
      '#type' => 'submit',
      '#value' => 'update your profile',
     );
     return $form;
 }

    function my_module_my_form_submit($form, &$form_state) {
     global $user;
     $account = user_load($user -> uid);
     $image_path = 'picture://';
      $validators = array(
      'file_validate_is_image' => array(),
       );
     $file = new StdClass();
         $file -> uid = $user -> uid;
         $file->uri = $image_path;
         $file = file_save_upload('picture', $validators);
     $new = array (
      'name' => $form_state['values']['name'],
      'picture' => $file,
      );
      user_save($account,$new );
    $message = 'You have updated your profile';
    drupal_set_message(t($message));
 }

このフォームはユーザー名とユーザーの写真を更新していますが、このフォームをコンテンツとしてブロックで呼び出そうとしていますが、最初は機能しません。助けてください。

4

1 に答える 1

3

機能に問題が多い

function hook_block_view($delta = '') {
  switch ($delta) {
    case 'my_block':
      $block['subject'] = t('My form');
      $block['content'] = my_module_my_form();
    }
}
  1. ここでは、フック自体ではなく、hook_block_view() の実装を記述しているため、関数を呼び出す必要がありmy_module_block_view()ます。
  2. には$block['content']レンダリングされたフォームが取り込まれる必要があるためmy_module_form()、フォーム定義関数の代わりに呼び出す必要があります (メニュー フックのページ コールバックで行うのと同じように)。
  3. あなたの関数は何も返しません! return $block;switch ステートメントの後に含める必要があります。

したがって、関数は次のようなものにする必要があります

function my_module_block_view($delta = '') {
  switch ($delta) {
    case 'my_block':
      $block['subject'] = t('My form');
      $block['content'] = my_module_form();
      break;
  }
  return $block;
}
于 2013-04-06T22:02:24.187 に答える