Ubercart checkout textfield feltöltése ajax segítségével

jabba306 képe

Sziasztok!

D6 és Ubercart alá készítünk egy modult, de elakadtunk.
PickPackPont szállításhoz készítünk modult, ahol a megrendelő a fizetés oldalon ki tudja választani a PPP átvevőhelyet.
Az átvevőhelyek listája online érhető el.
Azt a megoldást választottuk, hogy JS segítségével lehetővé tesszük a vásárlónak, hogy kiválassza az átvevőhelyet, majd ajaxal átadjuk az értéket a drupalnak.

Ezen a ponton akadtunk el.
A hook_checkout_pane() fgv segítségével elhelyeztünk egy hidden mezőt. Ennek a mezőnek nem tudjuk átadni a kiválasztás értékét.

A kód a következő:

function pickpackpont_checkout_pane()
{
  $panes[] = array(
    'id' => 'recipient',
    'callback' => 'pickpackpont_checkout_pane_recipient',
    'title' => t('Recipient Information'),
    'desc' => t('Information on product recipient.'),
    'weight' => 9,
  );
  return $panes;
}
 
function pickpackpont_checkout_pane_recipient($op, &$arg1, $arg2)
{
	drupal_add_js(drupal_get_path('module','pickpackpont').'/storelist.js');
	drupal_add_js(drupal_get_path('module','pickpackpont').'/MicrosoftAjax.js');
 
  switch ($op)
  {
    case 'view':
		$description = '<div id="pickpackpont" class="pickpackpont"></div>';
	    //$contents['recipient_other'] = array('#type' => 'hidden', '#value' => 'valami');
      return array('description' => $description, 'contents' => $contents);
    case 'process':
		$arg1->data['recipient']['recipient_other'] = $arg2['recipient_other'];
		return TRUE;
    case 'review':
		$review[] = array('title' => t('Recipient'), 'data' => $arg1->data['recipient']['recipient_other']);
		return $review;
  }
}
 
function pickpackpont_menu()
{
	$items['cart/checkout/pickpackpont/add_pickpackpont/%'] = array(
		'page callback' => 'add_pickpackpont',
		'page arguments' => array(1),
		'access arguments' => array('access pickpackpont content'),
		'type' => MENU_CALLBACK
	);
 
	return $items;
} 
 
function add_pickpackpont()
{
	$code = arg(4)!='_'?arg(4):'';
 
	$contents['recipient_other'] = array('#type' => 'hidden', '#value' => $code);
 
	return $code;
}

Tudnátok segíteni, hogy hol hibáztunk?

Köszönöm!

Melyik modulhoz, modulokhoz kapcsolódik a téma?: 
Drupal verzió: 
fox mulder képe

Nem tudom, mennyire pontos az idézett kód és hogyan akar működni, de néhány észrevétel:

Ha a pickpackpont_menu()-ben meg van adva a 'page arguments'=>array(1) (az url 'checkout' része), akkor miért nem használjátok, illetve miért az arg() fvt használjátok?

Az add_pickpackpont()-ban mit csinál a 2. sor, ha a 3. sor return $code?

0
0

Fox Mulder

jabba306 képe

A module fájl kódja pontosan így néz ki.

A hozzá tartozó js fájl ide kapcsolódó fgv-e a következő:

