Practical symfony Day 13: The User

English source: http://www.symfony-project.org/jobeet/1_4/Doctrine/en/13

Орчуулсан:

Б.Батжаргал
b.batja@gmail.com
http://ssacci.blogspot.com

Өдөр 13:  Хэрэглэгч (Day 13: The User)

Өчигдөр бид маш их мэдээлэл авсан билээ. Symfony –ийн админ үүсгэгч (admin generator) нь, PHP –ийн цөөхөн хэдэн мөр бичсэнээр бээкэнд интерфэйсүүдийг богино хугацаанд үүсгэх боломжийг хөгжүүлэгчидэд олгодог.

Өнөөдөр бид HTTP хүсэлтүүдийн (requests) хооронд Symfony хэрхэн өгөгдөл (persistent data) дамжуулдаг болохыг судлах болно. Та магадгүй НTTP протокол нь стэйтлес (stateless) гэдгийг мэдэх байх. Энэ нь, хүсэлт (request) бүр HTTP протоколын preceding эсвэл proceeding –ийн аль нэгнээс үл хамаарна гэсэн үг. Одоогийн вэб сайтуудад хэрэглэгчийн туршлагийг (user experience) нэмэгдүүлэх хүсэлтүүдийн хооронд дамжигдах өгөгдлийг хэвээр нь хадгалах арга зам хэрэгтэй байдаг.

Хэрэглэгчийн сэйшн (session) –г күүкий (cookie) ашиглан таньж болно. Symfony –д, хөгжүүлэгч нь сэйшн (session)-тэй шууд харьцах хэрэггүй бөгөөд sfUser обьектыг ашигладаг. sfUser обьект нь апликэйшний хэрэглэгчийг төлөөлдөг.

Хэрэглэгчийн флэйшүүд (User Flashes)

Бид өмнө нь хэрэглэгч обьектын флэйшүүдтэй ээкшнүүдийг харж байсан билээ. Флэйш гэдэг нь хэрэглэгчийн сэйшнд хадгалагдсан эпиминрал (ephemeral) мессэж юм. Энэ нь дараагийн хүсэлт ирэхэд автоматаар устгагддаг. Флэйш нь шууд шилжилт (redirect) хийсний дараа хэрэглэгчид мессэж харуулахад их хэрэгтэй байдаг. Ажил (job) хадгалах, устгах эсвэл сунгах гэх мэт үйлдлүүд хийхэд, админ үүсгэгч нь хэрэглэгчид feedback (хариу) харуулахдаа флэйшүүдийг ашигладаг.

sfUser обьектын setFlash  методыг хэрэглэн флэйшийг тавьдаг:

// apps/frontend/modules/job/actions/actions.class.php
public function executeExtend(sfWebRequest $request)
{
  $request->checkCSRFProtection();

  $job = $this->getRoute()->getObject();
  $this->forward404Unless($job->extend());

  $this->getUser()->setFlash('notice', sprintf('Your job validity has been extended until %s.', $job->getDateTimeObject('expires_at')->format('m/d/Y')));

  $this->redirect($this->generateUrl('job_show_user', $job));
}

Эхний аргумент нь флэйшийн тодорхойлогч, хоёрдох аргумент нь харуулах мессэж байна. Та өөрийн хүссэн флэйшийг тодорхойлж өгөх боломжтой бөгөөд notice болон error нь ерөнхий хоёр нь юм. (Админ үүсгэгчд notice болон error нь өргөн хэрэглэгдсэн байдаг.)

Хөгжүүлэгч нь темплэйтэд флэйш мессэжийг оруулж өгнө. Jobeet –ийн хувьд, layout.php файлд оруулж өгнө:

// apps/frontend/templates/layout.php
<?php if ($sf_user->hasFlash('notice')): ?>
  <div><?php echo $sf_user->getFlash('notice') ?></div>
<?php endif ?>

<?php if ($sf_user->hasFlash('error')): ?>
  <div><?php echo $sf_user->getFlash('error') ?></div>
<?php endif ?>

Темплэйтэнд, тусгай $sf_user хувьсагчаар дамжуулан хэрэглэгчд хялбархан хандана.

v  Темплэйтэнд symfony-ийн зарим обьектуудад, ээкшнээс (action) обьектууд руу тодорхой дамжих шаардлагагүйгээр хялбархан ханддаг: $sf_request, $sf_user болон $sf_response.

Хэрэглэгчийн аттрибутууд (User Attributes)

Харамсалтай нь, Хэрэглэгчийн сэйшнд Jobeet хэрэглэгчийн мэдээллийг хадгалах шаардлага (requirement) байхгүй. Тиймээс шинэ шаардлага (requirement) нэмцгээе: ажил үзэхийг хялбаржуулах (ease job browsing), хэрэглэгчийн хамгийн сүүлд үлдсэн гурван ажлыг үзэх холбоосыг цэсэнд харуулах.

