[PHP] Variable uit foreach loop weergebruiken

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo allemaal,

Ik probeer het volgende zonder succes:

code:
1
2
3
4
5
6
7
8
9
10
11
function tiles_func ( $atts ) {
    $class = 'mahjongtiles_normal';
    return '<img class="' . $class . '" src="' . plugins_url() . '/tiles/'. $sc[0] .'.png" alt="Mahjongtile" />';
}

$file = array_diff( scandir('' . plugin_dir_path(__FILE__) . '/tiles'), array('.', '..') );

foreach ($file as $value) {
    $sc = explode('.', $value);
    add_shortcode( $sc[0], 'tiles_func' );
}


In de tiles_func gaat het fout, daar kan $sc[0] simpelweg niet uitgelezen worden. Hoe voorkom ik dit/repareer ik dit?

Heb geprobeerd om de functie pas te maken in de foreach loop, maar dat kan natuurlijk niet omdat dan de functie dubbel gedeclareerd wordt. Ook heb ik geprobeerd om $sc global te maken en zelfs $sc[0] global te maken, maar dit lukt ook niet. Heb ook geprobeerd om $sc[0] te returnen maar dit werkte ook niet.
Verder heb ik van alles geprobeerd waarvan de logica ver te zoeken is.

Het aanmaken van de shortcodes gaat wel goed in de foreach loop, uiteraard omdat daar $sc gedeclareerd wordt.

Hoe kan ik nu $sc[0] en $sc[1] weer hergebruiken buiten de foreach loop om?
$sc[0] bevat namelijk de naam van een plaatje en $sc[1] bevat de extensie.

Acties:
  • 0 Henk 'm!

  • analog_
  • Registratie: Januari 2004
  • Niet online
in je functie krijg je hem als parameter $atts door natuurlijk. $atts is $sc[0] (lijn 10). Tenminste als mijn PHP nog goed genoeg is. $sc[0] = hele string dacht ik overigens, de opgedeelde stukjes zitten in index 1 tot n. /dacht dat het ging om een dynamische functie oproeping, add_short isn't. Wat je kan doen is je array per modulo 2 aflopen en de twee stukjes zelf samenvoegen.

loop alles af met stappen van 2 (0 2 4 6) in i (mod(i,2) in C++)
$uit = sc[i].'-lijm-'.sc[i+1];
roep add_short met $uit.

