Avdey
Участник
Offline
|
|
« : 08-01-2012 07:04 » |
|
Смотрите я работаю с классом FPDF и в общем-то не жалуюсь, всё получается, но много раз приходится писать один и тот же код, вы скажите напиши функцию и всё будет в порядке....но у меня вот в чём вопрос: Вот код: <?php $pdf->Write(0, 'Здравствуйте этот символ'); $pdf->WriteSymbol(chr(187)); //Нельзя ни как убрать эту строку? я просто не глубоко знаю работу с классами и не подскажите, как можно упростить код? $pdf->Write(0, ' - означает округление'); ?> В результате будет с генерирован PDF файл и в нём будет написано: Здрасти этот символ ≃ - означает округление Почему нельзя вот так сделать: <?php $pdf->Write(0, 'Здравствуйте этот сивол ' . WriteSymbol(chr(187)) . ' - означает округление '); ?> А может можно...я в общем не знаю, подскажите....
|
|
« Последнее редактирование: 08-01-2012 13:01 от Avdey »
|
Записан
|
|
|
|
Sla
|
|
« Ответ #1 : 08-01-2012 08:59 » |
|
1. С первого взгляда - а почему бы и нет. 2. А не проще ли попробовать, только чуть-чуть изменить <? $pdf->Write(0, 'Здрасти этот сивол ' . chr(187) . ' - означает округление '); ?>
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Avdey
Участник
Offline
|
|
« Ответ #2 : 08-01-2012 09:11 » |
|
Так не сделаешь так как функция WriteSymbol прописана мною в классе FPDF и она меняет шрифт в котором под номером chr(187) стоит знак, который мне нужен а потом меняет шрифт обратно, и если я пропишу как вы показали то получу знак под этим номером но не тот который мне нужен. А так как я написал выше, браузер выдаёт ошибку и говорит: Fatal error: Call to undefined function WriteSymbol() in Z:\home\localhost\www\storeofnavi\local\application\oms_po_2lp\algorithm\OMS.php on line 490 а если прописать так <?php $pdf->Write(0, ' Вот знак который мне нужен '.$pdf->WriteSymbol(chr(187)).' - он означает '); ?>
это работает но не корректно, получается вот что вывод в PDF-файл "знак" а потом пишет "Вот знак который мне нужен он означает" а не "Вот знак который мне нужен "знак" он означает" ачает"
|
|
« Последнее редактирование: 08-01-2012 13:03 от Avdey »
|
Записан
|
|
|
|
Sla
|
|
« Ответ #3 : 08-01-2012 09:39 » |
|
ТЗ нужно ставить сразу, а не по ходу вопроса.
$pdf->Write(0, ' Вот знак который мне нужен '.$pdf->WriteSymbol(chr(187)).' - он означает ');
все верно, как ты описал... Обясню...
Что происходит.
Соединение строк (понятно) ' Вот знак который мне нужен '.$pdf->WriteSymbol(chr(187)).' - он означает '
более интересно $pdf->WriteSymbol(chr(187)) - задача функции вернуть результат. Какой рез она возвращает не имеет значения, результат склеивается с другим подстроками Но! Сама функция работает с pdf потоком, т.е она вывела в поток (выполнилась), вернула результат, склеилась и уже вывелась в подготовленной строке в поток.
покажи код WriteSymbol и Write
Может быть, нужно сделать, что либо наподобие стандартный функций, например printf или sprintf
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Avdey
Участник
Offline
|
|
« Ответ #4 : 08-01-2012 09:54 » |
|
Понимаете функций много, на пример вот такая задача: Нужно написать следующую строку в PDF-файле: "Привет, это пример как реализовать нижний индекс у числа 23 2 через класс FPDF" Код будет следующий: <?php $pdf->Write(0, 'Привет, это пример как реализовать нижний индекс у числа 23'); $pdf->SubWrite(0,'2','',6,-3); $pdf->Write(0, ' через класс FPDF'); ?>
и таких функций много, которые можно было бы чтоб они в одну строку писались....так что решить проблему с WriteSymbol поковырясь в функции, это не решить проблему в целом. Но вот код функции Write из класса <?php function Write($h, $txt, $link='') { //Output text in flowing mode $cw=&$this->CurrentFont['cw']; $w=$this->w-$this->rMargin-$this->x; $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; $s=str_replace("\r",'',$txt); $nb=strlen($s); $sep=-1; $i=0; $j=0; $l=0; $nl=1; while($i<$nb) { //Get next character $c=$s[$i]; if($c=="\n") { //Explicit line break $this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',0,$link); $i++; $sep=-1; $j=$i; $l=0; if($nl==1) { $this->x=$this->lMargin; $w=$this->w-$this->rMargin-$this->x; $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; } $nl++; continue; } if($c==' ') $sep=$i; $l+=$cw[$c]; if($l>$wmax) { //Automatic line break if($sep==-1) { if($this->x>$this->lMargin) { //Move to next line $this->x=$this->lMargin; $this->y+=$h; $w=$this->w-$this->rMargin-$this->x; $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; $i++; $nl++; continue; } if($i==$j) $i++; $this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',0,$link); } else { $this->Cell($w,$h,substr($s,$j,$sep-$j),0,2,'',0,$link); $i=$sep+1; } $sep=-1; $j=$i; $l=0; if($nl==1) { $this->x=$this->lMargin; $w=$this->w-$this->rMargin-$this->x; $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; } $nl++; } else $i++; } //Last chunk if($i!=$j) $this->Cell($l/1000*$this->FontSize,$h,substr($s,$j),0,0,'',0,$link); } ?>
и SubWrite <?php function subWrite($h, $txt, $link='', $subFontSize=12, $subOffset=0) { // resize font $subFontSizeold = $this->FontSizePt; $this->SetFontSize($subFontSize); // reposition y $subOffset = ((($subFontSize - $subFontSizeold) / $this->k) * 0.3) + ($subOffset / $this->k); $subX = $this->x; $subY = $this->y; $this->SetXY($subX, $subY - $subOffset);
//Output text $this->Write($h, $txt, $link);
// restore y position $subX = $this->x; $subY = $this->y; $this->SetXY($subX, $subY + $subOffset);
// restore font size $this->SetFontSize($subFontSizeold); }
оф сайт http://fpdf.org/
|
|
« Последнее редактирование: 08-01-2012 13:05 от Avdey »
|
Записан
|
|
|
|
Sla
|
|
« Ответ #5 : 08-01-2012 10:05 » |
|
Я объяснил, как это работает Если функций много, то все же, умаю, что нужно придумать свой парсер входной строки со своим шаблонизатором
Например
'Здрасти этот сивол %%__chr . (chr(187)) . '__%% - означает округление ' таким образом, что все что находится между %%__chr __%% будет выводить в поток аналогично WriteSymbol или '%%__sub'.Строка.__%%
М... ну.. тут шаблоны далеки от идеала Или использовать, что-то наподобие bbcode [chr]символ[/chr] [sub]строка[/sub]
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #6 : 08-01-2012 11:26 » |
|
Avdey, 1. Пиши по-русски. Детские ошибки типа "упрАстить" лично меня пугают. 2. Оборачивай код тегом code. Если хочешь, чтобы твои посты чаще читали, чем не читали - оформлять пост обязательно. 3. Используй "скобки" "<?php ?>", а не сокращенные.
Все три пункта указывают на несобранность и неаккуратность. Надо работать над собой!
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Avdey
Участник
Offline
|
|
« Ответ #7 : 08-01-2012 13:09 » |
|
Avdey, 1. Пиши по-русски. Детские ошибки типа "упрАстить" лично меня пугают. 2. Оборачивай код тегом code. Если хочешь, чтобы твои посты чаще читали, чем не читали - оформлять пост обязательно. 3. Используй "скобки" "<?php ?>", а не сокращенные.
Все три пункта указывают на несобранность и неаккуратность. Надо работать над собой!
Исправился по двум пунктам, но по 3....почему нельзя писать сокращённые скобки <? ?> ? Я объяснил, как это работает Если функций много, то все же, умаю, что нужно придумать свой парсер входной строки со своим шаблонизатором
Например
'Здрасти этот сивол %%__chr . (chr(187)) . '__%% - означает округление ' таким образом, что все что находится между %%__chr __%% будет выводить в поток аналогично WriteSymbol или '%%__sub'.Строка.__%%
М... ну.. тут шаблоны далеки от идеала Или использовать, что-то наподобие bbcode [chr]символ[/chr] [sub]строка[/sub]
Дайте пример парсера входной строки, гляну и пойму всё.
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #8 : 08-01-2012 13:46 » |
|
Во-первых, это показывает неаккуратность программиста. Во-вторых, это снижает совместимость. На всех системах поддерживается "<?php", но не на всех разрешен короткий тег. Читаем целиком, а не между строк! http://ru.php.net/manual/en/language.basic-syntax.phpmode.php
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Sla
|
|
« Ответ #9 : 08-01-2012 13:48 » |
|
Avdey, shortag почитай - http://php.net/manual/en/ini.core.php - поймешь $pdf->Write(0, 'Привет, это пример как реализовать нижний индекс у числа 2[sub]3[/sub]');
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
|