Pdflib: how to create drop cap using add_flowtext() - php

I took the cookbook example and modified it to use add_textflow() instead of create_textflow() but I can't get it to work. Instead of interpreting the macros it just writes it as plain text. What am I doing wrong?
From documentation I got the understanding that I should define the macros inline - or did I misunderstand it? Have tried everything I could think of...
$tf = 0;
$optlist = "";
$llx = 100; $lly = 50; $urx = 450; $ury = 800;
$t_fontsize = 16; // font size of the text
$t_leading = 20; // leading of the text
$c_num = 3; // no. of lines for the drop cap to cover
$c_textrise = -(($c_num - 1) * $t_leading); // text rise of the drop cap
$c_fontsize = -($c_textrise * 1.8); // font size of the drop cap
try {
$p = new pdflib();
$p->set_option("errorpolicy=exception");
$p->set_option("stringformat=utf8");
$p->begin_document("", "");
$optlist = "fontname=Helvetica fontsize=" . $t_fontsize . " encoding=unicode ";
$text = "<macro " .
"{cap_start {fontsize=" . $c_fontsize . " leading=" . $t_leading .
" textrise=" . $c_textrise .
" matchbox={createwrapbox boxheight={leading textrise}}} " .
"cap_end {matchbox=end fontsize=" . $t_fontsize . " textrise=0}}>";
$text .= "<&cap_start>O<&cap_end>ver the mountains... ";
$tf = $p->add_textflow($tf, $text, $optlist);
$text =
"Paper Planes are the ideal way of " .
"passing the time. We offer revolutionary " .
"new develop­ments of the traditional com­mon " .
"paper planes. If your lesson, conference, or lecture " .
"turn out to be deadly boring, you can have a wonderful time " .
"with our planes. ";
$tf = $p->add_textflow($tf, $text, $optlist);
do {
$p->begin_page_ext(0, 0, "width=a4.width height=a4.height");
$result = $p->fit_textflow($tf, $llx, $lly, $urx, $ury, "");
$p->end_page_ext("");
} while ($result == "_boxfull" || $result == "_nextpage");
/* Check for errors */
if (!$result == "_stop") {
if ($result == "_boxempty")
throw new Exception ("Error: Textflow box too small");
else {
throw new Exception ("User return '" . $result .
"' found in Textflow");
}
}
$p->delete_textflow($tf);
$p->end_document("");
$buf = $p->get_buffer();
$len = strlen($buf);
header("Content-type: application/pdf");
header("Content-Length: $len");
header("Content-Disposition: inline; filename=drop_caps.pdf");
print $buf;
} catch (PDFlibException $e) {
die("PDFlib exception occurred:\n".
"[" . $e->get_errnum() . "] " . $e->get_apiname() .
": " . $e->get_errmsg() . "\n");
} catch (Exception $e) {
die($e->getMessage());
}
$p = 0;

this is simple: only create_texflow() support inline options (because you must specify the data in a single chunk). With add_textflow() you have the possibility to "build" the textflow handle in multiple steps, for each text fragment with the related options.
In your case, it might look like the following way:
$optlistmacro = " macro " .
"{cap_start {fontsize=" . $c_fontsize . " leading=" . $t_leading .
" textrise=" . $c_textrise .
" matchbox={createwrapbox boxheight={leading textrise}}} " .
"cap_end {matchbox=end fontsize=" . $t_fontsize . " textrise=0}}";
$tf = $p->add_textflow($tf, "", $optlist . $optlistmacro);
$tf = $p->add_textflow($tf, "O", "&cap_start");
$tf = $p->add_textflow($tf, "ver the mountains... ", "&cap_end");
In this code fragment, I do the first add_textflow() without text but all the
macros settings. Then it place the "O" with the macro (&cap_start) in
the option list. The following text "ver the mountains... " is done
in the next add_textflow() and as option I place the &cap_end.

Related

PDFlib place table on bottom of defined fitbox