Хэрэглэгч ажил хуудсанд (job page) хандахад дэлгэцэнд харагдаж байгаа ажил обьект нь сэйшн дэхь хэрэглэгчийн түүхэнд нэмэгдэн хадгалагддаг байх хэрэгтэй:

// apps/frontend/modules/job/actions/actions.class.php
class jobActions extends sfActions
{
  public function executeShow(sfWebRequest $request)
  {
    $this->job = $this->getRoute()->getObject();

    // fetch jobs already stored in the job history
    $jobs = $this->getUser()->getAttribute('job_history', array());

    // add the current job at the beginning of the array
    array_unshift($jobs, $this->job->getId());

    // store the new job history back into the session
    $this->getUser()->setAttribute('job_history', $jobs);
  }

  // ...
}

v  Бид JobeetJob обьектуудыг шууд сэйшнд хадгалах боломжтой юм. Гэхдээ ингэх хэрэггүй. Учир нь сэйшн хувьсагчууд нь хүсэлтүүдийн хооронд сериалайз (serialized цуваа) байдаг. Сэйшн ачаалагдахад  JobeetJob обьектууд нь de-serialized байх  ёстой. Хэрэв сэйшнтэй ажиллаж байх хооронд сэйшн өөрчлөгдөх юмуу эсвэл устгагдвал “стаолед” (“stalled” хашигдах, мухардах) болдог.

getAttribute(), setAttribute()

Ялгагчийг (identifier) тодорхойлж өгсөнөөр хэрэглэгчийн сэйшнээс sfUser::getAttribute() методоор дамжуулан утгуудыг авдаг. Урвуу үйлдэл нь, тодорхойлсон ялгагчын (identifier) сэйшнд setAttribute() методыг ашиглан ямарч PHP хувьсагчийг хадгалж болно.

Хэрэв ялгагч (identifier) нь  тодорхойлогдоогүй бол getAttribute() метод нь дефаолт утгийг буцаана.

v  Дефаолт утга авах getAttribute() методын шорткат нь дараахтай адил байна:

if (!$value = $this->getAttribute('job_history'))

{

$value = array();

}

myUser класс (The myUser class)

Ажлаа хэсэглэж хуваах нь дээр байдаг бөгөөд кодоо myUser класс руу зөөцгөөе. myUser класс нь апликэйшний тусгай төлвүүдтэй symfony –ийн үндсэн sfUser классыг дахин тодорхойлно:

// apps/frontend/modules/job/actions/actions.class.php
class jobActions extends sfActions
{
  public function executeShow(sfWebRequest $request)
  {
    $this->job = $this->getRoute()->getObject();

    $this->getUser()->addJobToHistory($this->job);
  }

  // ...
}

// apps/frontend/lib/myUser.class.php
class myUser extends sfBasicSecurityUser
{
  public function addJobToHistory(JobeetJob $job)
  {
    $ids = $this->getAttribute('job_history', array());

    if (!in_array($job->getId(), $ids))
    {
      array_unshift($ids, $job->getId());

      $this->setAttribute('job_history', array_slice($ids, 0, 3));
    }
  }
}

Түүнчлэн, хэрэглэгчийн эрх нь бүх шаардлагийг хангаж байхаар кодыг өөрчилсөн байна:

  • !in_array($job->getId(), $ids):  Тухайн ажил нь түүхт хоёр дахин хадгалагдахгүй
  • array_slice($ids, 0, 3): Хамгийн сүүлд хэрэглэгчийн үзсэн гурван ажлыг харуулна

Layout –д $sf_content хувьсагчийн өмнө дараах кодыг нэмж харуулна:

// apps/frontend/templates/layout.php
<div id="job_history">
  Recent viewed jobs:
  <ul>
    <?php foreach ($sf_user->getJobHistory() as $job): ?>
      <li>
        <?php echo link_to($job->getPosition().' - '.$job->getCompany(), 'job_show_user', $job) ?>
      </li>
    <?php endforeach ?>
  </ul>
</div>

<div>
  <?php echo $sf_content ?>
</div>

Layout –д тухайн ажлын түүхийг буцаадаг getJobHistory() методыг ашигласан байна:

// apps/frontend/lib/myUser.class.php
class myUser extends sfBasicSecurityUser
{
  public function getJobHistory()
  {
    $ids = $this->getAttribute('job_history', array());

    if (!empty($ids))
    {
      return Doctrine_Core::getTable('JobeetJob')
        ->createQuery('a')
        ->whereIn('a.id', $ids)
        ->execute()
      ;
    }

    return array();
  }

  // ...
}

getJobHistory() метод нь Doctrine_Query обьектыг ашиглан JobeetJob обьектуудыг буцаадаг.

