Gallerie-Lösung für Image-Node (nicht Taxonomy-basiert!)
am 26.11.2008 - 17:54 Uhr in
Hi Leute!
Ich versuche eine Gallerie auf Basis von Image-Nodes zu realisieren:
Es gibt den Kontent-Typ "Fotograph" und den Kontent-Typ "Image", dem per CCK eine "Related-to-Fotopraph"-Feld zugewiesen ist.
Nun habe ich ein Template node-fotograph.tpl.php, in dem ich neben den Infos zum Fotographen auch seine zugewiesenen Bilder anzeigen möchte. Die Fotographen-Seite wird über den Pfad "taxonomy_term/fotograph/node-title" angesurft.
Ich habe erst versucht, das über Views zu lösen und dann per views_embed_view()
einzubinden, aber ich habe den Eindruck, dass ich für diesen Lösungsweg die Relation genau hätte umdrehen müssen, also das Relatet-to-Feld in den Kontent-Typ "Fotograph" packen und diesem dann so seine Bilder zuweisen. Das fände ich aber zu umständlich, da ich nicht nach jedem neuen Bild noch die Fotographenseite anpassen möchte.
Über Hilfe freue ich mich, danke!
- Anmelden oder Registrieren um Kommentare zu schreiben
Was ich nicht ganz kapiere:
am 26.11.2008 - 19:35 Uhr
Was ich nicht ganz kapiere: Wenn Du eine Node vom Type Image erstellst kannst Du doch den Fotografen angeben.
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Da geht noch was.
ja, richtig. und wenn ich
am 27.11.2008 - 12:08 Uhr
ja, richtig.
und wenn ich mir die fotografenseite angucke, möchte ich alle seine image-nodes anzeigen. ich möchte also aus den related image nodes eine gallerie erstellen und diese in das template der fotografen-node einbinden.
... Du "etwas" brauchst um die Fotografen unique identifizieren
am 27.11.2008 - 12:17 Uhr
Tja, da Du ausdruecklich betonst nicht die Taxonomie verwenden zu wollen muss man ueberlegen.
Sind die Fotografen registrierte User der Website?
Was ich sagen will ist das Du "etwas" brauchst um die Fotografen unique identifizieren zu koennen um zu verhindern
da ich nicht nach jedem neuen Bild noch die Fotographenseite anpassen
Eventuell ueberdenkst Du noch Mal Deine Vorgehensweise generell.
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Da geht noch was.
nein, die fotografens ind
am 27.11.2008 - 12:32 Uhr
nein, die fotografens ind keine user, sondern inhalte.
es muss doch möglich sein, invers zu bestimmen, welche image nodes mit einer fotografen-node verknüpft sind.
ich denke mal, dass ich mir eine template-funktion zusammenbasteln muss al la
<?php
"wenn image-node-relatedt_to-NID gleich node-NID des fotografen, dann lade node"
?>
oder so.
eventuell in der art?
<?php
function template_find_related_images(){
if(arg(0) == 'node' && is_numeric(arg(1))) {
$nid = (int)arg(1);
$stack = array();
$result = db_query("SELECT nid FROM content_field_related_artist WHERE field_related_artist_nid = %d",$node->nid);
while($arr = db_fetch_array($result)){
array_push($stack, $arr['nid']);
}
foreach ($stack as $part) {
...
}
}
}
?>
Das war nicht meine Frage.
am 27.11.2008 - 12:38 Uhr
nein, die fotografens ind keine user, sondern inhalte
Das war nicht meine Frage.
Existieren die Fotografen als registrierte User? Wenn ja dann koennen Sie ja eine Node/s vom Typ Image erstellen. Wenn immer noch ja dann hat jede Imagenode auch die User ID des Fotografen?
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Da geht noch was.
nein, die Fotografen
am 27.11.2008 - 12:46 Uhr
nein, die Fotografen existieren nicht als registrierte User.
aber mit
<?php
$result = db_query("SELECT nid FROM content_field_related_artist WHERE field_related_artist_nid = %d",$node->nid);
?>
erhalte ich schon mal alle mit der node verknüpften image-nodes. das ist doch schon mal ein ansatz.
headkit schrieb nein, die
am 27.11.2008 - 12:56 Uhr
nein, die fotografens ind keine user, sondern inhalte.
Also die Frage von quiptime ist damit wohl beantwortet.
Aber ich weiss nicht, irgendwie scheint mir, dass headkit da viel zuweit sucht. Fotos sind Nodes und auch die Fotografen. Irgendwo im Node Foto müste also ein Feld sein, welches den Bezug auf genau einen Node Fotograf herstellt.
IMHO sind da keine Programierungen und änliches nötig, sonder das sollte mit Views oder evtl. Panels erledigt werden können. Ich stelle mir das wie folgt vor. In der View Gallerie setzt man einen hervorgehobenen Filter auf des Feld Fotograf. Wenn nun bei einen Foto auf den Fotograf geklickt wird, wird der Inhalt irgendwie an den Filter übergeben und schon werden nur noch die Fotos des gewählten Fortografen angezeigt.
Ich habe leider noch keinen Plan von den Argumenten, aber ich glaube die müssten wohl auch irgenwie einbezogen werden.
Als Variante könnte ich mir auch vorstellen, dass ein verknüpfter Block auf der Seite die Möglichen Fotografen listet und man da von diesem Block aus das Argument an die View übergibt. [OT]Wie gesagt, ich habe das ganze mit den Argumenten noch nicht kappiert, aber das wird wohl das nächste sein was ich mir genauer ansehen werde.[OT]
Gruss Roger
Gruss Roger
Gelöste Forenbeiträge mit [gelöst] im Titel ergänzen (1. Posting vom Thema) <==> das erleichtert das finden von Lösungen
mit ner view kriegt man das
am 27.11.2008 - 15:12 Uhr
mit ner view kriegt man das nur umgekehrt hin.
und panels gibt es nciht für D6.
aber danke...
also ich ahbe nun folgenden
am 27.11.2008 - 15:24 Uhr
also ich ahbe nun folgenden code
<?php
function phptemplate_find_related_images(){
if (arg(0) == 'node' && is_numeric(arg(1))) :
$nid = (int)arg(1);
echo "NID: ".$nid."<br>";
$stack = array();
$result = db_query("SELECT nid FROM content_field_related_artist WHERE field_related_artist_nid = %d",$nid);
while($arr = db_fetch_array($result)){
array_push($stack, $arr['nid']);
}
#print_r($stack);
foreach ($stack as $part) {
echo $part.": ";
$image_node = node_load($part);
#print_r ($image_node);
echo $image_node->images['smallgallery']."<br>";
$path= $image_node->images['smallgallery'];
theme_image($path, $alt = "$image_node->title", $title = "$image_node->images");
}
endif;
}
?>
und das problem, dass die FOREACH-schleife alle bis auf den letzten pfad ausgibt.komischerweise wird die zeile "echo $part.": ";" korrekt ausgegeben, der pfad bleibt daraufhin aber leer....
Doch, Panels fuer D6 gibt es.
am 28.11.2008 - 00:53 Uhr
und panels gibt es nciht für D6
Doch, gibt es. Habe schon damit gearbeitet.
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Da geht noch was.
Zitat: Current State of
am 28.11.2008 - 12:37 Uhr
Current State of Panels:
Drupal 5: Release Candidate stage. String freeze has been implemented; no new features, and we focus on bug fixes up until we reach an official release.
Drupal 6: Alpha stage. Code is working but unstable, and should NOT be run on production sites. No new features were or will be added up through release; expect the same functionality as Panels2 in D5. There is no D5 -> D6 upgrade path right now.
headkit schrieb ... und das
am 28.11.2008 - 12:38 Uhr
...
und das problem, dass die FOREACH-schleife alle bis auf den letzten pfad ausgibt.komischerweise wird die zeile "echo $part.": ";" korrekt ausgegeben, der pfad bleibt daraufhin aber leer....
Probleme im Code phptemplate_find_related_images()
am 28.11.2008 - 13:13 Uhr
Ich will mal kurz an Deinem PHP Code meckern.
<?php
echo $image_node->images['smallgallery']."<br>";
?>
Ein br Tag wird korrekterweise so ausgegeben:
<?php
echo $image_node->images['smallgallery']."<br />";
?>
Noch besser ist:
<?php
print $image_node->images['smallgallery'] . '<br />';
?>
Moechte man im HTML Quellcode ein Linebreak erreichen ist dies moeglich:
<?php
print $image_node->images['smallgallery'] . '<br />' . "\n";
?>
Und dies hier ist nicht notwendig:
<?php
theme_image($path, $alt = "$image_node->title", $title = "$image_node->images");
?>
Warum $alt = "$image_node->title" ?
Besser ist:
<?php
theme_image($path, $alt = $image_node->title, $title = $image_node->images);
?>
Um die theme_image Funktion in Drupal zu verwenden ist folgendes korrekt:
<?php
theme('image', $path, $image_node->title, $image_node->images);
?>
Wenn eine Funktion Parameter definiert sind die Variablennamen innerhalb des Funktionscode von Bedeutung. Wird eine Funktion aber aufgerufen spielen diese Variablennamen keine Rolle.
Man muss lediglich beachten das beim Aufruf der Inhalt einer uebergebenen Variable dem entspricht was die Funktion erwartet.
Das bedeutet beispielsweise:
Jetzt sehe Dir die function theme_image() an. Hier ist sie:
<?php
function theme_image($path, $alt = '', $title = '', $attributes = NULL, $getsize = TRUE) {
if (!$getsize || (is_file($path) && (list($width, $height, $type, $image_attributes) = @getimagesize($path)))) {
$attributes = drupal_attributes($attributes);
$url = (url($path) == $path) ? $path : (base_path() . $path);
return '<img src="'. check_url($url) .'" alt="'. check_plain($alt) .'" title="'. check_plain($title) .'" '. (isset($image_attributes) ? $image_attributes : '') . $attributes .' />';
}
}
?>
Vergleiche ihre Parameter mit dem was Du beim Aufruf uebergibst:
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Da geht noch was.
vielen dank, das war sehr
am 28.11.2008 - 13:44 Uhr
vielen dank, das war sehr lehrreich!
ich werde das beherzigen.
nur warum wird die schleife nicht bis zum letzten eintrag ausgeführt?
dankeschön.
Die Frage muss anders
am 28.11.2008 - 13:52 Uhr
Die Frage muss anders gestellt werden und eigentlich sind es mehrere Fragen die man stellen muss.
Wird die Schleife korrekt durchlaufen? Mit Sicherheit ja.
Was passiert beim letzten Durchlauf? Welche Inhalte haben auszugebende Inhalte?
Die letzte Frage ist die Kernfrage.
Die kann ich aber nicht beantworten weil ich die Debug-Ausgaben von print_r() innerhalb der Schleife nicht kenne. Mache in der Schleife mal ein
<?php
print '<pre>';
print_r($image_node->images);
print '</pre>';
?>
===================================================
Du bist auf meine Frage in dem Codemecker-Post nicht eingegangen.
Parameter $image_node->images <- ?? Erwartet wird ein String. Ist $image_node->images ein String?
Was ist mit diesem Parameter? Ist es ein String oder nicht?
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Da geht noch was.
Kurz dazwischengefragt
am 28.11.2008 - 14:26 Uhr
mit ner view kriegt man das nur umgekehrt hin.
und panels gibt es nciht für D6.
aber danke...
Warum funktioniert das nicht? Ich konnte gestern eine View so einstellen, dass ich zumindest in der Vorschau mittels eines Argumentes die Gallerie so filtrieren konnte, dass nur noch die Nodes (Bilder) gelistet werden, die auf einen Bestimmten Node (Fotograf) referenziert sind. Da ich aber noch keine Erfahrung habe und ich auch nichts in der Dokufinden konnte wie man das Argument der View übergben kann habe ich das nicht einbinden können. Müsste aber irgendwie mit dem Modul View Reference möglich sein.
Die Referenzierung auf den Fotografen habe ich mittels einem Beitrags-Verweis (CCK-Feld) in den Bilder-Nodes gemacht.
Gruss Roger
PS:
Wenn's gewünscht wird mache ich auch einen Neuen Thread auf, wusste aber nicht, wie ich da headkit mit ins Boot kriege.
Gruss Roger
Gelöste Forenbeiträge mit [gelöst] im Titel ergänzen (1. Posting vom Thema) <==> das erleichtert das finden von Lösungen
*räusper* nein, es handelt
am 28.11.2008 - 14:46 Uhr
*räusper*
nein, es handelt sich um ein object bzw. ein array.
aber das war auch eher ein tippfehler, da sollte eigentlicha uch der titel rein...
*räusper*
na mach mal auf, ich komm
am 28.11.2008 - 14:41 Uhr
Wenn's gewünscht wird mache ich auch einen Neuen Thread auf, wusste aber nicht, wie ich da headkit mit ins Boot kriege.
na mach mal auf, ich komm dann ins boot...
quiptime schrieb Die letzte
am 28.11.2008 - 14:54 Uhr
Die letzte Frage ist die Kernfrage.
Die kann ich aber nicht beantworten weil ich die Debug-Ausgaben von print_r() innerhalb der Schleife nicht kenne.
nuja, da gibt es eben auch keine ausgabe. die schleife bricht eine runde zu früh ab.
...
aaaber: print_r($image_node) hat mir beschienen, dass es sich bei der letzten ausgabe nicht um eine image-node handelt. gotcha!
also muss ich noch den node-typ abfangen.
nuja, das sollte man wohl beim sauberen programmieren sowieso machen.
hach ja! man lernt nie aus - und leider vergisst man allzu schnell...
die FOREACH-schleife wäre
am 28.11.2008 - 15:22 Uhr
die FOREACH-schleife wäre somit rund:
<?php
foreach ($stack as $part) {
$image_node = node_load($part);
if ($image_node->type == 'image'){
echo '<br />';echo $part.': ';
print $image_node->images['smallgallery'].'<br />';
$path= $image_node->images['smallgallery'];
theme('image', $path, $image_node->title, $image_node->title);
}
}
?>
die frage ist nun nur noch, warum ich keine bilder zu sehen bekomme.
auch mit
<?php
theme('image', base_path().$path, $image_node->title, $image_node->title);
?>
gehts nicht.
ich könnte die bilder natürlich auch über
<?php
print ('<img class="image" src="'.base_path().$path.'" />');
?>
najuti, so wichtig isses
am 28.11.2008 - 16:24 Uhr
najuti, so wichtig isses auch nicht. ich realisiere es jetzt "von hand".
aus reinem interesse freue ich mich aber dennoch über eine auflösung des problems.
vielen dank für's "an die hand nehmen"!!!
Dein Code - umbauen und verbessern
am 28.11.2008 - 16:40 Uhr
Irgendwie hast Du Dich verzettelt und stolperst ueber Deinen Code:
Erst mal wuerde ich einiges korrigieren. Ansatzpunkte fuer die Korrekturen:
<?php
function phptemplate_find_related_images() {
if (arg(0) == 'node' && is_numeric(arg(1))) :
// arg(1) ist durch die Bedingung is_numeric() bereits eine Ziffer
//$nid = (int)arg(1);
//echo "NID: ".$nid."<br>";
// mit arg(1) weiterarbeiten
$result = db_query("SELECT nid FROM {content_field_related_artist} WHERE field_related_artist_nid = %d", arg(1));
$stack = array();
while ($arr = db_fetch_array($result)) {
// ACHTUNG:
// array_push() -> Das Ergebnis nach dem push pruefen: Was ist der Array Key?
// Eine fortlaufende Keyziffer oder eine Node ID ?
array_push($stack, $arr['nid']); // <- aendere den Aufbau des Array !
// ACHTUNG: man muss KEIN array_push() verwenden!!!
// praktikabler ist folgende Vorgehensweise:
// $stack[$arr['nid']] = 'ein weiterer Wert';
// dies erzeugt ein "besseres" Array in dem die Keys nicht automatisch hochlaufen
// der Wert fuer den Key sollte eine Node ID sein damit mein foreach() mit $key und $value funktioniert
// 'ein weiterer Wert' macht hohen Sinn wenn der SELECT nicht nur die nid holt, dadurch wird der SELECT effektiver
// und das zu fuellende Array $stack kann weitere Infos als value aufnehmen die man im foreach() mit $value verwenden kann
}
//print_r($stack);
foreach ($stack as $nid => $value) {
//print $part.": ";
// $nid und $val ansehen
print $nid . '<br />';
print $value . '<br />';
// ich hoffe $nid ist auch wirklich die Node ID
$image_node = node_load($nid);
// Nodeobject $image_node ansehen
print '<pre>';
print_r($image_node);
print '</pre>';
//print $image_node->images['smallgallery'] . '<br />';
//$path = $image_node->images['smallgallery'];
//theme('image', $path, $image_node->title, $image_node->images);
}
endif;
}
?>
Du hast hier PHP Code, keinen Bash Code
Das ist falsch: #print_r($stack);
Richtig: //print_r($stack);
Nach einem print_r() Durchlauf der foreach Schleife die Variable $path neu/anders "zusammenbauen".
Bitte sehe Dir andere DB SELECT an um zu erkennen was die geschweiften Klammern um den Tabellennamen bedeuten.
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Da geht noch was.
quiptime schrieb Das ist
am 10.12.2008 - 14:01 Uhr
vielen dank, einiges finde ich einleuchtend, anderes ist mir nicht so klar.
prinzipiell funktioniert der code ja.
deine methode, gleich mehrere parameter auszulesen ist natürlich super - in dem fall benötige ich allerdings wirklich nur die NID.
was passiert eigentlich, wenn ich ein array an einer bestimmten stelle fülle, obwohl davor noch keine einträge existieren, also z.b.
<?php
$array = ["a", "b"];
$array[5] = "f";
// wie bei $stack[$arr['nid']]
// $stack ist hier ja kein assoziatives array, oder?
// dann macht doch deine FOREACH-schleife gar keinen sinn, oder übersehe ich hier was?
?>
geht das überhaupt? hatte ich noch nie in erwägung gezogen...
Das ist falsch: #print_r($stack);
Richtig: //print_r($stack);
wo ist da der unterschied? beides funktioniert doch.
Bitte sehe Dir andere DB SELECT an um zu erkennen was die geschweiften Klammern um den Tabellennamen bedeuten.
hab gesucht und leider nix über SELECT {... gefunden.
:-(