function LoadData(xml)
{
    var xmlDoc = createXmlDOMObject(xml);
    var pickpackpont = "";
 
    pickpackpont += "<label for='countrylabel'>Megye: </label><select id='country'>";
    pickpackpont += "<option value=''>-- KĂŠrem vĂĄlasszon --</option>";
    $(xmlDoc).find('county').each(function (index, item)
    {
      var name = $(this).find('name').text();
      pickpackpont += "<option value='" + name + "'>" + name + "</option>";
    });
    pickpackpont += "</select><br/>";
    pickpackpont += "<label for='locationlabel'>VĂĄros: </label><select id='location'>";
    pickpackpont += "</select><br/>";
    pickpackpont += "<label for='storelabel'>ÁtvÊtel helye: </label><select id='store'>";
    pickpackpont += "</select><br/><br/>";
    pickpackpont += "<label for='selected'></label>";
 
    $('#pickpackpont').append(pickpackpont);
    $('#location').hide();
    $('label[for=locationlabel]').hide();
    $('#store').hide();
    $('label[for=storelabel]').hide();
    $('label[for=selected]').hide();
 
    $('#country').change(function ()
    {
      if ($(this).val() != "")
      {
        $('#location').show();
        $('label[for=locationlabel]').show();
        $('#store').hide();
        $('label[for=storelabel]').hide();
        $('label[for=selected]').hide();
        $('#location').empty();
        $('#location').append("<option value=''>-- KĂŠrem vĂĄlasszon --</option>");
        $(xmlDoc).find('county').each(function (index, item)
        {
          var name = $(this).find('name').text();
          if (name == $('#country').val())
          {
            $(this).find('location').each(function (innerIndex, innerItem)
            {
              var location = $(this).find('locationname').text();
              $('#location').append("<option value='" + location + "'>" + location + "</option>");
            });
          }
        });
      }
      else
      {
        $('#store').hide();
        $('label[for=storelabel]').hide();
        $('#location').hide();
        $('label[for=locationlabel]').hide();
        $('label[for=selected]').hide();
      }
    });
 
    $('#location').change(function ()
    {
      if ($(this).val() != "")
      {
        $('#store').show();
        $('label[for=storelabel]').show();
        $('label[for=selected]').hide();
        $('#store').empty();
        $('#store').append("<option value=''>-- KĂŠrem vĂĄlasszon --</option>");
        $(xmlDoc).find('location').each(function (index, item)
        {
          var locationname = $(this).find('locationname').text();
          if (locationname == $('#location').val())
          {
            $(this).find('store').each(function (innerIndex, innerItem)
            {
              var title = $(this).find('title').text();
              var address = $(this).find('address').text();
              $('#store').append("<option value='" + title + "'>" + address + "</option>");
            });
          }
        });
      }
      else
      {
        $('#store').hide();
        $('label[for=storelabel]').hide();
        $('label[for=selected]').hide();
      }
    });
 
    $('#store').change(function ()
    {
    	$('label[for=selected]').show();
    	$('label[for=selected]').html($(this).val());
 
    	//var baseURL = location.protocol + "//" + location.host + "/cart/checkout/pickpackpont/";
    	var baseURL = location.protocol + "//" + location.host + "/drupal/cart/checkout/pickpackpont/";
 
		var postString = baseURL + 'add_pickpackpont/' + $(this).val();
 
		$.ajax( {
			url : encodeURI(postString),
			error : function()
			{
				alert('Hiba tĂśrtĂŠnt!');
			},
			success : function(data, status)
			{
				alert('OK');
			}
		});	    	
    });    
}

A return meg csak formai követelmény, annak igazából haszna nincs, azaz lehetne akár return true is.

Azt tapasztaltuk, hogy az add_pickpackpont fgv-ben a

$contents['recipient_other'] = array('#type' => 'hidden', '#value' => $code);

