Ga Terug  
     


Extensie ontwikkeling (2.5) Plaats hier je vragen en opmerking met betrekking tot de ontwikkeling van extensies.

Antwoord
 
Onderwerpopties Weergavemodus
Oud 29 februari 2012, 14:18   #1
sahertian
 
Geregistreerd op: 28 oktober 2008
Berichten: 20
Bedankjes gegeven: 0
Bedankjes ontvangen: 2
Standaard Limiet op aantal characters in PHP

Hallo,

Ik heb een blok php code waarvan ik het aantal chars van de introtext wil verminderen.

Er is een php functie substr, echter werkt deze niet in onderstaande context. (zie echo "substr($row->introtext,0,20)"

Heeft iemand een tip om een PHP limit op de output van introtext te zetten?

Thanks,
Ron

PHP Code:
<?php
$app 
JFactory::getApplication();
$dbprefix $app->getCfg('dbprefix');
$db  JFactory::getDBO();
$hitword $article->title;
$query "SELECT title,id,introtext,catid from ".$dbprefix."content";
$db->setQuery$query );     
$row $db->loadObjectList();

if (
$row!=null){
  foreach (
$row as $row)
{   

echo 
"substr($row->introtext,0,20)";

  }
}

?>
[MOD R2GNL]Codes binnen tags plaatsen svp. En in het juiste forumdeel plaatsen, dit gaat niet over de core extensies zelf, maar een eigen ontwikkeling

Laatst aangepast door r2gnl : 1 maart 2012 om 08:48.
sahertian is offline   Met citaat antwoorden
Oud 1 maart 2012, 11:12   #2
oorzaak
Documentatieteam
 
oorzaak's Avatar
 
Geregistreerd op: 12 juni 2009
Locatie: Nieuwegein
Berichten: 1.127
Bedankjes gegeven: 104
Bedankjes ontvangen: 126
Standaard Re: Limiet op aantal characters in PHP

Hallo Ron,

Je schrijft niet wat er precies misgaat, dus geef ik een algemene reactie. Wat ik zelf weleens merk in dit soort constructies is dat het plaatsen van een objectnotatie binnen een dergelijke functie voor problemen zorgt. Wat ik dan doe is en eerst een simpele variabele van maken:

PHP Code:
$introtext $row->introtext;
echo 
substr($introtext,0,20); 
PS Ik zie nu pas dat je aanhalingstekens na echo hebt gezet, volgens mij kun je dat beter niet doen. Ik had ze in eerste instantie overgenomen maar nu verwijderd.

Laatst aangepast door oorzaak : 1 maart 2012 om 11:14. Reden: PS

Met vriendelijke groeten, Frits
www.oorzaak.nl

If you're not paying for it, then you are the product. Behalve als het gaat over open source software ;-)
oorzaak is offline   Met citaat antwoorden
Oud 8 april 2012, 00:14   #3
goslingcools
 
goslingcools's Avatar
 
Geregistreerd op: 22 december 2008
Locatie: Den Haag
Leeftijd: 44
Berichten: 187
Bedankjes gegeven: 5
Bedankjes ontvangen: 42
Standaard Re: Limiet op aantal characters in PHP

Code:
<?php echo JHtml::_('string.truncate', $row->introtext, 175, true, true); ?>
En ik zou de data wat netter opvragen:

Code:
<?php defined('_JEXEC') or die;
$db =& JFactory::getDBO();
$query = "SELECT * FROM #__content WHERE state=1";	
$db->setQuery( $query );		
$rows = $db->loadObjectList();
?>
Success

COBIZ webdevelopment | www.cobiz.nl
goslingcools is offline Stuur een bericht via Skype™ naar goslingcools   Met citaat antwoorden
Oud 9 april 2012, 12:58   #4
HermanPeeren
Gebruikersgroep Rotterdam
 
HermanPeeren's Avatar
 
Geregistreerd op: 17 april 2009
Locatie: Rotterdam
Leeftijd: 57
Berichten: 562
Bedankjes gegeven: 52
Bedankjes ontvangen: 199
Standaard Re: Limiet op aantal characters in PHP

