Practical symfony 7 дахь өдөр Playing with the Category Page (орчуулсан: Ариунсүлд)

За Ариунсүлдийн маань хүч хөдөлмөр, нилээд сууж, өөрийн үнэтэй цагаа зарцуулан байж маш хурдан дараагийн бүлгийг орчуулсан явдал маш их баярлалаа. Энэ мэтээрээ бол энэ ном нээх удахгүй дуусах бололтой. 🙂  Тэгэхээр төдий чинээгээрээ symfony framework-г суралцах хүний тоо олон л болно гэсэн үг. Одоо сурж байгаа болон ирээдүйд суралцах бүгдийн өмнөөс энэхүү ажилд өөрийн хувь нэмрээ оруулж байгаа Ариунсүлддээ талархаж байгаагаа хичээлийн өмнө хэлмээр санагдлаа. Thanks man.

За ингээд өнөөдрийн хичээл эхэлж байна. Асуух зүйл байвал comment-г шууд бич.

Playing with the Category Page

Өчигдрийн хичээлээр та өөрийн Symfony-ийн мэдлэгээ Doctrine, fixtures, routing, debugging болон Custom configuration гэх мэтээр нэмсэн ба бяцхан дадлага ажлаар өнөөдрийн хичээлээ эхэлье.

Таныг Jobeet категори хуудсанд ажилласан ба өнөөдөр илүү чадавхижсан гэж найдаж байна.

Бэлэн үү? Боломжит хүгжүүлэлтүүдийн талаар ярилцъя.

The Category Route

Эхлээд категори хуудсанд зориулсан цомхон URL-ыг route-д нэмье. Routing файлын эхэнд дараахи кодыг нэмнэ:

# apps/frontend/config/routing.yml

category:

url: /category/:slug

class: sfDoctrineRoute

param: { module: category, action: show }

options: { model: JobeetCategory, type: object }

Хэдийгээр та шинэ онцлог нэвтрүүлж байгаа боловч URL болон холбоотой заагч (route)-ийн талаар сайн бодох хэрэгтэй бөгөөд анхдагч заагчийг устгах шаардлагатай.

Route нь холбоотой объект, параметрүүдийн дурын баганыг ашиглаж чадна. Үүнээс гадна холбоотой объект класст тодорхойлогсдон accessor-ийн утгыг агуулж байдаг. slug параметрт category хүснэгтийг зааж өгөх мөр байдаггүй тул бид JobeetCategoryд заагч хийх хийсвэр заагч (virtual accessor) нэмж өгье:

// lib/model/doctrine/JobeetCategory.class.php

public function getSlug()

{

return Jobeet::slugify($this->getName());

}

The Category Link

Одооjob module-ийн indexSuccess.php template-т категори хуудастай холбоё:

<!– some HTML code –>

<h1>

<?php echo link_to($category, ‘category’, $category) ?>

</h1>

<!– some HTML code –>

</table>

<?php if (($count = $category->countActiveJobs() –

sfConfig::get(‘app_max_jobs_on_homepage’)) > 0): ?>

<div class=&#8221;more_jobs&#8221;>

and <?php echo link_to($count, ‘category’, $category) ?>

more…

</div>

<?php endif; ?>

</div>

<?php endforeach; ?>

</div>

Бид зөвхөн холбогч нэмсэн. Энэ холбогч нь 10-аас дээш ажлын байрны мэдээлэлтэй категорийн хувьд нэг хуудсанд харуулах ажлын байрны тоонд хязгаарлалттгүй болох нь харагдана. Иймээс JobeetCategorycountActiveJob() method нэмж өгснөөр асуудлыг шийдэж болно:

// lib/model/doctrine/JobeetCategory.class.php

public function countActiveJobs()

{

$q = Doctrine_Query::create()

->from(‘JobeetJob j’)

->where(‘j.category_id = ?’, $this->getId());

return Doctrine_Core::getTable(‘JobeetJob’)->countActiveJobs($q);

}

countActiveJobs() methot нь JobeetJobTableд тодорхойлогдоогүй тул jobeetJobTable.php файлд дараахи өөрчлөлт оруулъя:

// lib/model/doctrine/JobeetJobTable.class.php

class JobeetJobTable extends Doctrine_Table

