folytatás innen

Itt most létrehozok egy egy olyan modult, ahol csak azokat a termékeket fogjuk megjeleníteni, amik egy kiválasztott kategóriában szerepelnek.

[sourcecode language=”bash”]
# hozzuk létre a modult:
./symfony doctrine:generate-admin –module=Product frontend Product
[/sourcecode]

Itt ígéretemhez híven szükség lesz egy kis kód létrehozására is.
Először ki kell egészíteni a apps/frontend/modules/Product/actions/actions.class.php filet:
[sourcecode language=”php”]
/**
* Minden action eseten szukseg lesz egy slotra,
* amiben eltaroljuk hogy melyik kategoria van kivalasztva
*
*/
public function preExecute()
{
parent::preExecute();
$this->getResponse()->setSlot(‘sf_admin.extend_url’, ‘category=’.$this->context->getRequest()->getParameter(‘category’));
}

/**
* redirect eseten is hozza kell tenni a kategoriat a linkhez
*
* @param unknown_type $url
* @param unknown_type $statusCode
*/
public function redirect($url, $statusCode = 302)
{
if ($this->request->hasParameter(‘category’))
{
$query_string_array[‘category’] = $this->request->getParameter(‘category’);
}

if ($object = @$this->getRoute()->getObject() && isset($query_string_array))
{
if (is_array($url))
{
$url = array_merge($url, $query_string_array);
}
else
{
if (strpos($url, ‘?’)!==false)
{
$url .= ‘&’. http_build_query($query_string_array);
}
else
{
$url .= ‘?’. http_build_query($query_string_array);
}
}
}

parent::redirect($url, $statusCode);
}

/**
* meg kell szurni kategoria szerint a listat
*
* @return unknown
*/
protected function buildQuery()
{
$query = parent::buildQuery();
if (sfContext::getInstance()->getRequest()->hasParameter(‘category’))
{
$category = CategoryTable::getInstance()->find(sfContext::getInstance()->getRequest()->getParameter(‘category’));

if ($category)
{
$query->andWhere(‘category_id = ?’, $category->getId());
}

$this->category = $category;
}

return $query;
}

/**
* Uj elem letrhozasakor ki kell valasztani a kategoriat
*
* @param sfWebRequest $request
*/
public function executeNew(sfWebRequest $request)
{
parent::executeNew($request);
$this->form->setDefault(‘category_id’, $request->getParameter(‘category’));
}

/**
* szerkeszteskor adjuk meg a termek nevet, amit szereksztunk
*
* @param sfWebRequest $request
*/
public function executeEdit(sfWebRequest $request)
{
parent::executeEdit($request);
$this->getResponse()->setSlot(‘sf_admin.title’, ‘Termék adatlapja (‘.(string)$this->product.’)’);
}

/**
* A lista tablazatanak fejleceben adjuk meg hogy melyik kategoria termekeit listazzuk
*
* @param sfWebRequest $request
*/
public function executeIndex(sfWebRequest $request)
{
parent::executeIndex($request);
$this->getResponse()->setSlot(‘sf_admin.title’, ‘Termékek listája’ . ($this->category ? ‘(‘.(string)$this->category.’)’ : ” ));
}

/**
* A torles utan az objektum torlesre kerult, így a redirect eseten mar nem tudjuk feldolgozni
*
* @param sfWebRequest $request
*/
public function executeDelete(sfWebRequest $request)
{
$request->checkCSRFProtection();

$this->dispatcher->notify(new sfEvent($this, ‘admin.delete_object’, array(‘object’ => $this->getRoute()->getObject())));

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

$extend = ‘?category=’.$object->getCategoryId();

$object->delete();

$this->getUser()->setFlash(‘notice’, ‘The item was deleted successfully.’);

$this->redirect(‘@product_Product’.$extend);
}
[/sourcecode]

