Jump to content
Sign in to follow this  
safa

[EĞİTİM]ödeme modülü yapma(offline)

Recommended Posts

prestashop'ta modül egeliştirme olayı tamamen gizli kalmış durumda. artık bu ödeme modüllerini nasıl yapıldığını anlatmak istiyorum. sadece bu ortadaki karışıklık ve herkesin birbirine hakaret etmesinden bıktığımdan dolayı.
----------------------------------------------------------------------------------------------------------------
bilindi gibi prestashop smarty ye uyumlu şekilde çalışmaktadır, ve prestashop içinde gelen class yapılarının bütün modülleri kontrol ettiğini unutmayalım.
ilk adım.
Modül ismi:
modül isimlendirmesini yaparken. örnek "offlinecardpayment" diye bir klasör açığımız zaman bu klasörün içinde aynı isimde offlinecardpayment.php dosyasının olması gerekir. ilk adım olarak offlinecardpayment diye bir klasör açın ve içinde offlinecardpayment.php diye bir dosya oluşturun. eğer safa diye bir klasör açasanız içine safa.php dosyasını oluşturmak zorundasınız.
ve bu dosyanın içine biraz kod yazalım :)

<?php

class offlinecardpayment extends PaymentModule  //burada dikkat edilirse bu class in bir payment modülü olduğunu prestashop class larına bildiyoruz. işte bu sayade her modülün işlevi birbirinden ayrılmış oluyor.
{

   private $_html = '';
   private $_postErrors = array();

   function __construct()
   {
       $this->name = 'offlinecardpayment';
       $this->tab = 'Payment';// admin panelindeki modül guruplarından payment modülü katagorisine atama işlemi
       $this->version = 1;

       parent::__construct(); // bu parent yazılan modülün çevirilerine izin verilmesini açıklıyor.

       $this->page = basename(__FILE__, '.php');
       $this->displayName = $this->l('Offline Payments Module');// bu modülün admin panelinde görünen ismi
       $this->description = $this->l('Take Payment Card details for offline processing'); // burasıda yine admin panelindeki modülün açıklaması

}
}
?>



bu şekilde dosyayı kaydettiğiniz zaman admin panelinde ilk modülünüzü görebilirsiniz.:)

adım adım açıklanacaktır. arkadaşlar lütfen modül bitmeden yorum yazmayın.

Share this post


Link to post
Share on other sites

modülün install function yazılması
admin bölümünde her modülün yanında install butonu vardır. yine prestashop class yapılarına uygun olarak kur va kaldır. sistemine göre tasarlanmıştır. ilk aşamada bu install function inı yazalım.:)

public function install()
{
if (!parent::install()
OR !$this->createPaymentcardtbl() //girilen kredi kartı bilgilerini veritabanında tutumak için için ayrı bir function yazacaz ilerde. ilerleyen postlarda bunu görebilrisiniz
           OR !$this->registerHook('invoice')
OR !$this->registerHook('payment')
OR !$this->registerHook('paymentReturn'))
return false;
return true;
}


------------------------------------------

OR !$this->createPaymentcardtbl()


işte bu fonsiyonda girilen kart bilgilerini tutacaz.

OR !$this->registerHook('invoice')
OR !$this->registerHook('payment')
OR !$this->registerHook('paymentReturn')


bu üç satırında temel işlevi bize ödeme modül boyunca işimize yarayacak. .tpl dosyalarını oluşma izninin prestashop class ları tarafında verilmesini sağlamaktır.

Share this post


Link to post
Share on other sites

createPaymentcardtbl()
işte şimdi modülün install functionu içinde işimize yarayacak createPaymentcardtbl() functionunu yazlaım ve girilen kart bilgilerini veritabanımıza tutmak için önemli:)
id_payment = her sipariş için bir numara kaydediyoruz.
id_order = girilen kart bilgilerini hangi spairiş için ilşkilendiriyoruz
cardholder_name = kredi kartı üzerinde yazlılan ismi tutuyoruz
cardnumber = kredi kartı numarasını tutuyoruz
expiry date = kredi kartının son kullanma tarihini tutuyoruz.



