SQL tábla karbantartás

makgab képe

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ó: 
lili_ képe

pontosítani kellene milyen a táblád szerkezete és milyen sorokat szeretnél törölni

gondolom az id átvitel érdekelne URL-ben?

0
0

mini

makgab képe

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.

0
0
makgab képe

tudna segiteni valaki? :(

0
0
Pasqualle képe

http://drupal.org/project/codes
toltsd le a modulomat es olvasd el a codes.admin.inc fajlt

0
0
makgab képe

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:

<?php
$items['lista/edit/%'] = array(
    'title' => 'Szotar Edit',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('szotar_edit', 2),
...
 
function szotar_edit($SZOTARID) {
...
}
?>

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.

0
0
makgab képe

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.

0
0
fox mulder képe

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 :)

0
0

Fox Mulder

fox mulder képe

Elvileg az SZOTARID=1 paramétert átadja, nem?

Hát irasd ki a $SZOTARID értékét a szotar_edit-ben. Mondjuk:

drupal_set_message('Szótár ID: ' . $SZOTARID);
0
0

Fox Mulder

makgab képe

Az átadott paraméter:
drupal_set_message('Szótár ID: ' . $SZOTARID);

Eredmény:
Szótár ID: Array

Egy tömb? :O

G.

0
0
fox mulder képe

drupal_set_message('SZOTARID: <pre>' . print_r($SZOTARID, TRUE) . '</pre>');

Ez kiírja a tömböt.
0
0

Fox Mulder

Pasqualle képe

a hibauzenet szerint a szotar_edit fuggvenyed nem letezik. Ha masik fajlba raktad akkor a menuben ezt meg kell mondanod, pl

'file' => 'szotar.admin.inc',

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:

function szotar_edit(&$form_state, $szotarid) {
0
0
makgab képe

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.

0
0
Pasqualle képe

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

drupal_set_message('Szótár ID: ' . $szotarid);

tesztet..
0
0
makgab képe

ok, köszi most megy. ki is irja az ID értékét. :)

G.

0
0
fox mulder képe

...
'page callback' => 'drupal_get_form',
'page arguments' => array('szotar_edit', 2, 'akár', 'mennyi', 'paraméter'),
...

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.
0
0

Fox Mulder

makgab képe

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?

<?php
function szotar_delete(&$form_state, $SZOTARID) {
   return confirm_form($form, 'Biztos törlöd a/z/ ' . $SZOTARID . ' azonosítót?', 'Igen', 'Nem', t('Delete') );
}
?>

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:

<?php
function szotar_delete_submit($form, &$form_state) {
   // SQL delete
   db_query(" DELETE FROM {table}... ");
   drupal_set_message( 'Bejegyzés törölve.' );
}
?>

Jó felé indultam el?

G.

0
0
Pasqualle képe

a parametereket az adott sorrendben es mindet ki kell tolteni..

function szotar_delete(&$form_state, $szotarid) {
  $form['#szotarid'] = $szotarid;
  return confirm_form($form, 'Biztos törlöd?', '/valahova', NULL, t('Delete'));
}
 
function szotar_delete_submit($form, &$form_state) {
  $form_state['redirect'] = '/valahova'; 
  // SQL delete
  db_query("DELETE FROM {table} WHERE szotarid = %d", $form['#szotarid']);
  drupal_set_message( 'Bejegyzés törölve.' );
}

es ilyet ne csinalj

'Biztos törlöd a/z/ ' . $SZOTARID . ' azonosítót?',

hogy beszursz a szovegbe valamit ami az url-bol jon, mert nagyon nagyon veszelyes. hasznald helyette a t() fuggvenyt.
0
0
makgab képe

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.

0
0
Pasqualle képe

igen

0
0
makgab képe

hi!

Már csak a szotar_edit maradt megoldatlanul. :)

<?php
function szotar_edit(&$form_state, $szotar) {
  $form['szotarid'] = array(
  '#type' => 'textfield',
  '#title' => 'Szótár ID',
  '#size' => 50,
  '#maxlength' => 50,
  '#required' => TRUE,
  '#value' => $szotar['SZOTARID'],
  );
  $form['nev'] = array(
  '#type' => 'textfield',
  '#title' => 'Szótár név',
  '#size' => 50,
  '#maxlength' => 50,
  '#required' => TRUE,
  '#value' => $szotar['NEV'],
  );
  $res = db_query( "SELECT CSOPORTID, CSOPNEV FROM {SZOTARCSOP} ORDER BY CSOPNEV" );
  while ( $record = db_fetch_array( $res ) ) {
    $res_arr[$record['CSOPORTID']] = $record['CSOPNEV'];
  }
  $form['csoportid'] = array(
  '#type' => 'select',
  '#title' => 'Csoport',
  '#required' => TRUE,
  '#options' => $res_arr,
  '#description' => 'Kérem válasszon a csoportból!',
  '#value' => $szotar['CSOPORTID'],
  );
  $form['submit'] = array(
  '#type' => 'submit',
  '#value' => t('Save'),
  );
  return $form;
}
?>

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.