{

public function retrieveActiveJob(Doctrine_Query $q)

{

return $this->addActiveJobsQuery($q)->fetchOne();

}

public function getActiveJobs(Doctrine_Query $q = null)

{

return $this->addActiveJobsQuery($q)->execute();

}

public function countActiveJobs(Doctrine_Query $q = null)

{

return $this->addActiveJobsQuery($q)->count();

}

public function addActiveJobsQuery(Doctrine_Query $q = null)

{

if (is_null($q))

{

$q = Doctrine_Query::create()

->from(‘JobeetJob j’);

}

$alias = $q->getRootAlias();

$q->andWhere($alias . ‘.expires_at > ?’, date(‘Y-m-d H:i:s’, time()))

->addOrderBy($alias . ‘.created_at DESC’);

return $q;

}

}

JobeetJobTableийн код шинэ addActiveJobsQuery() method-ийг олон дахин дуудаж (Код дахин давтах нь буруу гэдэг боловч ) байгааг та анзаарсан байх.

Кодын багахан хэсгийг дахин хуулж ашиглах нь эхний ээлжинд амар байдаг. Гэвч хэрэв чи үүнийг өөрөөр шийдэхийг хүсвэл дахин ачаалагдах бүхнийг shared function, method-уудад үүсгэх хэрэгтэй.

countActiveJobs() method-д execute() methodийг ашиглаж үр дүнг тоолохын оронд count() methodийг ашиглах нь хурдан байдаг.

Бид маш олон файлд энгийн өөрчлөлтүүд хийсээр ирлээ. Гэвч код нэмэх бүртээ проаграмдаа зөв layer, дахин ашиглагдах (re-usable) код оруулахыг хичээж байлаа. Ингэсээр одоогийн кодонд хүрсэн билээ. Энэ бол symphony project-ийн ажиллах ерөнхий зарчим. Доорхи дэлгэцний зураг дээр тавхан ажлын байрны жагсаалт байгаа нь хангалтгүй бөгөөд бидэнд 10-аас олон ажлын байрны жагсаалт хэрэгтэй (max_jobs_on_homepage тохиргооны хэрэгжилтийг харахын тулд).

Job Category Module Creation

Энэ командаар category module үүсгэнэ:

$ php symfony generate:module frontend category

Урьд нь module үүсгэхдээ doctrine:generate-module хэрэглэсэн. Энэ нь сайн боловч кодын 90%-ийг автоматаар үүсгэхийг хүсээгүй. Бид энэ кодоор хоосон module үүсгэсэн.

Яагаад job module-д category action нэмээгүй вэ? Энэ боломжтой боловч category page нь категори төрлийнх ба ихэвчлэн үүнд зориулсан category module-аар үүсгэдэг.

Category page-д хандахад category route slug хувьсагчаар холбоотой категориудад хүсэлт явуулна. Гэвч slug нь өгөгдлийн санд хадгалагддаггүй тул категорийн нэрийг slug-аар тодорхойлж чадахгүй.

Update the Database

Category хүснэгтэд slug багана нэмье:

Энд тодорхойлсон slug багана нь Doctrine-ны Sluggable гэдэг нэртэй төлвийг (behavior) ашигладаг. Иймээс JobeetCategory-ийн шаардлагатай төлвүүдийг enable болгоё:

# config/doctrine/schema.yml

JobeetCategory:

actAs:

Timestampable: ~

Sluggable:

fields: [name]

columns:

name:

type: string(255)

notnull: true

Одоо slug нь жинхэнэ багана болсон тул JobeetCategory-оос getSlug() method-ийг устгана.

Slug баганы тохиргоо нь бичлэг оруулах бүрт автоматаар хадгалдаг бөгөөд талбарын нэрээр объект үүсгэдэг.

doctrine:build –all –and-loadаар өгөдлийн сангийн хүснэгтүүдийг шинэчилж бидний fixture-үүдийг бичнэ.

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

Бидэнд одоо executeShow() method-ийг үүсгэх боломжтой боллоо. Category action файлыг дахин доорхи кодоор дарж засварлана уу:

// apps/frontend/modules/category/actions/actions.class.php

class categoryActions extends sfActions

{

public function executeShow(sfWebRequest $request)

{

$this->category = $this->getRoute()->getObject();

}

}

executeIndex() method-ийг устгасан тул түүний indexSuccess.php template-ийг устгах шаардлагатай. Байрлал: (apps/frontend/modules/category/templates/indexSuccess.php).

