webform modul altal kuldot level modositasa

york képe

Hali!

Olyan problemam van, hogy a webform modul altal kikuldott levelhez kellene csatolnom egy PDF-et, amit a bekuldott eredmenyek alapjan allitok ossze, Ehhez szuksegem lenne a nid (node id) es a hozza tartozo sid (submission id) ertekekre.

Azt talaltam ki, hogy a hook_form_alter segitsegevel lefuttatok egy egyedi submit-ot es itt elmentem a szukseges valtozo ertekeket, es amikor a level kuldes van akkor a hook_mail_alter(&$message) -nel eloszedem es hasznalom. Igen am de a level kuldes elobb van mint, ahogy az en submit hookom lefut :), ha a sajat submit hookot teszem elore akkor meg a sid erteket nem tudom meg.

Van egy halvany remenysugar amit talaltam, reszlet a webform_client_form_submit fuggvenybol:

<?php
function webform_client_form_submit($form, &$form_state) {
  global $user, $base_url;
  ...
    foreach ($emails as $cid => $email) {
      $messages[$cid] = theme(array('webform_mail_'. $node->nid, 'webform_mail'), $form_state['values'], $node, $sid, $cid);
      $headers[$cid] = theme(array('webform_mail_headers_'. $node->nid, 'webform_mail_headers'), $form_state['values'], $node, $sid, $cid);
    ...
  }
  ...
}
?>

Ezekre a theme fuggveny hivasokra ra lehet kapcsolodni valahogy modulbol?

Ha valakinek van egyeb otlete szivesen fogadom...
(Csak modulbol mukodo megoldas erdekel)

pp képe

implementálod a theme hook-ot és felveszed benne a webform_mail_$nid (mondjuk ha a webform a 25-ös node, akkor webform_mail_25) sminket amire olyan függvényt vagy akár smink fájlt raksz, amilyet akarsz. Ha automatizálni akarod, tehát nem bedrótozni, az már izgalmasabb)

pp

0
0
york képe

Ehhez a smink fileokat a smink konyvtarba kellene tenni, en meg sajat modulbol akarom beallitasoknak megfeleloen modositani a levelet. Tehat ez a sajat smink file nem lehet megoldas :(.

0
0
pp képe

Hook_theme-t nem is tudsz modulba tenn! Nézz bele a node modul könyvtárába és egyél sok beiglit

0
0
tolmi képe

Modulba is tudsz tenni hook_theme()-et:
"Register a module (or theme's) theme implementations."

Mellesleg a hook_theme nem tudom hogy hogyan oldaná meg york problémáját, szerintem ő arra kérdezett rá, hogy felül tudja-e írni a sminkfüggvényeket modulból. A válasz igen. Egyszerűen ha van egy ilyen sminkfüggvény:

function theme_smink_fuggveny_neve() {...}

akkor azt a sajat modulodban felül tudod írni úgy, mintha a hook_smink_fuggveny_neve() hurkot implementálnád:
function modulomneve_smink_fuggveny_neve() {...}

Továbbá ajánlott drupal.org-os oldal a sminkfüggvényekről.

0
0

--
Tolmács Márk
Drupal bandita

pp képe

Hülyeséget írtam. Csak modulba tudsz tenni hook_theme-t, sminkbe nem. (ezt akartam írni de a smink helyett modult írtam.)
Ezért sem értem, hogy Yorknak miért nem jó az én megoldásom, amikor az pontosan az amit kért: nem smink, hanem modul megvalósítást kap.

Én még sose csináltam ilyet amit írsz de a dokumentáció szerint hiába valósítod meg egy modulban a smink függvényed azt nem fogja meghívni a smink motor. Pont ez a baja Yorknak, hogy nem tudja modulból hogyan írja felül ezt a kimenetet. Jelölte a halvány reménysugarat és én az az irányú továbbhaladást kívántam segíteni.

Ha belenézünk a webform modult kódjába akkor láthatjuk, hogy a webform_theme függvényben csak a webform_mail_message smink függvény kerül csak implementálásra az egyes node-okhoz való függvény nem. Adott tehát a lehetősége, hogy olyan modult fejlesszünk, ami pl. a webformhoz csatolt fájlokat a kiküldött levélhez is csatolja. Kezdetnek megteszi az is, hogy az ember tol egy webformot, megjegyzi a nid-jét és azt implementálja a saját moduljába. Ez az implementálás két lépésből áll.
1. a hook_theme kampót implementáljuk és megmondjuk a Drupalnak, hogy mely függvényünk fogja feldolgozni az adott adatokat.
2. megvalósítjuk a függvényt.
Amint egy bedrótozott függvénnyel ez megvan lehet tovább lépni az általános megoldás felé.

Ezt a lehetőséget biztosítja számunkra a webform, mely szerintem nem a legjobb, hisz a modulokkal való integráció biztosítására más mechanizmus(module_invoke) való.
Amit még meg lehet próbálni, hogy mi van akkor, ha megpróbáljuk felülírni a smink tömböt.

function sajatmodul_theme() {
  $theme = array(
    'webform_mail_message' => array(
      'arguments' => array('form_values' => NULL, 'node' => NULL, 'sid' => NULL, 'cid' => NULL),
      'template' => 'webform_mail_message',
    ),
    'webform_mail_headers' => array(
      'arguments' => array('form_values' => NULL, 'node' => NULL, 'sid' => NULL, 'cid' => NULL),
      'template' => 'webform_mail_headers',
    ),
  );
  return $theme;
}

de ez nem tudom, hogy működik-e mert nem próbáltam. ;)

