// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= Parcours d'Apprentissage PHP
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Parcours d'Apprentissage PHP - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Parcours d'Apprentissage PHP

== Développer des applications PHP dans l'IDE NetBeans

vous trouvez ci-bas quelques ressources sur l'utilisation de l'EDI NetBeans dans le développement d'applications PHP. Le support du PHP dans l'EDI NetBans évolue rapidement, les ressources sur cette page sont destinées pour la version 6.5 de NetBeans

== Getting Started 

* link:../../kb/docs/php/quickstart.html[+NetBeans IDE PHP Quick Start Tutorial+]
* link:../../kb/docs/php/project-setup.html[+Setting Up a PHP Project+]

== Tutorials and Articles

=== Configuring Your Environment for PHP Development

* link:../../kb/docs/php/configure-php-environment-windows.html[+Configuring the Environment in Windows+]
* link:../docs/ide/install-and-configure-mysql-server.html[+Configuring the MySQL Database Server in Windows+]
* link:../../kb/docs/php/configure-php-environment-ubuntu.html[+Configuring the Environment in Linux Ubuntu Distribution+]
* link:../../kb/docs/php/configure-php-environment-mac-os.html[+Configuring the Environment in Mac OS X+]
* link:http://wiki.netbeans.org/HowToConfigureXDebug[+How To Configure XDebug (Wiki)+]

=== Testing and Debugging

* link:../../kb/docs/php/debugging.html[+Debugging PHP Source Code in the NetBeans IDE+]
* link:../docs/php/phpunit.html[+Testing with PHPUnit and Selenium+]
* link:http://blogs.oracle.com/netbeansphp/entry/path_mapping_in_php_debugger[+NetBeans for PHP Blog: Path Mapping for Remote Debugging+]

=== Frameworks

* link:http://www.oracle.com/webfolder/technetwork/tutorials/obe/db/oow10/php_webapp/php_webapp.htm[+Developing a Zend Framework Application With Oracle Database 11g and NetBeans IDE+]
* link:http://www.tiplite.com/cakephp-support-in-netbeans/[+TipLite blog: CakePHP Support in NetBeans+]
* link:http://blogs.oracle.com/netbeansphp/entry/using_zend_framework_with_netbeans[+NetBeans for PHP Blog: Using Zend Framework with NetBeans IDE+]
* link:http://www.mybelovedphp.com/2009/01/27/netbeans-revisited-code-completion-for-code-igniter-ii/[+My Beloved PHP blog: Netbeans revisited: Code Completion for Code-igniter II+]
* link:http://www.mybelovedphp.com/2009/01/27/netbeans-code-completion-for-the-kohana-framework/[+My Beloved PHP blog: Netbeans: Code Completion for the Kohana Framework+]
* See also: Symfony and Zend framework support documents in the Screencasts and Community Contributions sections.

=== General PHP Tutorials

* link:../docs/php/code-templates.html[+Code Templates in NetBeans IDE for PHP+]
* link:../../kb/docs/php/remote-hosting-and-ftp-account.html[+Deploying a PHP Application on a Remote Web Server+]

=== Creating a Database Driven Application With PHP

* link:../../kb/docs/php/wish-list-tutorial-main-page.html[+Main Page: Creating a Database Driven Application With PHP+]
* Part 1: Creating the Database link:../../kb/docs/php/wish-list-lesson1.html[+1a: Creating a MySQL Database+]
* link:../docs/php/wish-list-oracle-lesson1.html[+1b: Creating Oracle Database Tables+]
* link:../../kb/docs/php/wish-list-lesson2.html[+Part 2: Designing the Application. Reading from the Database+]
* link:../../kb/docs/php/wish-list-lesson3.html[+Part 3: Creating a New Application User+]
* link:../../kb/docs/php/wish-list-lesson4.html[+Part 4: Optimizing the Code+]
* link:../../kb/docs/php/wish-list-lesson5.html[+Part 5: Adding Security. Implementing Application User Logon+]
* link:../../kb/docs/php/wish-list-lesson6.html[+Part 6: Adding a New Wish to the Database+]
* link:../../kb/docs/php/wish-list-lesson7.html[+Part 7: Updating and Deleting Entries In the Database+]
* link:../../kb/docs/php/wish-list-lesson8.html[+Part 8: Making the Application Look Better Using CSS+]
* link:../../kb/docs/php/wish-list-lesson9.html[+Part 9: Deploying the Application on a Remote Web Server+]

== Screencasts

* link:../docs/php/screencast-phpdoc.html[+Generating PHP Documentation With NetBeans IDE+]
* link:../docs/php/screencast-rename-refactoring.html[+Rename Refactoring and Other Editor Improvements in NetBeans IDE 7.0 for PHP+]
* link:../docs/php/zend-framework-screencast.html[+Screencast: Zend Framework Support in NetBeans IDE +]
* link:../../kb/docs/php/namespace-code-completion-screencast.html[+PHP Namespace Code Completion+]
* link:../docs/php/flickr-screencast.html[+Building a PHP Demo in Flickr+]
* link:../docs/php/php-variables-screencast.html[+Declaring Variables in Comments and Related Code Completion Features+]

== Community-Contributed Docs

* link:http://netbeans.dzone.com/php-project-api-generator[+DZone: APIGen Plugin: PHP Project API Generator+]
* link:http://wiki.netbeans.org/NB68symfony[+Symfony on Windows in NetBeans 6.8+]
* link:http://wiki.netbeans.org/ConfiguringNetBeansProjectForWordPress[+Configuring a NetBeans IDE Project for WordPress+]

== Other Resources

=== Online Magazine Articles

* link:http://netbeans.dzone.com/news/generate-constructor-getters-a[+NetBeans Zone: Generate Constructor, Getters and Setters in NetBeans PHP IDE+]
* link:http://netbeans.dzone.com/news/netbeans-project-specific-php-[+NetBeans Zone: NetBeans Project-Specific PHP Interpreter+]

=== The IDE, Databases, and Versioning

* link:../docs/ide/oracle-db.html[+Connecting to Oracle Database+]
* link:../../features/ide/index.html[+Base IDE Features+]
* link:../articles/mysql.html[+MySQL and the NetBeans IDE+]
* link:../docs/ide/mysql.html[+Connecting to a MySQL Database+]
* link:../../features/ide/collaboration.html[+Version Control and Developer Collaboration+]
* link:http://nbdrupalsupport.dev.java.net/[+NetBeans IDE Support for Drupal 6.x+]

=== Weblogs

* link:http://blogs.oracle.com/netbeansphp/entry/configuring_a_netbeans_php_project#comments[+NetBeans for PHP blog+]
