Senin, 10 September 2018

Code Igniter, retrieving return value from view

You might need someday retrieving a return value from view. Well, I am glad that I finally knew it that it is possible.

So this is how we can do it.

The common usage of function to load a view is like this.

$this->load->view("myPage", $arrayOfData);


But if your view should return a value, then do this

$returnVal = $this->load->view("myPage", $arrayOfData, TRUE);

Yup, this function has a third parameter. If you set it as TRUE, than it will return the value, otherwise it will return CI Object.

Code Igniter ERROR syntax error, unexpected 'use' (T_USE)

Some of you might face this problem, when you try to integrate github library to your Project and you are using CodeIgniter.

The main problem is

You cannot put 'use' inside a function.

But you might have to use it inside your model. To solve it, I put the php file using the 'use' inside the 'views' directory and load it as a views.

In this example I am using the Github's shamir secret sharing library that is developed by Oliver Mueller and Stefan Gehrig.

model.php
<?php 

public function shamirSecretSharing()
{
       $data['message'] = 'this is a secret';
       return $this->load->views('shamir/compute');
}


?>

And here is my compute.php located in "..\application\views\shamir\compute.php".

compute.php
<?php 

require_once APPPATH. 'views/shamir/autoload.php';

use TQ\Shamir\Secret;

$shares = Secret::share($message, 3, 3);

return $shares;

?>

I'm not going to explain the function of the library. What I want to show is how I use the Library inside my model. If you ask me, what APPPATH mean. You can read it here.

required, required_once, include Problem in Codeigniter

I had a problem integrating a library downloaded from github in codeigniter. One of the problem is the "required_once" function.

I'm sure there are many ways to solve this problem. I have two ways to share in this post.

Problem:

In every library downloaded from github, we need to call the autoload.php file at the start using "required_once". In some chases, required_once will be used almost in every php file. It is an old way to integrate github library in your code.

First Way:
Load it as a view.
For example, you need to include the autoload.php file.
Put the whole directory of the library inside the directory of 'views' and do this in the controller

controller.php
<?php

public function myFunc()
{
    $this->load->view('yourLib/autoload');
    $this->load->view('yourPageFile');
}
?>

Or you can do that inside the model as well'

aModel.php
<?php

public function modelFunc()
{
    $var=$this->load->view('yourLib/autoload','',true);
    
    your code ....
}
?>

Take a look at the load views. There are 3 parameters of the view function. The first parameter is the file of the page that you want to show, second parameter is for the variables that will be used in the page and the third parameter is set to TRUE. It will tell the CI that you want to return a value from view. If you don't set it to TRUE, it will return an CI-Object.

Second Way:
Use APPPATH macro. APPPATH is a macro referring your application Path.

If I do this
include_once APPATH."views/myLib/autoload.php";

that will give you  
include_once "c:\xampp\htdocs\myApp\application\views\myLib\autoload.php";

I hope this can help you somehow

Minggu, 02 September 2018

Sending Email with PHP

I got a request to create a web Application with a requirement sending a Warning via E-mail. First thing I did was googling, "sending Email with PHP", "how to send Email with PHP", ect. Thanks to many website and its author that give me a lot of information how to do that. I do really thank you guys for every information that you provide on your website.

I found so many tutorial with the complete library and the example how to use it. Unfortunately, many don't work. BUT...I blame my self, I'm the one who doesn't know how to use it. Then, I stopped for a minute and try to figure it out, how is the logical steps for a web server using PHP to send an E-mail. let me straight to the point, we cannot send an E-mail just using the PHP. Maybe I'm wrong at this point, but if we really could do it, I'm sure that we should make some changes in our web server's configuration.

So, what can we do then? We create a Mail Client using PHP. 
  1. Check the mail client manual setting in your web host. If you are using cpanel, check in Email Accounts --> Connect Devices --> Set up Mail Client
  2. Download PHPMailer here. Thanks to Marcus Bointon that provides us this library.
  3. Create the autoload.php, read it here how to do it. 
Before I continue to the PHP code, lets create the autoload.php for the PHPMailer library. Here is how the autoload.php looks like:

<?php
/**
 * An example of a project-specific implementation.
 *
 * After registering this autoload function with SPL, the following line
 * would cause the function to attempt to load the \Foo\Bar\Baz\Qux class
 * from /path/to/project/src/Baz/Qux.php:
 *
 *      new \Foo\Bar\Baz\Qux;
 *
 * @param string $class The fully-qualified class name.
 * @return void
 */
spl_autoload_register(function ($class) {

    // project-specific namespace prefix
    $prefix = 'PHPMailer\PHPMailer';

    // base directory for the namespace prefix
    $base_dir = __DIR__ . '/src/';

    // does the class use the namespace prefix?
    $len = strlen($prefix);
    if (strncmp($prefix, $class, $len) !== 0) {
        // no, move to the next registered autoloader
        return;
    }

    // get the relative class name
    $relative_class = substr($class, $len);

    // replace the namespace prefix with the base directory, replace namespace
    // separators with directory separators in the relative class name, append
    // with .php
    $file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';

    // if the file exists, require it
    if (file_exists($file)) {
        require $file;
    }
});

