Home / Symfony

Symfony

সিম্ফনিতে (Symfony) কীভাবে কাস্টম ফর্ম তৈরি করা যায়

এই টিউটোরিয়ালে আমি দেখাব সিম্পনিতে (Symfony) কীভাবে কাস্টম ফর্ম তৈরি করা যায় আমি ধরে নিচ্ছি আগে থেকেই কমপ্লিট সিম্ফনি ইন্সটল করা আছে আপনার পিসিতে, যদি
ইন্সটল করা না থাকে তাহলে আমার এই বাংলা ভিডিও তা দেখে নিতে পারেন

এখন,আমার ডিরেক্টরিটা চেঞ্জ করতে হবে যেখানে আমার কমপ্লিট সিম্ফনি ইন্সটল করা আছে
path
আপনার ডিরেক্টরিটা ভিন্ন হতে পারে , কারন আমি এখানে লিনাক্স ব্যবহার করার মাধ্যমে দেখাচ্ছি , তারপর টাইপ করুন

php app/console;

টার্মিনালের মাধ্যমে , আপনে দেখতে পারবেন অনেকগুলো সিম্ফনি কমান্ড

Rasel Khan:~$ php app/console
Symfony version 2.6.4 - app/dev/debug

Usage:
 [options] command [arguments]

Options:
 --help (-h)           Display this help message
 --quiet (-q)          Do not output any message
 --verbose (-v|vv|vvv) Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
 --version (-V)        Display this application version
 --ansi                Force ANSI output
 --no-ansi             Disable ANSI output
 --no-interaction (-n) Do not ask any interactive question
 --shell (-s)          Launch the shell.
 --process-isolation   Launch commands from shell as a separate process.
 --env (-e)            The Environment name. (default: "dev")
 --no-debug            Switches off debug mode.

Available commands:
 help                                  Displays help for a command
 list                                  Lists commands
acme
 acme:hello                            Hello World example command
assetic
 assetic:dump                          Dumps all assets to the filesystem
 assetic:watch                         Dumps assets to the filesystem as their source files are modified
assets
 assets:install                        Installs bundles web assets under a public web directory
cache
 cache:clear                           Clears the cache
 cache:warmup                          Warms up an empty cache
config
 config:debug                          Dumps the current configuration for an extension
 config:dump-reference                 Dumps the default configuration for an extension
container
 container:debug                       Displays current services for an application
debug
 debug:config                          Dumps the current configuration for an extension
 debug:container                       Displays current services for an application
 debug:event-dispatcher                Displays configured listeners for an application
 debug:router                          Displays current routes for an application
 debug:swiftmailer                     Displays current mailers for an application
 debug:translation                     Displays translation messages informations
 debug:twig                            Shows a list of twig functions, filters, globals and tests
doctrine
 doctrine:cache:clear-metadata         Clears all metadata cache for an entity manager
 doctrine:cache:clear-query            Clears all query cache for an entity manager
 doctrine:cache:clear-result           Clears result cache for an entity manager
 doctrine:database:create              Creates the configured databases
 doctrine:database:drop                Drops the configured databases
 doctrine:ensure-production-settings   Verify that Doctrine is properly configured for a production environment.
 doctrine:generate:crud                Generates a CRUD based on a Doctrine entity
 doctrine:generate:entities            Generates entity classes and method stubs from your mapping information
 doctrine:generate:entity              Generates a new Doctrine entity inside a bundle
 doctrine:generate:form                Generates a form type class based on a Doctrine entity
 doctrine:mapping:convert              Convert mapping information between supported formats.
 doctrine:mapping:import               Imports mapping information from an existing database
 doctrine:mapping:info                 
 doctrine:query:dql                    Executes arbitrary DQL directly from the command line.
 doctrine:query:sql                    Executes arbitrary SQL directly from the command line.
 doctrine:schema:create                Executes (or dumps) the SQL needed to generate the database schema
 doctrine:schema:drop                  Executes (or dumps) the SQL needed to drop the current database schema
 doctrine:schema:update                Executes (or dumps) the SQL needed to update the database schema to match the current mapping metadata.
 doctrine:schema:validate              Validate the mapping files.