pp

0
0
tolmi képe

Bocsánat a kekeckedésért, de a sminkben is lehet implementálni a hook_theme()-et, csak semmi értelme, mert a phptemplate engine megteszi ezt helyettünk. ;)

A félreértésért meg elnézést, a lényeg hogy york megkapta a válaszát és remélhetőleg sikeresen megoldotta a problémáját.

0
0

--
Tolmács Márk
Drupal bandita

york képe

Olvastam a valaszokat, eloszor picit felre ertettem amit javasoltatok, de most mar tudom mire gondoltok.
Ki fogom probalni es leirom, ha sikerult megoldanom a dolgot.
Az utobbi idoben eleg keveset ultem gep elott es ha minden jol megy az ev hatralevo reszeben ezen nem is igazan akarok valtoztatni.

0
0
york képe

A megoldas nalam az lett:

<?php
function sajatmodul_theme() {
  $theme = array(
    'webform_mail_message' => array(
      'arguments' => array('form_values' => NULL, 'node' => NULL, 'sid' => NULL, 'cid' => NULL),
      'template' => 'webform-mail',
      'pattern' => 'webform_mail(_[0-9]+)?',
    ),
  );
}
?>

Ezzel felul irtam a webform modul ezen hook-jat, igy a sajat konyvtaraba levo webform-mail.tpl.php file fut le.
Es azert, hogy az eredeti file is lefusson (ami fontos :) ez kerult a file vegere:
<?php
...
include drupal_get_path('module', 'webform') . '/webform-mail.tpl.php';
?>

Azt hogy a smink konyvtarban talalhato fileok rendesen lefutnak-e nem ellenoriztem, de szerintem ezt nem befolyasolja a modositas.

Koszonom a segitseget.

0
0
aboros képe

azért kérdezem, mert 6.x -ben ehhez (más template legyen értelmezve) nem kell ám modul! (figyelj márk;) template.php -ból egy template_preprocess_ függvénnyel is felül lehet bírálni, hogy melyik tpl.php -t használja a drupal. gondolom így hívják a webform előfeldolgozóját, hogy template_preprocess_webform .. de az is lehet, hogy template_preprocess_webform_mail, nem tudom, meg kéne nézni a modulba. ebben függvényben egy tömbben van minden, ami menni fog a .tpl.php -nak. a tömb tartalmazhat 'template-suggestions' kulcs alatt egy másik tömböt, amiben megadhatsz bármilyen használandó .tpl.php -t, akár egy sajátot is, elég csak értéket adni neki, valahogy így:

...
$variables['template_suggestions'][] = 'en-sajat-templatem.tpl.php';
...
0
0

-
clear: both;

Sweetchuck képe

Template_preprocess-t megint elfelejtettem. (Lásd a másik hozzászólásom)

0
0
tolmi képe

Nagyon tetszik!

0
0

--
Tolmács Márk
Drupal bandita

york képe

6.x-rol van szo. Fontos, hogy sajat modulbol lehessen megoldani a dolgot, mivel a modul egyik funkcioja, hogy a kikuldot levelhez hozza csap egy pdf-et.
Igazabol nem ertem amit irsz. Ha sminkbol akarnam megoldani, az nem lenne nehez, mivel akkor webform-mail.tpl.php filet kellene implementalnom.
A cel az, hogy a sajat modulom egy fuggvenye mindenkepp megkapja vezerlest amikor ez a hook ertekelodik ki.

A webfom modul rendelkezik egy ilyen preprocess fuggvennyel:

<?php
/**
 * Prepare to theme the contents of e-mails sent by webform.
 */
function template_preprocess_webform_mail_message(&$vars) {
  global $user;
 
  $vars['user'] = $user;
  $vars['ip_address'] = ip_address();
}
?>

Mit kell nekem tennem?

0
0
aboros képe

láttam én már .tpl.php -ban sql lekérdezést ;)

Ezzel felul irtam a webform modul ezen hook-jat, igy a sajat konyvtaraba levo webform-mail.tpl.php file fut le.