nem működik. Nem adja át a $code változó értékét. Valójában semmilyen értéket nem ad át (ha konkrét sztringet írok a $code helyére azt sem.

Hol hibás az elméletünk?

Köszönöm!

0
0
fox mulder képe

Mit vártok az add_pickpackpont()-tól? Létrehoztok benne egy form tömb töredéket, amivel nem fog történni és nem is történhet semmi, mert egy menu callback függyvénynek az a dolga, hogy előállítson egy kimenetet, ami válasz a menupontban definiált kérésre (a modulotokban: kiírja a $code értékét) és nem tud módosítani olyan űrlapot, amiről nem is tud.

0
0

Fox Mulder

jabba306 képe

Az igazság az, hogy meglehetősen kezdők vagyunk Drupal programozásban.
Ez az első olyan modul, ahol alaposabban bele kell mászni ezekbe a dolgokba. Sok homály is van a képletben, persze google-zunk, meg olvasgatunk mindenfélét. Megtennéd, hogy segítenél valami konkrétummal, hogy mit és hogyan kellene csinálni, hogy működjön az átadás?

Köszönöm!

0
0
fox mulder képe

Nálam is nagy a homály (megpróbáltam localhoston összerakni), de az biztos, hogy a pickpackpont_menu() - add_pickpackpont() páros nem fogja módosítani a cart/checkout/ űrlapot.

Az űrlaphoz a pickpackpont_checkout_pane_recipient() 'view' ágában kéne hozzáadni a select-eket (amit most a js-ben csináltok) és csak az opciókat beállítani js-ben (lásd később), mert így tudjátok lenyomni a Drupal űrlapfeldolgozó rendszerének a torkán a bekért adatokat. A csak js-ben létrehozott űrlap elemekről a szerver oldal (a Drupal) nem tud.

Miért kell ajax? Egyrészt, mert egy külső adatforrásból kéritek le a boltok listáját XML-ként. Másrészt viszont azért, mert az egyik select elem függ a másiktól, ha a vásárló kiválaszt egy megyét, akkor a csak ebben a megyében lévő városok kerülnek a város select opciói közé stb.

Az utóbbi problémára a hierarchical select modul, illetve a Drupal AHAH jelenthet megoldást, az XML lekéréséhez viszont nincs tippem (illetve dehogynem: az utóbbi link).

1
0

Fox Mulder

silversk8r képe

fox mulder már leírta a lényeget. én csak kiegészíteném
A Drupal Form API nem szereti ha kívülről belepiszkálsz és ilyenkor a select értéke nem lesz meg a form elküldésekor (submit). hook_form_alter() vagy hook_form_FORM_ID_alter() segítségével adjátok hozzá a select listát.
Ajaxhoz ajánlott a Drupalban található jQuery függvényeket használni (és akkor nem kell a MicrosoftAjax.js).

Ha jól értettem a feladatot, akkor a megye mezőnél nem indokolt az Ajax használata, mivel ez a lista nem változik. A város+átvevőhely listák elemeit sem lehet csak úgy ajaxosan hozzáadni, mert attól a Drupal még nem szerez róluk tudomást, ezért a Drupal saját függvényeit használva kell belevarázsolni a $form tömbbe. Ha nem válik be a Hierarchical Select, a megye mező változásakor (onchange) kell meghívni az ajaxot (de csakis drupalosan). Ez valahogy így szokott kinézni:

  $form['select_1'] = array(
    '#type' => 'select',
...
    '#ahah' => array(
      'event' => 'change',
      'path' => 'ahah-form-callback',
      'wrapper' => 'wrapper-1',
      'method' => 'replace',
    ),
  );

Itt egy példa: http://drupal.org/node/411074#comment-1614458
A simple_select_parent lenne a megye, és a simple_select_child a város. Az átvevőhelyhez pedig ki kell bővíteni egy harmadik elemmel.

remélem, hogy segítettem
sok sikert

1
0
jabba306 képe

Mindenkinek köszönöm a segítséget. Dolgozunk a megoldáson az útmutatásotok alapján.

0
0
AmazonIT képe

Sziasztok!
Próbálok találni a pick pack modullal kapcsolatban bármit, és csak ez az egy topicot találtam. Olvasgattam itt a levelezgetést, és az a kérdésem, hogy összeállt-e már a rendszer? Jelenleg nálam rengeteg hibaüzenet generálódik, ráadásul nem is tudom a modult kikapcsolni. A boltok listáját egészen biztos nem éri el...
Van valahol esetleg valami leírás erről a modulról?
köszi!

0
0
dj képe

modullal van problémád?

Új topikban megírhatnád, hogy mit csináltál és mi nem működik.

0
0

Üdv!
Dudás József