Első modulom - code needs review ;)

aboros képe

A Harmadik Budapesti Drupal Használói Találkozó után hazajöttem, kinéztem egy pofásabb sminket és bár nem jártam rögtön gobai magasságokban, azért másfél órán belül csak sikerült ráhúznom a Drupal 6.1 -re. Szerettem volna megosztani a közösséggel, de hamar kiderült, hogy ez licensz akadályokba ütközik. Adta magát az ötlet, hogy készítsek egy oldalt ahol ezt megtehetem magamnak. Sminkblog kvázi, igazából yet another place for themes. Sose elég. :)

Sweetchuck képe

Nem biztos hogy a legszebb megoldás, de müködik.
Kicsit átírtam a node.module fájlt.
Nem bizos hogy szükség van a statikusan tárolni a parse_url($db_url) függvény eredményét mert gyakran csak 1 node insert történik egy oldal lekérésközben, de asszem hogy én olyan modult írok ami többet is fog egyszere insertálni.
Szóval a módosítások Drupal 4.6.3 esetén:
410. sor környékén van egy ilyen elágazás a node_save() függvényben.

// Apply filters to some default node fields:
if (empty($node->nid)) {
  // Insert a new node.

itt ágazik el az a rész hogy INSERT vagy UPDATE
és az elágazás elé ezt írtam:

static $db_url_array=NULL;
if($db_url_array==NULL){
  global $db_url;
  $db_url_array = parse_url($db_url);
}//if
 
az elágazás mindkét részében van egy ehez hasonló rész:
<code>
// Prepare the query:
foreach ($node as $key => $value) {
  if (in_array((string) $key, $fields)) {
    $k[] = db_escape_string($key);
    $v[] = $value;
    $s[] = "'%s'";
  }
}

csere erre:

// Prepare the query:
foreach ($node as $key => $value) {
  if (in_array((string) $key, $fields)) {
    if(($url['scheme'] = 'pgsql')
    && ($key == 'moderate' || $key == 'sticky')
    && ($value == '' || $value == NULL)
    ){
      $value=0;
    }
    $k[] = db_escape_string($key);
    $v[] = $value;
    $s[] = "'%s'";
  }
}

most így müködik rendesen.

Azért gyanítom, hogy csak nálam van a hiba mert ez olyan dolog ami 1 perc alatt kiderül ha nem müködik.
Szeretnék visszajelzést, hogy más tapasztala-e ezt a jelenséget.
PostgreSQL sever telepítéssel együtt is csak 10 perc.
Köszönöm :)

0
0
zoliky képe

Vegul sikerult megoldani a problemat, de csak az egyik reszet!
igy nez ki a modulom:

<?php
/**
 * @file
 * Obtain forum statistics
 */
 
/**
 * Implementation of hook_block()
 */
function forumstat_block($op = 'list', $delta = 0) {
  switch ($op) {
    case 'list':
    $block[0]["info"] = t('Forum statistics');
    return $block;
 
    case 'view':
    $item = _forumstat_fetch();
    $subject = theme('forumstat_mytheme', 'Forum Statistics');
    $block["subject"] = $subject;
    $block["content"] = check_plain($item->nid);
    return $block;
  }
}
 
/**
 * Fetching statistics from database
 */
function _forumstat_fetch() {
  $sql = "SELECT nid FROM {node} WHERE status=1 AND type='forum' ORDER BY RAND() LIMIT 1";
  $res = db_query($sql);
  $item = db_fetch_object($res);
  return $item;
}
 
/**
 * Implementation of hook_theme()
 */
function forumstat_theme() {
  return array(
    'forumstat_mytheme' => array(
    'arguments' => array('subject' => NULL),
    ),
  );
}
 
function theme_forumstat_mytheme($subject) {
  $out = '<div class="subject" style="background-color: pink">'. $subject . '</div>';
  return $out;
}

Most kulso tpl.php fajl nelkul csinalja a temat, de lenyegtelen. Ami idegesit az, hogy a drupal nem hagya el az alapertelmezet tagokat a block kozul, ezekre gondolok (2: es 3:).

1: <div id="block-forumstat-0" class="block block-forumstat">
2: <h2></h2>
3: <div class="content"></div>
4: <div>