[ Voor 80% gewijzigd door analog_ op 16-01-2012 23:34 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Nee helaas niet :( $atts is een verplichte variable uit WordPress, daarin staat alles wat naast de shortcode nog wordt meegegeven binnen de blokhaken. Ik geef echter niets extra mee om de shortcodes zo kort mogelijk te houden.

Nee ook dat niet, in een ander script gebruik ik exact dezelfde foreach loop. Daar werkt het gebruik van $sc[0] en $sc[1] wel omdat ik daar de waarden gebruik binnen de loop. Nu wil ik ze in een functie buiten de loop gebruiken, maar dat lukt me helaas niet.

[ Voor 36% gewijzigd door Verwijderd op 16-01-2012 23:32 ]


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Lees de handleiding eens en doe eens een var_dump($atts)? ;)

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
CodeCaster schreef op maandag 16 januari 2012 @ 23:32:
Lees de handleiding eens en doe eens een var_dump($atts)? ;)
Heb ik ook al geprobeerd: is leeg :(
Ik maak bijvoorbeeld deze shortcode: [sc].
En ik gebruik uiteindelijk ook [sc].
Wanneer ik [sc att1] zou intikken bevat $atts wel att1.

Edit:
Ik kom nu een stuk verder als ik de functie toch eerst als global declareer. Eerder kon ik $sc en $file niet var_dumpen, nu wel. Probleem is dat $sc nu vanwege de loop slechts de laatste waarde uit de array bevat en niet dynamisch is zoals ik het zou willen. Iemand een idee hierover?

[ Voor 52% gewijzigd door Verwijderd op 17-01-2012 00:13 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Volgens mij gaat het niet lukken wat ik wil, om deze reden:

- WordPress herkent de shortcode alleen als deze is gedeclareerd met:
code:
1
add_shortcode( $value, 'tiles_func' );

- Om de shortcode dynamisch te maken gebruik ik $code uit:
code:
1
function tiles_func ( $atts, $content, $code ) {

- Dit zijn de enige 3 variable's die wordpress toelaat/herkent/mee kan geven (of heb ik dit mis?)
- De shortcode kunnen dus niet dynamisch worden tenzij $code ook het bijbehorende filetype bevat en dat doet het niet als ik niet [sc.png] type, aangezien de shortcode [sc] is.

Als iemand wel een idee heeft om dit netjes op te lossen hoor ik het heel erg graag, ik kom er zelf niet meer uit. Ik zie zelf als enige uitweg om alle shortcodes te maken inclusief filetype.

Acties:
  • 0 Henk 'm!

  • Barleone
  • Registratie: Maart 2009
  • Laatst online: 22:02
analog_: in je functie krijg je hem als parameter $atts door natuurlijk. $atts is $sc[0] (lijn 10).
Wat heb je daarmee gedaan? Ik zie nog nergens dat je daarop reageert, dus voor de duidelijkheid:
In je tiles_func() gebruik je $sc[0]
Maar binnen de tiles_func() bestaat die variabele helemaal niet heh ;)
B) Je moet $atts gebruiken.

Tweakers.net 6 nostalgie! - Wayback Machine
Have you tried turning it off and on again?


Acties:
  • 0 Henk 'm!

  • wjzijderveld
  • Registratie: Augustus 2005
  • Laatst online: 23-08 10:55
Post is niet helemaal duidelijk. Gaat om WordPress specifieke zaak, heeft eigenlijk niks met de foreach te maken.

add_shortcode vertelt WordPress dat er een nieuwe UBB code is die gebruikt kan worden in de editor.
Wat Maxican wil weten, is de shortcode zelf in de functie die de shortcode afhandelt.

Je hebt denk ik wel iets aan het volgende: http://codex.wordpress.org/Shortcode_API#Attributes

Daar hebben ze het ook over de 3e parameter, maar deze kan ook leeg zijn, maar dan is het $atts[0] weer gevuld. Vind het beetje een vreemde werkwijze van WordPress, maar op die manier moet je wel altijd kunnen achterhalen welke shortcode gebruikt is.
quote: Wordpress
code:
1
2
3
4
5
 add_shortcode('foo','foo'); // two shortcodes referencing the same callback
 add_shortcode('bar','foo');
    produces this behavior:
 [foo a='b'] ==> callback to: foo(array('a'=>'b'),NULL,"foo");
 [bar a='c'] ==> callback to: foo(array(0 => 'bar', 'a'=>'c'),NULL,"");

This is confusing and perhaps reflects an underlying bug, but an overloaded callback routine can correctly determine what shortcode was used to call it, by checking BOTH the third argument to the callback and the zeroeth attribute. (It is NOT an error to have two shortcodes reference the same callback routine, which allows for common code.)
edit: Snap nu bovenstaande berichten eigenlijk pas, ze bedoelen hetzelfde als ik hierboven uitleg. Belangrijkste is dat dat je de combinatie tussen 3e argument en $atts[0] moet gebruiken.

[ Voor 6% gewijzigd door wjzijderveld op 17-01-2012 11:23 ]

Canon EOS60D | Canon 100mm f/2.8 USM | Canon 100-400mm f/4.5-5-6L | Canon 10-22mm f/3.5-4.5 USM | Canon 430EX II


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
@Barleone:
Jawel op $atts had ik gereageerd 2 posts terug in het eerste deel, deze variable is leeg omdat ik dus slechts de shortcode type en niet [shortcode attribuut]. Omdat ik geen attribuut meegeef kan ik alleen met het 3e parameter de shortcode achterhalen, deze parameter heet $code.

@wjzijderveld:
Punt waar ik dan nu tegen aan loop is dat $code alleen de waarde van [shortcode] bevat en ik deze het liefst zo kort mogelijk wil houden, dus [b] en niet [b.png] omdat dit handmatig invoeren weer vervelend maakt. Kortom om als ik [b] als shortcode aanmaak en gebruik moet ik handmatig de extentie .png toevoegen aan de url, mocht het plaatje in de gebruikte shortcode dan geen .png zijn werkt het script niet.

Wat ik graag wilde doen is het script dynamisch maken dus een array vullen op basis van alle plaatjes in een bepaalde directory, foreach los laten op de plaatjes om zo van elk plaatje een shortcode te maken en de ingetikte shortcode weer achterhalen in wordpress om zo het juiste plaatje te posten. Maar tot nu toe lukt me dit alleen als ik alle shortcode met file extentie aanmaak: dus [img.png] wordt in $code als img.png gelezen en kan ik op het eind van de url plakken om zo het plaatje te laten zien in een post.

Misschien zou ik alle shortcode ook nog zonder extentie kunnen genereren om vervolgens door de array te itereren en de $value te vinden die overeenkomt, en om dan de in wordpress ingetypte [b] automatisch te vervangen door [b.png]. Dan zou handmatig invoeren ook nog mogelijk zijn zonder dat de extentie van het plaatje bekend is bij de gebruiker.

Maar of dit kan, en zo ja: hoe dit zou moeten... geen idee. Ik ben slechts een amateurtje met PHP helaas.

Acties:
  • 0 Henk 'm!

  • TheNephilim
  • Registratie: September 2005
  • Laatst online: 17-09 11:07

TheNephilim

Wtfuzzle

Je kunt inderdaad de directory uitlezen om de shortcodes te maken, zonder extensie. Dan bij het weergeven de dir weer uitlezen en de shortcode [image] vergelijken met bestandsnamen uit die dir zonder extensie.

Dan kun je [image] doen en uiteindelijk <img src="image.png" /> neerzetten.

Ik werk zelf ook met Wordpress, maar de shortcode API heb ik nog nooit gezien. Ziet er wel grappig uit, dus dat gaan we nog eens even bekijken! ^^

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
TheNephilim schreef op dinsdag 17 januari 2012 @ 13:08:
Je kunt inderdaad de directory uitlezen om de shortcodes te maken, zonder extensie. Dan bij het weergeven de dir weer uitlezen en de shortcode [image] vergelijken met bestandsnamen uit die dir zonder extensie.

Dan kun je [image] doen en uiteindelijk <img src="image.png" /> neerzetten.

Ik werk zelf ook met Wordpress, maar de shortcode API heb ik nog nooit gezien. Ziet er wel grappig uit, dus dat gaan we nog eens even bekijken! ^^
Ah kijk dat is goed om te horen... ik kan alle functies wel bedenken maar ben geen programmeur en een beginner met PHP. Heb jij wellicht een tip welke functie ik zou moeten gebruiken om bovenstaande idee uit te voeren? Dan heb ik in ieder geval een zoekterm om mee verder aan de slag te gaan.

Acties:
  • 0 Henk 'm!

  • wjzijderveld
  • Registratie: Augustus 2005
  • Laatst online: 23-08 10:55
Heb geen tijd om een testcase op te zetten, maar als ik het goed begrijp wil je toch alleen maar van:
code:
1
2
[sc]
[nc]

het volgende maken (met wat meer info in de img tags):
code:
1
2
<img src="sc.png" />
<img src="nc.png" />


Volgens mij hoef je dan alleen maar je functie aan te passen naar het volgende:

PHP:
1
2
3
4
5
function tiles_func ( $atts, $content = null, $code = '' ) {
    $class = 'mahjongtiles_normal';
    $shortCode = $code === '' ? $atts[0] : $code;
    return '<img class="' . $class . '" src="' . plugins_url() . '/tiles/'. $shortCode .'.png" alt="Mahjongtile" />';
}


edit: excuus als dit al teveel oplossing geven is. Heb alleen het idee dat Maxican niet echt geholpen wordt anders.

[ Voor 8% gewijzigd door wjzijderveld op 17-01-2012 17:05 ]

Canon EOS60D | Canon 100mm f/2.8 USM | Canon 100-400mm f/4.5-5-6L | Canon 10-22mm f/3.5-4.5 USM | Canon 430EX II


Acties:
  • 0 Henk 'm!

  • TheNephilim
  • Registratie: September 2005
  • Laatst online: 17-09 11:07

TheNephilim

Wtfuzzle

Het probleem is op dit moment de extensie, hij weet niet welke extensie de bestanden hebben. Dus wil je dat dynamisch op willen lossen zul je de directory uit moeten lezen en een array maken $files['filename-zonder-extensie'] = 'filename-met-extensie';
Dan in jou code alleen even '. $shortCode .'.png vervangen voor '. $files[$shortCode] .'

Check hier hoe je directories uit kan lezen:

http://www.w3schools.com/php/func_directory_readdir.asp

Acties:
  • 0 Henk 'm!

  • wjzijderveld
  • Registratie: Augustus 2005
  • Laatst online: 23-08 10:55
Ah oke, dat begreep ik niet dat die onbekend was. Eigenlijk zie ik die probleem omschrijving nog steeds nergens staan :)

