如何在php上调用同一个类中的其他方法?

时间:2013-12-15 19:25:08

标签: php laravel-4 tcpdf

美好的一天,

我试图通过在laravel 4控制器中创建自定义方法来修改我的TCPDF标头,继承我的代码:

<?php 

ini_set('max_execution_time', 300); //5minutes


class PdfController extends BaseController
{

public function Header() {
    // Logo
    $image_file = K_PATH_IMAGES.'logo_example.jpg';
    $this->Image($image_file, 10, 10, 15, '', 'JPG', '', 'T', false, 300, '', false, false, 0, false, false, false);
    // Set font
    $this->SetFont('helvetica', 'B', 20);
    // Title
    $this->Cell(0, 15, '<< TCPDF Example 003 >>', 0, false, 'C', 0, '', 0, false, 'M', 'M');
}


public function poPdf()
{


    $pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);

// set document information
$pdf->SetCreator(PDF_CREATOR);
$pdf->SetAuthor('Nicola Asuni');
$pdf->SetTitle('TCPDF Example 048');
$pdf->SetSubject('TCPDF Tutorial');
$pdf->SetKeywords('TCPDF, PDF, example, test, guide');

 // set default header data
 $pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 048', PDF_HEADER_STRING);

// set header and footer fonts
$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));

// set default monospaced font
$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);

// set margins
$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);

// set auto page breaks
$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);

// set image scale factor
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);

// set some language-dependent strings (optional)
if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
require_once(dirname(__FILE__).'/lang/eng.php');
$pdf->setLanguageArray($l);
}

// ---------------------------------------------------------

// set font
$pdf->SetFont('helvetica', 'B', 20);

// add a page
$pdf->AddPage();

$pdf->Write(0, 'Example of HTML tables', '', 0, 'L', true, 0, false, false, 0);

$pdf->SetFont('helvetica', '', 8);

// -----------------------------------------------------------------------------

// $all = Session::all();
$data = Session::get('products');

// dd($data);

// -----------------------------------------------------------------------------

// NON-BREAKING TABLE (nobr="true")

$tbl = <<<EOD
<table border="1" cellpadding="2" cellspacing="2" nobr="true">
<thead>
<tr>
<td width="30px;">Id</td>
<td width="130px;">Name</td>
<td width="220px;">Description</td>
<td width="80px;">Quantity</td>
<td width="80px;">Price</td>
<td width="80px;">Subtotal</td>
</tr>
<thead>
$data
</table>
EOD;

$pdf->writeHTML($tbl, true, false, false, false, '');

// -----------------------------------------------------------------------------

//Close and output PDF document
$pdf->Output('example_048.pdf', 'I');


}
}

我的问题如何将标题设置为我之前定义的Header方法的值。

喜欢$pdf->SetHeaderData(public function Header());

3 个答案:

答案 0 :(得分:2)

只需调用另一种方法(dohhh)$this->Header() ...

答案 1 :(得分:1)

我认为你应该做的第一件事就是在PHP中学习更多关于继承的知识,因为你的示例代码的大多数问题都与误解哪个类正在扩展哪个类有关。如果你搜索“PHP中的对象继承”,你会发现很多很棒的文章。

现在,转到实际的代码......

我可以看到你扩展了BaseController。通常,如果要实现将要处理传入Web请求的Controller类,则会扩展此类。 Laravel 4实现了一种相当简单的URI控制器/动作方法。例如,您可以实现一个名为WidgetController的控制器(可以扩展BaseController),该控制器具有getIndex方法,当您点击/widget URI时将调用该控制器。此外,您可以实现getDetail方法,该方法会在/widget/detail URI被点击时显示。

示例代码中的方法似乎不适合这种方法,所以我猜这个类是一个实际的Controller类,因此你不需要扩展{{1 }}

就TCPDF而言,通常有两种方法可以使用它。一种方法是简单地创建它的实例,就像在示例代码中所做的那样,并开始调用它的方法。另一种方法是扩展 TCPDF,然后创建该类的实例。如果这样做,则可以覆盖某些方法,例如BaseController方法,每次TCPDF添加新页面时都会调用该方法。但是,在使用第一种方法时(即直接使用TCPDF实例)实现Header()方法不会实现任何效果,因为它不会被任何东西自动调用。如果您仔细查看TCPDF包中的示例3,您将看到作者创建了一个名为Header()的类,它扩展(或继承自)MYPDF,然后使用{{1}的实例。 1}}。您错过了示例代码中的这一关键点,该代码继承自Laravel的TCPDF而不是MYPDF

鉴于标题中没有任何内容似乎是动态的,那么您可以坚持使用您正在使用的方法(即使用BaseController类的实例)并简单地调用TCPDF,这将允许您设置TCPDF将在每页的标题中呈现的图像和文本。

或者,如果您的代码确实不是控制器,那么您可以TCPDF而不是扩展$pdf->setHeaderData(),然后自动调用extend TCPDF方法。

我刚才意识到上面的最后两段可能就是我需要编写的内容,但希望您或其他人会发现额外的信息对您有帮助。 : - )

答案 2 :(得分:0)

是的,就像它说的那样,你用$ this调用其他相同功能的方法。也许你忘了归还它:

return $this->otherMethod();