Լրացուցիչ Բլոկների Տեսակներ (EBT) - Դասավորության Կառուցողի նոր փորձառություն❗

Լրացուցիչ Բլոկների Տեսակներ (EBT) - ձևավորված, կարգավորելի բլոկների տեսակներ՝ սլայդշոուներ, ներդիրներ, քարտեր, բացվող ցանկեր և շատ ուրիշներ։ Ներառված կարգավորումներ՝ ֆոնի, DOM տուփի, JavaScript փլագինների համար։ Փորձեք դասավորությունների կառուցման ապագան արդեն այսօր։

EBT մոդուլների ցուցադրական տարբերակներ Ներբեռնել EBT մոդուլները

❗Լրացուցիչ Պարբերությունների Տեսակներ (EPT) - Պարբերությունների նոր փորձառություն

Լրացուցիչ պարբերության տեսակներ (EPT) - անալոգիական պարբերության վրա հիմնված մոդուլների հավաքակազմ։

EPT մոդուլների ցուցադրական տարբերակներ Ներբեռնել EPT մոդուլները

Scroll

Drupal 7 ձևաթղթերի API՝ Drupal-ում ձևերի ստեղծման համար

11/05/2025, by Ivan

Նախորդ դասերում մենք ծանոթացանք hook_block_info(), hook_block_view(), hook_menu(), hook_permission() hook-երին և այժմ կարող ենք ծրագրային եղանակով ստեղծել անսահմանափակ քանակությամբ էջեր և բլոկներ։ Այս դասում մենք կծանոթանանք Drupal 7-ի Form API-ին՝ ձևերի ստեղծման համար։ Մենք կստեղծենք ձև՝ մոդուլի ֆունկցիաների ադմինիստրացման համար և կփորձենք օգտագործել հնարավորինս շատ արդեն ծանոթ hook-եր՝ հմտությունները ամրապնդելու նպատակով։

Սկզբում կարտածենք 3 բլոկ՝ վստահ եմ՝ դա ձեզ համար բարդ չի լինի։

function sitemade_block_info(){
    $blocks = array(); // ինիցիալիզացնում ենք դատարկ զանգված
    $blocks[1]['info'] = 'Օգտատերերի ցանկ';
    $blocks[2]['info'] = 'Նոդերի ցանկ';
    $blocks[3]['info'] = 'Տերմինների ցանկ';
    return $blocks;
}
function sitemade_block_view($delta = ''){
    $block = array();
    switch ($delta){
        case 1:
          $block['subject'] = 'Օգտատերեր';
          $block['content'] = '';
          $query = db_select('users', 'u')
            ->fields('u', array('uid', 'name'))
            ->orderBy('u.uid', 'DESC')
            ->range(0, 5)
            ->execute();
          $users = $query->fetchAll(PDO::FETCH_ASSOC);
          foreach($users as $user){
            $block['content'] .= '';
          }
        break;
        case 2:
          $block['subject'] = 'Նոդեր';
          $block['content'] = '';
          $query = db_select('node', 'n')
            ->fields('n', array('nid', 'title'))
            ->orderBy('n.nid', 'DESC')
            ->range(0, 10)
            ->execute();
          $nodes = $query->fetchAll(PDO::FETCH_ASSOC);
          foreach($nodes as $node){
            $block['content'] .= '';
          }
        break;
        case 3:
          $block['subject'] = 'Տերմիններ';
          $block['content'] = '';
          $query = db_select('taxonomy_term_data', 't')
            ->fields('t', array('tid', 'name'))
            ->orderBy('t.tid', 'DESC')
            ->range(0, 10)
            ->execute();
          $terms = $query->fetchAll(PDO::FETCH_ASSOC);
          foreach($terms as $term){
            $block['content'] .= '';
          }
        break;
    }
    return $block;
}

Մաքրում ենք քեշը, որպեսզի նոր բլոկները հայտնվեն ադմինիստրատիվ էջում։ Դրանց տեղադրում ենք ձախ sidebar-ում։

Drupal blocks

Այժմ կստեղծենք ադմինիստրատիվ էջ, որտեղ հետո կտեղադրենք ձև՝ այս երեք բլոկների կառավարումն իրականացնելու համար։

