sziasztok!
Eredetileg ebből indultam ki:
"http://drupal.hu/forum/elemek-list%C3%A1ja-az-admin-oldalon"
A szerkesztés és a törlés érdekelne, persze nem a users táblában. :)
Saját modult irnék, és egy sima sql tábla karbantartásához kellene, kérdéses edit, delete mintának. Tudnátok segíteni?
A eredeti kód az említett url-ről:
function lista_pelda_menu() { $items['lista'] = array( 'title' => 'Lista pelda', 'description' => 'Pelda.', 'page callback' => 'drupal_get_form', 'page arguments' => array('listazas'), 'access callback' => 'user_access', 'access arguments' => array('access administration pages'), 'type' => MENU_NORMAL_ITEM, ); $items['lista/edit/%'] = array( 'title' => 'Edit user', 'page callback' => 'drupal_get_form', 'page arguments' => array('pelda_user_edit', 2), 'access callback' => 'user_access', 'access arguments' => array('access administration pages'), 'type' => MENU_CALLBACK, ); $items['lista/delete/%'] = array( 'title' => 'Delete user', 'page callback' => 'drupal_get_form', 'page arguments' => array('pelda_user_delete', 2), 'access callback' => 'user_access', 'access arguments' => array('access administration pages'), 'type' => MENU_CALLBACK, ); return $items; } function lista_pelda_theme() { $items['listazas'] = array( 'arguments' => array('form' => array()), ); return $items; } function listazas() { $header = array( array('data' => t('User name'), 'field' => 'u.name', 'sort' => 'asc'), array('data' => t('Mail'), 'field' => 'u.mail'), array('data' => t('Operations'), 'colspan' => 2), ); $form['header'] = array( '#type' => 'value', '#value' => $header, ); $sql = 'SELECT * FROM {users} u WHERE u.uid > 0'; $sql .= tablesort_sql($header); $result = pager_query($sql, 50, 0); $form['user']['#tree'] = TRUE; while ($user = db_fetch_object($result)) { $form['user'][$user->uid] = users_row($user); } $form['pager'] = array('#value' => theme('pager', NULL, 50, 0)); $form['#theme'] = 'listazas'; return $form; } function users_row($user) { $form['name'] = array( '#type' => 'markup', '#value' => $user->name, ); $form['mail'] = array( '#type' => 'markup', '#value' => $user->mail, ); $edit_link = (0) ? '' : l(t('Edit'), 'lista/edit/'. $user->uid); $form['edit_user'] = array( '#type' => 'markup', '#value' => $edit_link, ); $delete_link = (0) ? '' : l(t('Delete'), 'lista/delete/'. $user->uid); $form['delete_user'] = array( '#type' => 'markup', '#value' => $delete_link, ); return $form; } function theme_listazas($form) { $header = $form['header']['#value']; $rows = array(); foreach (element_children($form['user']) as $key) { // Build the table row. $rows[] = array( array('data' => drupal_render($form['user'][$key]['name'])), array('data' => drupal_render($form['user'][$key]['mail'])), array('data' => drupal_render($form['user'][$key]['edit_user'])), array('data' => drupal_render($form['user'][$key]['delete_user'])), ); } $output = theme('table', $header, $rows); if ($form['pager']['#value']) { $output .= drupal_render($form['pager']); } $output .= drupal_render($form); return $output; } function pelda_user_edit($uid) { drupal_set_message(t('Not yet implemented.'), 'error'); $form['dummy'] = NULL; return $form; } function pelda_user_delete($uid) { drupal_set_message(t('Not yet implemented.'), 'error'); $form['dummy'] = NULL; return $form; }
Drupal verzió:
Fórum:
pontosíts
pontosítani kellene milyen a táblád szerkezete és milyen sorokat szeretnél törölni
gondolom az id átvitel érdekelne URL-ben?
mini
pontosítás
nem lényeg a tábla, mert több is lesz majd.
de nekem elég ha egy {users} tábla 'uid', 'name', 'mail' mezővel működne a minta.
próbálom összerakni de nem megy. :(
azt szeretném végső soron, hogy a fenti minta egy tabon (fülön) jelenjen meg (csináltam már tabot MENU_LOCAL_TASK-al). Egy másik tab meg lehet az 'Add', amin felvitelt lehet megtenni (meg egy Edit tab is lenne a szerkesztésre).
Az id-t úgy gondoltam átvinni, hogy aktívvá teszi az 'Edit' fület és ott lehet módosítani. Ez jó nem, v. van szebb, jobb?
G.
tud segiteni valaki? :(
tudna segiteni valaki? :(
egyszeru pelda
http://drupal.org/project/codes
toltsd le a modulomat es olvasd el a codes.admin.inc fajlt
majdnem jó az edit_link :)
Egy ilyen hibaüzenetem van az edit linkre kattintva:
warning: call_user_func_array() [function.call-user-func-array]: First argument is expected to be a valid callback, 'szotar_edit' was given in /var/www/html/drupal/includes/form.inc on line 366.
Kódban:
A 'page arguments' => array('szotar_edit', 2) sorban a szotar_edit a fuggvény, amit meg kell hívni, ez ok. De az eredeti mintában is láttam utána egy 2-t. Ez mi is pontosan?
A hiba gondolom annyi, hogy vár egy paramétert. Jól gondolom?
A böngészőben az edit linkre alul a státusz sorban látszódik a hivatkozás:
http://..../lista/edit/1
Elvileg az SZOTARID=1 paramétert átadja, nem? Mit vár még? :O
G.
mégsem megy
Egy másik témában láttam (http://drupal.hu/forum/form-param%C3%A9ter):
'valami/reszletek/%'
0 = valami
1 = reszletek
2 = %
Nálam most is ugyanaz a hibaüzenet.
Most akkor mi is van? :(
G.
2
A 2 azt jelenti, hogy a $items['lista/edit/%']-ben megadott útvonal harmadik darabját adja át paraméterként (a %-jel. Azért 2, mert a 0. a 'lista', az 1. az 'edit', a 2. a '%'). Elvileg jónak tűnik a kódod...
UI.: Hopp, megtaláltad :)
Fox Mulder
Írasd ki
Hát irasd ki a $SZOTARID értékét a szotar_edit-ben. Mondjuk:
Fox Mulder
átadott paraméter
Az átadott paraméter:
drupal_set_message('Szótár ID: ' . $SZOTARID);
Eredmény:
Szótár ID: Array
Egy tömb? :O
G.
Bocs, helyesen ez:
Ez kiírja a tömböt.
Fox Mulder
hibak
a hibauzenet szerint a szotar_edit fuggvenyed nem letezik. Ha masik fajlba raktad akkor a menuben ezt meg kell mondanod, pl
a menu modositas utan a menut ujra kell epiteni. pl az admin/build/modules oldalon nyomj egy mentest..
masik hiba, hogy a form fuggvenyek elso parametere a $form_state, tehat ha a form fuggvenyednek parametert akarsz atadni akkor az mar a fuggveny masodik parametere lesz. igy:
most működik
A menüben kimaradt a 'file' opció. Most megy... :)
De &$form_state nélkül is megy. Akkor ez fontos, de gondolom a későbbi verziókban már kötelező lesz.
Több paramétert hogy lehet átadni egy függvénynek?
G.
nem megy
egy fuggvenynek nem kell megadnod az osszes parameteret, de ha a masodik parametert (szotarid) akarod hasznalni akkor valamit irnod kell az elsore is..
csereld le ahogy irtam es utana probald ki a
tesztet..
ok
ok, köszi most megy. ki is irja az ID értékét. :)
G.
Így
A page arguments elemei ugyebár a drupal_get_form()- paraméterei, az meg az első paramétert (a függvénynevet) felhasználja, a többi paramétert továbbadja a függvénynek.
Fox Mulder
szotar_delete
A szotar_delete függvényen dolgozom. Cél:
egy kérdés, hogy biztos törölni akarja-e a user az elemet, majd ha igen, akkor töröl.
confirm_form()-t kellene használnom, ugye?
A paraméterek nem egészen világosak:
$form Additional elements to inject into the form, for example hidden elements.
$question The question to ask the user (e.g. "Are you sure you want to delete the block foo?").
$path The page to go to if the user denies the action. Can be either a drupal path, or an array with the keys 'path', 'query', 'fragment'.
$description Additional text to display (defaults to "This action cannot be undone.").
$yes A caption for the button which confirms the action (e.g. "Delete", "Replace", ...).
$no A caption for the link which denies the action (e.g. "Cancel").
$name The internal name used to refer to the confirmation item.
és kellene egy:
Jó felé indultam el?
G.
fuggveny parameterek
a parametereket az adott sorrendben es mindet ki kell tolteni..
es ilyet ne csinalj
hogy beszursz a szovegbe valamit ami az url-bol jon, mert nagyon nagyon veszelyes. hasznald helyette a t() fuggvenyt.
okes, müxik
Működik is. :)
A
$form['#szotarid'] = $szotarid;
pontosan mit is csinál? A paraméterként átadott $szotarid-t a formon hidden mezőként teszi be?
Hogy a Törlés gombra tovább adja a delete_submit() fv-nek?
G.
igen
igen
szotar_edit
hi!
Már csak a szotar_edit maradt megoldatlanul. :)
I. A form megjelenik, pl.:
Szótár ID: 2
Szótár név: 2
Csoport: 'Masodik csop'
Kérem válasszon a csoportból!
A név mezőbe is az ID kerül és nem látom, hogy miért? :)
II. A "Szótár ID" mezőt nem szeretném, hogy a userek módosítsák. Lehet azt read-only-vá tenni valahogy?
G.
miert
mit tettel a $szotar parameterbe?
http://api.drupal.org/api/file/developer/topics/forms_api_reference.html
a #markup tipust kell hasznalnod..
$szotar parameter
A .module menüjében:
szotar.inc:
Nem látom hogy miért kerül bele a NEV-be az ID. :)
G.
pedig egyertelmu, hogy miert nem
az url-bol a hatodik reszt rakod a szotar valtozoba:
tehat ez sem jo, mivel a $szotar az nem tomb.. a szotar_row() fuggveny itt lenyegtelen..
a szotar_edit()-en belul egy SQL select-el betoltod a szotar nevet, vagy egy menu wildcard-ot keszitesz ami a $szotarid-bol $szotar tombot keszit..
http://drupal.org/node/224170 (itt van leirva, csak nagyon bonyolultan magyarazva)
SQL
A form most jó!
viszont a submit nál érdekes adatokat akar beszurni:
Ezt akarja futtatni:
UPDATE SZOTAR SET NEV='Proba', CSOPORTID=2 WHERE SZOTARID=0
azaz a form-ból nem veszi át az új (módosított) értékeket és a SZOTARID-nek 0-t ad (WHERE után). A #markup típus miatt ad 0-t. Ha ezt #textfield-re teszem, akkor jó. De a többi mező miért marad az sql-el lekérdezett értékén? Nem a felhasználó által módosított mezőértéket viszi tovább.
Valamit elirtam?:O
G.
#default_value és ellenőrzés
Inkább a #default_value a jó a formon, nem a #value! :)
Most jó, bár markup tipussal nem jó. Ahelyett mit lehet tenni?
Ellenőrizni hogyan lehet a db_query()-t?
Az
if ( db_query(...) )
mintha csak SELECT esetén működne. Nem?
G.
ellenorizni
db_query()
de mivel szep piros hibauzenetben kiirja ha hiba van az SQL parancsban, es amugy sem tudsz vele mit kezdeni ha hiba van, ugyhogy nincs miert ellenorizni. Ha ellenorzol akkor mindig az adatod ellenorizd amivel dolgozol, ne az SQL vegeredmenyet..
sql (insert v. update)
De pl. egy update esetén, mikor a WHERE feltétel után ID=0 volt, akkor szintaktikailag helyes az SQL, de nem adott vissza "hibát", pedig nem futott le helyesen az update parancs, nem módosított semmit (mivel ID=0 rekord nem volt a táblában). Az ilyeneket pl. ki lehet szűrni v. lekérdezni, hogy sikerült-e?
G.
nem futott le helyesen
az az SQL parancs ami nem modosit semmit az nem rossz, ezert nem is adhat hibat. Sokszor van szukseg olyan SQL parancsra ami csak specialis feltetelek eseten modosit sorokat, es gyakran nem modosit semmit.
Ha megis ellenorizni akarsz van ra lehetoseg:
db_affected_rows()
db_last_insert_id()
markup
$form_state['values'] tombbe a markup nem kerul bele..
jogosultság
az egyébként hogy lehet, hogy anonymous (nem bejelentkezett) user látja a modult?
pedig a .module menüben pl.:
Az 'administer szotar' nincs bepipálva/engedélyezve a nembelépett usereknek. :O
G.
rosszul irtad
makgab, kérlek, ha PHP kódot
makgab,
kérlek, ha PHP kódot küldesz be, akkor használd a <code>...</code> és azon belül a <?php... ?> jelölőkódokat. Köszönjük.
köszönet
Köszönet, azt hiszem most minden működik. :)
G.