<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Cain&#039;s Blog</title>
	<atom:link href="https://vanmason.web.id/wp/feed/" rel="self" type="application/rss+xml" />
	<link>https://vanmason.web.id/wp</link>
	<description>about programming and other stuff</description>
	<lastBuildDate>Fri, 01 Sep 2017 07:02:25 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://vanmason.web.id/wp/wp-content/uploads/2026/06/cropped-coding-32x32.png</url>
	<title>Cain&#039;s Blog</title>
	<link>https://vanmason.web.id/wp</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Generate File Word Dari Template</title>
		<link>https://vanmason.web.id/wp/2017/09/08/generate-file-word-dari-template/</link>
		
		<dc:creator><![CDATA[Cain]]></dc:creator>
		<pubDate>Fri, 08 Sep 2017 09:20:13 +0000</pubDate>
				<category><![CDATA[Yii2]]></category>
		<guid isPermaLink="false">https://vanmason.web.id/wp/?p=63</guid>

					<description><![CDATA[Kali ini kita akan mencoba untuk menggenerate file word dari template yang sudah ada menggunakan Yii2. Studi kasusnya misal sebagai berikut. Sebuah sistem informasi akan menggenerate surat undangan yang dapat diunduh oleh pengguna. Surat tersebut mengikuti sebuah template yang sudah ada di dalam sistem (diunggah oleh admin). Mungkin banyak yang bertanya-tanya, kenapa file word, kenapa bukan file pdf saja. Secara coding memang lebih mudah jika yang digenerate adalah sebuah file pdf. Akan tetapi bisa saja sistem membutuhkan template surat yang dinamis, dapat berubah sewaktu-waktu, dapat diunggah oleh admin kapanpun, dan ketika surat yang sudah digenerate diunduh, surat tersebut memerlukan modifikasi <div><a class="btn btn-primary" href="https://vanmason.web.id/wp/2017/09/08/generate-file-word-dari-template/" >Read More</a> </div>]]></description>
										<content:encoded><![CDATA[<p>Kali ini kita akan mencoba untuk menggenerate file word dari template yang sudah ada menggunakan Yii2. Studi kasusnya misal sebagai berikut. Sebuah sistem informasi akan menggenerate surat undangan yang dapat diunduh oleh pengguna. Surat tersebut mengikuti sebuah template yang sudah ada di dalam sistem (diunggah oleh admin).</p>
<p><span id="more-63"></span>Mungkin banyak yang bertanya-tanya, kenapa file word, kenapa bukan file pdf saja. Secara coding memang lebih mudah jika yang digenerate adalah sebuah file pdf. Akan tetapi bisa saja sistem membutuhkan template surat yang dinamis, dapat berubah sewaktu-waktu, dapat diunggah oleh admin kapanpun, dan ketika surat yang sudah digenerate diunduh, surat tersebut memerlukan modifikasi lagi di luar sistem.</p>
<p>File word paling mengakomodasi kebutuhan-kebutuhan di atas. Sudah umum kita ketahui pengguna komputer awam sangat jarang yang menginstall editor pdf di komputernya, pada umumnya mereka memiliki editor word.</p>
<p>Langsung saja, pertama yang kita perlukan adalah library phpoffice/phpword. Install ke Yii2 menggunakan composer</p>
<p><code class="EnlighterJSRAW" data-enlighter-language="null">composer require phpoffice/phpword:"*"</code></p>
<p>Tidak lupa kita tentukan template word yang dapat digunakan. Misal, template akan diisikan nama pengguna dan tanggal ketika file word tersebut diunduh.</p>
<p><img fetchpriority="high" decoding="async" class="alignnone wp-image-66" src="https://vanmason.web.id/wp/wp-content/uploads/2017/09/template-word-300x263.png" alt="" width="407" height="357" srcset="https://vanmason.web.id/wp/wp-content/uploads/2017/09/template-word-300x263.png 300w, https://vanmason.web.id/wp/wp-content/uploads/2017/09/template-word-768x672.png 768w, https://vanmason.web.id/wp/wp-content/uploads/2017/09/template-word-150x131.png 150w, https://vanmason.web.id/wp/wp-content/uploads/2017/09/template-word.png 960w" sizes="(max-width: 407px) 100vw, 407px" /></p>
<p>Dapat diperhatikan ada dua &#8220;kata&#8221; yang tidak biasa, yaitu <code class="EnlighterJSRAW" data-enlighter-language="null">${tanggalSurat}</code> dan <code class="EnlighterJSRAW" data-enlighter-language="null">${nama}</code> kedua &#8220;kata&#8221; tersebut akan diubah oleh sistem saat pengguna mengunduh file word yang menggunakan template tersebut.</p>
<p>Tentu saja template word diatas harus diunggah ke server dan dapat diakses oleh Yii2. Saat pengguna mengunduh file word, Yii2 juga harus menentukan template mana yang akan digunakan. Tentang hal itu tidak akan dibahas di tutorial ini.</p>
<p>Langkah berikutnya adalah membuat action untuk mengunduh file word pada sebuah controller yang akan diakses oleh pengguna.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">public function actionUnduhSurat()
{
	// Ambil template
	$fileTemplateWord = Yii::$app-&gt;basePath.'/web/upload/template_surat.docx';
	// Gunakan template prosesor
	$templateProcessor = new TemplateProcessor($fileTemplateWord);
	// Set value semua variabel yang ada di template
	$templateProcessor-&gt;setValue('tanggalSurat',date('j M Y');
	$templateProcessor-&gt;setValue('nama',Yii:$app-&gt;user-&gt;identity-&gt;nama);
	// Save file word di folder temporary server
	$temp_file_word = tempnam(sys_get_temp_dir(), 'PHPWord');
	$templateProcessor-&gt;saveAs($temp_file_word);
	// Kirimkan file untuk didownload oleh pengguna
	$filename = "Surat_Tugas.docx";
	header('Content-Description: File Transfer');
	header('Content-Type: application/octet-stream');
	header('Content-Disposition: attachment; filename='.$filename);
	header('Content-Transfer-Encoding: binary');
	header('Expires: 0');
	header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
	header('Pragma: public');
	header('Content-Length: ' . filesize($temp_file_word));
	flush();
	readfile($temp_file_word);
	// Hapus file word dari folder temporary server
	unlink($temp_file_word);
}</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Autentifikasi Jasig CAS</title>
		<link>https://vanmason.web.id/wp/2017/08/26/autentifikasi-jasig-cas/</link>
		
		<dc:creator><![CDATA[Cain]]></dc:creator>
		<pubDate>Sat, 26 Aug 2017 13:23:46 +0000</pubDate>
				<category><![CDATA[Yii2]]></category>
		<guid isPermaLink="false">https://vanmason.web.id/wp/?p=19</guid>

					<description><![CDATA[Cara mengintegrasikan autentifikasi Jasig CAS dengan Yii2, pertama-tama install terlebih dahulu library jasig/phpcas menggunakan composer composer require jasig/phpcas:"*" Buat model untuk autentifikasi pengguna, misal CasAuth.php use yii\base\Model; use Yii; class CasAuth extends Model { public $username; private $_user = false; /** * Finds user by [[username]] * * @return Admin&#124;null */ public function getAdmin() { if ($this-&#62;_user === false) { $this-&#62;_user = Admin::findByUsername(trim(strtolower($this-&#62;username))); } return $this-&#62;_user; } public function loginAdmin() { $duration = 60*20; if ($this-&#62;username) { $user = $this-&#62;getAdmin(); if ($user) { $user-&#62;last_login_time = date('Y-m-d H:i:s', time()); $user-&#62;login_ip = Yii::$app-&#62;request-&#62;getUserIP(); $user-&#62;update(); return Yii::$app-&#62;user-&#62;login($this-&#62;getAdmin(),$duration); } else { return false; } <div><a class="btn btn-primary" href="https://vanmason.web.id/wp/2017/08/26/autentifikasi-jasig-cas/" >Read More</a> </div>]]></description>
										<content:encoded><![CDATA[<p>Cara mengintegrasikan autentifikasi Jasig CAS dengan Yii2, pertama-tama install terlebih dahulu library jasig/phpcas menggunakan composer</p>
<p><code class="EnlighterJSRAW" data-enlighter-language="null">composer require jasig/phpcas:"*"</code></p>
<p><span id="more-19"></span>Buat model untuk autentifikasi pengguna, misal CasAuth.php</p>
<pre class="EnlighterJSRAW" data-enlighter-language="php" data-enlighter-highlight="18">use yii\base\Model;
use Yii;

class CasAuth extends Model
{
    public $username;

    private $_user = false;

    /**
     * Finds user by [[username]]
     *
     * @return Admin|null
     */
    public function getAdmin()
    {
        if ($this-&gt;_user === false) {
            $this-&gt;_user = Admin::findByUsername(trim(strtolower($this-&gt;username)));
        }

        return $this-&gt;_user;
    }

    public function loginAdmin()
    {
        $duration = 60*20;
        if ($this-&gt;username) {
            $user = $this-&gt;getAdmin();
            if ($user) {
                $user-&gt;last_login_time = date('Y-m-d H:i:s', time());
                $user-&gt;login_ip = Yii::$app-&gt;request-&gt;getUserIP();
                $user-&gt;update();
                return Yii::$app-&gt;user-&gt;login($this-&gt;getAdmin(),$duration);
            } else {
                return false;
            }

        } else {
            return false;
        }
    }
}</pre>
<p>Pada baris ke-18 <code class="EnlighterJSRAW" data-enlighter-language="null">Admin::findByUsername(trim(strtolower($this-&gt;username)))</code> adalah pemanggilan terhadap fungsi findByUsername dari model Admin. Fungsi ini akan mengembalikan satu record data Admin berdasarkan username. Model Admin selain <em>extends</em> ActiveRecord juga harus <em>implements</em> IdentityInterface.</p>
<pre class="EnlighterJSRAW">use Yii;
use yii\db\ActiveRecord;
use yii\web\IdentityInterface;

class Admin extends ActiveRecord implements IdentityInterface
{
    const STATUS_DELETED = 0;
    const STATUS_ACTIVE = 10;
    ...
    /**
     * Finds user by username
     *
     * @param string $username
     * @return static|null
     */
    public static function findByUsername($username)
    {
        return static::findOne(['username' =&gt; $username, 'status' =&gt; self::STATUS_ACTIVE]);
    }

    ...
}</pre>
<p>Buat actionLogin pada file SiteController.php jadi seperti dibawah ini:</p>
<pre class="EnlighterJSRAW" data-enlighter-highlight="3,11-12,17,28">    public function actionLogin()
    {
        \phpCAS::client(CAS_VERSION_2_0, Yii::$app-&gt;params['casHost'] , Yii::$app-&gt;params['casPort'], Yii::$app-&gt;params['casContext']);

        \phpCAS::setNoCasServerValidation();
        \phpCAS::handleLogoutRequests(false);
        \phpCAS::forceAuthentication();

        $username = \phpCAS::getUser();

        $model = new CasAuth(['username'=&gt;$username]);
        if ($model-&gt;loginAdmin()) {
            return $this-&gt;goHome();
        } else {
            if ($model) {
                $service = strval(Yii::$app-&gt;request-&gt;hostInfo.'/site');
                \phpCAS::logout(array('service'=&gt;$service));
            }
            return $this-&gt;redirect('/site');
        }
    }

    public function actionLogout()
    {
        \phpCAS::client(CAS_VERSION_2_0, Yii::$app-&gt;params['casHost'], Yii::$app-&gt;params['casPort'], Yii::$app-&gt;params['casContext']);

        $service = strval(Yii::$app-&gt;request-&gt;hostInfo.'/site/logout-cas');
        \phpCAS::logout(array('service'=&gt;$service));
    }

    public function actionLogoutCas()
    {
        Yii::$app-&gt;user-&gt;logout();

        return $this-&gt;goHome();
    }</pre>
<p>Perhatikan baris ke-3 <code class="EnlighterJSRAW" data-enlighter-language="null">Yii::$app-&gt;params['casHost']</code>, <code class="EnlighterJSRAW" data-enlighter-language="null">Yii::$app-&gt;params['casPort']</code>, dan <code class="EnlighterJSRAW" data-enlighter-language="null">Yii::$app-&gt;params['casContext']</code> adalah konfigurasi server CAS yang telah disimpan di file <code class="EnlighterJSRAW" data-enlighter-language="null">config\params-local.php</code>. Lihat di bawah ini</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">return [
    'casHost' =&gt; "sso.domain.com", // host CAS
    'casPort' =&gt; 443, // port CAS
    'casContext' =&gt; "",
    ....
];
</pre>
<p>Kembali ke fungsi actionLogin, pada baris ke-7 adalah fungsi untuk melakukan autentifikasi SSO ke server CAS, kemudian saat autentifikasi berhasil pada baris ke-9 username CAS disimpan ke variabel <code class="EnlighterJSRAW" data-enlighter-language="null">$username</code>. Selanjutnya buat instance model CasAuth dengan inisialisasi username menggunakan variabel <code class="EnlighterJSRAW" data-enlighter-language="null">$username</code>(baris ke-11).</p>
<p>Pada baris ke-12 lakukan pengecekan, apakah pengguna dengan username tersebut ada di dalam record data Admin.</p>
<p>Baris ke-17 cukup penting, karena bisa jadi pengguna dapat melakukan autentifikasi di sistem CAS tetapi tidak termasuk sebagai Admin. Untuk kasus seperti itu maka akan lebih baik jika pengguna tersebut dilogout sesionnya dari sistem CAS.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Hello World</title>
		<link>https://vanmason.web.id/wp/2017/08/22/hello-world/</link>
		
		<dc:creator><![CDATA[Cain]]></dc:creator>
		<pubDate>Tue, 22 Aug 2017 08:51:35 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://vanmason.web.id/wp/?p=6</guid>

					<description><![CDATA[Test first post]]></description>
										<content:encoded><![CDATA[<p>Test first post</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