function sitemade_permission(){
    return array(
      'admin content blocks' => array(
        'title' => t('Բովանդակության բլոկների կառավարում'),
        'description' => t('Նոդեր, օգտատերեր, տերմիններ'),
      ),
    );
}

function sitemade_menu(){
    $items = array();
    $items['admin/config/content/content_blocks'] = array(
      'title' => 'Օգտատերերի, նոդերի, տերմինների բլոկներ',
      'description' => 'Բլոկների ադմինիստրացում',
      'page callback' => '_sitemade_content_blocks',
      'access arguments' => array('admin content blocks'),
    );
    return $items;
}

function _sitemade_content_blocks(){
    $content = 'Lorem ipsum!';
    return $content;
}

Էջը ստեղծվեց, placeholder-ը հասանելի է admin/config/content/content_blocks հասցեով։

Drupal admin page

Ավելացնում ենք թույլտվությունը ադմինի համար՝ այս էջին հասանելիություն ունենալու համար։

Drupal permission

Այժմ կփոխենք hook-երի կոդը։ Նախ կստեղծենք ձև՝ երեք բլոկները կառավարելու համար։ Կառավարելու ենք բլոկի վերնագրերն ու ցուցադրվող նյութերի քանակները։

Փոխում ենք hook_menu-ի 'page callback' հատկությունը՝

function sitemade_menu(){
    $items = array();
    $items['admin/config/content/content_blocks'] = array(
      'title' => 'Օգտատերերի, նոդերի, տերմինների բլոկներ',
      'description' => 'Բլոկների ադմինիստրացում',
      'page callback' => 'drupal_get_form',
      'page arguments' => array('_sitemade_content_blocks'),
      'access arguments' => array('admin content blocks'),
    );
    return $items;
}

Շարունակելի է… Խնդրում եմ գրեք «շարունակիր», եթե ցանկանում եք շարունակել թարգմանությունը:

Այժմ գրենք ձևը՝ _sitemade_content_blocks ֆունկցիայի միջոցով, որը կվերադարձնի Form API դաշտերի զանգված։ Մենք կօգտագործենք variable_get()՝ դաշտերի լռելյայն արժեքները ներբեռնելու համար։

function _sitemade_content_blocks(){
    $form = array();

    $form['nodes-title'] = array(
      '#type' => 'textfield',
      '#title' => t('Նոդերի բլոկի վերնագիր'),
      '#default_value' => variable_get('node_block', ''),
      '#size' => 60,
      '#maxlength' => 64,
      '#description' => t('Նոդերի բլոկի վերնագիրը'),
    );

    $form['node-selected'] = array(
      '#type' => 'select',
      '#title' => t('Նոդերի քանակը բլոկում'),
      '#options' => drupal_map_assoc(range(1, 10)),
      '#default_value' => variable_get('node_block_range', 5),
      '#description' => t('Քանակը՝ ցուցադրվող նոդերի'),
    );

    $form['users-title'] = array(
      '#type' => 'textfield',
      '#title' => t('Օգտատերերի բլոկի վերնագիր'),
      '#default_value' => variable_get('user_block', ''),
      '#size' => 60,
      '#maxlength' => 64,
      '#description' => t('Օգտատերերի բլոկի վերնագիրը'),
    );

    $form['user-selected'] = array(
      '#type' => 'select',
      '#title' => t('Օգտատերերի քանակը բլոկում'),
      '#options' => drupal_map_assoc(range(1, 10)),
      '#default_value' => variable_get('user_block_range', 5),
      '#description' => t('Ցուցադրվող օգտատերերի քանակը'),
    );

    $form['terms-title'] = array(
      '#type' => 'textfield',
      '#title' => t('Տերմինների բլոկի վերնագիր'),
      '#default_value' => variable_get('term_block', ''),
      '#size' => 60,
      '#maxlength' => 64,
      '#description' => t('Տերմինների բլոկի վերնագիրը'),
    );

    $form['term-selected'] = array(
      '#type' => 'select',
      '#title' => t('Տերմինների քանակը բլոկում'),
      '#options' => drupal_map_assoc(range(1, 10)),
      '#default_value' => variable_get('term_block_range', 5),
      '#description' => t('Ցուցադրվող տերմինների քանակը'),
    );

    $form['actions'] = array('#type' => 'actions');
    $form['actions']['submit'] = array(
      '#type' => 'submit',
      '#value' => t('Պահպանել'),
    );

    return $form;
}