Сүүлийн алхам бол showSuccess.php template үүсгэх:

// apps/frontend/modules/category/templates/showSuccess.php

<?php use_stylesheet(‘jobs.css’) ?>

<?php slot(‘title’, sprintf(‘Jobs in the %s category’,

$category->getName())) ?>

<div>

<div class=&#8221;feed&#8221;>

<a href=&#8221;&#8221;>Feed</a>

</div>

<h1><?php echo $category ?></h1>

</div>

<table>

<?php foreach ($category->getActiveJobs() as $i => $job): ?>

<tr class=&#8221;<?php echo fmod($i, 2) ? ‘even’ : ‘odd’ ?>&#8221;>

<td class=&#8221;location&#8221;>

<?php echo $job->getLocation() ?>

</td>

<td class=&#8221;position&#8221;>

<?php echo link_to($job->getPosition(), ‘job_show_user’, $job) ?>

</td>

<td class=&#8221;company&#8221;>

<?php echo $job->getCompany() ?>

</td>

</tr>

<?php endforeach; ?>

</table>

Partials

indexSuccess.php template файлд үүссэн ажлын байрны жагсаалтыг үүсгэхийн тулд <table> tag-ийг хуулж тавьсан билээ. Энэ нь муу тул шинэ арга судалъя. Template-ийн зарим хэсгийг дахин ашиглах хэрэгцээ гарахад partial үүсгэх хэрэгтэй. Partial нь template-ийн кодын хэсэг бөгөөд хэд хэдэн template-д дахин ашиглагдах боломжтой байдаг. Partialийг template-ээс ялгахын тулд доогуур зураас ( _ )-аар эхлүүлдэг.

_list.php файл үүсгэе:

// apps/frontend/modules/job/templates/_list.php

<table>

<?php foreach ($jobs as $i => $job): ?>

<tr class=&#8221;<?php echo fmod($i, 2) ? ‘even’ : ‘odd’ ?>&#8221;>

<td class=&#8221;location&#8221;>

<?php echo $job->getLocation() ?>

</td>

<td class=&#8221;position&#8221;>

<?php echo link_to($job->getPosition(), ‘job_show_user’, $job) ?>

</td>

<td class=&#8221;company&#8221;>

<?php echo $job->getCompany() ?>

</td>

</tr>

<?php endforeach; ?>

</table>

Partial-ийг include_partial() helper ашиглан дуудна.

<?php include_partial(‘job/list’, array(‘jobs’ => $jobs)) ?>

include_partial() нь partial name (module name, /, болон _-аар эхлээгүй partial name (Жишээ: job/list )), partial-ийг ашиглах хувьсагчийн массивын нэр гэсэн аргументүүд авна.

Яагаад PHP-ийн include() method-ийг include_partial() helper-ийн оронд ашиглаж болдоггүй вэ? include_partial() helper нь cache support хийдэг үндсэн ялгаатай.

HTML код дахь <table> ийг include_partial()аар даръя:

// in apps/frontend/modules/job/templates/indexSuccess.php

<?php include_partial(‘job/list’, array(‘jobs’ =>

$category->getActiveJobs(sfConfig::get(‘app_max_jobs_on_homepage’)))) ?>

// in apps/frontend/modules/category/templates/showSuccess.php

<?php include_partial(‘job/list’, array(‘jobs’ =>

$category->getActiveJobs())) ?>

List Pagination

2 дахь өдөр тодорхойлсноор:

“Хуудас бүрт 20 ажлын байр байхаар хуваая.”

Doctrine объектуудыг хуудаслахад symphony нь зориулсан класстай байдаг: sfDoctrinePager[1]. Category action-д showSuccess template-ийн job объектыг илгээхийн оронд pager-ийг дамжуулъя:

// apps/frontend/modules/category/actions/actions.class.php

public function executeShow(sfWebRequest $request)

{

$this->category = $this->getRoute()->getObject();

$this->pager = new sfDoctrinePager(

‘JobeetJob’,

sfConfig::get(‘app_max_jobs_on_category’)

);

$this->pager->setQuery($this->category->getActiveJobsQuery());

$this->pager->setPage($request->getParameter(‘page’, 1));

$this->pager->init();

}