generate
 generate:bundle                       Generates a bundle
 generate:controller                   Generates a controller
 generate:doctrine:crud                Generates a CRUD based on a Doctrine entity
 generate:doctrine:entities            Generates entity classes and method stubs from your mapping information
 generate:doctrine:entity              Generates a new Doctrine entity inside a bundle
 generate:doctrine:form                Generates a form type class based on a Doctrine entity
init
 init:acl                              Mounts ACL tables in the database
orm
 orm:convert:mapping                   Convert mapping information between supported formats.
router
 router:debug                          Displays current routes for an application
 router:dump-apache                    Dumps all routes as Apache rewrite rules
 router:match                          Helps debug routes by simulating a path info match
security
 security:check                        Checks security issues in your project dependencies
server
 server:run                            Runs PHP built-in web server
 server:start                          Starts PHP built-in web server in the background
 server:status                         Outputs the status of the built-in web server for the given address
 server:stop                           Stops PHP's built-in web server that was started with the server:start command
swiftmailer
 swiftmailer:debug                     Displays current mailers for an application
 swiftmailer:email:send                Send simple email message
 swiftmailer:spool:send                Sends emails from the spool
translation
 translation:debug                     Displays translation messages informations
 translation:update                    Updates the translation file
twig
 twig:debug                            Shows a list of twig functions, filters, globals and tests
 twig:lint                             Lints a template and outputs encountered errors
yaml
 yaml:lint                             Lints a file and outputs encountered errors

এখন, নতুন একটা সিম্ফনি বান্ডেল তৈরি করব জেনারেট কমান্ডের ( generate:bundle ) মাধ্যমে। বান্ডেল জেনারেট করতে সমস্যা হলে আমরা সেই বান্ডেলের হেল্প নিব এই

php app/console generate:bundle --help;

কমান্ডের মাধ্যমে, তাহলে সবগুলো কমান্ড দেখাবে কীভাবে তৈরি করতে হবে ।

N:B The bundle namespace must end with “Bundle”.

নীচের স্টেপগুলো অনুসরন করি কীভাবে বান্ডেল এবং ইনটিটি (Entity) তৈরি করতে পারি

স্টেপ -১ নতুন একটা বান্ডেল তৈরি করব একমি ডিরেক্টরির ( Acme directory ) নিচে , সিম্ফনি ইন্সটল করার সময় ডিফল্ট অবস্থায় এই ডিরেক্টরিটা পাবেন । আমার বান্ডেলের নাম হবে টাস্ক-বান্ডেল (TaskBundle)।
এখন টার্মিনালের মাধ্যমে টাইপ করেন

 php app/console generate:bundle --namespace=Acme/TaskBundle;

তারপর এন্টার প্রেস করেন ।

স্টেপ -২ আপনে দেখতে পারবেন আপনার বান্ডেলের নাম , নীচের কোডটার মত

Bundle name [AcmeTaskBundle]:

স্টেপ -৩ তারপর প্রেস এন্টার

Target directory [/var/www/Symfony/src]:

স্টেপ -৪ এই স্টেপে বলে দিতে হবে আপনার বান্ডেলটা কোন ফরম্যাট-এ কনফিগারেশন হবে , আমি বেবহার করছি yml ফরম্যাটে , নীচের কোডটার মত

Configuration format (yml, xml, php, or annotation):yml

স্টেপ -৫ তারপর টাইপ করেন yes , নীচের কোডটার মত

 Do you want to generate the whole directory structure [no]? yes

You are going to generate a “AcmeTaskBundleAcmeTaskBundle” bundle
in “/var/www/Symfony/src/” using the “annotation” format.

স্টেপ -৬ প্রেস এন্টার

Do you confirm generation [yes]?

You saw Bundle generation
Generating the bundle code: OK
Checking that the bundle is autoloaded: OK

স্টেপ -৭ এন্টার প্রেস করতে থাকেন যতক্ষণ না পর্যন্ত এই স্ট্রিং টা দেখায় “You can now start using the generated code! “। নীচের স্টাকচারটা পিকচারটা দেখেন
pic_3