Այժմ գրենք submit ֆունկցիան՝ արժեքները պահպանելու համար variable_set()-ով։

function sitemade_content_blocks_submit($form, &$form_state){
    variable_set('node_block', $form_state['values']['nodes-title']);
    variable_set('user_block', $form_state['values']['users-title']);
    variable_set('term_block', $form_state['values']['terms-title']);
    variable_set('node_block_range', $form_state['values']['node-selected']);
    variable_set('user_block_range', $form_state['values']['user-selected']);
    variable_set('term_block_range', $form_state['values']['term-selected']);
}

Եվ վերջապես վերախմբագրում ենք hook_block_view()-ը՝ վերնագրերն ու քանակները variable_get()-ով ստանալու համար։

function sitemade_block_view($delta = '') {
    $block = array();
    switch ($delta){
        case 1:
          $block['subject'] = variable_get('user_block', 'Օգտատերեր');
          $block['content'] = '';
          $query = db_select('users', 'u')
            ->fields('u', array('uid', 'name'))
            ->orderBy('u.uid', 'DESC')
            ->range(0, variable_get('user_block_range', 5))
            ->execute();
          $users = $query->fetchAll(PDO::FETCH_ASSOC);
          foreach($users as $user){
            $block['content'] .= '';
          }
        break;

        case 2:
          $block['subject'] = variable_get('node_block', 'Նոդեր');
          $block['content'] = '';
          $query = db_select('node', 'n')
            ->fields('n', array('nid', 'title'))
            ->orderBy('n.nid', 'DESC')
            ->range(0, variable_get('node_block_range', 5))
            ->execute();
          $nodes = $query->fetchAll(PDO::FETCH_ASSOC);
          foreach($nodes as $node){
            $block['content'] .= '';
          }
        break;

        case 3:
          $block['subject'] = variable_get('term_block', 'Տերմիններ');
          $block['content'] = '';
          $query = db_select('taxonomy_term_data', 't')
            ->fields('t', array('tid', 'name'))
            ->orderBy('t.tid', 'DESC')
            ->range(0, variable_get('term_block_range', 10))
            ->execute();
          $terms = $query->fetchAll(PDO::FETCH_ASSOC);
          foreach($terms as $term){
            $block['content'] .= '';
          }
        break;
    }
    return $block;
}

Եվ վերջում՝ չմոռանաք մաքրել քեշը։ Արդյունքը տեսանելի կլինի գլխավոր էջում։

Drupal block

Այսպիսով, մենք ամբողջությամբ կազմեցինք մոդուլ, որը

  • Արտադրում է երեք տարբեր բլոկ՝ վերջին օգտատերերի, նոդերի և տերմինների ցուցակներով,
  • Ունի կարգավորումների էջ ադմինիստրատորների համար՝ admin/config/content/content_blocks հասցեում,
  • Օգտագործում է Form API՝ ձև ներկայացնելու և մշակելու համար,
  • Պահպանում է ձևի արժեքները variable_set()-ով և հետ բերում variable_get()-ով՝ բլոկների բովանդակությունը կառավարելու նպատակով։

Այս դասը ցույց տվեց, թե ինչպես կարելի է համակցել Drupal 7-ի hook-երն ու Form API-ն՝ կառուցելով հզոր և հարմարեցվող ինտերֆեյսներ։ Այս մոտեցումը կիրառելի է շատ այլ իրավիճակներում ևս՝ թե՛ պարզ մոդուլների, թե՛ բարդ կառավարման միջերեսների համար։

Հաջորդ քայլը կարող է լինել՝

  • Ավելացնել field validation՝ տվյալների ստուգման համար,
  • Օգտագործել system_settings_form()՝ պահպանումը հեշտացնելու համար,
  • Ավելացնել Ajax submit,
  • Կամ նույնիսկ Theme function-ներ՝ ձևի տարրերի արտածումը վերափոխելու համար։