sfRequest::getParameter() method нь 2 дахь аргументийн анхдагч утгыг авах ба action-ны хувьд хэрэв page request parameter үүсээгүй бол getParameter() нь 1 гэсэн утга буцаана.

sfDoctrinePager байгуулагч нь model класс болон нэг хуудсанд буцаах өгөгдлийн дээд хэмжээг авна. Сүүлд нь өөрийн тохиргооны файлыг зааж өгнө:

# apps/frontend/config/app.yml

all:

active_days: 30

max_jobs_on_homepage: 10

max_jobs_on_category: 20

sfDoctrinePager::setQuery() method нь Doctrine_Query объектыг өгөгдлийн сангаас select хийх үед ашиглана.

getActiveJobsQuery() method нэмэх:

// lib/model/doctrine/JobeetCategory.class.php

public function getActiveJobsQuery()

{

$q = Doctrine_Query::create()

->from(‘JobeetJob j’)

->where(‘j.category_id = ?’, $this->getId());

return Doctrine_Core::getTable(‘JobeetJob’)->addActiveJobsQuery($q);

}

Бид getActiveJobsQuery() method-ийг үүсгэснээрээ бусад JobeetCategory method-уудад үүнийг дахин ашиглах боломжтой болсон:

// lib/model/doctrine/JobeetCategory.class.php

public function getActiveJobs($max = 10)

{

$q = $this->getActiveJobsQuery()

->limit($max);

return $q->execute();

}

public function countActiveJobs()

{

return $this->getActiveJobsQuery()->count();

}

Эцэст нь template-ээ шинэчилье:

<!– apps/frontend/modules/category/templates/showSuccess.php –>

<?php use_stylesheet(‘jobs.css’) ?>

<?php slot(‘title’, sprintf(‘Jobs in the %s category’,$category->getName())) ?>

<div class=&#8221;category&#8221;>

<div class=&#8221;feed&#8221;>

<a href=&#8221;&#8221;>Feed</a>

</div>

<h1><?php echo $category ?></h1>

</div>

<?php include_partial(‘job/list’, array(‘jobs’ => $pager->getResults())) ?>

<?php if ($pager->haveToPaginate()): ?>

<div>

<a href=&#8221;<?php echo url_for(‘category’, $category) ?>?page=1″>

<img src=&#8221;http://www.symfony-project.org/images/first.png&#8221;

alt=&#8221;First page&#8221; title=&#8221;First page&#8221; />

</a>

<a href=&#8221;<?php echo url_for(‘category’, $category) ?>?page=<?php echo $pager->getPreviousPage() ?>&#8221;>

<img src=&#8221;http://www.symfony-project.org/images/previous.png&#8221;

alt=&#8221;Previous page&#8221; title=&#8221;Previous page&#8221; />

</a>

<?php foreach ($pager->getLinks() as $page): ?>

<?php if ($page == $pager->getPage()): ?>

<?php echo $page ?>

<?php else: ?>

<a href=&#8221;<?php echo url_for(‘category’, $category) ?>?page=<?php echo $page ?>&#8221;><?php echo $page ?></a>

<?php endif; ?>

<?php endforeach; ?>

<a href=&#8221;<?php echo url_for(‘category’, $category) ?>?page=<?php echo $pager->getNextPage() ?>&#8221;>

<img src=&#8221;http://www.symfony-project.org/images/next.png&#8221; alt=&#8221;Next page&#8221; title=&#8221;Next page&#8221; />

</a>

<a href=&#8221;<?php echo url_for(‘category’, $category) ?>?page=<?php echo $pager->getLastPage() ?>&#8221;>

<img src=&#8221;http://www.symfony-project.org/images/last.png&#8221; alt=&#8221;Last page&#8221; title=&#8221;Last page&#8221; />

</a>

</div>

<?php endif; ?>

<div>

<strong><?php echo count($pager) ?></strong> jobs in this category

<?php if ($pager->haveToPaginate()): ?>

– page <strong><?php echo $pager->getPage() ?>/<?php echo

$pager->getLastPage() ?></strong>

<?php endif; ?>

</div>

Энэ кодын ихэнхи хэсэг нь бусад хуудсыг дуудах холбоосуудаас бүрдэнэ. Энд sfDoctrinePager method-ийг ашиглах жагсаалтуудыг харуулсан байна.

getResults(): Идэвхитэй хуудасны Doctrine объектуудын утгууд (массив).