function createPaymentcardtbl()
{

                   $db = Db::getInstance();
           $query = "CREATE TABLE `"._DB_PREFIX_."order_paymentcard` (
`id_payment` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`id_order` INT NOT NULL ,
`cardholdername` TEXT NOT NULL ,
`cardnumber` TEXT NOT NULL
) ENGINE = MYISAM ";

       $db->Execute($query);

return true;
}


bu satırlarıda offlinecardpayment.php doaysına yaerleştirip modülü kur emri verildikten sonra veritabanınızda
ps_module tablosunda offlinecardpayment diye bir alan açıldığına bakabilirsiniz.

Share this post


Link to post
Share on other sites

/order.php?step=3 :)
şimdide müşterinin kargo seçimini, fatura adress seçimi yaptıktan sonra ödeme türlerini seçtiği alanda bir işret verelim yani kredi kartı ile ödeme yapmak için tıklayınız gibi.:)
dikkat ederseniz yukarda hookPayment() diye bir function sayasinde .tpl dosyaları yağtığımızı söylemiştim. işte bu fonsiyonla.

payment.tpl ve payment.php

dosyalarıyla bir ödeme alanı yapacağız.:)

function hookPayment($params)
{
global $smarty;

$smarty->assign(array(
           'this_path' => $this->_path,
           'this_path_ssl' => Configuration::get('PS_FO_PROTOCOL').$_SERVER['HTTP_HOST'].__PS_BASE_URI__."modules/{$this->name}/"));

return $this->display(__FILE__, 'payment.tpl');
}


---------------------------------

global $smarty;

bu fonsiyon yardımıyla smarty template i yaratıyoruz.

----------------------

$smarty->assign(array( 'this_path' => $this->_path,
'this_path_ssl' => Configuration::get('PS_FO_PROTOCOL').$_SERVER['HTTP_HOST'].__PS_BASE_URI__."modules/{$this->name}/"))


bu satırlarla bilgileri smarty temlplateine gönderiyoruz.

Share this post


Link to post
Share on other sites

şimdi sıra geldi payment.tp ve payment.php dosyalarını yazmaya.

payment.tpl







{l s='Pay with a credit card' mod='offlinecardpayment'}



görüldüğü gibi html bilen biri için gayet basit kodlar ödeme seçimi yaparken bir tane resim tıyoruz ve kredi kartı ile ödeme diye bir yazı sunuyoruz. modülü çevirilere uyumlu dzğzenlendiğinden seçimler ing oluyor.:)
ihtiyarcınız olalan bitan uygun büyüklükte cards.png resmi googlan bir sürü bulabilirsiniz.
payment.php

<?php

include(dirname(__FILE__).'/../../config/config.inc.php');
include(dirname(__FILE__).'/../../header.php');
include(dirname(__FILE__).'/offlinecardpayment.php');

if (!$cookie->isLogged())
   Tools::redirect('authentication.php?back=order.php');

$offlinecardpayment = new offlinecardpayment();
echo $offlinecardpayment->execPayment($cart);

include_once(dirname(__FILE__).'/../../footer.php');

?>



bu içerikleri ilgili dosyaları yaratıp içine kaydediniz. bu aşamada yine daha sona yazacağımız bir tane execPayment() fonsiyonu çağıyoruz bu aşamda bu fonsiyona sahip değiliz.

Share this post


Link to post
Share on other sites

execPayment() fonsiyonunu müşteri kredi kartı bilgilerini girdiği zaman veritabanında gönder dediği zaman kontrol sağlanacak ve bu şekilde veritabanına bilgiler gönderilecek.
offlinecardpayment.php doyasını açın ve bu function ıda içne atın:)

public function execPayment($cart)
{
if (!$this->active)
return ;

global $cookie, $smarty;

$smarty->assign(array(
'this_path' => $this->_path,
'this_path_ssl' => (Configuration::get('PS_SSL_ENABLED') ? 'https://' : 'http://').htmlspecialchars($_SERVER['HTTP_HOST'], ENT_COMPAT, 'UTF-8').__PS_BASE_URI__.'modules/'.$this->name.'/'
));

return $this->display(__FILE__, 'payment_execution.tpl');
}



dikkat ederseniz kodun en sonunda
return $this->display(__FILE__, 'payment_execution.tpl'); diye bir komut veriyoruz burdaki payment_execution.tpl dosyadında kredi kartı bilgilerini girme alanı belirtiyoruz. bu soya şimdilik elimizde yok:)