Շնորհավորում եմ․ դուք արդեն տիրապետում եք Drupal 7-ի ամենակարևոր hook-երից մի քանիսին և կարող եք ստեղծել ձեր սեփական ֆունկցիոնալ մոդուլները։

Այս դասընթացը մենք ավարտեցինք ամբողջությամբ։ Այն ընդգրկեց հետևյալ թեմաները՝

  • hook_block_info() և hook_block_view()՝ բլոկների ստեղծման և բովանդակության արտածման համար,
  • hook_permission()՝ օգտվողների իրավունքներ սահմանելու համար,
  • hook_menu()՝ ադմինիստրատիվ էջ ստեղծելու և ձև միացնելու համար,
  • drupal_get_form(), Form API, variable_set() և variable_get()՝ դինամիկ ձևեր ստեղծելու և պահպանված կարգավորումներ կարդալու համար։

Դուք այժմ ունեք լիարժեք մոդուլ, որը ստեղծում է կառավարելի բլոկներ և ունի պարամետրերի ձև՝ դրանց կարգավորելու համար՝ առանց կոդում փոփոխություններ անելու։

Այս սկզբունքները կիրառելի են ցանկացած ժամանակ, երբ դուք ցանկանում եք՝

  • ցուցադրել բովանդակության տարբեր տեսակներ,
  • թույլ տալ ադմիններին փոխել ցուցադրվող բովանդակությունը,
  • կառավարել մոդուլի վարքը UI-ի միջոցով՝ առանց կոշտ կոդավորման։

Հաջորդ հնարավոր թեմաները կարող են լինել՝

  • Մուլթիթաբ ձևերի ստեղծում՝ vertical tabs,
  • Ajax ֆունկցիոնալություն ձևերում,
  • hook_theme() և սեփական ձևանմուշների ստեղծում,
  • Ձևի տարրերի condition-based ցուցադրում,
  • Drupal Configuration API-ի և Storage ձևաչափերի կիրառում։

Շնորհակալություն հետևելու համար։ Եթե ցանկանում եք շարունակել սովորել Drupal-ի մոդուլների ստեղծում կամ խորանալ Form API-ի մեջ, խնդրեք՝ և ես կշարունակեմ հաջորդ թեմաներով։

Որպես ամփոփում, այս դասընթացի շնորհիվ դուք՝

  • Սովորեցիք ինչպես ծրագրային կերպով ստեղծել և կառավարման ենթարկել բլոկներ,
  • Ստեղծեցիք ադմինիստրատիվ ձև՝ Form API-ով, որը թույլ է տալիս փոփոխել բլոկների վերնագրերն ու ցուցադրվող տարրերի քանակը,
  • Կիրառեցիք variable_set() և variable_get()՝ տվյալների պահպանման ու օգտագործման նպատակով,
  • Օգտագործեցիք hook_permission()՝ ձևի հասանելիությունը կառավարելու համար,
  • Երկարատև և փուլ առ փուլ կառուցեցիք ֆունկցիոնալ և հարմարեցվող մոդուլ՝ առանց dependency-heavy լուծումների։

Դուք այժմ կարող եք վստահությամբ ստեղծել ձեր սեփական փոքր մոդուլները՝

  • Օգտագործողի կողմից կարգավորվող բլոկներով,
  • Ադմինի համար հասանելի պարամետրերով,
  • Եվ հեշտությամբ ընդլայնվող կառուցվածքով։

Սա նաև հիանալի սկիզբ է հետևյալ թեմաների համար՝

  • hook_form_alter()՝ գոյություն ունեցող ձևերի վերափոխման համար,
  • Ձևերի օգտագործում մոդալ պատուհաններում,
  • Config API՝ Drupal 8/9/10-ում՝ variable_set()-ի փոխարեն,
  • Field API-ի և Entity API-ի հետ ինտեգրացիա,
  • Աջակցություն multilingual / i18n թարգմանություններին։

Շնորհավոր, դուք հասկացաք Drupal 7-ի մոդուլների կառուցման հիմնական հիմքերը և Form API-ի գործնական օգտագործումը։

Պատրաստ եմ շարունակել՝ եթե ուզում եք անցնել ավելի խորացված թեմաների, ինչպես hook_theme(), custom templates, Ajax forms, կամ RESTful ինտեգրացիան։