Hoe maak ik een id uit een controller beschikbaar in een andere controller in dezelfde class

Overzicht

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Donald Boers

Donald Boers

11/06/2018 15:59:09
Anchor link
Ik heb een id in een Controller. Deze is gegenereerd als iemand op een link in een listing heeft geklikt:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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

Edit:
Titelfix en een fout eruit gehaald.
Gewijzigd op 11/06/2018 18:29:57 door - Ariën -
 
PHP hulp

PHP hulp

25/11/2024 17:18:15
 
- Ariën  -
Beheerder

- Ariën -

11/06/2018 16:10:50
Anchor link
Gebruik je een Router in PHP?
 
Davier doe

Davier doe

11/06/2018 16:13:44
Anchor link
Maak je een gebruik van bepaalde frameworks? Of is het een zelfgeschreven class?
 
Donald Boers

Donald Boers

11/06/2018 16:59:48
Anchor link
@Davier het is een zelfgeschreven class

Toevoeging op 11/06/2018 17:04:55:

- Ariën - op 11/06/2018 16:10:50:
Gebruik je een Router in PHP?


@- Ariën -. Ja ik gebruik een Router
 
Thomas van den Heuvel

Thomas van den Heuvel

11/06/2018 17:05:10
Anchor link
Hoe komt de URL tot stand? Vaak heb je zowel een mechanisme voor een interne notatie met een geprogrammeerde vertaling naar een externe notatie en andersom. Dit valt onder de noemer "routing" binnen je applicatie.

Het is nogal handig als je hier een soort van integrale aanpak voor verzint, zodat je hier geen omkijken meer naar hebt.
Gewijzigd op 11/06/2018 17:05:40 door Thomas van den Heuvel
 
- Ariën  -
Beheerder

- Ariën -

11/06/2018 17:13:40
Anchor link
Heb je wat relevante code van je framework?
 
Donald Boers

Donald Boers

11/06/2018 17:49:56
Anchor link
** quoteknip**

@- Ariën -. Wat zou je willen zien. Dit is bijvoorbeeld een gedeelte van de Router:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
return [
    'default' => '/page',
    'errors'  => '/error/:code',
    'routes'  => [
    
        // Front-end            
        '/page(/:action(/:id))' => [
            'controller' => 'Controller_Page',
            'action' => 'index',
        ],
    
        
        '/error(/:code)' => [      
            'controller' => 'Controller_Error',
            'action' => 'index',
        ],

        
        '/(:action(/:id))' => [
            'controller' => 'Controller_Page',
            'action' => 'index',
        ],
                   
    ]
];

?>

Wat wil je dat ik nog meer toon?
Gewijzigd op 11/06/2018 19:27:32 door - Ariën -
 
Davier doe

Davier doe

11/06/2018 18:13:09
Anchor link
Ervan uitgaande dat jouw router een class is, dan kun je als voorbeeld volgorde doen in je controller class:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php

require 'pad/naar/router.php'

use somenamespace\Router as route;
$route = new Route;

$route->get('/page/{:action}/{:id}', function($name, $id){
   echo "name: $name id: $id"; // test.......
});
?>
 
Donald Boers

Donald Boers

11/06/2018 19:04:04
Anchor link
**quoteknip**

Nee de Router is geen Class

Edit:
Het is niet nodig om het laatste voorgaande bericht integraal te quoten.
Gebruik voor een reactie de 'Snel reageren' onderaan een topic.
Gewijzigd op 11/06/2018 19:28:53 door - Ariën -
 
- Ariën  -
Beheerder

- Ariën -

11/06/2018 19:29:36
Anchor link
Wat is je class dan wel? een normale function?
is het niet een idee om dit naar een class om te bouwen?
 
Rob Doemaarwat

Rob Doemaarwat

11/06/2018 20:23:08
Anchor link
Wat is die "verdere verwerking"? Is dat heel veel later (afhankelijk van iets waar de gebruiker op klikt), of is dat iets wat eigenlijk direct na de eerste action komt (bijvoorbeeld als gevolg van een redirect)?

Als het "veel later" is zou ik zelf de waarde aan de client meegeven (in een hidden veld, of als var in JS). Voor de "volgende request" kun je deze waarde dan weer gebruiken om de URL voor de request op te bouwen. Nadeel is dan dat de gebruiker de waarde aan kan passen, maar in plaats van blog_posts/post/2 kan ie ook blog_posts/post/'"<script>alert(1235)</script) meegeven, dus de code om dat ID te controleren moet je toch al ergens hebben. Eventueel kun je nog een controle hash toevoegen, waardoor je (ook) kunt controleren dat het ID niet door de gebruiker kan zijn aangepast.

Als het "direct" is zou je het ID in de session op kunnen slaan. Dan weet je zeker dat de gebruiker 'm niet kan veranderen. Nadeel van sessions is dat ze op een gegeven moment verlopen (als de gebruiker te lang geen interactie met je site heeft). Ook kan dit spaak lopen als de gebruiker zich niet aan het door jouw bedachte "pad" houd (dat heb je al heel snel als ze bijvoorbeeld 2 verschillende posts in 2 tabbladen open hebben staan - die delen dan dezelfde sessie).
 
Donald Boers

Donald Boers

11/06/2018 20:38:21
Anchor link
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)

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<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
 
Rob Doemaarwat

Rob Doemaarwat

11/06/2018 21:24:54
Anchor link
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).
 
Thomas van den Heuvel

Thomas van den Heuvel

11/06/2018 21:26:03
Anchor link
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.
Gewijzigd op 11/06/2018 21:43:18 door Thomas van den Heuvel
 
Donald Boers

Donald Boers

11/06/2018 22:30:29
Anchor link
@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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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
 
Rob Doemaarwat

Rob Doemaarwat

11/06/2018 22:45:39
Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
var postId = null;

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

En in je HTML (via PHP):
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<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.
 
Donald Boers

Donald Boers

11/06/2018 23:44:58
Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
var postId = null;

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

En in je HTML (via PHP):
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<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
 
Thomas van den Heuvel

Thomas van den Heuvel

12/06/2018 00:07:07
Anchor link
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.
Gewijzigd op 12/06/2018 00:07:56 door Thomas van den Heuvel
 
Donald Boers

Donald Boers

12/06/2018 12:21:42
Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
var postId = null;

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

En in je HTML (via PHP):
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
var postId = <?= $blog_post['post_id']; ?>;

en het overige in een js file, stopt het pollen. Geen idee hoe dat komt
 
- Ariën  -
Beheerder

- Ariën -

12/06/2018 12:42:33
Anchor link
Wat zegt de HTML-source? Dat is altijd leidend voor JavaScript in zulke gevallen.
Javascript kent zelf geen PHP.
Gewijzigd op 12/06/2018 12:43:45 door - Ariën -
 
Rob Doemaarwat

Rob Doemaarwat

12/06/2018 16:24:59
Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
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?
 

Pagina: 1 2 volgende »

 

Dit topic is gesloten.



Overzicht

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.