Share this post


Link to post
Share on other sites

ve şimdide müşterinin kredi kartı bilgilerini girdiği payment_execution.tpl dosyasını yazalım.:)

>capture name=path}{l s='Shipping'}{/capture}
{include file=$tpl_dir./breadcrumb.tpl}
{l s='Order summary' mod='offlinecardpayment'}

{assign var='current_step' value='payment'}
{include file=$tpl_dir./order-steps.tpl}

{l s='Payment Card Details' mod='offlinecardpayment'}

<form action="{$this_path_ssl}validation.php" method="post">
</pre>
<table border="0">

{l s='Name on Card:' mod='offlinecardpayment'}

<input type="text" name="cardholderName" id="cardholderName" value="{$cardholderName}"/>


{l s='Credit Card Number:' mod='offlinecardpayment'}

<input type="text" name="cardNumber" id="cardNumber" value="{$cardNumber}" />
</table>
<br><br><p>
{l s='Other payment methods' mod='offlinecardpayment'}
<input type="submit" name="paymentSubmit" value="{l s='Submit Order' mod='creditcard'}" class="exclusive_large" />
</p>
<br></fo


dikkat ederseniz form un action kısmına validation.php dosyasına gönderiyoruz yani girilen bilgileri validation .php dosyasına POST ediyoruz..
bunu yazınca sitemizde negibi bir görüntü sağladı bakalım:)

23058_8VwRZVxh8hk61shXo4e6_t

Share this post


Link to post
Share on other sites

ve şimdide kredi kartı bilgilerini post metoduyla aldığımız validation.php dosyasını yazalım. bu bilgilerle şimdiye kadar yazdığımız fonsiyonlrı kullanarak. bilgileri veritabanımıza gönderilim.

<?php

include(dirname(__FILE__).'/../../config/config.inc.php');
include(dirname(__FILE__).'/../../header.php');
include(dirname(__FILE__).'/offlinecardpayment.php');


/* Gather submitted payment card details */
$cardholderName     = $_POST['cardholderName'];
$cardNumber         = $_POST['cardNumber'];


$currency = new Currency(intval(isset($_POST['currency_payement']) ? $_POST['currency_payement'] : $cookie->id_currency));
$total = floatval(number_format($cart->getOrderTotal(true, 3), 2, '.', ''));

$offlinecardpayment = new offlinecardpayment();
$offlinecardpayment->validateOrder($cart->id,  _PS_OS_PREPARATION_, $total, $offlinecardpayment->displayName, NULL, NULL, $currency->id);
$order = new Order($offlinecardpayment->currentOrder);
$offlinecardpayment->writePaymentcarddetails($order->id, $cardholderName, $cardNumber);

Tools::redirectLink(__PS_BASE_URI__.'order-confirmation.php?id_cart='.$cart->id.'&id;_module='.$offlinecardpayment->id.'&id;_order='.$offlinecardpayment->currentOrder.'&key;='.$order->secure_key);

?>


gördüğünüz gibi kodlar gayet basit:) bilgileri veritabanına gönderme işlemi ve sitede yeni bir sipariş kaydı yapıyoruz. ardaki fonctionlar genelde prestashop 'a sipariş tutarını ödeme bilgilerini tutan değişkenler yardmıyla sitede sipariş kaydını gerçekleiştiriyoruz.
burada ilginç bişey var ve bir fonksiyona daha ihtiyarç duyduğumuz şey.

$offlinecardpayment->writePaymentcarddetails($order->id, $cardholderName, $cardNumber);



bu fonsiyonu tekrar
offlinecardpayment.php dosyasını açarak içine kaydedin.

function writePaymentcarddetails($id_order, $cardholderName, $cardNumber)
{
$db = Db::getInstance();
$result = $db->Execute('
INSERT INTO `ps_order_paymentcard`
( `id_order`, `cardholdername`,`cardnumber`)
VALUES
("'.intval($id_order).'","'.$cardholderName.'","'.$cardNumber.'")');
return;
}

işte bu fonsiyon bilgileri veritabanımıza gönderiyor.

Share this post


Link to post
Share on other sites

şimdiye kadar modülün müşteri tarafındaki ksımlarını tamamen hallettik. müşteri kredi kartı bilgilerini giriyor ve bu bilgiler veritabanına kaydediliyor.
şimdi sıra geldi sitenin admin bölüme:)
hatırlarsanız