I have created a table in PDFlib PHP and defined the coordinates of the fitbox as the following:
$llx = 350;
$lly = 500;
$urx = 600;
$ury = 800;
Now I want the table to start at the bottom of these coordinates and I want the table to grow to the top if I add more cells. How can I achieve that?
The function I wrote so far (here the table starts at the top):
function createTable(pdflib $p, int $fontMedium, int $fontRegular, array $arrInput) {
$tbl=0;
$rowmax = 8;
/* ---------- table header */
$row = 1; $col = 1;
$optlist = "margin=4 fittextline={position=center font=" . $fontMedium . " fontsize=10} " .
"matchbox={fillcolor={#ffed00}} colspan=1 colwidth=200";
$tbl = $p->add_table_cell($tbl, $col, $row, $arrInput['table']['tableHeading'], $optlist);
if ($tbl == 0) {
echo("Error: " . $p->get_errmsg());
exit(1);
}
/* ---------- content rows */
foreach($arrInput['table']['tableListings'] as $listings) {
/* ----- Multi-line text with Textflow */
// $row++;
if ($row <= $rowmax) {
$row++;
} else {
echo("Error: Too many Items for table");
exit(1);
}
$font = $p->load_font("W-Regular", "unicode", "");
if ($font == 0) {
echo("Error: " . $p->get_errmsg());
exit(1);
}
$optlist = "charref fontname=W-Regular encoding=unicode fontsize=10";
$tf = $p->add_textflow(0, $listings, $optlist);
if ($tf == 0) {
echo("Error: " . $p->get_errmsg());
exit(1);
}
$optlist = "margin=4 matchbox={fillcolor={rgb 0.9 0.5 0}} textflow=" . $tf;
$tbl = $p->add_table_cell($tbl, $col, $row, "", $optlist);
if ($tbl == 0) {
echo("Error: " . $p->get_errmsg());
exit(1);
}
}
do {
$optlist = "header=1 rowheightdefault=20 " .
"stroke={{line=other}} ";
$result = $p->fit_table($tbl, $llx, $lly, $urx, $ury, $optlist);
if ($result == "_error") {
echo("Couldn't place table: " . $p->get_errmsg());
exit(1);
}
} while ($result == "_boxfull");
$p->delete_table($tbl, "");
}
I have found the answer. In the $optlist for the fit_table you can define the position of the table which (if you want it at the bottom of the fitbox) looks like this:
$optlist = "header=1 rowheightdefault=20 "
. "stroke={{line=horother linewidth=0.3}} "
. "position={bottom} "; // statement to define position of the table in the fitbox

PDFLib (PHP) Couldn't place table : Calculated table height too large

