Drupalban kulso php osztalyok ill jquery/ajax hasznalata

Balint133 képe

Sziasztok, bongeszgettem a forumot nem igazan talaltam valaszt az en 'problemamra'. Fejlesztek egy oldalt, viszont eleg fapados es nem rendszerezett. Ezert arra gondoltam, hogy egy Drupallal sokkal szervezettebb ill hatekonyabba tudnam tenni. Az oldalam nagyreszt szoveg, viszont van egy alkalmazas rajta. Errol egy par szot, hogy erthetobb legyen:

Van egy form, nemi ajax/jquery-vel megspekelve, hogy szebb legyen ill dinamikus. Vannak kulonbozo beallitasi lehetosegek. A program bevitelnek egy hosszu szoveges lancolatot var, majd elkuldes utan ezt "megformazza". Ez a megformazas annyit tesz, hogy BBCODE tag-ek koze helyezi a szovegfile lenyeget...stb. Na mar most a "konvertalas" reszre van egy kifejezetten erre irt osztaly ami nem is kicsi.

Olvasgattam drupal.org-on modulokkal ill formsAPI, Jquery, ajax-al kapcsolatban dokumentaciokat, ezekkel ha minden igaz megoldhato az "implementacio". Egyedul amit nem talaltam az az, hogy ezt a kulso osztalyt mikeppen tudom meghivni, ill hasznalni. Ebben kellene segitseg elso korben, hogy drupal module-kent tudjam ezt az osztalyt hasznalni. Ha ez megvan, utana mar a Jquery/Ajax ill design resszel mar fogok boldogulni remelem.

Elnezest, ha hosszura nyult a dolog.

Koszi elore is.

Drupal verzió: 
zserno képe

Elso lepeskent probalj meg egy kis oldalt letrehozni Drupal modulbol hook_menu()-vel (http://api.drupal.org/api/function/hook_menu/6).
Latni fogod, hogy a hook_menu()-ben tobbek kozott az oldal utvonalat regisztralod, valamint egy callback fuggvenyt, ami az adott utvonal tartalmat allitja elo. Ebben a callbackben hasznalhatod a kis osztalyodat.

Szemelyes velemeny: ahogy megismered a Drupal APIt, idovel ra fogsz jonni, hogy sokkal szebben is meg lehet csinalni a feladatot, ezert kb. az egeszet ujra fogod irni szep lassan. :)

0
0
Balint133 képe

Nos elkezdtem csinálgatni a modult, viszont akadályba ütköztem. Megvan ugye a formom viszont ezt szeretném valahogyan formázni, ehhez az kéne nekem h legyen egy module.tpl.php fileom is amit beilleszt a drupal a content tartalomba. Ha jól tanulmányoztam át az API-t akkor a theme_preprocess_hook függvény kell nekem, viszont ennek a használatáról nemigazán találtam normális leírást ill példát. Tudna valaki segíteni kérem? Ami eddig megvan kód az ennyi:

function converter_perm() {
  return array('access converter');
} // function converter_perm()
 
function converter_all() {
	drupal_add_js(drupal_get_path('module', 'converter') .'/js/main.js');
	drupal_add_js(drupal_get_path('module', 'converter') .'/js/iphone-style-checkboxes.js');
 
	return drupal_get_form('converter_form');
}
 
 
function converter_menu() {
  $items = array();
 
  $items['converter'] = array(
    'title' => 'Converter',
    'page callback' => 'converter_all',
    'access arguments' => array('access converter'),
    'type' => MENU_CALLBACK
  );
 
  return $items;
}
 
function converter_form($form_state) 
{
        /*Nem végleges, csak egy sablon*/
	$form['elkuld'] = array('#type'	=> 'button',
							'#id' 	=> 'elkuld'
							);
 
	$form['subj'] = array('#type' => 'textfield',
						  '#attributes' => array('readonly' => 'readonly')
						  );
 
	$form['csatjel'] = array('#type' => 'textarea',
							 '#resizable' => FALSE,
							);
			$form['test'] = array( '#type' => 'checkbox',
							'#prefix' => '<div class="on_off">',
							'#suffix' => '</div>',
							'#default_value' => 0
							);
 
	$form['farmok']['farm1'] = array('#type' => 'textarea',
									 '#resizable' => FALSE,
		 							 '#prefix' => '<div class="farm" align="center">'
									);
 
	$form['farmok']['farm2'] = array('#type' => 'textarea',
									 '#resizable' => FALSE
									);
	$form['farmok']['farm3'] = array('#type' => 'textarea',
									 '#resizable' => FALSE
									);
	$form['farmok']['farm4'] = array('#type' => 'textarea',
									 '#resizable' => FALSE
									);
	$form['farmok']['farm5'] = array('#type' => 'textarea',
									 '#resizable' => FALSE,
									);							
 
  	return $form;
}
 