sfParameterHolder

Ажлын түүх харуулах API –г хийж дууслаа. Одоо түүхээ ресит (reset) хийдэг методыг нэмцгээе:

// apps/frontend/lib/myUser.class.php
class myUser extends sfBasicSecurityUser
{
  public function resetJobHistory()
  {
    $this->getAttributeHolder()->remove('job_history');
  }

  // ...
}

sfParameterHolder классын обьект нь хэрэглэгчийн аттрибутуудыг удирддаг. getAttribute() болон setAttribute() методууд нь getParameterHolder()->get() болон getParameterHolder()->set() методуудыг төлөөлж чадна. Харин remove() методыг төлөөлж чадах метод sfUser обьектод байдаггүй бөгөөд параметр холдер (parameter holder) обьектыг шууд хэрэглэнэ.

sfRequest нь sfParameterHolder классыг хэрэглэн параметрүүдийг хадгалдаг.

Application Security

Authentication

Symfony –ийн бусад олон онцлогийн адилаар секюритийг security.yml YAML файлаар удирддаг. Тухайлбал, config/ директори дотор бээкэнд апликэйшний дефаолт тохиргоо байдаг.

# apps/backend/config/security.yml
default:
  is_secure: false

Хэрэв is_secure оролтыг true болгож сольвол бээкэнд апликэйшн бүхлээрээ хэрэглэгч жинхэлэгдсэн (authenticated) байхыг шаардана.

v  YAML файл дахь true болон false тэмдэгт мөрүүд нь бүүлиэн (boolean) утгийг илэрхийлнэ.

Вэб дебаг түүлбар дахь логуудыг харвал, таны хандахыг оролдсон хуудас бүрт defaultActions классын execureLogin() методыг дуудсан болохыг тэмдэглэсэн байна.

Жинхэлээгүй хэрэглэгч (un-authenticated user) секюрид ээкшн (secured action) хийж хандахыг оролдох үед, symfony нь settings.yml файлд тохируулагдсан логин ээкшн рүү хүсэлтийг илгээдэг:

all:
  .actions:
    login_module: default
    login_action: login

v  Логин ээкшнийг секюри хийх боломжгүй. Энэ нь дуусашгүй рекурс болохоос зайлсхийж байгаа юм.

v  Өдөр 4 –т үзсэнтэй адилаар, ижил тохиргооны файлыг хэдэн газарт тодорхойлно. Энэ нь security.yml файл юм. Модулийн config/ директори дотор, зөвхөн нэг ээкшн нь un-secure, бүхэл модулийн хувьд secure байх security.yml файл үүсгэ:

index:
  is_secure: false

all:
  is_secure: true

Дефаолтоор, myUser класс нь sfUser биш sfBasicSecurityUser классаас удамшсан байна. sfBasicSecurityUser класс нь хэрэглэгчийн authentication болон authorization –г удирдах нэмэлт методуудаар хангагдсан байдаг.

Хэрэглэгчийн authentication –г удирдахдаа, isAuthenticated() болон setAuthenticated() методуудыг ашигладаг:

if (!$this->getUser()->isAuthenticated())
{
  $this->getUser()->setAuthenticated(true);
}

Authorization

Хэрэглэгч authenticated хийх үед credentials (итгэмжлэх)–г тодорхойлж өгсөнөөр зарим ээкшний хандалтыг илүү хязгаарлаж болно. Хэрэглэгч хуудас руу хандахдаа шаардлагатай credentials (итгэмжлэх) –тэй байх хэрэгтэй болно:

default:
  is_secure:   false
  credentials: admin

Symfony –ийн credential (итгэмжлэлт) –н систем нь энгийн бөгөөд маш хүчирхэг юм. Credential (итгэмжлэх) нь таны тодорхойлж өгсөн ямарч апликэйшний секюрити моделийг төлөөлж чадна (групп болон permission –уудтай адил).

Нийлмэл итгэмжлэх (Complex Credentials)

security.yml файлын credentials оролт нь нийлмэл итгэмжлэхийн шаардлагийг тодорхойлох бүүлиэн (boolean) үйлдлүүдийг дэмждэг.

Хэрэв хэрэглэгч нь A болон B итгэмжлэхтэй байх ёстой бол, дөрвөлжин хаалтаар credentials –г хаана:

index:
  credentials: [A, B]

Хэрэв хэрэглэгч A эсвэл B итгэмжлэхтэй байх ёстой бол, хоёр хос дөрвөлжин хаалтаар хаана:

index:
  credentials: [[A, B]]

Credentials –ийн тооноос хамаарч бүүлиэн (boolean) илэрхийлэлийн ямарч төрлийг тодорхойлсон тохирох хаалтуудыг тэгш холино.

