Diskuze: MPDF vnořené OL seznamy
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 6 zpráv z 6.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
K tomu kodu, co jsi dal, se neda nic rici. ten tez bez html kodu nedava zadny
smysl. Tezko rici, proc ti nejaky, tez nezverejneny php kod, selhal
Ja pouzivam fPDf. To umi pracovat jen s html kodem.
Ma jen omezene schopnosti. Musel jsem si napsat konvertor tabulku v tabulce tak,
ze jsem puvodni tabulku ukoncil a otevrel novou Cili, predpokladam, ze bude pro
tebe asi nejednodussi, napsat si konverzi seznamu, ktery dostane nejakou class
na div + span
<ol>
<li>text</li> ---> <div><span>1.1.1</span><span>text</span></div>
To uz by mel umet ten konvertor aspon priblizne, prekodovat.
Ps. Tez jsem mel potize s UTF fonty a fura dalsiho. Ale, to se dalo cekat od
zjednodusene pdf knihovny
google = mpdf structured ol
http://mpdf.github.io/ -
dokumentace
http://mpdf.github.io/…ml-tags.html - ol, ul, li
http://mpdf.github.io/…ributes.html - font-size, type,
start
http://mpdf.github.io/…ted-css.html - slovo counters se na
te strance nevyskytuje
A jestli to spravne chapu, tak to umi ruzne odrazky, ale countery vubec. Ale,
tak s tim se musi pocitat, kdyz se pouziva takovyto konvertor, ze to neco
neumi.
https://mpdf.github.io/…o/lists.html
google = mpdf structured html list
google = mpdf countered html list
https://github.com/…f/issues/122
Tag.php
change
case 'decimal': case '1': $blt = $this->mpdf->listcounter[$this->mpdf->listlvl] . $this->mpdf->list_number_suffix; break;
to
case 'decimal': case '1': $pre = ''; for ($loop = 1; $loop <= $this->mpdf->listlvl; $loop++) {$pre = $this->mpdf->listcounter[$this->mpdf->listlvl+1 - $loop].'.'.$pre;} $blt = substr($pre,0,-1); break;
Peter Milch.
To jsem našel všechno taky a ta změna v kódu nepomohla, dle všeho se při
generování ani do té části (netuším proč) vůbec nedostane.
K tomu konvertoru, mohl bys mě trochu nakopnout? Netuším jak počítat <ol> a respektive všechny html tagy, abych je mohl změnit na <div><span> ? Děkuji
Udelas si vlastni dekoder/parser kodu.
Kdyz najdes tag "<ol"... udelej...
Kdyz najdes tag "<li"... udelej...
kdyz to mas otevrene ...
A celou tu cast s OL-LI nahradis vlastnim html kodem s tagy div, span, ktere ten
gerenetor pdfka umi.
Zkusim neco najit googlem v js.Zrovna se mi nedari ten js najit, ale pred
lety to nekde bylo
google = ol list by js dotted prefix
google = structured number list by php from ul li
https://stackoverflow.com/…nested-array
V podstate by to melo byt podobne tomuto. Tady se snazi vytvaret strukturovane
pole. Tak to je upravis tak, aby pocital zanoreni a cislo, ktere tam je.
<?php
class Parser {
private $elements = [];
public function parse() {
$doc = new \DOMDocument();
$doc->preserveWhiteSpace = false;
$doc->loadHTMLFile("./html.html");
$this->parseChildNodes($doc, $this->elements);
}
private function parseChildNodes($node, & $arrayToPush) {
$indexPushed = count($arrayToPush);
if ($node->nodeName == "li") {
$representation = [
"key" => $this->getDisplayValueFromNode($node),
"items" => []
];
array_push($arrayToPush, $representation);
$arrayToPush = & $arrayToPush[$indexPushed]["items"];
}
if ($node->childNodes == null) {
return;
}
foreach ($node->childNodes as $child) {
$this->parseChildNodes($child, $arrayToPush);
}
}
/**
* Get the value of the node's first element
* In our case this is the text value of the anchor tag
*
* @param $node
* @return String
*/
private function getDisplayValueFromNode($node) {
return $node->firstChild->nodeValue;
}
public function getElements() {
return $this->elements;
}
}
$parser = new Parser();
$parser->parse();
print_r($parser->getElements());
Ale, klidne pouzij strpos.
$elm_start = ' class="my-ol-list"';
$OL_open = "<ol"
$OL_close = "</ol"
$LI_open = "<li"
$LI_close = "</li"
$elm_end = '<div'; // bud mas vsechny ol uzavrene nebo narazis na nejaky string, to je dobre dat do cyklu.
$pos_start = 0; //pak budes potrebovat ulozit pozici odkud-kam budes seznam nahrazovat
$pos_end = 0;
... a pak ty cykly, ktere se mi nechce jako vymyslet
Tohle nekdo chtel v jinem tematu. Je to menu vypsane jako id/id_parent/text. A chtel to preparsovat do strukturovaneho pole nebo neco tak. Mohlo by to byt takovou inspiraci, jak pouzivat predavani promenych. Si udelej proste bokem kod, kde mu predas string z menu a at ti to tam doplni ty cisla. A az to budes mit ok, tak si to prekopirujes do hlavniho kodu.
<?php
$list = array(
array(
'Id' => 64899,
'IdP' => 37671,
'Name' => "Auto-moto"
),
array
(
'Id' => 64868,
'IdP' => 64899,
'Name' => "Autochladničky"
),
array
(
'Id' => 64876,
'IdP' => 64868,
'Name' => "Kompresorové autochladničky"
)
);
$out = array();
$pom = array();
echo '<pre>';
foreach($list as $row)
{
//var_dump($row);
list( $id, $idP, $name ) = array($row['Id'], $row['IdP'], $row['Name']);
//var_dump( $id, $idP );
if (isset($pom[ $idP ]))
{
$pom[ $idP ][ $id ] = array( 'IdP'=>$idP, 'Name'=>$name );
$pom[ $id ] = &$pom[ $idP ][ $id ];
}
else {
$out[ $id ] = array( 'IdP'=>$idP, 'Name'=>$name );
$pom[ $id ] = &$out[ $id ];
}
}
var_dump($out);
foreach($list as $row)
{
$path = array();
$id = $row['Id'];
for (;isset($pom[$id]);)
{
$path[] = $pom[$id]['Name'];
$id = $pom[$id]['IdP'];
}
echo implode(" > ", array_reverse($path))."\n";
}
?>
Zobrazeno 6 zpráv z 6.