Enige wat ik dan nog wil meegeven, probeer een manier te vinden om niet 2x de directory uit te hoeven lezen.

Canon EOS60D | Canon 100mm f/2.8 USM | Canon 100-400mm f/4.5-5-6L | Canon 10-22mm f/3.5-4.5 USM | Canon 430EX II


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo allemaal,

@wjzijderveld: ik kan idd proberen om nog wat info uit $atts[0] te halen maar volgens mij is die toch echt leeg wanneer er geen info wordt ingetikt naast de bestaande shortcode, en dat doe ik dus niet. Maar ik zal het nog eens proberen en zien wat er gebeurd, bedankt iig voor het idee!

@TheNephilim: dat klopt idd van de extensie, ik weet ze op dit moment wel (png) maar als ik in de toekomst een jpg of tiff bestand in de directory plaats waarvan ik een array maak... tja dan werkt de weergave van het plaatje niet, de shortcode wel natuurlijk maar hij kan hem dan niet weergeven op de website.
De functie readdir had ik me al eerder in verdiept maar voor de opbouw van de array moest ik scandir hebben. Ik zal hier nog eens naar kijken.

@wjzijderveld nogmaals: dat heb ik misschien iets te onduidelijk aangegeven, deels omdat hij momenteel niet onbekend is maar in de toekomst wel als een gebruiker een random plaatje in de directory plaatst die ik gebruik om mijn array te vullen. En mijn idee was ook om niet twee keer de directrory/array uit te lezen maar slechts 1 keer, maar dit gaat dus niet omdat in de functie van wordpress slechts die 3 variable's gebruikt mogen worden: $atts, $content en $code.

