موقع offres d'emplois بإستعمال YII2 Framework الجزء الأول


فهاد المشروع الأول من سلسلة مشاريع بإستعمال YII2 Framework غادي نشوفو كيفاش نقادو موقع offres d'emplois ولي غادي يمكن المستخدمين من إضافة عمل تصفح فرص العمل لي فالموقع تعديل وحدف فرص عمل بالإضافة لخصائص أخرى غادي نشوفوها وباش تمكن من ضبط الأمور لابد ماتشوف la documentation ف le site officiel ديالهم.

نظرة سريعة بالفيديو

1- تحميل المشروع

أول شيء غادي تديرو هو تثبيت composer لي غادي يمكنك من تثبيت YII2 يمكنلك تبحث عليه فغوغل وتحملو من الموقع الرسمي من بعد غادي تشوف الفيديو راه فيه كيفاش غادي ت installer ل framework من بعد غادي تزيد قاعدة بيانات جديدة ف phpmyadmin سميها jobwebsite فيها 3 ديال les tables كاين users,jobs,categories الكود باش تزيد الجداول فقاعدة البيانات هو :

                                -- phpMyAdmin SQL Dump
-- version 4.6.5.2
-- https://www.phpmyadmin.net/
--
-- Client :  127.0.0.1
-- Généré le :  Lun 19 Juin 2017 à 19:38
-- Version du serveur :  10.1.21-MariaDB
-- Version de PHP :  5.6.30

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;

--
-- Base de données :  `jobwebsite`
--

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

--
-- Structure de la table `categories`
--