OR !$this->registerHook('invoice')


böyle bir kod kullanmıştık. işte bu kod sayesinde şimdi zaırlayacağımız funtion ve tpl dosyaları sayesinde veritabanındaki kredi kartı bilgilerini okuyacağız.
tekrar offlinecardpayment.php dosyasını açın ve bu function ını içine yazın bu function veritabanındaki verileri okumammınızı sağlıyor.

function hookInvoice($params)
{
$id_order = $params['id_order'];

global $smarty;
$paymentCarddetails = $this->readPaymentcarddetails($id_order);

$smarty->assign(array(
   'cardHoldername'          => $paymentCarddetails['cardholdername'],
'cardNumber'         => $paymentCarddetails['cardnumber'],
'id_order' => $id_order,
'this_page' => $_SERVER['REQUEST_URI'],
'this_path' => $this->_path,
           'this_path_ssl' => Configuration::get('PS_FO_PROTOCOL').$_SERVER['HTTP_HOST'].__PS_BASE_URI__."modules/{$this->name}/"));
return $this->display(__FILE__, 'invoice_block.tpl');

}


ve bunu:)

function readPaymentcarddetails($id_order)
{
$db = Db::getInstance();
$result = $db->ExecuteS('
SELECT * FROM `ps_order_paymentcard`
WHERE `id_order` ="'.intval($id_order).'";');
return $result[0];
}


ve şimdide bu verileri adminde görmemizi sağlayan
invoice_block.tpl dosyasını yazalım.:)




    {l s='Payment Card Information' mod='offlinecardpayment'}




Card Holder Name: {$cardHoldername}Card Number: {$cardNumber}



bu şekilde modül tamamlanıyor hemen admin görünümüne bakalım.

23060_71NtVpkXuhEsspXn1kp1_t

Share this post


Link to post
Share on other sites

bu bilgileri sadece öğrenme amaçlı verdim , bir modül nasıl geliştirildiği hakkında php ve smarty si iyi olan arkadaşlar bunu online çevirebilir. benim gibi. tabiki bu modül kullanılacak bişey değil çünkü kredi kart bilgilerini görmek etik değil. bu çevrim sışı kredi kartı modülünü geliştiren forumda bir arkadaş var açtığı konular
http://www.prestashop.com/forums/viewthread/3684/third_party_modules/offline_credit_card_module_current_v2_dot_0_dot_5
http://www.prestashop.com/forums/viewthread/53591/third_party_modules/beta_testing_offline_credit_card_module_v_dot_3_dot_01_dot_beta
burdan detaylsını indirebilrisinz. tabiki bu yazıan modül şu anda basit bir işlem bu çok geliştirilebilir.
çalışmanın bitmiş dosyaları ekte...

offlinecardpayment.zip

  • Like 1

Share this post


Link to post
Share on other sites

mantığını gayet güzel açıklamışın safam emeğine sağlık kardeşim cidden süper bir anlatım olmuş

Share this post


Link to post
Share on other sites
güzel

mantığını gayet güzel açıklamışın safam emeğine sağlık kardeşim cidden süper bir anlatım olmuş

teşekkürler:-)

Share this post


Link to post
Share on other sites

Merhaba,

buradaki invoice block her faturada görünüyor, bunu sadece o modül kullanılarak yapılan siparişlerde gösterilecek şekilde ayarlayamaz mıyız?

Şimdiden teşekkürler.

Share this post


Link to post
Share on other sites

konu açalı bir yılı geçti aradan geçen süre zarfında prestahop gelişti tabi bizde geliştik.

işlerden bir boş vakit ayarlasam modul yazmanın videolu anlatımlarını hazırlıyacağım

Share this post


Link to post
Share on other sites

bide privateshop modulu yapsanız harika olacak uye olmadan siteye girilmemesi için...

Share this post


Link to post
Share on other sites

bide privateshop modulu yapsanız harika olacak uye olmadan siteye girilmemesi için...

modul anlatımı yaparsam genel bir tne basit modul anlatımı yaparım böyle özel istekleri yapamam :) herkesin farklı bir ihtiyarcı oluyor

Share this post


Link to post
Share on other sites
Sign in to follow this  

×
×
  • Create New...

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More