getNbResults(): Олдсон нийт үр дүнгийн тоо.

haveToPaginate(): Нэгээс олон хуудас байвал true (үнэн) буцаана.

getLinks(): Дэлгэцэнд гарах хуудасны жагсаалтыг буцаана.

getPage(): Одоогийн хуудасны дугаарыг харуулна.

getPreviousPage(): Өмнөх хуудсыг дуудна.

getNextPage(): Дараагийн хуудсыг дуудна.

getLastPage(): Сүүлийн хуудсыг дуудна.

sfDoctrinePager нь мөн Iterator, Countable interface-үүдийг хэрэгжүүлдэг ба count() функцийг getNbResult() method-ийн оронд хэрэглэн ижил үр дүнг харж болно.

Final Thoughts

Хэрэв та 6 өдрийн хичээлээс хангалттай ихийг судлаагүй санагдаж байгаа бол энэ нь зөвхөн symfony-ийн философи-ийг ойлгоход чиглэгдсэн байлаа. Symfony вэбсайтад шинэ feature нэмэх нь үргэлж төстэй байдаг. Жишээ нь. URL-ууд, зарим нэг action үүсгэх, model шинэчилэх болон template бичих. Хэрэв та mix ашиглаж байсан дадлага туршлага сайтай бол symfony-д гаршихад маш хурдан байх болно.

Маргааш Jobeet-ийн шинэ долоо хоног эхэлнэ. Бид topic:automated tests-ийн талаар шинэ сэдэв үзнэ.


[1] http://www.symfony-project.org/api/1_4/sfDoctrinePager

Орчуулсан: Ариунсүлд

Advertisements