CREATE TABLE `categories` (
  `id` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


--
-- Structure de la table `jobs`
--

CREATE TABLE `jobs` (
  `id` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  `category_id` int(11) NOT NULL,
  `title` varchar(255) NOT NULL,
  `description` text NOT NULL,
  `type` varchar(255) NOT NULL,
  `competences` varchar(255) NOT NULL,
  `salary` varchar(255) NOT NULL,
  `city` varchar(255) NOT NULL,
  `contact_email` varchar(255) NOT NULL,
  `contact_phone` varchar(255) NOT NULL,
  `is_published` tinyint(4) NOT NULL,
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


--
-- Structure de la table `users`
--

CREATE TABLE `users` (
  `id` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `username` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL,
  `password` varchar(255) NOT NULL,
  `token` varchar(255) NOT NULL,
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Index pour les tables exportées
--

--
-- Index pour la table `categories`
--
ALTER TABLE `categories`
  ADD PRIMARY KEY (`id`);

--
-- Index pour la table `jobs`
--
ALTER TABLE `jobs`
  ADD PRIMARY KEY (`id`),
  ADD KEY `user_id` (`user_id`),
  ADD KEY `category_id` (`category_id`);

--
-- Index pour la table `users`
--
ALTER TABLE `users`
  ADD PRIMARY KEY (`id`);

--
-- AUTO_INCREMENT pour les tables exportées
--

--
-- AUTO_INCREMENT pour la table `categories`
--
ALTER TABLE `categories`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=9;
--
-- AUTO_INCREMENT pour la table `jobs`
--
ALTER TABLE `jobs`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6;
--
-- AUTO_INCREMENT pour la table `users`
--
ALTER TABLE `users`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=7;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

                            

2- الإتصال بقاعدة البيانات

من بعد فالمجلد config وفالملف db.php لي فالمجلد الرئيسي ديال المشروع كنظيف عليه التغييرات لي غادي يمكنو باش نتصل بقاعدة البيانات الكود لي تغير هو :

                                <?php

return [
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=localhost;dbname=jobwebsite',
    'username' => 'root',
    'password' => '',
    'charset' => 'utf8',
];
                            

3- الملف JobsController.php

كنمشي للمجلد controllers كنزيد ملف جديد كنسميه JobsController.php لي غادي تكون فيه fonction behaviors لي كتمنع على المستخدم يلا مكانش مكونيكطي يزيد او يعدل أو يحدف فرصة عمل من بعد كاين fonction actionIndex لي كتسترجع فرص العمل لي عندنا فقاعدة البيانات وكترسلهم للملف index ديال فرص العمل ولي غادي نزيدو من بعد وكتحدد ل pagination ف 10 ولي كتمكنا باش نعرضو فقط عشرة ديال فرص العمل فالصفحة ثم كاين fonction actionCreate لي كتوجه المستخدم لملف إضافة فرصة عمل لي غادي نزيدوه من بعد ومنبعد مكيدخل المعلومات كتحقق واش حتى شي حقل ما خاوي منبعد كتزيدهم فالجدول jobs منبعد كاين fonction actionEdit لي كتعدل فرصة عمل منبعد مكتحقق من ان المستخدم لي مكونيكطي هو صاحب l'offre حيت ميمكنلوش يعدل offre ماشي ديالو منبعد مكتحقق بلي كل الحقول مملوءة وبلي داك لoffre كاين فقاعدة البيانات منبعد كتوجهو للصفحة الرئيسية مع رسالة نجاح منبعد كاين fonction actionView لي كتعرض المعلومات الخاصة بoffre ختارو المستخدم بواسطة لid ديالو منبعد كاين fonction actionCategory لي كتعرض المعلومات الخاصة بoffre ختارو المستخدم بواسطة الفئة لي كينتمي لها يعني ل catégorie ديالو ثم كاين fonction actionDelete لي كتمكن من حدف offre منبعد مكتحقق من ان المستخدم لي مكونيكطي هو صاحب l'offre حيت ميمكنلوش يمسح offre ماشي ديالومن بعد مكتلقاه بل id ديالوالكود ديال الملف هو :

                                <?php

namespace app\controllers;
use Yii;
use yii\filters\AccessControl;
use yii\web\Controller;
use yii\filters\VerbFilter;
use app\models\Category;
use app\models\Job;
use yii\data\Pagination;
class JobsController extends \yii\web\Controller
{
    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'only' => ['create','edit','delete'],
                'rules' => [
                    [
                        'actions' => ['create','edit','delete'],
                        'allow' => true,
                        'roles' => ['@'],
                    ],
                ],
            ]
        ];
    }
    public function actionIndex()
    {
        Yii::$app->formatter->locale = 'fr-FR';
        //get all jobs from database
        $query = Job::find();
        //use pagination
        $pagination = new Pagination([
            'defaultPageSize' => 10,
            'totalCount' => $query->count(),
        ]);
        $jobs = $query->orderBy('created_at')
            ->offset($pagination->offset)
            ->limit($pagination->limit)
            ->all();
        return $this->render('index',[
            'jobs' => $jobs,
            'pagination'=>$pagination
        ]);
    }
    public function actionView($id){
        Yii::$app->formatter->locale = 'fr-FR';
        //get all jobs from database
        $job = Job::find()->where(['id'=>$id])->one();
        return $this->render('view',[
            'job' => $job
        ]);
    }
    public function actionCategory($id){
        Yii::$app->formatter->locale = 'fr-FR';
        //get all jobs from database
        $jobs = Job::find()->where(['category_id'=>$id])->orderBy('created_at')->all();
        return $this->render('jobs_by_category',[
            'jobs' => $jobs
        ]);
    }
    public function actionCreate()
    {
        $job = new Job();
        if ($job->load(Yii::$app->request->post())) {
            if ($job->validate()) {
               $job->save();
               \Yii::$app->getSession()->setFlash('success', 'Offre ajoutée.');
               return $this->redirect('index.php?r=jobs');
            }
        }
        return $this->render('create', [
            'job' => $job,
        ]);
    }

    public function actionDelete($id)
    {
        $job = Job::find()->where(['id'=>$id])->one();
        if(isset(Yii::$app->user->identity->id) && (Yii::$app->user->identity->id != $job->user_id)){
            return $this->redirect('index.php?r=jobs');
        }
        $job->delete();
        \Yii::$app->getSession()->setFlash('success', 'Offre supprimée.');
        return $this->redirect('index.php?r=jobs');
    }

    public function actionEdit($id)
    {
        $job = Job::find()->where(['id'=>$id])->one();
        if(isset(Yii::$app->user->identity->id) && (Yii::$app->user->identity->id != $job->user_id)){
            return $this->redirect('index.php?r=jobs');
        }
        if ($job->load(Yii::$app->request->post())) {
            if ($job->validate()) {
               $job->save();
               \Yii::$app->getSession()->setFlash('success', 'Offre modifiée.');
               return $this->redirect('index.php?r=jobs');
            }
        }
        return $this->render('create', [
            'job' => $job,
        ]);
    }
}

                            

4- الملف Job.php