Put that autoload.php inside PHPMailer directory.

I am using Code Igniter, I put the PHPMailer inside the view. So I load it as a view to use the library.

This is how my function in controller looks like:

public function testMail()
{
    $this->load->view('PHPMailer/autoload');
    $this->load->view('sendMail');
}

and here is the sendMail.php


<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;


$mail = new PHPMailer(true);                              // Passing `true` enables exceptions
try {
    //Server settings
    $mail->SMTPDebug = 2;                                 // Enable verbose debug output
    $mail->isSMTP();                                      // Set mailer to use SMTP
    $mail->Host = 'mail.yourHost.com';                  // Specify main and backup SMTP servers
    $mail->SMTPAuth = true;                               // Enable SMTP authentication
    $mail->Username = 'user@yourHost.com';                 // SMTP username
    $mail->Password = 'password';                           // SMTP password
    $mail->SMTPSecure = 'tls';                            // Enable TLS encryption, `ssl` also accepted
    $mail->Port = 26;                                    // TCP port to connect to

    //Recipients
    $mail->setFrom('user@yourHost.com', 'User's Name');
    $mail->addAddress('recepient@test.com', 'Recipient Name');     // Add a recipient
    //$mail->addAddress('recepient@test.com');               // Name is optional
    $mail->addReplyTo('user@yourHost.com', 'User's Name');
    //$mail->addCC('cc@example.com');
   // $mail->addBCC('bcc@example.com');

    //Attachments
   // $mail->addAttachment('/var/tmp/file.tar.gz');         // Add attachments
    //$mail->addAttachment('/tmp/image.jpg', 'new.jpg');    // Optional name

    //Content
    $mail->isHTML(true);                                  // Set email format to HTML
    $mail->Subject = 'Subject';
    $mail->Body    = 'write something here';
    //$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';

    $mail->send();
    echo 'Message has been sent';
} catch (Exception $e) {
    echo 'Message could not be sent. Mailer Error: ', $mail->ErrorInfo;
}

?>

You can check your SMTP Configuration on your cpanel. That is already everything.

GitHub autoload.php

Some of you may need autoload.php after downloading a PHP library from gitHub. This post may be helpfull.

Here is how autoload.php looks like:

<?php
/**
 * Users who do not have 'composer' to manage dependencies, include this
 * file to provide auto-loading of the classes in this library. 
 */
spl_autoload_register ( function ($class) {
 /*
  * PSR-4 autoloader, based on PHP Framework Interop Group snippet (Under MIT License.)
  * https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader-examples.md
  */
 $prefix = "Project\";
 $base_dir = __DIR__ . "/src/";
 
 /* Only continue for classes in this namespace */
 $len = strlen ( $prefix );
 if (strncmp ( $prefix, $class, $len ) !== 0) {
  return;
 }
 
 /* Require the file if it exists */
 $relative_class = substr ( $class, $len );
 $file = $base_dir . str_replace ( '\\', '/', $relative_class ) . '.php';
 if (file_exists ( $file )) {
  require $file;
 }
} );
?>

I'd like you to take a look at the '$prefix = "Project\\";'.  What you have to do is just change the "Project" with the prefix used referring to $base_dir directory. The easiest way to find out is by opening the example.

For example, I was using Mike42 library to print to POS printer. Here is just a part of the example code:

<?php
/* Example print-outs using the older bit image print command */
require __DIR__ . '/../autoload.php';
use Mike42\Escpos\Printer;
use Mike42\Escpos\EscposImage;
use Mike42\Escpos\PrintConnectors\FilePrintConnector;

$connector = new FilePrintConnector("php://stdout");
$printer = new Printer($connector);

In Mike42's case, the autoload.php will be:

<?php
/**
 * Users who do not have 'composer' to manage dependencies, include this
 * file to provide auto-loading of the classes in this library. 
 */
spl_autoload_register ( function ($class) {
 /*
  * PSR-4 autoloader, based on PHP Framework Interop Group snippet (Under MIT License.)
  * https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader-examples.md
  */
 $prefix = "Mike42\";
 $base_dir = __DIR__ . "/src/Mike42/";
 
 /* Only continue for classes in this namespace */
 $len = strlen ( $prefix );
 if (strncmp ( $prefix, $class, $len ) !== 0) {
  return;
 }
 
 /* Require the file if it exists */
 $relative_class = substr ( $class, $len );
 $file = $base_dir . str_replace ( '\\', '/', $relative_class ) . '.php';
 if (file_exists ( $file )) {
  require $file;
 }
} );
?>

The prefix Mike42 refers to directory /src/Mike42.

I hope this can help you