sfBasicSecurityUser класс нь хэрэглэгчийн credentials (итгэмжлэх) –г удирдах хэдэн методоор хангадаг:

// Нэг эсвэл олон credentials нэмэх  
$user->addCredential('foo');
$user->addCredentials('foo', 'bar');

// Хэрэв хэрэглэгч credential –тэй бол шалгах
echo $user->hasCredential('foo');                      =>   true

// Хэрэглэгч хоёр credentialsтэй бол шалгах
echo $user->hasCredential(array('foo', 'bar'));        =>   true

// Хэрэглэгч credentials –уудын аль нэгтэй бол шалгах
echo $user->hasCredential(array('foo', 'bar'), false); =>   true

// Credential –г устгах 
$user->removeCredential('foo');
echo $user->hasCredential('foo');                      =>   false

// Бүх credential –г устгах (logout үйлдэлд хэрэглэгддэг) 
$user->clearCredentials();
echo $user->hasCredential('bar');                      =>   false

Jobeet бээкэнд апликэйшний хувьд, бидэнд зөвхөн администратор гэсэн нэг л профайл байгаа тул бид ямар ч credentials (итгэмжлэх) хэрэглэхгүй:

Плагин (Plugins)

Дугуйг дахин зохион бүтээх хэрэггүйтэй адил, бид логин ээкшнийг хөгжүүлэхгүй. Үүний оронд, бид symfony плагин суулгах болно.

Symfony фрэймворкын агуу хүчнүүдийн нэг нь плагин экосистем юм. Бид ирэх өдрүүдэд, плагин үүсгэх нь ямар хялбар зүйл болохыг үзэх болно. Плагин нь маш хүчирхэг бөгөөд модулиуд болон ассетууд (assets) –ыг тохируулах ямарч тохиргоог агуулж чадна.

Өнөөдөр, бид бээкэнд апликэйшнийг хамгаалах (secure) sfDoctrineGuardPlugin плагиныг суулгана.

$ php symfony plugin:install sfDoctrineGuardPlugin

plugin:install таск нь плагиныг нэрээр нь суулгадаг. Бүх плагинууд plugins/ директори дотор хадгалагддаг бөгөөд плагин директори бүр нь плагины нэрээрээ нэрлэгдсэн байдаг.

v  plugin:install таскыг ажиллуулахын тулд PEAR –г суулгасан байх ёстой.

plugin:install таскаар плагин суулгах үед, symfony нь плагины хамгийн сүүлийн тогтвортой хувилбарыг суулгадаг. Плагины онцгой хувилбарыг суулгахын тулд –release сонголтыг дамжуулна.

Плагины бүх боломжтой хувилбарыг symfony –ийн хувилбараар нь групп үүсгэн плагин хуудсанд жагсаасан байгаа.

Плагин нь өөрөө директори дотор агуулагддаг шиг, түүнчлэн та symfony-ийн вэб сайтаас пакежийг татаж аваад задлахад болно. Эсвэл плагины дэд хувилбарыг агуулах svn:externals холбоосыг үүсгэнэ.

plugin:install таск нь автоматаар ProjectConfiguration.class.php файлыг шинэчилж, автоматаар плагин (ууд) –ыг идэвхижүүлдэг. Гэхдээ subversion –аар эсвэл плагины архив файлыг татаж авсан тохиолдолд, ProjectConfiguration.class.php файлд плагин идэвхижүүлэлтийг та гараараа хийж өгөх хэрэгтэй:

// config/ProjectConfiguration.class.php 
class ProjectConfiguration extends sfProjectConfiguration
{
  public function setup()
  {
    $this->enablePlugins(array(
      'sfDoctrinePlugin',
      'sfDoctrineGuardPlugin'
    ));
  }
}

Бээкэнд секюрити (Backend Security)

Плагин бүрт плагиныг хэрхэн тохируулахыг тайлбарласан README файл байдаг.

Одоо шинэ плагиныг хэрхэн тохируулахыг үзэцгээе. Плагин нь users, groups болон permissions –ийг удирдах нилээд хэдэн шинэ модел классуудаар хангагдсан байдаг. Та өөрийн моделийг дахин байгуулах (rebuild) хэрэгтэй:

$ php symfony doctrine:build --all --and-load --no-confirmation

doctrine:build --all --and-load таск өмнө нь үүссэн байсан бүх хүснэгтүүдийг устгаад шинээр үүсгэдэг гэдгийг та санасан байх. Үүнээс зайлсхийхийн тулд та models, forms, болон filters –ийг үүсгээд, дараа нь data/sql/ дотор хадгалагдаж байгаа үүсгэгдсэн SQL statement-уудаар шинэ хүснэгтүүдийг үүсгэнэ.