En omdat $atts niets bevat als je geen extra tekst opgeeft naast de bestaande shortcode blijft deze leeg, $content blijft ook leeg omdat ik zelfsluitende shortcodes gebruik en dus geen content plaats tussen de shortcodes in, en $code bevat alleen de shortcode die gebruikt wordt en ook is toegevoegd met de add_shortcode functie. Kortom dat is [sc] en daar zal nooit [sc.png] komen te staan als ik niet [sc.png] als shortcode toevoeg.

Dit laatste heb ik nu gedaan: de inhoud van de directory zet ik om tot shortcodes, dus inclusief de file extentie. [sc.png] is nu dus een shortcode en komt ook in $code te staan. Daarmee kan ik nu dus dynamische shortcodes aanmaken en plaatjes weergeven.

Opzich is dit dus geen groot probleem, alleen als iemand handmatig de shortcodes wil gebruiken is het wel onhandig omdat het onnodig veel typen is, en je niet uit je hoofd weer welk plaatje welke extentie heeft.

Ander probleem met mijn huidige aanpak is dat ik nu handmatig uit de array die scandir maakt de directory: . en .. verwijder. Mocht iemand nu een directory uploaden komt deze in de array te staan en wordt er op basis van de directory naam een shortcode gemaakt.... dat heb ik liever niet. Ik probeer daarom alle directories te verwijderen uit de array, echter gaat dit niet met de functie glob() waarvan ik overal lees dat dat daarmee zou moeten werken... moet ik dit misschien combineren met if/else statement met daarin de is_dir functie?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Even een kleine update, het vorige bericht is al lang zat:
Ik heb 2 php bestanden, 1 voor aanmaken shortcodes, en 1 voor de weergave in de plugin zelf.

Bij de weergave heb ik er nu dit van gemaakt om automatisch alle directories uit de array te halen.
code:
1
2
3
4
5
6
7
8
9
$dir = 'img/tiles/';
$file = scandir($dir);

foreach ($file as $value) {
    if (is_dir($dir. DIRECTORY_SEPARATOR .$value) === false) {
        $tile[] = ''. $value .'';
    }
}
print_r($tile);


En bij het aanmaken van de shortcodes heb ik dit als volgt opgelost:
code:
1
2
3
4
5
6
7
8
$dir = '' . plugin_dir_path(__FILE__) . 'img/tiles/';
$file = scandir($dir);

foreach ($file as $value) {
    if (is_dir($dir. DIRECTORY_SEPARATOR .$value) === false) {
        add_shortcode( $value, 'tile_func' );
    }
}


Kan deze code nog mooier/beter/korter? dan hoor ik het graag zodat ik er iets van leer. Ben erg blij met de hulp hier namelijk.

Want ik kan me goed voorstellen dat het aanmaken van 2 identieke setjes variables op 2 pagina's een beetje suf is, wellicht kan ik beter 1 van de includen()? de foreach statements zijn ook vrijwel identiek, kan ik hier nog iets aan hergebruiken op de weergave pagina bijvoorbeeld?

[ Voor 86% gewijzigd door Verwijderd op 18-01-2012 17:54 ]

Pagina: 1