Drupal 7 ձևաթղթերի API՝ Drupal-ում ձևերի ստեղծման համար
Նախորդ դասերում մենք ծանոթացանք 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-ում։

Այժմ կստեղծենք ադմինիստրատիվ էջ, որտեղ հետո կտեղադրենք ձև՝ այս երեք բլոկների կառավարումն իրականացնելու համար։
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 հասցեով։

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

Այժմ կփոխենք 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;
}
Եվ վերջում՝ չմոռանաք մաքրել քեշը։ Արդյունքը տեսանելի կլինի գլխավոր էջում։

Այսպիսով, մենք ամբողջությամբ կազմեցինք մոդուլ, որը
- Արտադրում է երեք տարբեր բլոկ՝ վերջին օգտատերերի, նոդերի և տերմինների ցուցակներով,
- Ունի կարգավորումների էջ ադմինիստրատորների համար՝
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 ինտեգրացիան։