Csak azt kene kinyomni amit a "theme_forumstat_mytheme" fuggveny kuld vissza. Tudna valaki segitseget nyujtani ? - itt mar konyvel sem boldogulok :)

0
0
aboros képe

tehát akkor preprocessora is van, amit a template.php -ban valósíthatsz ugye meg.
ez az eredeti egy olyan átírata, ami egy "thumb" nevű sablonnal készíti el a user képét minden esetben:

function SMINKNEVE_preprocess_user_picture(&$variables) {
  $variables['picture'] = '';
  if (variable_get('user_pictures', 0)) {
    $account = $variables['account'];
    if (!empty($account->picture) && file_exists($account->picture)) {
      $picture = file_create_url($account->picture);
    }
    else if (variable_get('user_picture_default', '')) {
      $picture = variable_get('user_picture_default', '');
    }
 
    if (isset($picture)) {
      $alt = t("@user's picture", array('@user' => $account->name ? $account->name : variable_get('anonymous', t('Anonymous'))));
      #figyi itt nyulunk bele
      $variables['picture'] = theme('imagecache', 'thumb', $picture, $alt, $alt, array());
      #belenyulas vege
      if (!empty($account->uid) && user_access('access user profiles')) {
        $attributes = array('attributes' => array('title' => t('View user profile.')), 'html' => TRUE);
        $variables['picture'] = l($variables['picture'], "user/$account->uid", $attributes);
      }
    }
  }
}

végülis csak egy értékadást írtunk felül, hogy ne a theme('image' .. -en kergesse át a képet, hanem a theme('imagecache' .. -en.

ha ennél bonyolultabb kell, kérdezz bátran.
és légyszi ne csináljad, hogy ilyen címkéket adsz meg kapcsolódó modulnak, hogy "imagecache(?)" a kérdőjel nem kellene szerintem, az nem a modul neve.

itt az eredeti előfeldolgozó:
http://api.drupal.org/api/function/template_preprocess_user_picture/6
fél sort változtattunk. ;)

0
0

-
clear: both;

eMeLA képe

Emlékeim szerint pont ilyen esetre írtam (nem vagyok programozó, így lehet nem teljesen "szakszerű" a kód), illetve arra is jó, hogy akármekkora adatbázist fel lehet vele tölteni.

Egy próbát megér.

Felmásolod FTP-n az adatbázisod, majd a lenti kódot (az adatok kitöltése után) berakod egy php fájlba. Ezt a fájt mellémásolod az adatbázisnak és böngészőből futtatod.

<?php
 
set_time_limit(0);
$fa=fopen('fájlnév.sql','r');
 
 
$mySQLserver    = 'localhost';
$mySQLuser      = 'username';
$mySQLpassword  = 'password';
$mySQLdefaultdb = 'databasename';
 
$mySQLConnection = mysql_connect($mySQLserver, $mySQLuser, $mySQLpassword) or die( 'Nem lehet kapcsolodni' );
mysql_select_db($mySQLdefaultdb) or die( 'Nem tudok valasztani' );
mysql_query("SET NAMES UTF8");
mysql_query("SET CHARACTER_SET utf8");
print "Start !<br>";
$query="";
$s = 0;
while (!feof($fa)) {
  $sor=trim(fgets($fa));
  if ($sor) {if ($sor[0]!="-" and strlen($sor)>6) $query.=$sor;}
  if (substr($query,-1,1)==";") {
    print $s++."<br>";
    $rezz=mysql_query($query) or print(mysql_error()."<br><h1>".$sor."</h1>");
    $query="";
  }
}
fclose($fa);
print "End !<br>";
?>
0
0

...mit tudok: http://web.termuves.hu

zoliky képe

Nem akarok wordpress-t hasznalni es senki sem mondta, hogy a drupal sz*r. Csak tanacsokat akarok kerni, peldaul: 'te hulye ne csinald igy, mert lehet igy is...', nem pedig megoldasokat.

Elmagyarazom meg egyszer reszletesen a problemat:

1. Van egy drupal alapu smink.
2. A folapon vannak: page, story, es blog tipusu tartalmak. Tudomasom szerint a drupal ezeket node-nak tekinti.

3. Mindegyik node-t kulon keretben szeretnem latni. CSS-el ezt meg is lehet oldani.

#node {
  background: #fff;
  border: 1px solid #ccc;
  margin: 0 0 15px 0;
}

