6 http://www.tanarurkerem.hu/node/395
8 Készíts telefonszám adatbázis kezelőt. Az adatbázisban csak nevet és telefonszámot kell tárolnod.
9 Tudni kell felvenni új számot, törölni és szerkeszteni már meglévőt és listázni/keresni a már meglévő adatokban.
10 (nézd a héthez tartozó webináriumot)
12 Figyelj a biztonságra mind adatbázis oldalon, mind pedig a HTML kimenet szinten!
13 Nézd át a többiek feladatát és keress bennük biztonsági réseket.
14 Kizárólag javítási javaslattal együtt hívd fel erre a feladat készítőjének figyelmét.
18 /* hook_perm() implementáció */
19 function nevergone_2_perm() {
20 return array('elem megtekintése', 'elem szerkesztése');
24 /* hook_menu() implementáció */
25 function nevergone_2_menu() {
26 $items['nevergone_2'] = array( /* listázás */
27 'title' => 'nevergone_2 telefonkönyv',
28 'page callback' => 'nevergone_2_page',
29 'access arguments' => array('elem megtekintése'),
31 $items['nevergone_2/%nevergone_2/edit'] = array( /* elem szerkesztése */
32 'title' => 'nevergone_2 elem szerkesztése',
33 'page callback' => 'nevergone_2_edit',
34 'page arguments' => array(1), /* az első argumentum tartalmazza az elem azonosítóját: nevergone_2/[id] */
35 'access arguments' => array('elem szerkesztése'),
36 'type' => MENU_CALLBACK,
38 $items['nevergone_2/%nevergone_2/delete'] = array( /* elem törlése */
39 'title' => 'nevergone_2 elem törlése',
40 'page callback' => 'nevergone_2_delete',
41 'page arguments' => array(1),
42 'access arguments' => array('elem szerkesztése'),
43 'type' => MENU_CALLBACK,
45 $items['nevergone_2/search/name'] = array( /* automatikus kiegészítés névre */
46 'page callback' => 'nevergone_2_search_name',
47 'access arguments' => array('elem megtekintése'),
48 'type' => MENU_CALLBACK,
50 $items['nevergone_2/search/phone'] = array( /* automatikus kiegészítés telefonszámra */
51 'page callback' => 'nevergone_2_search_phone',
52 'access arguments' => array('elem megtekintése'),
53 'type' => MENU_CALLBACK,
59 /* telefonszám-form */
60 function nevergone_2_form($form_state, $data = NULL) {
61 /* új elem felvitele */
62 $form['id'] = array( /* azonosító */
64 '#value' => isset($data['id']) ? $data['id'] : 0,
66 $form['name'] = array( /* név */
67 '#type' => 'textfield',
69 '#default_value' => isset($data['name']) ? $data['name'] : '',
71 $form['phone'] = array( /* telefonszám */
72 '#type' => 'textfield',
73 '#title' => 'Telefonszám',
74 '#default_value' => isset($data['name']) ? $data['phone'] : '',
76 $form['submit'] = array( /* "submit" gomb */
85 function nevergone_2_search_form($form_state, $data = NULL) {
87 $form['search_field'] = array(
88 '#type' => 'fieldset',
89 '#title' => 'Keresés',
90 '#collapsible' => TRUE,
91 '#collapsed' => FALSE,
93 $form['search_field']['search_name'] = array( /* név */
94 '#type' => 'textfield',
96 '#autocomplete_path' => 'nevergone_2/search/name',
98 $form['search_field']['search_phone'] = array( /* telefonszám */
99 '#type' => 'textfield',
100 '#title' => 'Telefonszám',
101 '#autocomplete_path' => 'nevergone_2/search/phone',
103 $form['search_field']['search_submit'] = array( /* "submit" gomb */
105 '#value' => 'Keresés',
111 /* form megjelenítése és adatok listázása */
112 function nevergone_2_page() {
114 $output .= drupal_get_form('nevergone_2_form');
115 $output .= drupal_get_form('nevergone_2_search_form');
116 /* fejléc készítése a megjelenített táblázathoz */
120 'data' => 'Azonosító',
128 'data' => 'Telefonszám',
131 'data' => 'Szerkesztés / Törlés',
134 /* elemek listája rendezhetően */
135 $res = pager_query("SELECT * FROM {nevergone_2}" . tablesort_sql($header));
136 while ($row = db_fetch_array($res)) {
137 /* adatbázisból kiolvasott elemeket tömbbe pakoljuk a táblázatos megjelenítéshez */
138 $id = check_plain($row['id']);
139 $tr = array(); /* egy sor elkészítése */
141 $tr[] = check_plain($row['name']);
142 $tr[] = check_plain($row['phone']);
143 $tr[] = l('szerkesztés', 'nevergone_2/' . $id . '/edit') . ' / ' . l('törlés', 'nevergone_2/' . $id . '/delete');
144 $table[] = $tr; /* sor a táblázatba */
146 $output .= theme('table', $header, $table);
147 $output .= theme('pager');
152 /* form tartalmának ellenőrzése */
153 function nevergone_2_form_validate($form, &$form_state) {
154 if (empty($form_state['values']['name'])) {
155 form_error($form['name'], 'Nem lehet üres a név!');
157 if (empty($form_state['values']['phone'])) {
158 form_error($form['phone'], 'Nem lehet üres a telefonszám!');
163 /* form tartalmának mentése az adatbázisba */
164 function nevergone_2_form_submit($form, &$form_state) {
165 if ($form_state['values']['id'] === 0) {
166 /* új elem hozzáadása */
167 drupal_write_record('nevergone_2', $form_state['values']);
168 drupal_set_message('Új elem hozzáadva!');
171 /* szerkesztett elem mentése */
172 drupal_write_record('nevergone_2', $form_state['values'], array('id'));
173 drupal_set_message('Elem szerkesztése megtörtént!');
174 drupal_goto('nevergone_2');
179 /* adott azonosítójú elem betöltése az adatbázisból */
180 function nevergone_2_load($arg) {
181 $data = db_fetch_array(db_query("SELECT * FROM {nevergone_2} WHERE id=%d", check_plain($arg)));
186 /* adott azonosítójú elem szerkesztése */
187 function nevergone_2_edit($data){
188 $output = drupal_get_form('nevergone_2_form', $data);
193 /* adott azonosítójú elem törlése */
194 function nevergone_2_delete($data){
195 $res = db_query("DELETE FROM {nevergone_2} WHERE id=%d", check_plain($data['id']));
196 drupal_set_message('Elem törlése megtörtént!');
197 drupal_goto('nevergone_2');
201 /* keresésnél automatikus kiegészítés a név mezőre */
202 function nevergone_2_search_name($name = '') {
205 $result = db_query_range("SELECT name FROM {nevergone_2} WHERE LOWER(name) LIKE LOWER('%s%%')", $name, 0, 10);
206 while ($row = db_fetch_array($result)) {
207 $matches[$row['name']] = check_plain($row['name']);
210 drupal_json($matches);
214 /* keresésnél automatikus kiegészítés a telefonszám mezőre */
215 function nevergone_2_search_phone($phone = '') {
218 $result = db_query_range("SELECT phone FROM {nevergone_2} WHERE phone LIKE '%s%%'", $phone, 0, 10);
219 while ($row = db_fetch_array($result)) {
220 $matches[$row['phone']] = check_plain($row['phone']);
223 drupal_json($matches);