I get this Exception:
Couldn't place table : Calculated table height 657.375 too large (> 492, shrinking 74.8432%)
The content is dynamic, and It seems sometimes it exeeds the table capacity but I am not sure, any ideas?
Version of PDFLibary 9.2.0 / Version of PHP 7.2.13 MSVC15
Portion of code where the exception is raised:
$result = $p->fit_table($tbl, $llx, $lly, $urx, $y, $fit_opts);
if ($result == "_error")
throw new Exception("Couldn't place table : " .
$p->get_errmsg());
Entire code below:
<?php
$outfile = "";
$title = "Table Invoice";
$infile = "stationery.pdf";
$tf = 0;
$tbl = 0;
$sum = 0;
$total = 0;
$subtotal = 0;
$tabheight = 0;
$pagewidth = 792;
$pageheight = 612;
$fontsize = 12;
$capheight = 7;
$rowheight = 16;
$margin = 4;
$leading = "120%";
$ystart = $pageheight - 40;
$yoffset = 15;
$ycontinued = 40;
$nfooters = 1;
$nheaders = 1;
/* The table coordinates are fixed; only the height of the table may differ*/
$llx = 25;
$urx = 770;
$lly = 80;
/* The widths of the individual columns is fixed */
$maxcol = 5;
$c1 = 20;
$c2 = 300;
$c3 = 30;
$c4 = 30;
$c5 = 30;
$c6 = 30;
$c7 = 30;
$c8 = 30;
$c9 = 30;
$c10 = 30;
$c11 = 30;
/* Get the current date */
setlocale(LC_TIME, "C");
date_default_timezone_set("Europe/Berlin");
$fulldate = date("F j, Y");
/* Text to output after the table */
$closingtext =
"Terms of payment: 30 days net. " .
"90 days warranty starting at the day of sale. " .
"This warranty covers defects in workmanship only. " .
"Kraxi Systems, Inc. will, at its option, repair or replace the " .
"product under the warranty. This warranty is not transferable. " .
"No returns or exchanges will be accepted for wet products.";
//Executing query for table rows
if (!$rst) {
print "Error " . $conn->ErrorMsg();
exit;
} else {
if ($rst->RecordCount() > 0) {
$address = array(
"John Q. Doe", "255 Customer Lane", "Suite B",
"12345 User Town", "Everland"
);
try {
$searchpath = $PDFSOURCEPATH;
$p = new PDFlib();
$p->set_option("errorpolicy=return");
$p->set_option("textformat=bytes");
$p->set_option("SearchPath={{" . $searchpath . "}}");
if ($p->begin_document("", "") == -1) {
die("Error: " . $p->get_errmsg());
}
$boldfont = $p->load_font("Helvetica-Bold", "unicode", "");
if ($boldfont == 0)
throw new Exception("Error: " . $p->get_errmsg());
$regularfont = $p->load_font("Helvetica", "unicode", "");
if ($regularfont == 0)
throw new Exception("Error: " . $p->get_errmsg());
/* Start the output page */
$p->begin_page_ext($pagewidth, $pageheight, "");
/* Output the customer's address */
$y = $ystart;
$p->setfont($regularfont, $fontsize);
for ($i = 0; $i < count($address); $i++) {
$p->fit_textline($address[$i], $llx, $y, "");
$y -= $yoffset;
}
/* Print the header and the date */
$y -= 3 * $yoffset;
$p->setfont($boldfont, $fontsize);
$p->fit_textline("INVOICE", $llx, $y, "position {left top}");
$p->fit_textline($fulldate, $urx, $y, "position {right top}");
$y -= 3 * $yoffset;
$head_opts_right = "fittextline={position={right top} " .
" font=" . $boldfont . " fontsize={capheight=" . $capheight . "}} " .
" rowheight=" . $rowheight . " margin=" . $margin;
$head_opts_left = "fittextline={position={left top} " .
" font=" . $boldfont . " fontsize={capheight=" . $capheight . "}} " .
" rowheight=" . $rowheight . " margin=" . $margin;
$col = 1;
$row = 1;
/* Add each heading cell with the option list defined above;
* in addition, supply a fixed column width
*/
$tbl = $p->add_table_cell(
$tbl,
$col++,
$row,
"Col 1",
$head_opts_right . " colwidth=" . $c1
);
if ($tbl == 0)
throw new Exception("Error adding cell: " . $p->get_errmsg());
$tbl = $p->add_table_cell(
$tbl,
$col++,
$row,
"Col 2",
$head_opts_left . " colwidth=" . $c2
);
if ($tbl == 0)
throw new Exception("Error adding cell: " . $p->get_errmsg());
$tbl = $p->add_table_cell(
$tbl,
$col++,
$row,
"Col 3",
$head_opts_left . " colwidth=" . $c3
);
if ($tbl == 0)
throw new Exception("Error adding cell: " . $p->get_errmsg());
$tbl = $p->add_table_cell(
$tbl,
$col++,
$row,
"Col 4",
$head_opts_right . " colwidth=" . $c4
);
if ($tbl == 0)
throw new Exception("Error adding cell: " . $p->get_errmsg());
$tbl = $p->add_table_cell(
$tbl,
$col++,
$row,
"Col 5",
$head_opts_right . " colwidth=" . $c5
);
if ($tbl == 0)
throw new Exception("Error adding cell: " . $p->get_errmsg());
$tbl = $p->add_table_cell(
$tbl,
$col++,
$row,
"Col 6",
$head_opts_right . " colwidth=" . $c6
);
if ($tbl == 0)
throw new Exception("Error adding cell: " . $p->get_errmsg());
$tbl = $p->add_table_cell(
$tbl,
$col++,
$row,
"Col 7",
$head_opts_right . " colwidth=" . $c7
);
if ($tbl == 0)
throw new Exception("Error adding cell: " . $p->get_errmsg());
$tbl = $p->add_table_cell(
$tbl,
$col++,
$row,
"Col 8",
$head_opts_right . " colwidth=" . $c8
);
if ($tbl == 0)
throw new Exception("Error adding cell: " . $p->get_errmsg());
$tbl = $p->add_table_cell(
$tbl,
$col++,
$row,
"Col 9",
$head_opts_right . " colwidth=" . $c9
);
if ($tbl == 0)
throw new Exception("Error adding cell: " . $p->get_errmsg());
$tbl = $p->add_table_cell(
$tbl,
$col++,
$row,
"Col 10",
$head_opts_right . " colwidth=" . $c10
);
if ($tbl == 0)
throw new Exception("Error adding cell: " . $p->get_errmsg());
$tbl = $p->add_table_cell(
$tbl,
$col++,
$row,
"Col 11",
$head_opts_right . " colwidth=" . $c11
);
if ($tbl == 0)
throw new Exception("Error adding cell: " . $p->get_errmsg());
$row++;
$body_opts = "fittextline={position={right top} " .
" font=" . $regularfont .
" fontsize={capheight=" . $capheight . "}} " .
" rowheight=" . $rowheight . " margin=" . $margin;
$itemno = 1;
$masterRows = array();
while (!$rst->EOF) {
$col = 1;
$masterRows[] = $row;
/* ---------------------------------------------------------------
* Add the text line cell containing the Item in the first column,
* with the options defined for table body cells above
* ---------------------------------------------------------------
*/
$tbl = $p->add_table_cell($tbl, $col++, $row, $rst->fields["col1"], $body_opts);
if ($tbl == 0)
throw new Exception("Error adding cell: " . $p->get_errmsg());
$tf_opts = "font=" . $regularfont .
" fontsize={capheight=" . $capheight . "} leading=" . $leading;
$bodytf_opts = "fittextflow={firstlinedist=capheight}" .
" colwidth=" . $c2 . " margin=" . $margin;
/* Add the Textflow with the options defined above */
$tf = $p->add_textflow(0, $rst->fields["customername"], $tf_opts);
if ($tf == 0)
throw new Exception("Error: " . $p->get_errmsg());
/* Add the Textflow table cell with the options defined above */
$tbl = $p->add_table_cell(
$tbl,
$col++,
$row,
"",
$bodytf_opts . " textflow=" . $tf
);
if ($tbl == 0)
throw new Exception("Error adding cell: " . $p->get_errmsg());
$tf = 0;
$tbl = $p->add_table_cell(
$tbl,
$col++,
$row,
date("m/d/Y", strtotime($rst->fields["col2"])),
$body_opts
);
if ($tbl == 0)
throw new Exception("Error adding cell: " . $p->get_errmsg());
$tbl = $p->add_table_cell(
$tbl,
$col++,
$row,
date("m/d/Y", strtotime($rst->fields["col3"])),
$body_opts
);
if ($tbl == 0)
throw new Exception("Error adding cell: " . $p->get_errmsg());
if ($result == "_error")
throw new Exception("Couldn't place table : " .
$p->get_errmsg());
/* Calculate the overall sum */
$total += $sum;
$itemno++;
$row++;
//Executing query for table rows comments
while (!$rstComments->EOF) {
$tf_opts = "font=" . $regularfont .
" fontsize={capheight=" . $capheight . "} alignment=left leading=" . $leading;
$tf = $p->add_textflow(0, $rstComments->fields["comment"], $tf_opts);
if ($tf == 0)
throw new Exception("Error: " . $p->get_errmsg());
$bodytf_opts = "fittextflow={firstlinedist=capheight} colspan=10" .
" colwidth= 700 margin=" . $margin;
$tbl = $p->add_table_cell(
$tbl,
2,
$row,
"",
$bodytf_opts . " textflow=" . $tf
);
if ($tbl == 0)
throw new Exception("Error adding cell: " . $p->get_errmsg());
$tf = 0;
///////////////End comments///////////////
$row++;
$rstComments->MoveNext();
} /* for */
$rst->MoveNext();
}
$footer_opts =
"rowheight=" . $rowheight . " colspan=2 margin =" . $margin .
" matchbox={name=subtotal}";
$tbl = $p->add_table_cell($tbl, $maxcol - 1, $row, "", $footer_opts . "");
if ($tbl == 0)
throw new Exception("Error adding cell: " . $p->get_errmsg());
$fill_opts =
" fill={";
foreach ($masterRows as $rowNumber) {
$fill_opts .=
"{area=row" . $rowNumber . " fillcolor={gray 0.9}} ";
}
do {
$fit_opts =
"header=" . $nheaders . " footer=" . $nfooters .
$fill_opts .
"{area=header fillcolor={rgb 0.90 0.90 0.98}} " .
"{area=footer fillcolor={rgb 0.98 0.92 0.84}}}";
/* Place the table instance */
$result = $p->fit_table($tbl, $llx, $lly, $urx, $y, $fit_opts);
/* An error occurred or the table's fitbox is too small to keep any
* contents
*/
if ($result == "_error")
throw new Exception("Couldn't place table : " .
$p->get_errmsg());
if ($result != "_boxfull") {
/* Format the total to a maximum of two fraction digits */
$roundedValue = sprintf("%.2f", $total);
$contents = "total: " . $roundedValue;
/* Retrieve the coordinates of the third (upper right) corner of
* the "subtotal" matchbox. The parameter "1" indicates the
* first instance of the matchbox.
*/
$x3 = 0;
$y3 = 0;
if ($p->info_matchbox("subtotal", 1, "exists") == 1) {
$x3 = $p->info_matchbox("subtotal", 1, "x3");
$y3 = $p->info_matchbox("subtotal", 1, "y3");
} else {
throw new Exception("Error: " . $p->get_errmsg());
}
/* Start the text line at the corner coordinates retrieved
* (x2, y2) with a small margin. Right-align the text.
*/
$p->setfont($boldfont, $fontsize);
$p->fit_textline(
$contents,
$x3 - $margin,
$y3 - $margin,
"position={right top}"
);
} else if ($result == "_boxfull") {
/* Get the last body row output in the table instance */
$lastrow = $p->info_table($tbl, "lastbodyrow");
/* Calculate the subtotal */
$subtotal = 0;
for ($i = 0; $i < $lastrow - $nfooters; $i++) {
$subtotal += $items[$i][1] * $items[$i][2];
}
/* Format the subtotal to a maximum of two fraction digits*/
$roundedValue = sprintf("%.2f", $subtotal);
$contents = "subtotal: " . $roundedValue;
/* Retrieve the coordinates of the third (upper right) corner of
* the "subtotal" matchbox. The parameter "1" indicates the
* first instance of the matchbox.
*/
$x3 = 0;
$y3 = 0;
if ($p->info_matchbox("subtotal", 1, "exists") == 1) {
$x3 = $p->info_matchbox("subtotal", 1, "x3");
$y3 = $p->info_matchbox("subtotal", 1, "y3");
} else {
throw new Exception("Error: " . $p->get_errmsg());
}
/* Start the text line at the corner coordinates retrieved in
* (x3, y3) with a small margin. Right-align the text.
*/
$p->setfont($boldfont, $fontsize);
$p->fit_textline(
$contents,
$x3 - $margin,
$y3 - $margin,
"position={right top}"
);
/* Output the "Continued" remark */
$p->setfont($regularfont, $fontsize);
$p->fit_textline(
"-- Continued --",
$urx,
$ycontinued,
"position {right top}"
);
$p->end_page_ext("");
$p->begin_page_ext($pagewidth, $pageheight, "");
$y = $ystart;
}
} while ($result == "_boxfull");
/* Get the table height of the current table instance */
$tabheight = $p->info_table($tbl, "height");
$y = $y - (int) $tabheight - $yoffset;
/* Add the closing Textflow to be placed after the table */
$tf_opts = "font=" . $regularfont . " fontsize=" . $fontsize .
" leading=" . $leading . " alignment=justify";
$tf = $p->add_textflow(0, $closingtext, $tf_opts);
if ($tf == 0)
throw new Exception("Error: " . $p->get_errmsg());
/* Loop until all text has been fit which is indicated by the "_stop"
* return value of fit_textflow()
*/
do {
/* Place the Textflow */
$result = $p->fit_textflow($tf, $llx, $lly, $urx, $y, "");
if ($result == "_error")
throw new Exception("Couldn't place table : " .
$p->get_errmsg());
if ($result == "_boxfull" || $result == "_boxempty") {
$p->setfont($regularfont, $fontsize);
$p->fit_textline(
"-- Continued --",
$urx,
$ycontinued,
"position {right top}"
);
$p->end_page_ext("");
$p->begin_page_ext($pagewidth, $pageheight, "");
$y = $ystart;
}
} while (!$result == "_stop");
$p->end_page_ext("");
$p->end_document("");
$buf = $p->get_buffer();
$len = strlen($buf);
if ($email == 1) {
$filename = $filename . ".pdf";
#unlink($filename);
$file = fopen($filename, "w");
fputs($file, $buf, $len);
fclose($file);
PDF_delete($p);
} else {
header("Content-type: application/pdf");
header("Content-Length: $len");
header("Content-Disposition: inline; filename=$report_filename");
print $buf;
}
} catch (PDFlibException $e) {
die("PDFlib exception occurred in hello sample:\n" .
"[" . $e->get_errnum() . "] " . $e->get_apiname() . ": " .
$e->get_errmsg() . "\n");
} catch (Exception $e) {
die($e);
}
} else {
if ($email == 1) {
try {
$p = new PDFlib();
if ($p->begin_document("", "") == -1) {
die("Error: " . $p->get_errmsg());
}
$p->begin_page_ext($pagewidth, $pageheight, "");
$p->set_text_pos(20, 600);
$p->end_page_ext("");
$p->end_document("");
$buf = $p->get_buffer();
$len = strlen($buf);
$filename = $filename . ".pdf";
#unlink($filename);
$file = fopen($filename, "w");
fputs($file, $buf, $len);
fclose($file);
} catch (PDFlibException $e) {
die("PDFlib exception occurred in hello sample:\n" .
"[" . $e->get_errnum() . "] " . $e->get_apiname() . ": " .
$e->get_errmsg() . "\n");
} catch (Exception $e) {
die($e);
}
} else {
print "No records matched search criteria";
exit;
}
}
}
?>