A problema az, hogy a drupal a fooldalon igy listaza ki a node tartalmat:

<div id="node".......>
   <h2>Szia! Itt egy cim</h2>
   <div id="tabs" .......></div>
   <div id="content ......></div>
</div>

Ha pedig raklikelek a "Szia! Itt egy cim"-re, a drupal csak azt a nodet jeleniti meg amire raklikeltem, persze egy kis elteresel a HTML kodba:

<h2>Szia! Itt egy cim</h2>
<div id="node".......>
   <div id="tabs" .......></div>
   <div id="content ......></div>
</div>

A cimet kirakja a node DIV-bol.
A tobbiek azt tanacsoltak, hogy a keretet ne rakjam ra a "#node-ra". Igen am de akkor sem jo!

Tegyuk fel, hogy most a fooldalon vagyok. Raklikelek a "Szia! Itt egy cim"-re es meglenekik a page tipusu nezet. Engemet tulajdonkepen nem is erdekel a

page cim a page tipusu nezetben, el is szeretnem tuntetni. Minek rakjam keretbe, azert, hogy a forum cime, a contact form cime meg minden szarsag cime keretbe legyen!! Nem, ezt nem akarom. Nekem csak a node cime kell keretben. Ezert igy csinaltam

Megnyitotam a page.tpl.fajlot es ezt modositom:

<?php if ($title && !$node) { print '<h1 class="title">'. $title .'</h1>'; } ?>

es a node.tpl.php fajlban a kovetkezo helyet

<?php if (!$page): ?>
  <h2><a href="<?php print $node_url ?>" title="<?php print $title ?>"><?php print $title ?></a></h2>
<?php endif; ?>

ezt irtam at:

<?php if ($node): ?>
  <h2><a href="<?php print $node_url ?>" title="<?php print $title ?>"><?php print $title ?></a></h2>
<?php endif; ?>

Szerintem igy vilagosan elmagyaraztam. Csak otletekre van szuksegem, jol jartam el?
A node tipusu tartalmaknal nem lesz page cim, de elojon a node cim a keretben, eppen amit szeretnek. A tobbi tipusu oldalnal: peldaul contact form, blog, administer, stb... elojon a page cim.

Nezetek meg ezt az oldalt: http://artdesigner.lv/ csak a "Download", "Personal", es "Secret" kategoriak-nal jelenik meg a lap cime es az is kulon keretbe, nincs benne a tartalmi (node) keretbe.

Ha tudnatok segiteni halas lennek, csak tanacsokra lenne szuksegem. Elore is koszonom!

0
0
etyike képe

Megcsináltam első modulom (olyan is :), de elakadtam.

function clearbox_form_alter(&$form, $form_state, $form_id) {
  if ($form_id == 'lightbox2_auto_image_handling_settings_form') {
	//valasztas kiegeszitese
    $automatic_options = array(
	  0 => t('Disabled'),
	  1 => t('Lightbox'),
	  2 => t('Lightbox grouped'),
	  3 => t('Slideshow'),
	  4 => t('HTML content'),
	  5 => t('HTML content grouped'),
	  //uj valasztas folvetele
	  //ezeket fol kell tuntetni az *auto_image_handling.js* fajlban
	  6 => t('Clearbox'),
	  7 => t('Clearbox grouped'),
	);
	//hozzaadas a listahoz
	$form['handler_options']['image_node_options']['lightbox2_image_node']  = array(
	  '#type' => 'select',
	  '#title' => t('Automatic handler for image nodes'),
	  '#options' => $automatic_options,
	  '#description' => t('Choose how URLs for image nodes will be automatically handled.'),
	  '#default_value' => variable_get('lightbox2_image_node', ''),
	);
  }
}
//utvonal mentese
$path = drupal_get_path('module', 'clearbox');
 
//utvonal atadasa a clearbox.js fajlnak
$clearbox_js_settings = array(
  'path' => $path,
  );
drupal_add_js(array('clearbox' => $clearbox_js_settings), 'setting');
 
//Clearbox3 beillesztese az oldalba
$js_location = variable_get('clearbox_js_location', 'header');
drupal_add_js($path .'/clearbox.js', 'module', $js_location);