csak erre írtam, hogy ehhez még nem feltétlenül kell modul. nem tudom pontosan mit csinál a modulod és hogyan, nem írtam, hogy rossz a megoldásod, csak egy másik irány is létezhet arra világítottam rá. persze ez nagyban függ attól, hogy pontosan mit is kell csinálni, meg hogy kinek mi a kényelmes.

szerintem nem feltétlenül kell ahhoz egy saját modul, hogy egy webform kimenő leveléhez csatolj egy filet. talán még akkor se, ha dinamikusan kell eldönteni, hogy milyen filet kell csatolni.

0
0

-
clear: both;

york képe

A modul egy webform eredmenybol general a beallitasoknak megfeleloen egy pdf-et.
Az egyik funkcioja az, hogy a kitoltes utan a levelhez csatolja a pdf-et.
Mindenkepp olyan megoldast keresnek, ami modulbol megoldhato, es nem kell meg ezen kivul sminkelessel is jatszani.
Reszletekert olvass vissza, leirtam mindent.

0
0
aboros képe

csak az adott hozzászólásra reagáltam nem figyeltem hogy miről folyik a diskurzus. bocs.

0
0

-
clear: both;

york képe

Semmi gond, ha van otleted szivesen veszem.
Most ugy tunik marad a megoldasom, ha valaki egyedi sminket csinal figyeljen erre.
Meg a modul beallitasainal felhivom erre a figyelmet, hogy mit kell beletenni a sajat sminkbe, hogy menjen a PDF kuldes.

0
0
Sweetchuck képe

Tesztelni kéne, de érzésem szerint több hiba lehetőség is van.
Nem mindegy a modul betöltési sorrend.
Amikor a rendszer végig megy a hook_theme() implementációkon és a webform van előbb és utánna a sajatmodul, akkor rendben van, de ha fordítva akkor, a webform templétje fog lefutni. Tehát kimaradnak a módosításaid.
Valószínűleg tesztelésnél szerencséd volt a sorrenddel. Próbáld ki {system}.weight-ben átírni az értékeket szóban forgó modulok rekordjaiban. (cache ürítés!)

Amennyiben a sminkedben is van webform-mail.tpl.php akkor a modulok teljesen kimaradnak.
Ha egy smink változtatni akar a levél kinézetén (a sminkek már csak ilyenek), de hozzá akarja adni a sajatmodul szolgáltatását, akkor be kell töltenie a modules/sajatmodul/webform-mail.tpl.php-t ami betölti az eredeti webform sablont. Ezzel duplikálva az eredményt.

Amit kipróbálnék:
A sajátmodul létrehoz egy függvényt, olyan paraméterlistával hogy az a sablon fájlokból meghívható legyen.
(saját webform-mail.tpl.php helyett.)

function sajatmodul_webform_modosito($form_values, $node, $sid, $cid) {
  //Itt csinálom amit akarok
  //Ha kell akkor  - return $valami;
}

Ügyebár egy másik modul|smink sablonját nem illik módosítani, tehát marad a saját smink változtatása.
Le kell másolni a webfom sablonjának tartalmát és belerakni a függvény hívást.

Ezzel az a baj hogy kell egy smink vagy nulláról, vagy öröklődéssel. Továbbá a webhelyen engedélyezett összes sminknek tudatában kell lennie ennek.

Persze mint tudjuk a Drupal egy mindre rávehető tartalom kezelő. Ezért szeretjük.
Ha a smink motor (phptemplate.engine) teszi bele a sajatmodul változatatását a sablonba, akkor a többi sminknek nem kell csak ezért létrehoznia a webform-mail.tpl.php fájlt.

Csinálj egy másolatot erről
themes/engines/phptemplate/phptemplate.engine
ide
sites/default/themes/engines/phptemplate/phptemplate.engine

van benne 2 függvény az egyiket kell módosítani

function phptemplate_theme($existing, $type, $theme, $path) {
  $templates  = drupal_find_theme_functions($existing, array('phptemplate', $theme));
  $templates += drupal_find_theme_templates($existing, '.tpl.php', $path);
  $templates += drupal_find_theme_templates($existing, '.tpl.php', drupal_get_path('theme_engine', 'phptemplate'));
  return $templates;
}

Eredetileg a smink motor nem arra van, hogy sminkeljen, de a hozzáadott sornak köszönhetően most már azt is tud :)
Aztán ide rakod a megfelelően módosított webform-mail.tpl.php fájlt. (Az phptemplate.engine mellé)

Így smink nélkül is működnie kell. Cache ürítés az kell, hogy a {system}.owner a megfelelő értékeket tartalmazza a sminkek esetében.

Ez az én elméletem, aztán ha veszed a fáradtságot akkor majd te elmondod hogy milyen a gyakorlat :-DD

0
0
york képe

Ez tul bonyolult es sok a hiba lehetoseg a site epitese kozben. A sminkkel kapcsolatban igazad lehet. Aboros otlete tetszik meg fogom vizsgalni.

0
0