73 thoughts on “Practical symfony 7 дахь өдөр Playing with the Category Page (орчуулсан: Ариунсүлд)

  1. getSlug() functionluu hamdahaar aldaa garaad bn :name gej handahaar category/page1 ni zugeer daraagiin huudasluu ni url deer ni space avagdaad bhiin ???

    • hicheeliin ehend garch bgaa // lib/model/doctrine/JobeetCategory.class.php dotorh getSlug() function ni slugify() gsen function-r url-g (-)-aar holboj bgaan. Krilleer bichiheer slugify() dr ni hurwuulehdee aldaa garsan bj boloh ym.

  2. eneiig Mongol bolgoson nisaihan sanaa bn olon hunii horhoig hurgeh bh tegeed davhar zovologoo ogoorei hamtdaa ene Jobeetiig duusagachii xo

    • chi uuruunhii sanaagaar uur project uusgeh heregtei. Tegd jobeet-n hicheelees sursan zuiluudee ter project-doo ashiglahgui yu, Nemelt function -nii huwid project-s l hamaaraad ymar shaardlaga bna terniihee daguu l bichchine.

  3. symfony deer table.uudee innodb.geer fielduudee holboj ashiglasan deer uu esvel myisam.aar ni ashiglasan zgr uu zarim ni innodb bolgoson hernee fielduudee zaaj ogolgui zgr l innodb bolgoson baihiin yalgaa ni bolon ali ni zugr ve?

    • innodb join ашиглах, relation-тэй үед хэрэглэвэл дээр. MyIsam -г full text search -д ашиглана. Ялгааг нь тэгээд хайгаад харахгүй юу, баазаа сэргээх зөөх энэ тал дээр бол ялгаа байгаа шдээ.

      жишээ нь: Field -ийн relation-г нь зааж өгөөд cascade болговол тухайн мөр устахад холбоотой бусад table-үүдийн утга автоматаар устана.

  4. admin hesgeesee cache dotorhoosoo module.uudaa avchaad generate.yml-g ustgadag bil uu tegehgui bol dan generate.yml-aar goy admin garahguinee

  5. Unknown record property / related component “user&#8221; on “Question&#8221;
    ene yunii aldaa ve… table innodb.geer holbogdoogui bolhoor ingej bna u

  6. googles routing yml.n talaar jishee harj baital app.n routing.yml deer
    class: sfDoctrineRoute
    gej ashiglasan baihiin ene yag yund hereglej bgan bol?

    • routing-р объект дамжуулна, Жишээ нь:
      url: /pages/show/:id
      class: sfDoctrineRoute
      options: { model: Page, type: object }
      гэж байвал Page model-ын объектыг /pages/new- URI-р дамжуулна гэсэн үг.
      show -ийн action-д $this->getRoute()->getObject(); гэж авна.
      Утга биш объект дамжуулна.

  7. $q = Doctrine_Core::getTable(‘User’)
    ->createQuery(‘u’)
    ->leftJoin(‘u.Email e’)
    ->where(‘u.username = ?’, ‘jwage’);

    $user = $q->fetchOne(array(), Doctrine_Core::HYDRATE_ARRAY);

    echo $user[‘Email’][’email’];

    ene HYDRATE_ARRAY ni yaadag ym bol do

  8. Table -ийн өгөгдлүүдийг array болгож дуудна. Ингэснээр чи $user[‘first_name’] гэж хандаж боломжтой болно. Performance-ын хувьд объект болгосноос арай хурдан ачааллана.

    • getId() гэсэн method байхгүй байна гэнэ. Чиний Object Mapper-д чинь id гэсэн хувьсагч байгаа эсэхийг шалга,
      эсвэл MyUser класс-даа getId гэсэн method нэмээд өгчих.

  9. За чи ер нь Doctrine сайт руу ороод илүү сайн ойлгох хэрэгтэй юм шиг байна. getInstance method нь объектыг буцааж байгаа.

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

    • Buh module bolon action-uud stack -d hadgalagdana, getFirstEntry – stack-iin ehnii utga.

      $sf_context->getActionStack()->getFirstEntry()->getModuleName(); – module

      $sf_context->getActionStack()->getFirstEntry()->getActionName(); – action

    • $pdo = Doctrine_Manager::getInstance()->getCurrentConnection()->getDbh(); // pdo connection

      $query = “SELECT * FROM table WHERE param1 = :param1 AND param2 = :param2&#8221;; //raw sql
      $stmt = $pdo->prepare($query); // хүсэлтээ бэлдэнэ

      $params = array(
      “param1&#8221; => “value1&#8221;,// аргумент1
      “param2&#8221; => “value2″//аргумент2
      );
      $stmt->execute($params);

  10. hi asuult bna bi 3. 4 credentials-tai e-office mayagiin ym hiij bgam Tegeed tus tusad ni app uusgeed hiivel deer u esvel layout uusgeed yavsan deer u? er ni ali ni iluu sain onovchtoi shiidel ve

    • Credential болгонд апп үүсгэнэ гэвэл код л давхардана даа. Зүгээр эрхийг нь шалгаад ямар үйлдэл хийж болно болохгүйг нь тодорхойлоод тэгээд болчих санагдахын.

    • partial ашиглаад байвал хадгалах энэ тэр дээр чи өөрөө логикийг нь алдагдуулахгүйгээр код нэмж өгөх хэрэгтэй болно.
      2 хүснэгтийнхээ relations-ыг нь сайн зааж өгөөд оруулж ирэх форм дээрээ
      2
      $imageForm = new ImageForm($object->getImage()); // $object -нь тухайн эх формын объект. жишээ нь Профайл бол профайлын объект
      $this->embedForm(‘image’, $xTypeForm); // image – нь профайл форм-д хавсаргагдах нэр, жишээ нь: profile_image_path, profile_image_label гэх мэт.

      Эмбэд -р хийж өгвөл ажил хөнгөвчилхөөс гадна, ямар нэгэн баазын relation – ны асуудал гарахгүй. More with symfony гэсэн номон дээр дэлгэрэнгүй байгаа.

  11. баярлалаа би ерөнхийдөө дундын тэблэ үүсгээд relation-ээр холбосон тэблэ-үүдээ моделийнхээ класс дээр зааж өгөөд form дээрээ schema widget-ээр холбож гаргаж ирээд байгаа Тэгээд Процесс форм дээр нь set хийж өгөөд байгаа……

    • Heredoc – өөрийн гэсэн дүрэмтэй string хэвлэгч. энэ хооронд бичигдсэн бүх зүйл тэмдэгт бол тэмдэгт, скрипт бол скриптээр уншигдана.

  12. sain u udriin mendee neg ym asuuy bolohuu
    generateSessionData
    gej symfony deer oor deer n baidag session-ii data avdag function ymuu

    • Байхгүй. Session-toi get, setAttribute гэж л хандаж байгаа. Үндсэн php-ийнч session-г ашиглаж болийшдэ. Баригдмалаар сэтгэж болохгүй.

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

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