itt nem adódik át semmi, ha megadom kézzel az útvonalat úgy működik; de ha már itt vagyok ezt is megtanulnám, meg így jobb is
clearbox.js
...
var settings=Drupal.settings.clearbox;
var CB_ScriptDir=setting.path+'/clearbox';
...

már csak ennyi híja lenne, erről nem találok semmit
0
0

Kellemes és szép napot a továbbiakban
etyike

gazsesz képe

1. settings.php
ennek a végén akövetkezőt találtam - amit nem én írtam bele:

$conf['cache_inc'] = './sites/all/modules/cache/cache.inc';
    $conf['session_inc'] = './sites/all/modules/cache/session.inc';
    $conf['cache_settings'] = array(
      'engines' => array(
        'db' => array(
          'engine' => 'database',
          'server' => array(),
          'shared' => TRUE,
          'prefix' => '',
        ),
        'apc' => array(
          'engine' => 'apc',
          'server' => array(),
          'shared' => TRUE,
          'prefix' => '',
        ),
        'memcache' => array(
          'engine' => 'memcache',
          'server' => array(
            'localhost:11211',
            'localhost:11212',
          ),
          'shared' => TRUE,
          'prefix' => '',
        ),
      ),
 
      'schemas' => array(
        'db' => array(
          // Engines:
          'db',
        ),
        'apc' => array(
          // Engines:
          'apc',
        ),
        'memcache' => array(
          // Engines:
          'memcache',
        ),
      ),
 
      'bins' => array(
        // Bin name     => Schema name.
        'default'       => 'db',
        'cache'         => 'apc',
        'cache_form'    => 'memcache',
        'cache_page'    => 'memcache',
        'cache_filter'  => 'memcache',
      ),
    );

Az a sejtésem, hogy a szolgáltató írhatott bele, mert ezzel az oldallal elég sok probléma volt a taxonomy filter (Lassú Query fórum) join-olási hibája miatt és többször le akarta állítani az oldalt.

2. Gondolom a fenti rész beírása miatt írja ki a Status reports, hogy
APC extension, Memcache extension not installed. Ezek installálását vajon a szolgáltatótól kell kérni?

3. A tábla sérült volt délután, de repair-rel javítottam, azóta OK-t ír ki, de továbbra is üres.

0
0

Gazsesz

errata képe

nagyon köszönöm a tutoriált ezen elindulva sikerült amit szerettem volna :)
sajnos nem fogalmaztam 1értelműen szóval 1-2 dolgot még bele kellet raknom, ezeket leírom hátha még kelleni fog valakinek:

az info_box-ba kicsit átírtam a php-t ez csak ilyen egyéni dolog:

$node_types = node_get_types();
unset($node_types['info_box']);
unset($node_types['panel']);
unset($node_types['page']);
unset($node_types['story']);
$allowed = array();
 
$allowed["evrywhere"] = "Mindenhol";
 
foreach ($node_types as $machine_name => $type_obj) {
    $allowed[$machine_name] = $type_obj->name;
}
return $allowed;

nekem így átláthatóbb, és hozzáfűztem 1 mindenhol megjelenést is, illetve nem vizsgál minden ciklusban egy feltételt a kód...

na de jön a view paraméter kódja :)

if ((arg(0) == 'node' && is_numeric(arg(1)))) {
  $node = node_load(arg(1));
  return $node->type;
} else {
  foreach (views_get_all_views() as $name => $obj) {
    foreach ($obj->display as $display_name => $display_obj) {
        if(isset($display_obj->display_options['path']) && arg(0) == $display_obj->display_options['path']) {
            return str_replace('_prew', '', $obj->name);
            break;
        }
    }
  }   
}

nekem még voltak view-aim is amiknek a [node-type]_prew volt a neve és ott is meg kellet jelenítenem nem tudom hogy szép-e a megoldás amit csináltam de az egyszerű megoldások sehogy se akartak működni :(
szóval a lényeggel meg is vagyok köszön a segítséget.
Már csak 1 dolog van hátra ha a paraméter alapján nincs találat akkor 1 alapértelmezett info box-ot jelenítsen meg (ez lenne az everywhere), ennek a kérdésemnek nyissak új fórum témát vagy felesleges? remélem rájövök a megoldásra de ha valaki gyorsabb nálam ne habozzon írja meg nyugodtan :)

köszi még egyszer
Péter

0
0