Loop "Addfriend" counting issue

I am having this below code, It is work perfectly. But am having a small issue messuring the "$username_index" count.
the main idea of my code is following:
having accounts.txt [92 lines] usernames:pass format.
having usernames.txt [99999 lines] usernames format.
It will login to account1, then it will add 95 usernames, then next account2 , then add next 95 usernames.
But some accounts are giving response "Too many add friends". In this case response, I will skip the account and go to next.
But below code will contiue to the next 95!, so its skip 95 from usernames!
I want it contiue adding where the left username from skipped account.
I want it as soon it will login to the next account AND CONTIUING ADD THE NEXT LINE OF USERNAMES! no need to jump to next 95 username to add!
Example how i want it:
login account1
add username1
add username2
ERROR APPEARS!
login account2
add username3
add username4
add username5
add username6
error appears!
login account3
add username7
add username8
etc..
Current Code:
$username_index = 0;
while(true) { // This is our while.. yes but this not for login()!
try {
$names = readFromFile("usernames.txt", 95, $username_index);
if(count($names) <= 0)
break;
sleep(1);
$fuckc = 0;
foreach($names as $name){
$ans = $API->addFriend($name);
$var_response = $ans->getMessage();
if (strpos($var_response, 'too many friends!') !== false) {
printf("[!] Too many friends!, Skipping account now.\n");
break;
}
if (strpos($var_response, 'Sorry') === false) {
$fuckc++;
printf("[+]" . "[" . date("h:i:s") . "]" . "[" . $fuckc . "] " . "response: " . $var_response . "\n");
//printf("[" . $fuckc . "] " . "response: " . $var_response . "\n");
}
//sleep(SLEEP_TIME);
}
$username_index += 95;
$API->logout();
//rotate_proxy();
$API = null;
//sleep(waiting);
//$results = $findFriends->getResults();
if (!isset($results) || count($results) == 0) {
if(!login()) die("Could not find a valid account.\n");
}
} catch(Exception $e){
echo $e->getMessage() . "\n";
if(!login()) die("Could not find a valid account.\n");
}
}
Edited again : the counter $username_index only increasse when $var_response is not "too many friends!" :
$username_index = 0;
while(true) { // This is our while.. yes but this not for login()!
try {
$names = readFromFile("usernames.txt", 95, $username_index);
if(count($names) <= 0)
break;
sleep(1);
$fuckc = 0;
foreach($names as $name){
$ans = $API->addFriend($name);
$var_response = $ans->getMessage();
if (strpos($var_response, 'too many friends!') !== false) {
printf("[!] Too many friends!, Skipping account now.\n");
break;
}
else $username_index++; //◄■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
if (strpos($var_response, 'Sorry') === false) {
$fuckc++;
printf("[+]" . "[" . date("h:i:s") . "]" . "[" . $fuckc . "] " .
"response: " . $var_response . "\n");
//printf("[" . $fuckc . "] " . "response: " . $var_response . "\n");
}
//sleep(SLEEP_TIME);
}
// $username_index += 95; //◄■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
$API->logout();
//rotate_proxy();
$API = null;
//sleep(waiting);
//$results = $findFriends->getResults();
if (!isset($results) || count($results) == 0) {
if(!login()) die("Could not find a valid account.\n");
}
} catch(Exception $e){
echo $e->getMessage() . "\n";
if(!login()) die("Could not find a valid account.\n");
}
}

