Taxonomy.modul checkbox

Anonymous képe

Beleütköztem a mi nap egy hiányosságba(?)

Vannak olyan oldalak, blogok, áruházak ahol rengeteg kategória van.
Egy node több kategóriába is bele tartozhat, tehát beküldéskor multiple -select -el választjuk ki alapesetben ctrl- nyomvatartásával melyekbe kerüljön bele. De mi van akkor ha a kategóriák száma meghaladja 200-at? Elég lehetetlen lesz a választás, görgetni fel-le... még ha a select form mérete betölti a képernyőt akkor is.

Másik, hogy elég gyengén van éreztetve a kategória gyermekek elválasztása, nem átlátható. (főleg ha görgetni kel)

Ugye, úgy van megoldva hogy a 'kifejezések' gyermekei kiválasztásnál a mélységük arányába a nevük elé kapnak egy ?-? kötőjelet.

PL.:

FőMama
-anya
-apa
--Gyermek01
--Gyermek02
---Gyermek gyermeke
----Sanyika

Főpapa
-anya
-apa
--Gyermek01
--Gyermek02
---Gyermek gyermeke
----Lacika

Képzeljük el egy nagyobb listát.. 5-6-os mélységgel. :)

Próbáltam módosítani a ?-?- számát. Mélységenként kettőre, háromra.. nem volt igazi.

Írtam egy js-t ami figyeli a mélységek ?-?- számát és OPTGROUP-al egészíti a select-et. Így már egész szépen el tudtam választani css-el. Gond az volt ezzel hogy kókány és mivel több ilyen taxonomy csoport select lista van egy oldalon (amiknek nem kéne OPTGROUP-osnak lennie), ezért Tid- class szerint kellett pozicionálnom, de így a későbbi kategória bővítés kód-túrkászásal jár amit az user nem fog tudni.

Keresgéltem drupal.org -on és találtam egy marha jó modult. (nem publikált).

Itt: http://drupal.org/node/84286
és itt: http://www.angrydonuts.com/taxonomy_checkboxes_v2_the_reven

A végleges modul így néz ki:

function test_expand_checkboxes($element) {
  $value = is_array($element['#value']) ? $element['#value'] : array();
  $element['#tree'] = TRUE;
  if (count($element['#options']) > 0) {
    if (!isset($element['#default_value']) || $element['#default_value'] == 0) {
      $element['#default_value'] = array();
    }
    foreach ($element['#options'] as $key => $choice) {
      if (!isset($element[$key])) {
        $tchoice = ltrim($choice, '-');
        $depth = strlen($choice) - strlen($tchoice);
        $element[$key] = array(
          '#type' => 'checkbox',
          '#prefix' => '<div style="margin-left: ' . (10 * $depth) . 'px">',
          '#suffix' => '</div>',
          '#processed' => TRUE,
          '#title' => $tchoice,
          '#return_value' => $key,
          '#default_value' => isset($value[$key]),
          '#attributes' => $element['#attributes']);
      }
    }
  }
  return $element;
}
function test_expand_radios($element) {
  if (count($element['#options']) > 0) {
    foreach ($element['#options'] as $key => $choice) {
      if (!isset($element[$key])) {
        $tchoice = ltrim($choice, '-');
        $depth = strlen($choice) - strlen($tchoice);
        $element[$key] = array(
          '#type' => 'radio',
          '#prefix' => '<div style="margin-left: ' . (10 * $depth) . 'px">',
          '#suffix' => '</div>',
          '#title' => $tchoice,
          '#return_value' => $key,
          '#default_value' => $element['#default_value'],
          '#attributes' => $element['#attributes'],
          '#parents' => $element['#parents'],
          '#spawned' => TRUE);
      }
    }
  }
  return $element;
}
function test_form_alter($form_id, &$form) {
  if (isset($form['type']) && $form['type']['#value'] .'_node_form' == $form_id) {
    if (is_array($form['taxonomy'])) {
      foreach ($form['taxonomy'] as $vid => $taxonomy) {
        if (is_numeric($vid)) {
          if ($taxonomy['#multiple']) {
            $form['taxonomy'][$vid]['#type'] = 'checkboxes';
            $form['taxonomy'][$vid]['#process'] = array('test_expand_checkboxes' => array());
          }
          else {
            $form['taxonomy'][$vid]['#type'] = 'radios';
            $form['taxonomy'][$vid]['#default_value'] = $form['taxonomy'][$vid]['#default_value'][0];
            $form['taxonomy'][$vid]['#process'] = array('test_expand_radios' => array());
          }
          unset($form['taxonomy'][$vid]['#theme']);
          if ($form['taxonomy'][$vid]['#options'][0]) {
            unset($form['taxonomy'][$vid]['#options'][0]);
          }
          else {
            $form['taxonomy'][$vid]['#required'] = TRUE;
          }
          $form['taxonomy'][$vid]['#prefix'] = '<div class="taxonomy-form">';
          $form['taxonomy'][$vid]['#suffix'] = '</div>';
        }
      }
    }
  }
}