স্টেপ -৮ এখন, আমি নতুন একটা ইনটিটি (Entity) তৈরি এই “doctrine:generate:entity” কমান্ডের মাধ্যমে ।

php app/console doctrine:generate:entity;

স্টেপ -৯ তারপর ইনটিটি (Entity) শর্টকাট নাম চাইবে

 Next The Entity shortcut name like AcmeTaskBundle:Task 

স্টেপ -১০ এই স্টেপে বলে দিতে হবে আপনার ইনটিটি (Entity) ম্যাপিং ইনফর্মেশনটা ( mapping information) কোন ফরম্যাট-এ কনফিগারেশন হবে , আমি বেবহার করছি yml ফরম্যাটে ।

Configuration format (yml, xml, php, or annotation) [annotation]:yml

আপনার কমপ্লিট ফাঁকা একটা ইনটিটি (Entity) শুরু হয়ে গেল, এখন আপনার মনের মতন করে কিছু ফিল্ড বা ফাংশন অ্যাড করে নেন ।
বি : দ্র আপনার ফিল্ড তৈরি করার পর প্রাইমারি কী (primary key) অটোমেটিক অ্যাড হয়ে যাবে, এটা নিয়ে আপনার ভাবতে হবে না

কমপ্লিট ইন্সটল হওয়ার পর ওপেন করেন Task.php ফাইল এবং অ্যাড করেন নীচের কোডটা

<?php
 namespace AcmeTaskBundleEntity; 
 
 class Task {  

	 protected $task;  
 	 protected $dueDate; 
 
	 public function getTask()     { 

         return $this->task;
	}

	public function setTask($task){
 
  		$this->task = $task;
 	}
 
     public function getDueDate(){
 
  		return $this->dueDate;
	}
 
 	public function setDueDate(DateTime $dueDate = null){
 		$this->dueDate = $dueDate;
 	}
}
 ?>

টাস্ক Task নামে একটা ক্লাস তৈরি করলাম পুরাতন পিএইচপি অবজেক্ট-এর মত এবং সাথে কিছু ফাংশন আছে ……………।।
বি : দ্র এই কোডটা সম্বন্ধে বেশী কিছু বললাম না, আমি ধরে নিচ্ছি যারা সিম্ফনি নিয়ে কাজ করতে আসছেন বা চান তারা অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং ভাল ধারনা রাখেন

এখন, ওপেন করুন DefaultController.php ফাইল আন্ডার AcmeTaskBundleController ডিরেক্টরি এবং নীচের কোডটা অ্যাড করেন

 <?php
 // src/Acme/TaskBundle/Controller/DefaultController.php
 namespace AcmeTaskBundleController;

 use SymfonyBundleFrameworkBundleControllerController;
 use AcmeTaskBundleEntityTask;
 use SymfonyComponentHttpFoundationRequest;

 class DefaultController extends Controller{
 
 		public function formAction(Request $request){
 
 			$task = new Task();
 			$task->setTask('Write a blog post');
 			$task->setDueDate(new DateTime('tomorrow'));

 			$form = $this->createFormBuilder($task)
     			->add('task', 'text')
 				->add('dueDate', 'date')
 				->add('save', 'submit', array('label' => 'Create Post'))
 				->getForm();
 
 				return $this->render('AcmeTaskBundle:Default:new.html.twig',   array(
 					'form' => $form->createView(),
 				));
 		}
 }
 ?> 

আমি নতুন একটা রাউট (Route) তৈরি করে নিয়েছি form(ফর্ম ) নামে , লাইন নাম্বার ১১ তে দেখুন formAction এই ফাংশনটা কাজ করবে যখন ব্রাউজারে এই yoursite.com/form টা পাস হবে ,
এই এক্সামপলটা দেখাবে কীভাবে আপনার ফর্ম ডিরেক্টরিটা তৈরি হবে কন্ট্রোলারের (controller) মধ্য , ফর্মের জন্য আপনার দুইটা ফিল্ড আছে টাস্ক (task) এবং
ডিউডেট (dueDate) লাইন নাম্বার ১৮, ১৯ এবং এদের প্রপার্টিগুলো আছে ইনটিটি Task.php ক্লাসে , ৫ নাম্বার লাইন -এ অ্যাড করেছি আমি use AcmeTaskBundleEntityTask; এটা অ্যাড করার ফলে আমি Task ক্লাসের প্রপার্টিগুলো ব্যবহার করতে পারছি,