Even een paar puntjes:
  • met loadObjectList() krijg je een array van objecten terug. Meervoud dus. Daarom handig om die variabele $rows ook meervoud te maken.
  • vervolgens, als je die array doorloopt, dan ga je ieder element van die $rows (in meervoud) een naam geven = $row (in enkelvoud):
    PHP Code:
    foreach ($rows as $row
    Bij de eerste geposte code had die array dezelfde naam ($row in enkelvoud) als het element.
  • zoals "goslingcools" terecht opmerkt, hoef je zelf die prefix voor de db-tabel niet op te geven, maar gebruik je daar #_ voor.
  • in de code van "goslingcools" staat een & voor de JFactory::getDBO(): dat was nodig in PHP4, omdat objecten daar standaard niet by reference werden doorgegeven. Joomla! 2.5 draait echter op PHP5 en het is dus netter om die overbodige & weg te laten. Dit staat ook in veel Joomla!-documentatie nog niet goed.
  • in MySql worden namen van velden en tabellen optioneel met een achterwaards aanhalingsteken (`) omringd en de waarden (ook numerieke) met "gewone" aanhalingstekens. Dat is ook ter preventie van SQL-injectie. De funties om dat te doen zitten in het JDatabase-object: respectievelijk $db->nameQuote() en $db->quote().
  • nog netter zou zijn om voor het bouwen van een query van het JDatabaseQuery-object gebruik te maken, dat we sinds Joomla 1.6 hebben: om er alvast aan te wennen, dat we Joomla! ook met andere databases kunnen gebruiken. Dan loopt het niet mis als je specifieke MySql-dingen in je query stopt (zoals die escapes van namen en numerieke waarden en Limit).


---------- Bericht toegevoegd op 9 april 2012 om 13:58 ---------- Vorige bericht was op 9 april 2012 om 09:09 ----------

Het is natuurlijk niet netjes als een woord halverwege afgebroken wordt. Bij de afgekapte string moet je dus een onaf woord weglaten. Zo'n laatste stukje is met de volgende regular expresion (regexp) te selecteren: /\s+?(\S+)?$/. Hier staat: selecteer de laatste niet-spaties die na 1-of-meer spaties staan (inclusief die spaties). Dat stukje vervang je vervolgens door een lege string. Omdat er na die karakters die je wil selecteren nog een spatie kan staan, moet je de substring 1 langer maken (in jouw geval dus 21). Als die lengte bijvoorbeeld $length zou heten, dan krijg je zoiets voor die substring-regel:
PHP Code:
$truncatedtext preg_replace('/\s+?(\S+)?$/'''substr($introtext0$length+1)); 
Als het heel precies moet is het wel oppassen met substr en UTF8 in teksten: dan kan een letterteken meerdere bytes in beslag nemen en komt je telling in de war. In dat geval kun je beter mb_substr gebruiken. Verder gaan we nu wel uit van tekst die van links naar rechts (ltr) gaat en niet andersom (rtl) zoals Arabisch en Hebreeuws. Ook gaan we bij bovenstaande regexp uit van spaties tussen de woorden (wat bij Chinees en Japans niet zomaar het geval is). Maar dat is alleen van belang als je een algemeen bruikbare extensie wil maken voor Joomla!.

Meer info over de query builder (JDatabaseQuery):
Die jimport is met de nieuwe autoloader in 2.5 niet eens meer nodig.

Laatst aangepast door HermanPeeren : 9 april 2012 om 13:02.

Herman Peeren
Yepr: web - ontwerp - applicaties - illustraties - maatwerk
www.yepr.nl
KvK 58029443
HermanPeeren is offline   Met citaat antwoorden
Oud 15 april 2012, 19:41   #5
goslingcools
 
goslingcools's Avatar
 
Geregistreerd op: 22 december 2008
Locatie: Den Haag
Leeftijd: 44
Berichten: 187
Bedankjes gegeven: 5
Bedankjes ontvangen: 42
Standaard Re: Limiet op aantal characters in PHP

Truncating midden in een woord of juist pas na een heel woord kan ook met de standaard Joomla truncate function. Zie $noSplit
in libraries\joomla\html\html\string.php

Code:
public static function truncate($text, $length = 0, $noSplit = true, $allowHtml = true)

Laatst aangepast door goslingcools : 15 april 2012 om 19:42.

COBIZ webdevelopment | www.cobiz.nl
goslingcools is offline Stuur een bericht via Skype™ naar goslingcools   Met citaat antwoorden
De volgende leden bedanken goslingcools voor dit nuttige bericht:
HermanPeeren (16 april 2012)
Antwoord

Onderwerpopties
Weergavemodus

Berichting Regels
Je mag niet nieuwe onderwerpen maken
Je mag niet reageren op berichten
Je mag niet bijlagen posten
Je mag niet je berichten bewerken

BB code is Aan
Smilies zijn Aan
[IMG] code is Aan
HTML code is Uit

Forumnavigatie


Alle tijden zijn GMT +1. De tijd is nu 08:17.