Oldal aljára ugrás

makgab képe

hi!

Igazából nem biztos, hogy modul fejlesztési kérdés, de saját modulnál kellene megoldanom.
Van egy saját tartalom és abba kellene egy submit button a teljes nézetben. Ez meg is van.
A button megnyomására a Drupal "Csatolmányok" részéhez kell ugrania.
Ehhez kellene oda egy

<a name="ideugras">Ide kellene ugrani</a>

html kód elvileg, ami nincs alapból ott.

Hogyan oldható meg szépen? Az is jó, hogy teljesen a lap aljára ugrik a form buttonra kattintva.

G.

Drupal verzió: 
makgab képe

egy megoldás, ami működik:

<?php
 
...
 
/**
* Implementation of hook_view().   tartalom nézete
*/
function mymodule_view($node, $teaser = FALSE, $page = FALSE) {
    if ( $teaser ) {
	    // ha tartalomhoz van beallitva summary/osszetio, akkor az jelenik meg!!
	    $node = node_prepare($node, $teaser);
	} else {
	    // teljes tartalom
	    $node = node_prepare($node, $teaser);
	    // Link
    	    $node->content['body']['#value'] = '<br><form action="'. url('mymodulebase', $options = array( 'absolute'=>'TRUE' ) ) .'" method="post"><input type="submit" value="'. t('Informacio...') .'"  class="form-submit" /></form><br>'
		. '<form action="' . url('node/') . $node->nid . '/#attachments'  . '" method="post"><input type="submit" value="'. t('Csatolmanyok...') .'"  class="form-submit" /></form><br>'
		. $node->content['body']['#value'];
    }
 
    return $node;
}
 
...
 
?>

G.

0
0
aboros képe

vagy hogy írjak e egyátlán valamit. lehet nem kellene, akkor bocs, de nem bírom megállni, hogy meg ne jegyezzem.

ez a kódrészlet itt nem megoldás, hanem egy ordas nagy gányolás.
kérem senki ne vegye ezt mintának a témában vázolt feladat megoldására.

azt most hagyjuk, hogy ehhez miért kell űrlap, mikor ezt egy sima anchorral meg lehet csinálni, tegyük fel, hogy mindenképp űrlappal kell megoldani valamiért. (nlta miért)
ilyet, hogy kacsacsőr form, method post, stb... ilyet soha nem csinálunk drupalban. soha! vért könnyezve kórusban visítanak a kismacskák a motorháztető alatt!!!
van formAPI, tessék azt használni. azt kell! mint ahogy nem írunk olyat, hogy kacsacsőr a src (mert van l() fgv és azt használjuk) .. nem írunk olyat, hogy kacsacsőr img src... mert van theme('image'... és azt használjuk!

formAPI!!!

amit még nem értek, hogy ezt miért hook_view -ban csinálod??? az adott tartalomtípust a te modulod hozta létre?? ha igen, akkor talán ok, bár akkor se értem, hogy miért égeted az űrlapodat a $node->content -be?? ha nem a mymodule hozta létre ezt a tartalomtípust, akkor pedig végképp rossz, a hook_view csak olyankor használatos, ha ugyan az a modul definiálta a típust, mint amelyik a hook_view -t valósítja meg. ha másik modul által létrehozott tartalomtípust akarsz piszkálni és mindenképp modulban akarod tenni ezt (ki tudja miért?), akkor hook_nodeapi.

nem vagyok teljesen biztos benne, de ezzel a fenti borzadállyal szerintem eltörted a cckt is, tehát ha most cckval hozzáadsz egy mezőt a típusodhoz, nem fog megjelenni mert manuál átégetted a $node->content. nem túl egészséges.

egy szónak is száz a vége, amit itt fent csinálsz az baromi drupal-idegen.
bocs hogy így megírtam ezt, de fontosnak tartom, hogy ezt tudd, ne szokjad meg ezt a fenti borzalmat.

0
0

-
clear: both;

makgab képe

Ok, rendben. Elfogadom a kritikát, de eddig még nem volt ilyen feladatom. Próbálkozom, de nem jó irányba. :)
A tartalomtípust a mymodule modul hozta létre. Saját nézetet szeretnénk neki létrehozni.