szerkesszük át a generator.yml konfig fájlt:
apps/frontend/modules/Product/config/generator.yml
[sourcecode language=”plain”]
generator:
class: jRollerDoctrineGenerator
param:
model_class: Product
theme: jroller
non_verbose_templates: true
with_show: false
singular: ~
plural: ~
route_prefix: product_Product
with_doctrine_route: true
actions_base_class: sfActions

config:
actions: ~
fields:
# az alábbi sor egy kapcsolt tábla szerinti rendezést mutat be
Category: { is_sortable: true, peer: Category, sort: title}
list:
display: [title, slug, Category]
batch_actions: []
filter: ~
form:
hide: [slug] # rejtsük el a slugot a formból
edit: ~
new: ~
[/sourcecode]

Hogy ki tudjuk választani a kategóriát meg kell jeleníteni. Ezt egy komponenssel tesszük.
Létrehozunk a CategoryAdmin modulban egy CategoryAdmin komponenst:
apps/frontend/modules/CategoryAdmin/actions/components.class.php

[sourcecode language=”php”]
<?php
/**
* megjeleniti a kategoria listat
*
* @param sfWebRequest $request
*/
class CategoryAdminComponents extends sfComponents
{
public function executeMenu(sfWebRequest $request)
{
$this->selectedCategory = null;
if ($request->getParameter(‘category’))
{
$this->selectedCategory = CategoryTable::getInstance()->find($request->getParameter(‘category’));
}
$this->categories = CategoryTable::getInstance()->findAll();
}
}
[/sourcecode]

Létrehozunk hozzá egy templatet is, amiben a jquery-ui menu pluginjat fogjuk használni:
apps/frontend/modules/CategoryAdmin/templates/_menu.php
[sourcecode language=”php”]
<?php if (count($categories)) : ?>

<ul class="menu-left">
<?php foreach ($categories as $category): ?>
<li class=".ui-menu-item <?php echo $category->getSlug() ?>">
<?php echo link_to($category, ‘@product_Product?category=’.$category->getId()); ?>
</li>
<?php endforeach; ?>
</ul>

<script type="text/javascript">
$(function() {
$( ".menu-left" ).menu();
<?php if ($selectedCategory): ?>
$( ".menu-left" ).menu( "focus", null, $( ".<?php echo $selectedCategory->getSlug() ?>" ) );
<?php endif ?>
});
</script>

<?php endif ?>
[/sourcecode]

Valahol meg kell hívnunk ezt a komponenst. Ezt megtehetnénk egy új layoutban is, viszont ez a bejegyzés az sfAdminThemejRoller pluginról szól, így azzal fogom megoldani. Ehhez felül kell írni egy templatet, méghozzá egy olyat, amivel a legkevesebb kódot “égetünk” a munkánkba. Ez azért fontos hogy a modul a továbbiakban is a generator.yml fájlban beállított paraméterek alapján működjön. Nyilván minél több olyan fájlt írunk felül, ami onnan állítható, annál kevésbé fogunk tudni később a paramétereken változtatni. Illetve a változtatásoknak nem lesz meg a várt hatása. Ezért a választásom egy üres template fájlra esett, ami pontosan ezért lett létrehozva: _list_header.php
Hozzuk tehát létre a modul template mappájában a fájl másolatát és szerkesszük:
apps/frontend/modules/Product/templates/_list_header.php
[sourcecode language=”php”]
<?php include_component(‘CategoryAdmin’, ‘menu’) ?>
[/sourcecode]

Habár nem vagyok designer, de még nekem is feltűnt hogy ez így nem szép / nem jó.
Ezért szerkesztettem egy kicsit a designon
web/css/main.css
[sourcecode language=”css”]
.list-product #sf_admin_header{
float: left;
margin-top: 50px;
width: 15%;
}
.list-product #sf_admin_content {
float: left;
width: 85%;
}
.ui-menu { width: 90%; }
[/sourcecode]

Ezt is feltöltöttem a githubra:https://github.com/nova76/demo
Ittpedig megtekinthető