Using arrays in PHP

I am working on my first program written in PHP. This is a basic question. I am trying to print a string stored in an array. I have two arrays. One array, $content, stores a number at $content[$i][15] (i am using arrays in arrays, and looping through it with a for loop). Lets say this number is 3. I now want to access a string in another array, called $type. This string is at position $type[3]. Logically, I think, $type[3] should print the same thing as $type[$content[$i][15]]. But, when I call $type[$content[$i][15]], it doesn't print anything, but when i print $type[3] it works fine. Is this type of call not allowed in PHP?
$type = array();
$typetemp = readfile("type.csv");
foreach ($typetemp as $sa){
$type[$sa[0]] = $sa[1];
}
$content = readfile("content.csv");
for($i=0; $i<sizeof($content); $i++){
if($content[$i][15] == 3){
if($content[$i][4] == 1){
$temp = $content[$i][15];
echo "id is " . $content[$i][0] . "title is " . $content[$i][1] . "introtext is " . $content[$i][2] . "restoftext is " . $content[$i][3] . "visible is " . $content[$i][4] . "category is " . $content[$i][5] . "creation_date is " . $content[$i][6] . "author is " . $content[$i][7] . "img is " . $content[$i][8] . "ordering is " . $content[$i][9] . "rank is " . $content[$i][10] . "vid is " . $content[$i][11] . "start_date is " . $content[$i][12] . "stop_date is " . $content[$i][13] . "event_date is " . $content[$i][14] . "type is " . $content[$i][15] . "thumb is " . $content[$i][16] . "type name is " . $type[$temp] . "<br/>";
}
}
}
function readfile($filename) {
$line_of_text = array();
$file_handle = fopen($filename, "r");
while (!feof($file_handle) ) {
array_push($line_of_text, fgetcsv($file_handle, 1024));
}
fclose($file_handle);
return $line_of_text;
}
You are missing a $ sign before content:
$type[$content[$i][15]]
This accesses the value in $type with index $content[$i][15]