A gombbal kell megoldani az ugrást (#attachments).

A szép megoldás itt van:
http://api.drupal.org/api/drupal/developer--examples--node_example.modul...
Ezt kellene felhasználnom.

<?php
 
function node_example_view($node, $teaser = FALSE, $page = FALSE) {
  $node = node_prepare($node, $teaser);
  $node->content['myfield'] = array(
    '#value' => theme('node_example_order_info', $node),
    '#weight' => 1,
  );
 
  return $node;
}
 
function node_example_theme() {
  return array(
    'node_example_order_info' => array(
      'arguments' => array('node'),
    ),
  );
}
 
function theme_node_example_order_info($node) {
  $output = '<div class="node_example_order_info">';
  $output .= t('The order is for %quantity %color items.', array('%quantity' => check_plain($node->quantity), '%color' => check_plain($node->color)));
  $output .= '</div>';
  return $output;
}
 
 
?>

Igazából itt is egy output-tal (theme_node_example_order_info) csinálja theme-vel.

G.

0
0
aboros képe

ágyúval lősz a verébre. most hirtelen nincs kéznél egy olyan típusom se, ami használna upload.modult (vagy egy éve nem használom a core upload.module -t), de este majd megnézem, hogy pontosan mi történik azzal és küldök egy pontos megoldást. az idézett példamodul arra lett írva (hudeszépen mondtad), hogy illusztráljon egy node_load és egy theme_ közötti "kommunikációt". a példa amit megvalósít ezer más úton is megoldható, nem csak úgy.
neked jellemzően egy sminkes megoldás kéne szerintem, de legalábbis semmiképp nem kell űrlap és az is nagyon rossz ötlet, hogy a linket a node->content -be égeted.
este majd ránézek.

még annyit, hogy az upload.modul el fog tűnni, a hetesben már nincs is, szóval szeirntem arra építeni bármit is a jövőben, az botorság, tessék használni a filefieldet. azért van.

0
0

-
clear: both;

nevergone képe

Apró kiegészítés: a Drupal 7-ben még van upload modul, csak már nem célszerű használni.

0
0
aboros képe

lörnin' báj duin, esz déj széj. ;)

még mindig nem világos, hogy mi okod volt arra, hogy olyan modult írj, ami saját maga definiál egy tartalom típust, mikor ezt cckval is megteheted és még akkor is fennál annak a lehetősége, hogy a típust a saját modulod babrálja. (plusz minden cck jóságot is használhatsz. semmi értelme saját modulban node typeot csinálni szerintem)

mindegy is.
sminkben is meg lehet ezt csinálni, de most az is mindegy, te modulban akarod. maradjak fókuszált ;)

nem volt energiám csinálni egy modult, ami saját típust állít elő és a hook_view() -t használja, úgyhogy a hook_nodeapi() -t használom és azt figyelem, hogy van e upload modullal feltöltött adat, ha igen, akkor adok egy linket, ami a $node->content elején fog megjelenni. ez egy teljesen egyszerű html anchor lesz, egy id -re fogok hivatkozni, hogy melyikre, azt könnyű kideríteni: http://img.skitch.com/20091123-ewhtx3ci6inx4wiufqg3j7fx4f.jpg
ugyan ezt kell csinálnod a hook_view() -ban is.
a modulom neve anchor_to_attachments_example

.info file:

name = 'Anchor to attachments'
description = 'Example module to show how to provide an anchor to attachments table of upload.module.'
core = 6.x
version = 6.x-example
package = drupal.hu examples
dependencies[] = upload

.module file:

<?php
function anchor_to_attachments_example_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
	if ($op == 'view') {
		if (!empty($node->files) && $a4) {
			$node->content['files-anchor'] = array(
				'#value' => l(t('Jump to attachments'), '', array('fragment' => 'attachments', 'external' => TRUE, 'attributes' => array('id' => 'files-anchor'))),
				'#weight' => -10,
			);
		}
	}
}
?>

ennek eredménye emitt: http://img.skitch.com/20091123-my95x7yruppfu781w3in4yjb3h.jpg

nincs hook_theme, nincs saját sminkfüggvény, minek az? szépen ezt a kis tömböt amit most a node->content -be varrunk majd a render odaintézi a helyére. -10 a súlya. ez azt jelenti, hogy fixen -10 -re van égetve, úgyhogy amikor a display fields fülön variálod a sorrendeket, akkor ez oda lesz égetve a -10 -re. lehetne mondjuk kombinálni, hogy ahova az upload.module attachments részét súlyozod, oda súlyozzuk a linket, az attachmentset meg átsúlyozzuk 999 -re. :) vagy lehet még lesni más modulokból, hogy hogyan teszik guin súlyozhatóvá a dolgaikat.

ja és persze lehetne még a végtelenbe és tovább ;)
remélem sikerült inspirációt adni.

0
0

-
clear: both;