sfDoctrineGuardPlugin нь хэрэглэгчийн класст нилээд хэдэн методуудыг нэмдэг тул та myUser классын үндсэн классыг sfGuardSecurityUser болгон өөрчлөх хэрэгтэй:

// apps/backend/lib/myUser.class.php
class myUser extends sfGuardSecurityUser
{
}

sfDoctrineGuardPlugin нь хэрэглэгчүүдийг authenticate хийх sfGuardAuth модуль дахь signin ээкшнээр хангадаг.

Логин хуудасны дефаолт ээкшнийг өөрчилж, settings.yml файлыг засварлана:

# apps/backend/config/settings.yml
all:
  .settings:
    enabled_modules: [default, sfGuardAuth]

    # ...

  .actions:
    login_module:    sfGuardAuth
    login_action:    signin

    # ...

Прожектын бүх апликэйшнууд нь плагинуудыг дундаа эзэмшдэг тул тухайн хэрэглэхийг хүсэж байгаа модулиудаа enabled_modules тохиргоонд нэмж модулиудын идэвхижүүлэлтийг тодорхой болгох хэрэгтэй.

Сүүлийн алхам бол администратор хэрэглэгч үүсгэх:

$ php symfony guard:create-user fabien SecretPass
$ php symfony guard:promote fabien

v  Хэрэв subversion trunk –аас sfDoctrineGuardPlugin плагиныг суулгасан бол та дараах нэг коммандаар хэрэглэгч үүсгэж, promote (эрх нэмэх) хийнэ:

$ php symfony guard:create-user fabien@example.com fabien SecretPass Fabien Potencier

TIP sfGuardPlugin нь коммандын мөрнөөс users, groups, болон permissions –г удирдах таскуудаар хангагдсан байдаг. list таскыг хэрэглэсэнээр guard namespace –д хамаарах бүх таскуудыг жагсаана:

$ php symfony list guard

Хэрэглэгч authenticated хийгдээгүй үед, бид цэсийн хэсгийг нуух хэрэгтэй:

// apps/backend/templates/layout.php
<?php if ($sf_user->isAuthenticated()): ?>
  <div id="menu">
    <ul>
      <li><?php echo link_to('Jobs', 'jobeet_job') ?></li>
      <li><?php echo link_to('Categories', 'jobeet_category') ?></li>
    </ul>
  </div>
<?php endif ?>

Хэрэглэгч authenticated хийгдсэн үед, бид цэсэнд гарах (logout) холбоосыг нэмэх хэрэгтэй:

// apps/backend/templates/layout.php
<li><?php echo link_to('Logout', 'sf_guard_signout') ?></li>

v  app:routes таскыг хэрэглэж, sfDoctrineGuardPlugin плагины бүх routes –г харна.

Jobeet бээкэнд апликэйшнийг илүү сайжруулж, администратор хэрэглэгчидийг удирдах шинэ модуль нэмцгээе. Талархууштай, Плагин нь модулиар хангадаг. sfGuardAuth модулийн хувьд түүнийг settings.yml файлд идэвхижүүлэх хэрэгтэй:

// apps/backend/config/settings.yml
all:
  .settings:
    enabled_modules: [default, sfGuardAuth, sfGuardUser]

Цэсэнд шинэ холбоос нэмэе:

// apps/backend/templates/layout.php
<li><?php echo link_to('Users', 'sf_guard_user') ?></li>

Бид дууслаа!

Хэрэглэгчийн тестчилэл (User Testing)

Өдөр 13 хараахан дуусаагүй, учир нь бид хэрэглэгчийн тестчилэлийн талаар ярилцаагүй байгаа билээ. Symfony browser нь күүкий (cookie) –нүүдийг үзүүлэх болно. sfTesterUser тестер built-in –г ашиглан хэрэглэгчийн төлвүүдийг тестлэх нь тун хялбархан юм.

Бидний одоог хүртэл нэмж ирсэн, цэсний онцлогт зориулсан функцианаль тестүүдийг шинэчилцгээе. Ажил (job) модулийн функцианаль тестүүдийн төгсгөлд дараах кодыг нэм:

// test/functional/frontend/jobActionsTest.php
$browser->
  info('4 - User job history')->

  loadData()->
  restart()->

  info('  4.1 - When the user access a job, it is added to its history')->
  get('/')->
  click('Web Developer', array(), array('position' => 1))->
  get('/')->
  with('user')->begin()->
    isAttribute('job_history', array($browser->getMostRecentProgrammingJob()->getId()))->
  end()->

  info('  4.2 - A job is not added twice in the history')->
  click('Web Developer', array(), array('position' => 1))->
  get('/')->
  with('user')->begin()->
    isAttribute('job_history', array($browser->getMostRecentProgrammingJob()->getId()))->
  end()
;