foreach loop prevous data in export file

I have a export script that export items to a csv file. I want to export the additional images for each item on each product row in the csv file.
That part looks like this:
$img_query=tep_db_query("SELECT additional_images_id, products_id, popup_images
FROM " . TABLE_ADDITIONAL_IMAGES . "
WHERE products_id=" . $products['products_id'] ."");
if (!tep_db_num_rows($img_query)) {
$imageextra2 = " ";
} else {
$img_rows=tep_db_num_rows($img_query);
while ($img = tep_db_fetch_array($img_query)) {
$img2 = $img['popup_images'];
$pid = $img['products_id'];
$a = array($img2);
foreach($a as &$img){
}
foreach($a as $imageextra) {
$imageextra = "http://www.URL.com/images/". $img2.";";
$imageextra2 .= $imageextra;
}
} }
But when I export more than one product that have additional images the images from the line abowe follows to the next line in the csv file.
Heres an exampe of the result. Each item has one additional image:
Item-A;AdditionalImage-A.jpg;AdditionalImage-A2.jpg
Item-B;AdditionalImage-A.jpg;AdditionalImage-A2.jpg;AdditionalImage-B.jpg;AdditionalImage-B2.jpg
Item-C;AdditionalImage-A.jpg;AdditionalImage-A2.jpg;AdditionalImage-B.jpg;AdditionalImage-B2.jpg;AdditionalImage-C.jpg;AdditionalImage-C2.jpg
What can I do to get this working?
Cheers,
Fredrik
Edit
Below is the complete section of php that grab the info and generate the export file:
<?php
require('includes/application_top.php');
if (isset($_POST['create'])) {
if (isset($_POST['product']) && is_array($_POST['product'])) {
foreach ($_POST['product'] as $product_id) {
$products_query_raw = "select p.products_id, p.products_image, p.products_model, products_image_pop, p.products_price, p.products_quantity, p.products_tax_class_id, pd.products_name, pd.products_description from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd where p.products_id = $product_id and pd.products_id = p.products_id and pd.language_id = $languages_id";
$products_query = tep_db_query($products_query_raw);
if ($products = tep_db_fetch_array($products_query)) {
//++++ QT Pro: End Changed Code
$products_attributes_query = tep_db_query("select count(*) as total from " . TABLE_PRODUCTS_OPTIONS . " popt, " . TABLE_PRODUCTS_ATTRIBUTES . " patrib where patrib.products_id='" . $products['products_id'] . "' and patrib.options_id = popt.products_options_id and popt.language_id = '" . (int)$languages_id . "'");
$products_attributes = tep_db_fetch_array($products_attributes_query);
if ($products_attributes['total'] > 0) {
//++++ QT Pro: Begin Changed code
$products_id = $products['products_id'];
require_once(DIR_WS_CLASSES . 'pad_single_radioset_print.php');
$class = 'pad_single_radioset';
$pad = new $class($products_id);
$attribs .= $pad->draw();
//++++ QT Pro: End Changed Code
}
$product_desc = (isset($_POST['strip_tags']) && ($_POST['strip_tags'] == '1'))
? strip_tags($products['products_description'],'<br>, <li>, </li>, <ul>, </ul>') //ORG
: $products['products_description'];
$tax_rate = 0;
$taxes_query_raw = "select tax_rate from " . TABLE_TAX_RATES . " where tax_class_id = " . $products['products_tax_class_id'];
$taxes_query = tep_db_query($taxes_query_raw);
while ($taxes = tep_db_fetch_array($taxes_query)) {
$tax_rate += $taxes['tax_rate'];
}
$tax = ($products['products_price'] * $tax_rate) / 100;
$stock = $products['products_quantity'];
$product_desc=preg_replace("/([[:space:]]{2,})/",' ',$product_desc);
// Categories - just show the sub-category
$categories_list = Array();
$categories_query_raw = "select cd.categories_name, cd.categories_id from " . TABLE_PRODUCTS_TO_CATEGORIES . " ptc, " . TABLE_CATEGORIES_DESCRIPTION . " cd where ptc.products_id = " . $products['products_id'] . " and cd.categories_id = ptc.categories_id and cd.language_id = $languages_id";
$categories_query = tep_db_query($categories_query_raw);
while ($categories = tep_db_fetch_array($categories_query)) {
$categories_list[] = $categories['categories_name'];
$categories_id = $categories['categories_id'];
}
$category_name = implode(' / ', $categories_list);
// Additional images
$img_query=tep_db_query("SELECT additional_images_id, products_id, popup_images
FROM " . TABLE_ADDITIONAL_IMAGES . "
WHERE products_id=" . $products['products_id'] ."");
if (!tep_db_num_rows($img_query)) {
$imageextra2 = "; ; ";
} else {
$img_rows=tep_db_num_rows($img_query);
while ($img = tep_db_fetch_array($img_query)) {
$img2 = $img['popup_images'];
$pid = $img['products_id'];
$a = array($img2);
$imageextra2 = " "; # This avoid letting the additional images from lines abowe follow.
foreach($a as $imageextra) {
$imageextra = "http://www.URL.com/images/". $img2.";";
$imageextra2 .= $imageextra;
}
}
}
$export .=
$products['products_model'].';'.
$products['products_name'].';'.
$product_price.';'.
$products['products_quantity'].';'.
$product_desc.';'.
$categories_id.';'.
$shipping_cost.';'.
'http://www.URL.com/images/'.basename($products['products_image_pop']).';'.
$imageextra2.
"\n";
}
}
if ($fp = #fopen($_SERVER['DOCUMENT_ROOT'] . '/feed/t-butik.csv', 'w')) {
$utf = iconv("windows-1252","ISO-8859-1",$export);
$out = 'variable_name='.$utf;
fwrite($fp, $utf);
fclose($fp);
$messageStack->add("Feed generates successfully!!!", 'success');
} else {
$messageStack->add("ERROR: Permissions error trying to write feed to disk.", 'error');
}
}
}
?>
There doesn't seem to be enough of the code to give you an absolute answer but my guess would be that the variable $imageextra2 is not being reset on each iteration.
When you change a product you should reset the variable thats holding the images, which I assume is $imageextra2
Change This
if (!tep_db_num_rows($img_query)) {
$imageextra2 = "; ; ";
} else {
$img_rows=tep_db_num_rows($img_query);
while ($img = tep_db_fetch_array($img_query)) {
$img2 = $img['popup_images'];
$pid = $img['products_id'];
$a = array($img2);
$imageextra2 = " "; # This avoid letting the additional images from lines abowe follow.
foreach($a as $imageextra) {
$imageextra = "http://www.URL.com/images/". $img2.";";
$imageextra2 .= $imageextra;
}
}
}
To This
$imageextra2 = " "; # resets images
if (tep_db_num_rows($img_query)) {
$img_rows=tep_db_num_rows($img_query);
while ($img = tep_db_fetch_array($img_query)) {
$img2 = $img['popup_images'];
$pid = $img['products_id'];
$a = array($img2);
foreach($a as $imageextra) {
$imageextra = "http://www.URL.com/images/". $img2.";";
$imageextra2 .= $imageextra;
}
}
}
Best Regards,
Jason

Categories