makgab képe

Köszi!
Bár hasonló volt az elképzelésem csak nem találtam a megfelelő részt a doksiban (rossz helyen kerestem), de ezt css-ben kellene a smink-nek megfelelően submit buttonra formáznom (mert button kell a link helyett).
De ez már egy másik thread. :)

Köszönöm az iránymutatást!!

G.

0
0
hosszu.kalman képe

A linkbe bármikor tudsz képet is elhelyezni, ami már button ;)
Form generálásra itt semmi szükség szerintem.

0
0
makgab képe

igen... meg is oldottam ccs-ből. A "link-ből submit button lett".

G.

0
0
aries képe

Nem hülyeség típust készítei modulból. Egyrészt nem kell egy böszme nagy modult behúzni a maga minden hülyeségével (gondolok itt a Form API-s belenyúlásokra, ami miatt véletlenül sem úgy működnek a dolgok, ahogy azt az ember megszokta, cserébe vannak sűrűn változó, dokumentálatlan hookok, amikre nincs példa). Amikor nem csak az van, hogy kilométer hosszú standard node form-ot (ami nem is túl felhasználóbarát ugye) okádik az ember a user arcába, hanem van némi elvárás, mondjuk szeretne GYORSAN content_multigroup jellegű dolgot, ami működik is mondjuk a hierarchical selecttel, akkor van értelme, mi az hogy, nagyon is! És akkor nem lesz filefield, imagefield?

Valljuk be, egy komolyabb projektnél a felhasználói felületet tervezők nagy ívben tesznek arra, hogy a Drupalban, CCK-ban, Viewsban mi az alapértelmezett megjelenés. Ők azt akarják visszakapni, amit kitaláltak. Ha pedig az úgy nem jó, ahogy van, akkor sokkal gyorsabban haladsz saját ct modullal, ahol nem karmolássza össze az űrlapmegjelenítést soklépésben a Forms API, nem löki bele a teljes node tartalmát a $form-ba, nincs szopókő, ha a mezőt hozzáadod másik ct-hez is, és akkor átvariálja a táblastruktúrát stb.

Azt meg valljuk be őszintén: összetett mezőtípusokat létrehozni leginkább Nedjo, Quickschetch Robert Douglas, Merlinofchaos, Sun, Jonbob és más CCK core fejlesztők szoktak. Miért? Mert nem éri meg főverzión belül többször módosított, dokumentálatlan API-n újra és újra átrágni magad. Legalábbis nekem nem. Ettől függetlenül úgy szoktam létrehozni a táblastruktúrát, hogy az alkalmasint kompatibilis legyen a CCK-val, de dokumentáció és jó példák nélkül nem szégyen, ha az ember mellőzi. (A teljesítményre gyakorolt jótékony hatás sem mellékes, kapásból ~20MB-ot spórol az ember egy teljes tartalom megtekintésnél akár használja az ember a $node->content tartalmát, akár közvetlenül babrálja a megjelenítést a $node->field_* változókon keresztül.)

0
0
aboros képe

de szerintem az esetek döntő többségében nem állnak fenn a követelmények amik miatt mellőznöm kéne a cckt. szerintem itt nagyon kevesen építenek igazán komoly forgalmú webhelyeket vagy nagyon összetett, sokűrlapos, bonyolult adatrendszerű alkalmazásokat. legtöbbünk egyszerű siteokat hoz létre, ahol én személy szerint semmi értelmét nem látom annak, hogy saját modullal definiáljak egy tartalom típust mikor megtehetem ugyan ezt két klikkel a kezelőfelületen is.

0
0

-
clear: both;

aries képe

Ezzel egyet is értek, én csak a „semmi értelme saját modulban node typeot csinálni szerintem” mondatodra reagáltam.

0
0
aries képe

Alapvetően egyetértek, de az image-et, table és hasonlókat ha elhagyja az ember, nem nagy probléma, főleg, ha nem egyendolog kell (ezek általános függvények, ha valami megbazirgálja, akkor mindenhol meg lesz bazirgálva). Az interaktív elemeket nem használni viszont elég messze van a rendszerben gondolkodástól. :)

0
0
nevergone képe

Tényleg nem akarlak bántani, mert nem mondok semmi produktívat, de remélem a Drupal smink-készítést még nem tervezed felvenni, és a modulfejlesztés is, ehh...
Nyilván sok dologban én magam is béna vagyok, de igyekszem pótolni azzal, hogy utánaolvasok a dolgoknak, illetve igyekszem megfigyelni, hogyan csinálják a nálam hozzáértőbbek.