من بعد فالمجلد models كنزيد ملف كنسميه Job.php ولي عبارة عن model فيه fonction rules لي كتحدد الحقول لي خاصها تكون عامرة والحقول لي خصها تكون string ولا integer منبعد كاين getCategory لي كتدير la relation مابين الجدول categories وjobs ولي كتقولنا بلي l'offre كينتمي ل categorie وحدة منبعد كاين getUser لي كتدير la relation مابين الجدول users وjobs ولي كتقولنا بلي l'offre كينتمي ل مستخدم واحد وكاين beforeSave لي فقط كتسترجع ل id ديال المستخدم لي مكونيكطي قبل ما تزيد l'offre باش كيتزاد حتى هو فالجدول jobs الكود ديال الملف هو :

                                    <?php

namespace app\models;

use Yii;

/**
 * This is the model class for table "jobs".
 *
 * @property integer $id
 * @property integer $user_id
 * @property integer $category_id
 * @property string $title
 * @property string $description
 * @property string $type
 * @property string $competences
 * @property string $salary
 * @property string $city
 * @property string $contact_email
 * @property string $contact_phone
 * @property integer $is_published
 * @property string $created_at
 */
class Job extends \yii\db\ActiveRecord
{
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'jobs';
    }

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['category_id', 'title', 'description', 'type', 'competences', 'salary', 'city', 'contact_email', 'contact_phone', 'is_published'], 'required'],
            [['category_id', 'is_published'], 'integer'],
            [['description'], 'string'],
            [['created_at'], 'safe'],
            [['title', 'type', 'competences', 'salary', 'city', 'contact_email', 'contact_phone'], 'string', 'max' => 255],
        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'user_id' => 'User ID',
            'category_id' => 'Category ID',
            'title' => 'Title',
            'description' => 'Description',
            'type' => 'Type',
            'competences' => 'Competences',
            'salary' => 'Salary',
            'city' => 'City',
            'contact_email' => 'Contact Email',
            'contact_phone' => 'Contact Phone',
            'is_published' => 'Is Published',
            'created_at' => 'Created At',
        ];
    }
    public function getCategory(){
        return $this->HasOne(Category::className(),['id'=>'category_id']);
    }
    public function getUser(){
        return $this->HasOne(User::className(),['id'=>'user_id']);
    }
    public function beforeSave($data){
        $this->user_id = Yii::$app->user->identity->id;
        return Parent::beforeSave($data);
    }
}

                                

5- الملف jobs/index.php

فالمجلد views زيد مجلد جديد سميه jobs فيه زيد ملف جديد سميه index.php هادا الملف لي فيه الكود لي كيمكن من عرض جميع فرص العمل لي عندنا فقاعدة البيانات من بعد مكنستقبلوهم من fonction actionIndex لي فالملف JobsController.php كنخدم بforeach لي كتمكني من عرض كل معلومة خاصة بكل فرصة عمل فبلاصته بالإضافة للpagination لي كتمكن من عرض 10 ديال les offres فالصفحة وأيضا كاين الكود لي كيعرض رسائل النجاح الكود ديال الملف هو :

                                    <?php
/* @var $this yii\web\View */
use yii\helpers\Html;
use yii\widgets\LinkPager;
?>
<div class="row">
<div class="col-md-4">
<h1 class="text-info">Les derniéres offres</h1>
</div>
<div class="col-md-8">
<a href="/yii2_job_website/web/index.php?r=jobs/create" class="btn btn-primary pull-right">Ajouter</a>
</div>
</div>
<hr>
<div class="row">
    <div class="col-md-6 col-md-offset-3">
    <?php if(Yii::$app->session->getFlash('success') != null):?>
         <div class="alert alert-success"><?= Yii::$app->session->getFlash('success'); ?></div>
    <?php endif;?>
        <ul class="list-group">
            <?php foreach($jobs as $job):?>
            <li class="list-group-item"><a href="/yii2_job_website/web/index.php?r=jobs/view&id=<?php echo $job->id;?>" class="btn btn-link"><?php echo $job->title;?></a><span class="label label-success"><?php echo $job->city;?></span> 
              <span class="label label-danger"><?php echo $job->type;?></span>
              <span class="label label-info">
              <?php
                echo  Yii::$app->formatter->asDatetime($job->created_at);
              ?>
              </span></li>
            <?php endforeach;?>
        </ul>
    </div>
    <div class="row">
        <div class="col-md-6 col-md-offset-3">
            <?php echo LinkPager::widget(['pagination'=>$pagination]);?>
        </div>
    </div>
</div>

                                


إشترك في قناتنا على اليوتيوب

بحث في الموقع


إشترك للتوصل بالجديد