modulfejlesztési bénázás

Pál úr képe

Üdv,

tudom, hogy valamit én bénázom el, de 3 napja nem jövök rá, hogy mit.

tariff.module
...

  $items['admin/content/tariff/category'] = array(
    'title' => 'Categories',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('tariff_category'),
    'acces callback' => 'user_access',
    'access arguments' => array('administer tariff'),
    'type' => MENU_LOCAL_TASK,
    'file' => 'includes/simple_tariff.admin.inc',
  );
  $items['admin/content/tariff/category/%tariff_category/delete'] = array(
    'title' => 'Delete category',
Drupal verzió: 

open_basedir restriction in effect

gyg képe

Hiba a filerendszer oldalon:

Drupal verzió: 

Views 2 nézet kódba exportálása

gergely képe

Minden oldalon amit egy időre befejezek - mert ugye weboldalt csak elkezdeni lehet befejezni nem - megpróbálom a legjobb teljesítményt kicsikarni a rendszerből, hogy gyors legyen.

Ennek egyik legjobb módszere ha a nézetünket nem adatbázisban eltárolt adatok alapján kérdeztetjük le az adatbázisból, hanem mindezt kiexportáljuk egy modulba és az intézi csak a lekérdezés eredményét.

Elég elavult dolognak számít 2011 vége felé 6.x-2.x verziójú Views modulról írni, de hátha valaki még nem csinálta ezt. (7.x-3.x-en nem jöttem még rá, hogy kell.)

hosszu.kalman képe

Létre kell hozni egy blokkot aminek a következő a tartalma:

<script type="text/javascript" src="<?php print url("misc/jquery.js") ?>"></script>
<script type="text/javascript" src="<?php print url("misc/bettertip/jquery.bettertip.js") ?>"></script>
<style type="text/css" media="all">@import "<?php print url("misc/bettertip/jquery.bettertip.css") ?>";</style>
 
<style type="text/css">
div.utolso-bejelentkezok {
  float: left;
  width: 60px;
  text-align: center;
}
</style>
 
<script type="text/javascript">
 
var base_url = <?php print url() ?>;
 
$(function() {
  // Felhasznalo kepenek kattintasanak kezelese
  $('a.betterTip').click(function() {
    // Az id-ban szerepen a user id, ezert felbontjuk
    var uid_array = $(this).attr('id').split('_');
    // Atiranyitjuk az oldalt a felhasznalo profiljara
    document.location.href = base_url + 'user/' + uid_array[1];
    // A visszateres hamis
    return false;
  });
});
</script>
 
<?php
// A 12 legutoljara bejelentkezett aktiv (nem tiltott) felhasznalo lekerdezese
$result = db_query_range('SELECT uid FROM {users} WHERE uid <> 0 AND STATUS = 1 ORDER BY login DESC', 0, 12);
while ($user_obj = db_fetch_object($result)) {
  // Felhasznalo betoltese
  $user = user_load(array('uid' => $user_obj->uid));
 
  // Ha nincs a felhasznalonak kepe akkor egy alapertelmezett kep jelenik meg
  $user->picture = ($user->picture) ? $user->picture : url("files/profile_pictures/nincskep1.jpg");
  ?>
  <div class="utolso-bejelentkezok">
    <a id="user_<?php print $user->uid ?>" href="$betterTip_<?php print $user->uid ?>" class="betterTip" title="$content"><img src="<?php print $user->picture ?>" width="50" /></a>
  </div>
 
  <!-- ez az a resz ami megjelenik ha a kep fele visszuk az egeret -->
 
  <div id="betterTip_<?php print $user->uid ?>" style="display: none;">
    <div class="betterTip_name"><?php print $user->name ?></div>
    <div>
      <div><img src="<?php print $user->picture ?>" /></div>
      <div>
        <p>
          <?php print $user->profile_nem ?> | <?php print $user->profile_orszag ?><br />
          Member since: <?php print format_date($user->created, 'custom', 'Y-m-d H:i' ); ?>
        </p>
      </div>
    </div>
  </div>
  <?php
}
?>

Kell hozzá a bettertip nevű jQuerty plugin (js fájl és a hozzá tartozó css) és természetesen a jQuery is.
A stílust úgy alakítjuk ahogy akarjuk, én most csak beírtam valamit.

A hyperlink href attributumába be kell írni annak a html objektumnak az azonosítóját (ID), amit meg akarunk jeleníteni amikor felévisszük az egeret. Mivel mindegyiket egyértelműen azonosítani kell így használjuk az egyedi uid-t. Így alakul ki az, hogy a kép href-be bekerül a $betterTip_[uid] és alatta pedig van egy div aminek az id-ja betterTip_[uid]. Ennek a div-nek alapból nem szabad hogy látszódjon, ezért inline css-be display: none;
A hivatkozó híperlink tiltle tag-je legyen a $content, ezzel jelezzük, hogy egy másik html objektum tartalmát szeretnénk betölteni.

A kód elején van egy js kód ami annyit csinál, hogy ha rákattintuk a kis képre akkor bejön a felhasználó oldala. Ezért létrehoztam egy base_url változót, amibe a feltelepített Drupal címe található (pl domain.com/drupal), így nem kell direktbe megadni a linkeket, és minden oldalon működik.

Természetesen szükséges a profile modul is, hogy el tudjuk kérni a felhasználó nemét és országát.

Eléggé kapkodva írtam, így lehet zavaros de remélem érthető. Ha valami nem világos akkor írj nyugodtan!

A működést meg tudod nézni a http://www.kalman-hosszu.com/drupal-5/regisztralt-felhasznalok oldalon található jobb oldali blokkban.

0
0
Sk8erPeter képe

Az még önmagában megoldható lenne, hogy egyetlen Drupal verziószámát lekérdezzük egy PHP-scripttel, úgy, hogy a DRUPAL_BOOTSTRAP_CONFIGURATION fázisban inicializáljuk a Drupalt, majd a definiált VERSION konstans értékét megnézzük.
A probléma az, hogy úgy emlékszem, ez a konstans csak 6-ostól van meg (de korrigáljatok, ha korábban is létezett).

Lásd a bootstrap.inc fájlt:

http://api.drupal.org/api/drupal/includes%21bootstrap.inc/7

define('VERSION', '7.16-dev');

Az viszont már problémát jelent, hogy runtime-ban meg kell határozni az aktuálisan vizsgált Drupalnál a DRUPAL_ROOT konstanst, és ezt majd később felül kellene tudni definiálni, ha pl. az ügyfelek Drupaljain egy ciklussal kellene végigmenni. Plusz ugye a VERSION konstanst is felül kellene tudni definiálni ilyen esetben, mert minden ügyfélnél más-más lehet.

Ezért kerülő megoldás lehet, ha mondjuk az aktuális Drupal-könyvtárat argumentumként adjuk be egy PHP-scriptnek, ez a script megkapja ezt, ez alapján dolgozik, megvizsgálja az adott könyvtárat, majd végez. Ezt a scriptet pedig ciklikusan futtathatná egy akármilyen shell script vagy batch script.
De ez csak egy gyors ötletelés, és valószínű, hogy így sem feltétlenül teljesértékű megoldás - pl. ha korai verzió, nem biztos, hogy létezik a VERSION konstans; de ez persze egyben egy szűrő is lehet, ha túl régi változat (if(!defined('VERSION')){ /* túl régi... */ }).

Az alábbi kód útmutatást adhat kezdetnek, természetesen annyiban módosítani kellene az előbb leírtaknak megfelelően, hogy a $drupal_root_directory változó a command line-tól kapott valamelyik argumentummal (http://php.net/manual/en/reserved.variables.argv.php) lenne egyenlővé téve.

  1. <?php
  2.  
  3. $original_cwd = getcwd();
  4.  
  5. $drupal_root_directory = 'd:\Projects\web\PHP\drupal-7-another\htdocs';
  6.  
  7. chdir($drupal_root_directory);
  8.  
  9. define('DRUPAL_ROOT', $drupal_root_directory);
  10.  
  11. require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
  12.  
  13. if(defined('VERSION')){
  14. echo 'A telepített Drupal verziószáma: '.VERSION;
  15. }
  16. else{
  17. echo 'A VERSION konstans nem létezik, így abból nem meghatározható a verziószám.';
  18. }
  19.  
  20. chdir($original_cwd);

============

Szerk.:
most látom, hogy a VERSION konstanst már említette előttem Illyés Edith.
A fentire kapott -1 szavazat okára kíváncsi lennék, hogy a szavazó szerint mi nem stimmel (igaz, elvileg csak ötletelés zajlik); mindannyian tanulhatnánk belőle (legfőképpen én). Tényleg érdekelne, mi a rossz a gondolatmenetben.

2
-1
Sk8erPeter képe

Köszi szépen, hogy kipróbáltad! Már ez is nagy segítség, mert ezek szerint szűz Drupal esetén jól működik, ergo nem bugról van szó, hanem nálam van a para: vagy smink (pl. egy theme_* v. template_* override, vagy más) vagy modul okozza. Teljesen szűz Drupalon is ki fogom próbálni.

Frissítés óta tapasztalom ezt a jelenséget, de Drush-sal a core-t és contrib modulokat egyszerre frissítettem (pl. Entity API, i18n, stb.), de most legalább kiderült, hogy nem a core, hanem vmi kiegészítő modul a hibás.

Még két kérdés:

  1. Ezek szerint nálad a megjelenítés során, a default 0/1 értékekkel kiírja rendesen a kiválasztott 0/1 értéket?
  2. A '#markup' kulcs az egyes elemekre egyszerűen a drupal_render()-ben állítódik össze, amit aztán megkap a theme_field() függvény, és pl. $variables['items'][0]['#markup'] módon érhető el? Az tiszta, hogy egy foreach-csel megy végig a $variables['items']-en kiíratáskor, majd megint átereszti a drupal_render() függvényen, de hátha van előtte valami formázó - igaz, pont azt írtad, hogy "tényleg nincs ellátva különösebben display formatterekkel ez a mező", de hátha van még egy hely, ahol véletlenül módosításra kerül az adat; megpróbálnám valahogy debuggolni, honnan eredhet a gáz.

    A list.module fájl list_field_info()-jában amúgy látszik a 'list_boolean' típus, az options.module-ban pedig az options_field_widget_info()-ban az 'options_onoff' widget, de innen sokkal tovább nem tudtam jutni, hogy akkor most mégis honnan kezdjem a debuggolást, hol veszhet el a #title vagy épp az érték.

Esetleg érdemes lenne boolean helyett egy mezei list fieldet odarakni.

Ez most nem bejövős megoldás, mert pont ez a ki/bekapcsolós rész kellene az űrlapra, így nagyon kényelmes lenne. De amúgy az ötlet nem rossz, meg lehetne kerülni ezzel a dolgot, de inkább ezt akarnám megoldani.

Addig is eléggé gányolósan, kényszerből manuálisan módosítottam a formban való megjelenését: egy hook_form_FORM_ID_alter()-ben (nyilván a FORM_ID-t cserélve a form azonosítójára) felülírtam a
$form['field_EZ_AZ_ÉN_MEZŐM']['und']['#title']
értékét, ami mérhetetlenül gáz, mivel így nyelvfüggő a megoldásom ('und'), meg amúgy is undorító módja a módosításnak, de most gyorsan kellett a dolog. Ha jut eszedbe kevésbé undorító kényszermegoldás, jelezd plíz. :D
Ja, a node/term megjelenítésekor látható érték (a default esetben 0/1), ami szintén nem jelent meg, kevésbé volt fontos, de azt is kényszermegoldással összetákoltam (sic!):
egy theme_field()-ben a foreach részt módosítottam (lásd az $element['#field_type'] === 'list_boolean' részt):

  1. // Render the items.
  2. $output .= '<div class="field-items"' . $variables['content_attributes'] . '>';
  3. foreach ($variables['items'] as $delta => $item) {
  4. // páros/páratlan jelölések
  5. $classes = 'field-item ' . ($delta % 2 ? 'odd' : 'even');
  6.  
  7. // ITT VAN A TÁKOLÓS, MÓDOSÍTOTT RÉSZ
  8. // TODO: checkboxnál a renderelés során az érték nem kerül kiíratásra, debuggolni kéne, a #markup részbe már NULL kerül
  9. // addig is ocsmány kényszermegoldás:
  10. if($element['#field_type'] === 'list_boolean'){
  11. if(empty($item['#markup'])){
  12. $item['#markup'] = (string)$element['#items'][$delta]['value']; // ebben defaultból 0 v. 1 van
  13. }
  14. }
  15.  
  16. $output .= '<div class="' . $classes . '"' . $variables['item_attributes'][$delta] . '>' . drupal_render($item) . '</div>';
  17. }
  18. $output .= '</div>';
0
0

Egyedi Views sablon készítése

kalmarr képe

Sziasztok,

szeretném a views theme-jét megbabrálni a következő képen.

Egy "Accordion" típusú megjelenést szeretnék a view-ban létrehozni.

Aminek két "fő" része van először van egy csoportba foglalása ami az összes elemre vonatkozik és egy kisebb számozott csoportja, ami az egyes elemekre vonatkozik.

Az alap code így nézne ki (ez rendben működik).

Fórum: 
Drupal verzió: 
Melyik modulhoz, modulokhoz kapcsolódik a téma?: 
Taxonomy upgrade extras: 

sokmódon kereshető tartalom

Anonymous képe

Sziasztok!

Egy elég összetett csoportba sorolási és keresési igényre szeretnék megoldást találni.

A feltöltendő tartalom egy programsorozat, amit időpont(ok) (elég a év/hónap/nap), előadó(k), helyszín(ek) szerint kellene kereshetővé tenni.

Nem nagyon mozgok még otthon a taxonómiában, így lehet hogy hülyeséget gondolok, de valami olyan elképzelésem van, hogy csinálok előadók, helyszínek, és dátumok kategóriákat, mindegyik alá bekerülnek a megfelelő címszavak, majd a tartalom feltöltésekor egyszerre hozzárendelem többhöz is.

Hosszú, listaszerű tartalom

airzsolt képe

Sziasztok,
Az lenne a kérdésem, hogy hogyan lehet egy ehhez hasonló listát egyszerűen betenni, és rendszeresen szerkeszteni (elsősorban folyamatosan hozzáadni, néha javítani és esetleg beszúrni) egy drupla honlapon:
http://drupal.org/project/Modules/category/52

A forrásban megnézve látom, hogy két egyedi stílust használnak:
class="project-item project-modules even">
class="project-item project-modules odd">
ami kézenfekvő, és nyilván még "kézzel" szerkesztve is viszonylag egyszerű, de mit tegyek, ha pl. egy 200-as lista közepére kellene később beszúrni páratlan db. sort - vagyis felborul a háttérszín sorrendje.