0
0
makgab képe

A modulok egész jól mennek, persze messze vagyok még a középszinttől is. De próbálkozom.
Mindig megfogadom a tanácsaitokat, ebben a témában is!

Azért fordulok hozzátok, mert adódott egy probléma, amilyet még nem csináltam.
Ki kell próbálni, csak úgy lehet rájönni dolgokra. A próbálkozásom működik, de nem drupal-barát. Ok.
Jó volna egy minta, hogyan lehet szépen megoldani.

Előre is köszönöm a segítségeteket!

G.

0
0
teecee képe

Sziasztok!

Látom, nagyon megoldottátok már ezt a problémát, de felteszem a kérdést (lehet elásva magamat a Drupal Szakmai Bizottság :DDD előtt)
Miért nem javascripttel oldjuk meg ezt a problémát? A kérdésben oldalon belüli átugrás van, ahhoz még anchor sem kell, hogy javascripttel átugorjuk, és JS-sel elég könnyen hozzáragasztunk még egy gombot akárhova, vagy akár meglévőre. Lévén ez egy látszólagos megoldás, gondolom usability feature, hogy a kedves user ne felejtse el a csatolmányt feltölteni, vagy ne kelljen keresgélnie és így ezt szívesen kitolnám JS-be.

Ez elborult ötlet, vagy csak nagyon elkényelmesedtem a mostanában lévő sok Js miatt amit kódoltam? :)

0
0

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
TeeCee, the One and Only

hosszu.kalman képe

Ha nincs engedélyezve a JS akkor nem működik a dolog, az a probléma. Amúgy persze meglehetne azzal is csinálni.

0
0
teecee képe

...hogy ezt fogjátok hozni kérdésnek, de tapasztalataim alapján 99,9%-ban be van kapcsolva a Js. Mivel az én feltételezésem szerint itt valami user-kisegítő fícsőrről lenne szó, ami az egységsugarú felhasználóknak készül, azoknál meg nincs letiltva semmi. A profik, akik meg szándékosan tiltják le a JS-t azok meg úgysem használnák ezt a funkciót, vagy bekapcsolják a scriptet.

Szóval szerintem nem probléma, ha JS véletlen még sincs, mivel az oldal használható marad, minden funkció elérhető.

Jelzem: amikor views-listát alakítottam át, vagy webformot törtem többlaposra, akkor a meglévő HTML-ből dolgoztam diszkrét módon, így megmaradt az eredeti funkcionalitás, tehát ezt szem előtt szoktam tartani.

0
0

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
TeeCee, the One and Only

hosszu.kalman képe

Nem arról van szó, hogy valaki letiltja a JS-t, mert én kb úgy vagyok vele, hogy aki letiltja az szívjon csak, hanem arról, hogy mondjuk valaki felmegy az ilyen-olyan ultramenő csilli-villi érintőképernyős telefonjával megnézni az oldalt, és mivel a mobilos böngészők, vagy egyáltalán nem, vagy csak korlátozottan tudják használni a JS-t így cseszheti.

Ez ilyen furcsaság, hogy ahogy telik az idő egyre inkább elvárható hogy ne legyen tiltva a JS, viszont egyre kevésbé biztos hogy a látogatás számítógépről jön.

Legalábbis szerintem.

0
0
chx képe

Milyen mainstream okostelefonnak van ma korlátozott böngészője?

0
0
pp képe

A Nokia E51-es telefonom beépített böngészője bizonyos js-t tud futtatni, de az opera mini meg nem nagyon.

pp

0
0
york képe

Es mi van akkor amikor le van tiltva a JS?

0
0
aboros képe

mert abban nem vagyok annyira otthon. :)
száz módon lehet megoldani nyilván.

aki meg kikapcsolt jsel netezik 2010ben, az nemnormális.
gmailt is oldschool standard htmlbe használja? facebookot hogyna nézi? vagy flickert? hogy csak kettőt mondjak. :)

mondjuk ha már felvillantottad ezt a lehetőséget, nem osztasz meg egy konkrét megoldást? ;) tudod, utókor.. :P

0
0

-
clear: both;

teecee képe

... az kéne, mi? :P

No egye fene, 10 perec alatt összedobtam valamit.

$('.node').prepend('<input type="submit" class="toAttachmentsButton" value="Csatolmányokhoz">').click( function(){
$.scrollTo('.file-uploads', 500);
} );

