Ik heb een id in een Controller. Deze is gegenereerd als iemand op een link in een listing heeft geklikt:

blog_posts/post/2

waar 2 de id is waar ik op doel. Vervolgens heb ik die id nodig voor verdere verwerking. Eerst had ik deze gecombineerd met mijn JS functies, maardiversen mensen rade mij af om JS met PHP te combineren dus mijn vraag is: Hoe maak ik deze id beschikbaar in een andere controller die wel in dezelfde class aanwezig is?

Alvast bedankt

Ok laat ik het proberen uit te leggen: Ik heb een Model class Blog geheten (class Model_Blog extends DbModel). Verder heb ik een Controller Class ook Blog geheten(class Controller_Blog extends Controller). Zoals de naam van deze twee classes reeds doet vermoeden hebben deze betrekking op de blogpost sectie op de website.

In Controller_Blog heb ik een functie voor de detail pagina van een blogpost/artikel (public function postAction($params)) waarbij $params de id vertegenwoordigd van een bepaald artikel/blogpost welke wordt gegenereerd wanneer iemand op de link verder lezen klikt in de listing (http://flyingparadise.local/blog_posts/post/2)


$post_id  =  $params['id'];


Ik gebruik de jquery/ajax setInterval functie om te checken voor nieuw reacties op artikelen. Dat checken gebeurt in een andere functie in Controller_Blog class (check_updatesAction()). Voor dat checken heb ik de id (post_id) nodig die in de eerder genoemde functie (public function postAction($params)) is aangemaakt. Voorheen gebruikte ik de in die functie gegenereerde post_id rechtstreeks in JS

<script>
var postId = <?= $blog_post['post_id']; ?>;
</script>

en kon deze dan vervolgens als data meesturen naar check_updatesAction(). Maar zoals ik in de openings post al aangaf, zijn er tal van mensen die mij hebben afgeraden PHP en Jquery op die manier te mixen. Vandaar dus de vraag op welke manier ik post_id uit de functie post ook in de functie check_updates kan gebruiken.

Ik hoop dat dit wat duidelijkheid geeft
Ik zou het gewoon doen zoals je het nu doet.

Misschien moet je die "tal van mensen" eens vragen hoe zij dat doen. Ik kan van alles verzinnen, maar omdat je je check toch via JavaScript setInterval() doet lijkt het me het meest efficient om het ID ook gewoon in JS op te slaan. Je kunt 'm op nog 100 andere manier opslaan, maar uiteindelijk moet je 'm toch via JS "ophalen". Dus waarom dan moeilijk doen via een buitenbocht (mijn mening).

Het nadeel is dat je een ienienmienie stukje JavaScript in PHP genereert, maar als je de JavaScript die je nodig hebt om deze check te doen gewoon in een losse .js file opslaat hou je het verder prima gescheiden (kortom: je moet geen hele lappen JavaScript in je PHP/HTML opnemen - dat is wel waar).
En wat is er mis met $_GET?

Of een URL waaraan parameters gekoppeld zijn (interne vertaling naar o.a. een blog-id gekoppeld aan de URL)?

EDIT: POST actions worden sowieso niet gecrawled, dus deze hoeven geen SEO vriendelijke URLs te hebben, kan best iets zijn als blogComments?action=add&post=88.
@Rob Doemaarwat & @Thomas van den Heuvel Beide bedankt voor de reactie.

@Rob. Ja dat dacht ik dus ook. Het gaat in totaal om een Variabele. Ik laat dat inderdaad dus maar gewoon zo. Het werkt dus dat is het belangrijkste. Heb ik overigens nog wel een kort vraagje. Wanneer ik de complete JS functie inline heb staan werkt alles prima. Zet ik het echter in een js file plaats en dus genoodzaakt ben om het PP gedeelte tussen aanhalings tekens te plaatsen:

var postId	=	"<?= $blog_post['post_id']; ?>;
"
dan werkt het niet langer. Hoe kan ik dat oplossen?

@Thomas: Er is/bestaat geen enkele relatie tussen de twee functies behalve dat in functie post de post_id staat die ik dus eigenlijk ook in de functie check_update nodig heb. Het gaat er in dit gedeelte niet om dat er iets wordt toegevoegd door een bezoeker die op de pagina is. Dat zou net zo goed jij kunnen zijn of Rob die een reactie plaatst dus aan die parameters gekoppeld aan de url heb ik in dit geval niets
Die .js file wordt niet door de PHP parser gehaald, dus die variabele wordt niet ingevoegd (maar d'r staat letterlijk wat je hierboven hebt staan).

wat je dan moet doen is in je .js file:

var postId = null;

setInterval(function(){
  //doe iets met postId
},1000);

En in je HTML (via PHP):
<script>
var postId = <?= $blog_post['post_id']; ?>;
</script>

In je .js initialiseer je de postId dus als een globale variabele. In je HTML geef je 'm de echte waarde (je .js file moet dus voor dit stukje inline script worden geladen!). Tegen de tijd dat de setInterval voor het eerst aan de gang gaat heeft postId al lang die waarde.
Rob Doemaarwat op 11/06/2018 22:45:39

Die .js file wordt niet door de PHP parser gehaald, dus die variabele wordt niet ingevoegd (maar d'r staat letterlijk wat je hierboven hebt staan).

wat je dan moet doen is in je .js file:

var postId = null;

setInterval(function(){
  //doe iets met postId
},1000);

En in je HTML (via PHP):
<script>
var postId = <?= $blog_post['post_id']; ?>;
</script>

In je .js initialiseer je de postId dus als een globale variabele. In je HTML geef je 'm de echte waarde (je .js file moet dus voor dit stukje inline script worden geladen!). Tegen de tijd dat de setInterval voor het eerst aan de gang gaat heeft postId al lang die waarde.

@ob. Dat werkt perfect heel erg bedankt voor de input
Actually. Als het enkel gaat om code voor het pollen van reacties op een artikel zou je hier best een soort van lichtgewicht standalone script kunnen maken voor dit doel, waarbij alle dingen van het framework die je niet gebruikt eruitsnijdt.

Voor polling maakt dat toch echt niets uit hoe je URL er uitziet, dus bijv. /ajax/blog/checknewposts.php?id=88.

Je hoeft niet alles op voorhand / per definitie in te metselen in je framework en mits je hier voorzieningen voor treft hoeven URLs ook niet strak geregissserd te zijn wat je ook veel meer vrijheid geeft om dingen te doen.

Op dit moment klinkt het gewoon alsof je beperkt wordt door je eigen (routing) ontwerp. En zelfs al is dat maar een gevoel, dan zou ik dat gevoel nog steeds verkennen om te zien of je routing niet wat flexibeler kan.
Rob Doemaarwat op 11/06/2018 22:45:39

Die .js file wordt niet door de PHP parser gehaald, dus die variabele wordt niet ingevoegd (maar d'r staat letterlijk wat je hierboven hebt staan).

wat je dan moet doen is in je .js file:

var postId = null;

setInterval(function(){
  //doe iets met postId
},1000);

En in je HTML (via PHP):
<script>
var postId = <?= $blog_post['post_id']; ?>;
</script>

In je .js initialiseer je de postId dus als een globale variabele. In je HTML geef je 'm de echte waarde (je .js file moet dus voor dit stukje inline script worden geladen!). Tegen de tijd dat de setInterval voor het eerst aan de gang gaat heeft postId al lang die waarde.


@Rob Doemaarwat. Ik had toch iets te vroeg gejuigd gisteren. Zodra ik the post_id inline zet:

var postId = <?= $blog_post['post_id']; ?>;

en het overige in een js file, stopt het pollen. Geen idee hoe dat komt
Wat zegt de HTML-source? Dat is altijd leidend voor JavaScript in zulke gevallen.
Javascript kent zelf geen PHP.
Wat zie je in je Browser console (in Chrome Ctrl+Shift+I, en dan tabblad "Console")?

Zet anders eens in/om je interval functie iets ala:

console.warn('Start pollen');
setInterval(function(){
  console.warn('Doe poll met postId = ' + postId);
  //doe iets met postId
},1000);
Zie je deze meldingen (console.warn) in je Console voorbij komen?

Reageren