Tehát select form helyett checkboxok lesznek mélységtől függően be marginozva.

Ngyon jó, és egyértelmű, könnyebben is megértik az userek.

De, a gond ezzel az hogy az összes taxonomy csoportra alkalmazza ami nem szerencsés egy simpla selectnél.

Hogy lehetne azt megoldani hogy csak bizonyos vocaobulary-id re alkalmazza?

A legjobb az lenne ha a kategória beállításainál meg lehetne határozni, hogy az radio-s vagy nem, vagy egy filter form, amibe az érintett vid -eket belehetne írogatni.

Szerintem ez alap lehetne a taxonomy.module-ben
Nem rég álltam át drupal-ra és marhára nem értek hozzá, ezért kérném a segítségeteket.

Előre köszi!
Tamás

Hojtsy Gábor képe

Van egy ciklus minden taxonómia űrlap elemre: foreach ($form['taxonomy'] as $vid => $taxonomy) { Itt szépen kiderül a szótár azonosítója ($vid). Ha ezután a sor után beteszel valami ilyesmit: if (!in_array($vid, array(5, 6, 7, 3))) { continue; } akkor csak az itt zárójelbe írt számú szótárakra fogja végrehajtani a módosítást. Persze lehet erre beállítás oldalt is írni, meg a szótár opcióinak űrlapját is módosítani, de ahhoz érdemesebb jobban megismerkedni a Drupal-lal.

Különben nem egészen látom, hogy egy 200 elemű taxonómiából miért kényelmesebb gombokat csinálni. Befér így egyáltalán a képernyőbe?

0
0
Anonymous képe

Egyenlőre nem tudom megcsinálni. Nagyon az elején vagyok.

Nem fér be egy képernyőbe de csinálok hozzá valami ilyen css-t:

div {
width: 400px;
height: 600px;
overflow: scroll;
}

Szerintem sokkal felhasználóbarát és áttekinthetőbb megoldás lenne, mint
ctrl-t nyomva tartava jelölgetni.

Szerinted,
nem kéne ennek alap funkciónak lennie?

Üdv, Tamás

0
0
Hojtsy Gábor képe

Ha olyan nagy igény van rá, akkor lesz. A Drupal külön lehetőséget ad a javaslatok (feature request) beküldésére, amin keresztül egy ilyen funkció is bekerülhet.

0
0
Illyés Edit képe

Az Active Select modult érdemes megnézni.

Ha jutsz vele valamire, légyszi jelezz itt vissza, engem is érdekel a kérdés, csak mostanában nincs időm ilyen kis usability problémákon rágódni...:)

0
0
Anonymous képe

Nézegetem, de úgylátom nem igazán erre jó. Inkább olyan esetre pl, ha node elkészülése több lépésből állna. Tehát amit nem lehetne egy submit-el elintézni.

0
0
Illyés Edit képe

Lehet, hogy félreértettem a leírást, de szerintem olyan lépcsőzetes select listát lehet vele készíteni - nem tudom, hogy hívjuk az ilyet - hogy pl. kiválasztod az országot az első legördülő menüből, erre a mellette lévő legördülőbe AJAX-szal betöltődik az adott országban lévő városok listája.

Ahhoz, hogy ezt szótárakra és taxonómia kifejezésekre alkalmazni lehessen, meg kell írni egy kis (?) modult, ami ezt hasznosítja. A leírás is mondja, hogy az Active Select önmagában semmit nem csinál:

Don't bother installing this module unless some other module instructs you to do so.

0
0
Anonymous képe

Igen, értem én, de ide nem ez kel.

Tamas

0
0
Anonymous képe

Köszi hogy szoltál, mert tökjó cuccos!

Tamás

0
0
Anonymous képe

Próbáltam úgy ahogy tanácsoltad, valamiért nem jó.

Az baj hogy nem ismerem még a változókat, mi merre, nem látom át az egész nagyságát stb.
Bár gyorsan lehet tanulni, hihetetlen jó dokumentált a Drupal, nem is láttam még ilyet.
Nem értem miért nincs nagyobb közössége Magyarországon (és én is miért csak most kezdek vele foglalkozni???)
Elképesztően jó.
Nektek mennyi idő volt amíg belejöttetek kb.?

Tamás

0
0