0
0
Pasqualle képe

A név mezőbe is az ID kerül és nem látom, hogy miért?

function szotar_edit(&$form_state, $szotar) {
..
$form['nev'] = array(
..
'#value' => $szotar['NEV'],
..

mit tettel a $szotar parameterbe?

Lehet azt read-only-vá tenni valahogy?

http://api.drupal.org/api/file/developer/topics/forms_api_reference.html
a #markup tipust kell hasznalnod..

0
0
makgab képe

A .module menüjében:

<?php
  $items['base/rendszer/szotar/szotarlista/lista/edit/%'] = array(
    'title' => 'Szótár szerkesztés',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('szotar_edit', 6),
    'access callback' => user_access('administer szotar'),
    'file' => 'admin.szotar.inc',
    'type' => MENU_CALLBACK,
  ); 
?>

szotar.inc:

<?php
function szotar_row($szotar) {
  $form['SZOTARID'] = array(
    '#type' => 'markup',
    '#value' => $szotar->SZOTARID,
  );
  $form['NEV'] = array(
    '#type' => 'markup',
    '#value' => $szotar->NEV,
  );
  $edit_link = (0) ? '' : l(t('Edit'), 'base/rendszer/szotar/szotarlista/lista/edit/'. $szotar->SZOTARID);
  $form['edit_szotar'] = array(
    '#type' => 'markup',
    '#value' => $edit_link,
  ); 
 
...
 
function szotar_edit(&$form_state, $szotar) {
 
  $form['szotarid'] = array(
  '#type' => 'markup',
  '#title' => 'Szótár ID',
  '#value' => $szotar['SZOTARID'],       // ez jó
  );
  $form['nev'] = array(
  '#type' => 'textfield',
  '#title' => 'Szótár név',
  '#size' => 50,
  '#maxlength' => 50,
  '#required' => TRUE,
  '#value' => $szotar['NEV'],               // ide kerül bele a SZOTARID értéke ugyanúgy!
  ); 
...
?>

Nem látom hogy miért kerül bele a NEV-be az ID. :)

G.

0
0
Pasqualle képe

az url-bol a hatodik reszt rakod a szotar valtozoba:

$items['base/rendszer/szotar/szotarlista/lista/edit/%'] = array(
..
'page callback' => 'drupal_get_form',
'page arguments' => array('szotar_edit', 6),
..

function szotar_edit(&$form_state, $szotar) {
'#value' => $szotar['SZOTARID'], // ez jó

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)

0
0
makgab képe

<?php
function szotar_edit(&$form_state, $szotar) {
 
  // SQL selected record
  $res = db_query("SELECT SZOTARID, NEV, CSOPORTID FROM {O_SZOTAR} WHERE SZOTARID=%d", $szotar );
  $arr = db_fetch_array($res);
 
  // form
  $form['szotarid'] = array(
  '#type' => 'markup',
  '#title' => 'Szótár ID',
  '#value' => $arr['SZOTARID'],
  );
  $form['nev'] = array(
  '#type' => 'textfield',
  '#title' => 'Szótár név',
  '#size' => 50,
  '#maxlength' => 50,
  '#required' => TRUE,
  '#value' => $arr['NEV'],
...
?>

A form most jó!

viszont a submit nál érdekes adatokat akar beszurni:

<?php
function szotar_edit_submit($form, &$form_state) {
  db_query("UPDATE {SZOTAR} SET NEV='%s', CSOPORTID=%d WHERE SZOTARID=%d;", $form_state['values']['nev'], $form_state['values']['csoportid'], $form_state['values']['szotarid']);
}
?>

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.

0
0
makgab képe

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.

0
0
Pasqualle képe

db_query()

Return value
A database query result resource, or FALSE if the query was not executed correctly.

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..

0
0
makgab képe

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.

0
0
Pasqualle képe

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()

0
0
Pasqualle képe

$form_state['values'] tombbe a markup nem kerul bele..

$form['szotarid'] = array(
  '#type' => 'hidden',
  '#value' => $arr['SZOTARID'],
);
0
0
makgab képe

az egyébként hogy lehet, hogy anonymous (nem bejelentkezett) user látja a modult?
pedig a .module menüben pl.:

<?php
 $items['obase/rendszer/szotar'] = array(
    'title' => 'Szótár',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('szotarlistazas'),
    'access callback' => user_access('administer szotar'),
    'file' => 'admin.szotar.inc',
  ); 
?>

Az 'administer szotar' nincs bepipálva/engedélyezve a nembelépett usereknek. :O

G.

0
0
Pasqualle képe

    'access callback' => 'user_access',
    'access arguments' => array('administer szotar'),
0
0
Illyés Edit képe

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.

0
0
makgab képe

Köszönet, azt hiszem most minden működik. :)

G.

0
0