function template_preprocess_converter(&$variables)
{
  //ide nemtudom mi kéne
}
0
0
edgarpe képe

Azt írod, hogy formázni szeretnéd a form-od. Pontosan mit értsz ez alatt, valami konkrét dolgot írj, hogy miben kellene másképpen megjelennie mint ahogyan az általad bemásold kód megjeleníti. Csak mert valószínűleg neked nem a preprocess függvényekre lesz szükséged.

0
0
Balint133 képe

Szia, arra gondolok, hogy templatelni szeretném a formomat. Alapesetben a mostani kód minden form-item-t külön divben jelenít meg, viszont nekem ez így nemjó valahogyan csoportosítanom kellene őket, hogy úgy nézzen ki mint az eredeti ami alatt nincsen drupal csak egy php/html.

Szóval nekem az kéne, hogy létrehozom a formot majd egy .tpl.php fileban tudjam templatelni és csak a mezőt illessze bele az adott html kódba (drupal_form_render vagy melyik is ez a fggvény).

Nem tudom, hogy így már mennyire érthető mit szeretnék elérni!

0
0
edgarpe képe

Több megoldás is van, mint általában a Drupalban :)

Egy csúnya hekk megoldás, valahogy így:

function converter_all() {
  $form = drupal_get_form('converter_form');
 
  $output = '';
  $output .= '<div class="converer_outer">'
  // ... építgeted az output-ot ...
  $output .= drupal_render($form['egy_mezo']);
  $output .= drupal_render($form['masik_mezo']);
  // ... építgeted az output-ot ...
  $output .= drupal_render($form); // a form maradék részét is hozzáadod és lezárod.
 
  return $output;
}

Ennél szebb, ha az $output építgető függvényt egy theme hook-ként regisztrálod és függvényben vagy tpl.php template fájlban valósítod meg.
Ez valahogy így nézne ki:

function converter_all() {
  $form = drupal_get_form('converter_form');
 
  return theme('converter_form_render', $form);
}
function converter_theme() {
  $hooks['converter_form_render'] = array(
    'template' => 'converter-form-render', 'arguments' => array('form' => NULL)
  );
  return $hooks;
}

És a converter-form-render.tpl.php-ben valósítod meg a form-ot HTML-jét, benne ilyenekkel:
 print drupal_render($form['egy_mezo'])

Valami ilyensmi, bíztos van elgépelés a fentiekben, de elvi síkon jó :)
A theme neve azért lett convereter_form_render mert converter_form nevű függvényed már van és zavaró lenne.

0
0
Balint133 képe

KÖSZÖNÖM szépen, pont valami ilyesmire gondoltam! Azthiszem a második megoldást fogom választani ;) az tényleg szebb és áttekinthetőbb!

EDIT: Fatal error: Only variables can be passed by reference in C:\xampp\htdocs\drupal\modules\converter\converter-form-render.tpl.php on line 12 Ezt a hibaüzenetet kapom, a 12 sor pedig ez:
<?php drupal_render($form['subj']) ?>

Nem bírok rájönni ez miért van... amit írtál kód az elvben jó de mégse, és nem tudom miért nem...

Ha csak simán fogom a tpl.php-ban és elhagyom a drupal_render függvényt akkor gond nélkül kiírja a formnak az összes elemét :O

0
0
asrob képe

<?php print drupal_render($form['subj']) ?>
kell neked.

0
0

--
Borsa Péter
https://peterborsa.eu

Balint133 képe

srry elrontottam az előző hszben :) természetesen előtte van a print ...

EDIT: Amm most sikerült működésre bírnom, a drupal_get_form() fggvényt kicseréltem drupal_retrieve_form('converter_form', &$form_state) fggvényre. Következő kérdésem az lenne, hogy maradhat ez így? szóval a form_state-t a drupal beállítja magának? vagy valamit még mindig hülyén csinálok?

0
0
edgarpe képe

Oké, ahogy leírtam az nagy hülyeség :) A drupal_get_form() egy stringgel, a form renderelt html kódjával tér vissza.

Neked mindössze annyi kell, hogy a form-nak ahol definiálod megadod a theme hookját így:

function convertet_form() {
  //.. $form építgetés
  $form['#theme'] = 'converter_form_render';
  return $form;
}