No ez annyit csinál (ha már utókor), hogy a .node elem első TAG-jának berak egy SUBMIT típusú INPUT-ot, amire ráköt egy onClick eseményt, ami a .file-uploads -hoz küldi a böngészőt, fél mp-es animálással. (Ha már csinálunk valamit, csináljuk látványosra :D )

Ehhez kell a scrollTo plugin, viszont ha csak firebugban a konzolon akarjátok kipróbálni, akkor a következő sort rakjátok még be, egyébként meg be kell tölteni:

$.getScript('http://flesler-plugins.googlecode.com/files/jquery.scrollTo-1.4.2-min.js'); 

A rendes megvalósításhoz egyrészt kellene figyelni, hogy csak akkor tegye mindezt, ha van csatolmány, másrészt nem tudom, előfordul-e olyan eset, hogy egy oldalon több .node és .file-uploads rész lehet, ez ugye problémát okoz a mostani 'demóverzióban'.
Továbbá: tessék a drupal_add_js() függvénnyel behúzni a scrollTo plugint, úgy aggregálható!

aboros: így megfelel? :)

0
0

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
TeeCee, the One and Only

hosszu.kalman képe

Volt egy kis időm, úgyhogy összedobtam egy kis modult, ami ezt a funkciót megvalósítja, így ha van JS ha nincs JS mindenképpen működik.
A működéshez szükséges a jQuery.ScrollTo 1.4-es verziója.

scroll2attachment.info:

name = Scroll to attachment
description = Scroll to attachment in the node view
version = VERSION
core = 6.x
 
dependencies[] = upload

scroll2attachment.module:

<?php
/**
 * Implementation of hook_perm().
 * 
 * Define the following permissions:
 *   - configure scroll to attachment
 */
function scroll2attachment_perm() {
  return array('configure scroll to attachment');
}
 
/**
 * Implementation of hook_menu().
 * 
 * Define the following menu items:
 *   - admin/settings/scroll2attachment
 * 
 * @return array of the defined menu items
 * 
 * @see scroll2attachment_settings_form()
 */
function scroll2attachment_menu() {
  $items = array();
 
  $items['admin/settings/scroll2attachment'] = array(
    'title' => 'Configure scroll to attachment',
    'access arguments' => array('configure scroll to attachment'),
    'page callback' => 'drupal_get_form',
    'page arguments' => array('scroll2attachment_settings_form'),
  );
 
  return $items;
}
 
/**
 * Settings form.
 * 
 * @param unknown_type $form_state
 * @return unknown_type
 */
function scroll2attachment_settings_form($form_state) {
  $form = array();
 
  // Defined node types
  $types = node_get_types();
 
  $options = array();
 
  // Create select options
  foreach ($types as $type) {
    $options[$type->type] = $type->name;
  }
 
  $form['scroll2attachment_node_types'] = array(
    '#type' => 'select',
    '#multiple' => TRUE,
    '#title' => t('Enable the following node types'),
    '#required' => TRUE,
    '#default_value' => variable_get('scroll2attachment_node_types', array()),
    '#options' => $options,
  );
 
  return system_settings_form($form);
}
 
/**
 * Implementation of hook_nodeapi().
 */
function scroll2attachment_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
  switch ($op) {
    case 'view':
      if ($a4 && !empty($node->files) && array_key_exists($node->type, variable_get('scroll2attachment_node_types', array()))) {
        $node->content['scroll2attachment'] = array(
          '#value' => l(t('Jump to attachments'), '', array('fragment' => 'attachments', 'external' => TRUE, 'attributes' => array('class' => 'scroll2attachment'))),
          '#weight' => -10,
        );
        drupal_add_js(drupal_get_path('module', 'scroll2attachment') . '/jquery.scrollTo.js');
        drupal_add_js(drupal_get_path('module', 'scroll2attachment') . '/scroll2attachment.js');
 
      }
      break;
 
  }
}
?>

scroll2attachment.js:

/**
 * Create behavior to create button.
 * 
 * @param {Object} context
 */
Drupal.behaviors.scroll2attachment = function(context) {
  // Can't use attr('type', 'button') for inputs in jQuery
  var scroll2attachment_btn = $('<input type="button" />')
    .val(Drupal.t('Jump to attachments')) // Use Drupal t() function for translation in JS too
    .addClass('toAttachmentsButton')
    .click(function() {
      // Click event
      $.scrollTo('#attachments', 500);
      return false;
    });
 
  // Add the button, and remove the link	
  $('.scroll2attachment', context).before(scroll2attachment_btn).remove();
};

Hát ennyi lenne, csak gondoltam megosztom, hátha érdekel valakit.

0
0