Тестчилэлийг хялбаржуулахын тулд, бид эхлээд fixtures өгөгдлийг дахин ачаалаад (reload), дараа нь броузерыг дахин ачаалсанаар (restart) сэйшнийг цэвэрлэж ажлуулна.

isAttribute() метод нь хэрэглэгчийн өгөгдсөн атрибутыг шалгадаг.

v  Мөн түүнчлэн, sfTesterUser тестер нь хэрэглэгчийн authentication болон autorizations –г тестчилэх isAuthenticated() болон hasCredential() методуудаар хангадаг.

Дүгнэлт (Final Thoughts)

Symfony-ийн хэрэглэгчийн классууд нь PHP сэйшн удирдлагийг хийсвэрлэх сайхан арга юм. Бид хэдхэн минутын дотор Jobeet-н бээкэнд апликэйшнийг Symfony-ийн агуу плагин систем болон sfGuardPlugin плагины хослолоор хамгааллаа. Мөн бид өөрийн администратор хэрэглэгчидийг чөлөөтэй удирдах цэвэрхэн интерфэйсийг нэмсэн. Плагины модулиудад баярлалаа.

« Өдөр 12: Админ үүсгэгч Өдөр 14: Фийдүүд »

Advertisements

135 thoughts on “Practical symfony Day 13: The User

  1. Маш их баярлаж байна. Гэхдээ дахиад нэг даварчихвал яадгийм kkk. Энэ бүх хичээлүүдийг PDF ч юмуу нэгтгээд нэг файл болгоод тавиад өгөөч.

  2. Ихэд талархав хэрэгтэй зүйлс байна. Харагдах байдлын жаахан жижигсгээч уншихад жаахан төвөгтэйн

  3. Сайн уу
    Маш их баярлау байна асуух юм байна.
    энгийн admin Super Admin аа устгаад байх юм ямар нэг тохиргоо хийх бол хаана хийх вэ хэлээд өгөөч.

    • user-ийнхаа credential-г myUser.class дээрээ тохируулаад өгчих.
      superAdmin бол : $this->addCredential(‘superAdmin’);
      энгийн admin: $this->addCredential(‘admin’);

      тэгээд устгах хэсэгтээ ямар Credential-taйг нь шалгачих.

  4. Hi, Doctrine model-iin dahin todorhoilogdson save function dotor login hiisen (sfDoctrineGuard ashiglasan) hereglegchiin user_id -iig yaj avah ve. action deer bol $this->getUser()->getGuardUser()->getId(); geed avdag. Dahin todorhoilsonson save deeree user_id-iig ni uur table-d bichih gej baigaa yum.

  5. hi, $sf_user-g undsen layout deeree duudaj ajilluuldag ym uu zaaval… zgr module.n template deer ashiglah boloh u… zarchim ni ali ni ve ?

    • $sf_user нь template хэсэгт ашигладаг helper. Action-nii $this->getUser() нь, template хэсгийн $sf_user ижилхэн. Layout нь өөрөө хамгийн гаднах template (Template фолдерт байгааг харсан биздээ ). 🙂

      • hehe bayarlalaa harsan gehdee bi undsen layout deeree sf_user-g ashiglah ym baih gesen chin ali neg module.n layout deer bas davhar ashiglaj boloh ym bna te hehe

      • tegheer bi undsen layout deeree l sf_user-g ashiglah estoi yu module.n template deer bol ashiglah hereggui ym bna te ho

  6. $this->getUser()->login($this->form->getObject());

    iiimerhuu baidlaar avch baigaa getObject gedeg ni jishee ni yu baih ve?
    User gesen table.ee object bolgoj baina gej oilgoh uu?

    • Тухайн форм харгалзах объект. Жишээ нь: user-ийн хувьд UserForm-ыг ашиглаж байгаа бол объект нь user-х ,
      Ер нь бол Doctrine-ны map хийж байгаа хүснэгтийн объект байна.

    • layout -аар decorate хийх үү гэдэг тохиргоо. Хэрэв has_layout түрүү бол тухайн template нь гадуураа layout-аараа бүрэгдэнэ гэсэн үг.

  7. Sain uu, udriin mend asuuh ng zuil bna Bi oorinh deer ajillaj bga project.oo 1.0 esvel 1.4 gdgiig ni yaaj medeh ve ho… naiz maani hiij bsan web.ee ogson chin ter ni symfony hed ym bol gej bodoo l … teriig yaj medeh ve?

    • command line-r php symfony -V эсвэл index.php -ийнхээ getApplicationConfiguration(‘frontend’, ‘dev’, true); гээд баруун дээд булангийн debug bar-s бас харж болно.

    • url_for ni URI-д хэрэглэгдэнэ. Дотоод линк-үүд гэсэн үг, routing -д дэхь холбоосууд. 3 дахь аргумент нь yes бол гадаад холбоос руу үсрэнэ.

      link_to нь a tag-г буцаана, 3 дахь аргумент нь а таг-ийн атрибутууд байна.

  8. thanks …………………………………………..
    isAuthenticated()):?>
    $form))?>

    ta nevtersen bna
    <a href="&#8221;>Logout

    ene jisheenees
    isAuthenticated ni yag yaaj bgam be bi bie daaj surj bgan?

  9. hasCredential(‘user’)):?>
    <a href="&#8221;>User Login |
    <a href="&#8221;>Register

    anh login hiihed ni ogson addCredentail-aa……………….
    hasCredential ( user ) – credential bna u gej shalgaj bna u te?

    • symfony php-iin ORM boloh Doctrine -g ashigladag, baaztai holbogdoh buh tohirgoo model – ene ter belen bhad ygaad zaawal mysql_result() geh function ashiglah geed bgaan,
      ternees bish symfony uuruu php -deerh framework uchraas buh php-iin function-g ashiglaj bolno.

    • oo sain sain.

      cache dotorh admin heseg ni generate.yml tohirgoonoos uusej bgaan. tegeheer shineer tohirgoo hiisen bol cache-ee tseverlehed l bolno. cache dotrhoo ustgana gsen ug.

    • comment register гэхээр бүртгэлтэй хэрэглэгчид сэтгэгдэл бичдэг байхиймүү, Тэгвэл ч Captcha хэрэгүй шдээ,
      Бүртгүүлэхгүйгээр шууд сэтгэгдэл бичдэг бол captcha ашиглах нь зөв байх.

      • herev ajax , jquery-geer comment shiidsen bol captcha shaardlagagui baih te

    • наадах чинь 1.1 дээр л байсан, default-аара сүүлийх дээр нь байхгүй болцон. Хэрэгтэй бол Helper-ыг нь гараараа биччих.

  10. сайн уу эрхэмээ .
    нэг асуулт байнаа
    mobile bolon
    web -d zoriulsan 2 application beldsen ym tegeed
    utasnaad orohod mobile application ruu gdgiig ni yaaj tohiruulj zaaj ogoh ve ho…
    computer.s orohod medeej undsen web application baina… eniig helj ogch tuslaach

    • Форм дээр өөр форм дуудаж оруулдийн, олон холбоотой хүснэгтүүдийг нэг submit-ээр хадгална гэсэн үг.

  11. Ойлгомжгүй байвал doctrine-project.org руу ороод нарийвчлаад хараарай.
    наадах чинь зүгээр энгийн хүсэлт нь байна шдээ.
    с нь ямар нэгэн хүснэгтийн баганы утга төлөөлж байгаа тэгээд тэндээс 0 тэнцүү утгыг нь л авна. За тэгээд өөр doctrine -ийн query-ын боломжуудыг сайтаас нь ороод харчих.

  12. jquery plugin php deer hiisen web ruugee zalgachdag bsan chin symfony deer aygui asuudaltai bna yah ve adminaa golchlon yu yun deer anhaarah heregtei ve ta heleech

    • layout юмуу template хэсэгтээ javascript-ee дуудаад,

      template хэсэгт дараах байдлаар дуудагдана : use_javascript(‘/js/blah.js’);
      эсвэл view.yml дээр бичиж өгч болно,

      Тэгээд template дээрээ javascript-ээ ажиллуулдаг юмуу гаднаас оруулж ирэхэд л хангалттай даа.

  13. neg zarchimiin asuudal bna bi css.ee nerlehdee zalhuuraad base1.css, base2.css, base3.css, base4.css geed ogtsiin tegsen view.yml deeree adilhan baahan ner duudah bolchood tegeed tovchlood oruulahdaa base.css?rand=1234 ingesen. ingeh ni yamar neg buruu ur dun avchrahgui bgada ???

    • Тодорхой яг юун дээр гараад байгааг нь бичвэл сайн байна. Ерөнхийдөө бол анхдагч утга олгох, эхлүүлэх үед ашигладаг Method-ыг нэрлэдэг дээ.

  14. isset($data[$key]) ? $data[$key] : array();
    if(isset($data[$key])){
    $data[$key];
    }else{
    array();
    }
    ene 2 zarchimiin huvid yalgaaguui biz de

  15. isset($data[$key]) ? $data[$key] : array();
    ——————————————————–
    if(isset($data[$key])){
    $data[$key];
    }else{
    array();
    }

    • Php serialize-г html элемент зэргийг ямар нэгэн бүтцийг нь алдагдуулахгүйгээр бааздаа хадгалаад (serialize хийгээд), гаргаж авах (unserialize) зэрэг зэрэгт ашиглана. Өгөгдлийг дата бүтцэд оруулж хувиргана. жишээг нь гүүглэ-д

  16. json gdg oilgoltiig ooriinhooroo helj ogooch minii bodloor xml gej format bdag shg json gej format baih shg bna gej oilgood bga gehdee yag sain nariin meddeggui

  17. hi, oroin mend
    neg asuudal garlaa
    nom gesen table.s zarahaar zarsan table.s bolon yamar baraa zarsan zarsan_baraa table bgan tegeed neg zarsan deer olon baraa zarj bgan harin transaction table.n jagsaalt deer zarsan_baraa-nihaa uniig haruulah geed
    foreach dotor
    $trans->getZarsan()->getZarsanBaraa()->getPrice()
    gesen bolov ch doorh aldaa garaad boldoggui ee?

    Warning: call_user_func_array() [function.call-user-func-array]: First argument is expected to be a valid callback, ‘Doctrine_Collection::getPrice’ was given in

  18. hi oroin mend list components deer total ur dung urjuulj gargaad neg huvisagchid ogood hevlesen bga
    harin ter huvisagchaa action.class.n processform deer save hiihdee yaaj ter huvisagchid bga utgiig oruulj ireh ve?

    • setAttribute(‘your variable name’ => value) -гэж хийгээд болно. Гэхдээ энэ ч тийм үр дүнтэй арга бишдээ, input type=hidden гэж формоороо пост хийвэл уг нь баталгаатай байхдаа.

  19. model.d bga function.uudiig action deeree duudchad daraa ni ctrl+click hiiheer ug function ruu userdeg shde tegsen tegej userehgui ym yug ni tohiruulj ogdog ym bol?

    • Аан энэ зүгээр хамгийн анхны ашиглаж байгаа хүмүүсд зориулсан бэлэн, жижигхэн аппликэйшн. Нэг их давуу тал сул тал гээх байхгүй зүйлгүй, өөрийг чинь илүү ойлгомжтой болгоход л зориулагдсан.

  20. sain medehgui bna gehdee procedure bichchvel query.n hesegt ajillahad mash hyalbar gej sonsoj bsan … tiim ym hiij bsan bol her bol gej asuuj bgan ho

    • Яг чиний юу хүсээд байгааг сайн ойлгохгүй л байна. Тэгэхээр хэрэв чиний ярьж байгаа зүйл хамгийн сайн бол тэр аль хэдийн л хийгдэх байсан байх. Хурдан удааны хувьд чиний хэрхэн бичигдээд ямар төхөөрөмжөөр боловсруулагдаж байгаагаас л хамаарах байхдаа. 🙂

    • ямар төрөл рүү экспорт хийхээс хамаараад lib классаа нэмээд тэгээд л болно доо. Плагин байдаг эсэхийг нь сайн мэдэхгүй байна.

  21. er ni bol humuusees online sudalgaa avaad daraa ni teriigee sar saraar ni ch ymuu pdf, excel, html ruu export hiij avdag baihaar hiij bgan za ene html2pdf.fr site-g uzej sudlanaa

    • Наад плагин чинь би ашиглаж үзээгүй. Хөгжүүлэлт болон хүмүүс хэр их ашигладагыг нь нэг харчихгүй юу. Хөгжүүлэлт нь зогссон байвал бас дэмий байлгүй дээ. Яаж ашиглах нь чиний л сонголт.

  22. zolboo -н асуултан дээр тодруулаад асууя ер нь иймэрхүү sf plugin уудыг ашиглах эсвэл js /grid/ сангуудыг дуудаж оруулж ирээд ашиглах аль нь хялбар бас ирээдүйтэй амар юм бэ

    • Ер нь бол плагин нь ашиглахад арай хялбар. Харин хөгжүүлэлт нь хэр явагдаж байгаагаас хамаараад цаашид ашиглаад явах эсэх нь жоохон эргэлзээтэй. Харин сангуудыг нь дангаар нь ашиглаад явбал чи өөрөө бүх удирдлагыг гартаа барьж байгаа л гэсэн үг. Хөгжүүлэлт болон хэрэглэгчийн тоо энэ тэрийг харж байгаад л сонгох хэрэгтэй.

    • Болно л доо. Pear тухайн сервер дээрээ нэг удаа ямар нэгэн сан сулгаад тэгээд тэрийгээ хаанаас ч хамаагүй ашиглаад явах боломж л олгож байгаа. Тэрнээс биш яаж ашиглах нь хувь хүний л сонирхол.

Хариулт үлдээх

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Өөрчлөх )

Twitter picture

You are commenting using your Twitter account. Log Out / Өөрчлөх )

Facebook photo

You are commenting using your Facebook account. Log Out / Өөрчлөх )

Google+ photo

You are commenting using your Google+ account. Log Out / Өөрчлөх )

Connecting to %s