Ezt a theme hook-ot a converter_theme()-ben definiálod úgy ahogy fent már írtam.
Ekkor a tpl.php-ban már elérhető lesz a $form tömb, amit a drupal_render()-el már valóban meg tudsz jeleníteni, úgy ahogy szeretnéd.

Egyébként ez a megoldás nem csak teljes form-ra működik, hanem egyetlen form elemre is meg tudod tenni, ha csak annyi kell.

Illetve nem csak saját form-ra működik, a hook_form_alter()-el bármely core vagy más contrib modul form renderelését átállíthatod így, ezáltalá bármelyik form-ot úgy jeleníted meg ahogy szeretnéd. Ezek azok a dolgok, amelyek a Drupal olyan népszerű.

0
0
Balint133 képe

Sziasztok, mar megint en. Sikerult megoldanom a formot, nagyon pofas lett ;) Jquery-s checkboxok es a tobbi nyalanksag. Viszont ujjab problemaba utkoztem... megpedig az adatok tovabbitasa a php fele AJAX hasznalataval. Lehetseges ezt valahogy kivitelezni? Mert eddig akarmit talaltam oldalakon tutorialokat egyik sem mukodott :O :(
Szoval kerdesem az lenne, hogy hogy tudnam ajax segitsegevel json formatumban tovabbitani a mezok adatait?

UI.: Elnezest, hogy itt szerencsetlenkedek, de nemigazan akar osszejonni :(

0
0
edgarpe képe

A Drupalban van beépített jQuery (1.2.x), kliens oldalon a küldéshez $.ajax() $.get() vagy $.post() használható. A szerver oldalon Drupalban fogadni meg úgy tudod, hogy regisztrálsz egy menu elemet hook_menu() és feldolgozod a $_GET vagy $_POST értékét.

Szerkesztve: Feltételezem, hogy a művlet eredményeként megváltozna az adatbázisod vagy fájlrendszered. Ha így van, akkor az XSRF támadások elkerülése miatt a $.post() metódust és $_POST változót használd, és kerüld a GET paraméter átadást.

0
0
Balint133 képe

Szia, igen volt is bajom az 1.2es jQuery-vel :D mind1 debuggolva. Kliens oldalon eddig igynezek ki:

$("#loader").ajaxStart(function(){ //szimpla loader kep megjelenites/elrejtes
  $('.convert').hide();
  $(this).fadeIn(300)});
 
$("#loader").ajaxStop(function(){
  $(this).hide();
  $('.convert').fadeIn("slow")});
 
$('#elkuld').click(function(){
  $.ajax({
    type: 'POST',
    url: 'converter/ajax',
    dataType: "json",
    data: {csatjel: $('#edit-csatjel').val(),
             farm: $('#farmkor').attr('checked'),
             hajonev: $('#hajonev').attr('checked'),
	     db: $('#farmkordb').val(),
             farm1 : $('#farm1').val(),
             farm2 : $('#farm2').val(),
             farm3 : $('#farm3').val(),
             farm4 : $('#farm4').val(),
             farm5 : $('#farm5').val()},
             success: function(data){
                            $('#edit-csatjel').val(data.csata);
                            $('#subject_spn').val(data.subject)}
             });
 });

Drupal oldalon meg valami ilyesmi: ??

function converter_menu()
{
  $items['converter/ajax'] = array('type' => MENU_CALLBACK,
'page_callback' => 'converter_ajax_callback');
 
  //tobbi regisztralt menuelem
  return $items;
}
 
//module tobbiresz
 
function converter_ajax_callback()
{
  $adat = $_POST;
 
  //adatok feldolgozasa - visszateresi ertek: $feldolgozott = array('csata' => $ertek, 'subject' => $ertek2)
  echo drupal_json($feldolgozott);
}

jolirtam? :S

0
0
edgarpe képe

Igen, ránézésre jónak néz ki a szerver oldali rész.

0
0
Balint133 képe

Na jó, reggel óta ezzel a vacakkal szívok, kicsit mára már elegem van belőle! Ha szerinted a szerver oldali rész jónak néz ki, akkor valami a jquery fggvénnyel nemjó. Már minden létezőt kipróbáltam mi lehet a gond, de egyik sem működik. Kicist már felment a pumpa bennem ,hogy egy egyszerű ajax submit-et nem bírok összehozni!!!

MOD.: Hát ez vicces :) Egy aprócska figyelmetlenség:

'access arguments' => array('access converter'),
pótlásával a probléma tovaszállt :/ :D
0
0