এখন আপনার ফর্ম তৈরি হয়ে গেল , তারপর এটাকে আমি render করে দিব অন্য একটা টেমপ্লেট-এ দেখানোর জন্য , ইহা সাকসেস হয় ভিউ (“view”) অবজেক্ট-এর মাধ্যমে , ফর্মের কিছু হেল্পার ফাংশন বেবহার করব ফর্মটা দেখানোর জন্য , ওপেন করুন এই src/Acme/TaskBundle/Resources/views/Default ডিরেক্টরিটা, এখানে নতুন একটা ফাঁকা টুয়িগ(twig) টেমপ্লেট তৈরি করেন ( form.html.twig) নামে, তারপর নীচের কোডটা অ্যাড করেন

 
{{ form(form) }}
 

এক্সামপলটা আপনি ফর্ম সাবমিট করতে পারবেন পোস্ট (POST) রিকুয়েস্টের মাধ্যমে এবং একই ইউ-আর-এল (URL) ইহা ডিসপ্লে করবে । পরবর্তীতে দেখাব কীভাবে Request ( রেকুএস্তে ) Method (ফাংশন) পরিবর্তন করা যায় .

এখন, প্রয়োজন ইউজারের কাছ থেকে ডাটা সাবমিট করা , ইউজারটা অবশ্যই রাইট করবে ফর্মের মধ্য , এর জন্য কন্ট্রোলারে ( Controller) কিছু ফাংশন অ্যাড করে নিব , নীচের কোডটা দেখেন ।

 <?php

 $form->handleRequest($request);

	if ($form->isValid()) {

		return $this->redirect($this->generateUrl('task_success'));
 	}
 ?> 

এই handleRequest() ফাংশনটা প্রবর্তিত হয় Symfony 2.3 তে , Request ( রিকুয়েস্টে ) টা গৃহীত হবে সাবমিট ফাংশন ধারা ..

এখন, ফর্ম-এর ইনপুট ফিল্ড-এ ডাটা ইনপুট শেষ হলে যখন আমি সাবমিট বাটনে ক্লিক করব, তখন অন্য আরেকটা রাউট-এ (Route) রিডাইরেক্ট (Redirect) করবে , এটা করার জন্য আমি কন্ট্রোলারের ( Controller) মধ্য isClicked() ফাংশনটা ব্যবহার করব, নীচে দেখুন

<?php
  
 	if ($form->isValid()) {
 
		$nextAction = $form->get('save')->isClicked()
 				? 'task_success'
 				: 'task_fail';
		return $this->redirect($this->generateUrl($nextAction));
 	}
?>

এখানে, ইউজার যখন ফর্মটা সাবমিট করবে তখন এটা ভ্যালিড কিনা তা চেক করে নিলাম isValid() ফাংশনের মাধ্যমে , তারপর আমি Condition দিলাম যদি ক্লিকএবল এবং ভ্যালিড হয় তখন সে /task_success রাউট-এ (Route) রিডাইরেক্ট (Redirect) করবে , আর যদি ভ্যালিড না হয় /task_fail রাউট-এ (Route) রিডাইরেক্ট (Redirect) করবে।

আমি এখানে forward() ফাংশনটা ব্যবহার করেছি দুইটা রাউট-এর জন্য
For task_new:

$this->forward('AcmeTaskBundle:Default:task_new');

For task_success:

 $this->forward('AcmeTaskBundle:Default:task_success'); 

এই হচ্ছে সিম্পল একটা ফর্ম তৈরি সিম্ফনিতে , কারও কোন প্রব্লেম হলে পোস্টের নীচে কমেন্ট করবেন , সবাই ভাল থাকবেন !!