Jump to main content Jump to doc navigation

Расширение схемы

Откройте Extras -> MIGX

Package Name: mygallery

Вкладка «XML Schema» -> Load Schema

Добавьте объекты в существующую схему:

<object class="mygalTag" table="migx_gallery_tags" extends="xPDOSimpleObject">
    <field key="tag" dbtype="varchar" precision="100" phptype="string" null="false" default="" index="index" />
    <field key="alias" dbtype="varchar" precision="100" phptype="string" null="false" default="" index="index" />
    <composite alias="Images" class="mygalTagImage" local="id" foreign="tag" cardinality="many" owner="local" />
</object>
<object class="mygalTagImage" table="migx_gallery_tag_images" extends="xPDOObject">
    <field key="tag" dbtype="integer" attributes="unsigned" precision="10" phptype="int" null="false" index="pk" />
    <field key="image" dbtype="integer" attributes="unsigned" precision="10" phptype="int" null="false" index="pk" />
    <index alias="PRIMARY" name="PRIMARY" primary="true" unique="true" type="BTREE">
        <column key="tag" length="" collation="A" null="false" />
        <column key="image" length="" collation="A" null="false" />
    </index>
    <aggregate alias="Tag" class="mygalTag" local="tag" foreign="id" cardinality="one" owner="foreign" />
    <aggregate alias="Image" class="myGallery" local="image" foreign="id" cardinality="one" owner="foreign" />
</object>

Сохраните схему. Перейдите на вкладку «Create Tables» -> нажмите «Create Tables»

Добавление полей тегов в Formtabs

Отредактируйте конфигурацию MIGX «mygallery»

Вкладка «Formtabs»

Добавьте вкладку с caption «Tags»

На вкладку добавьте поле с fieldname «tags» и inputTVtype «listbox-multiple»

В Input Option Values этого поля укажите (привязка @SNIPPET; @EVAL в MODX 3 недоступен):

@SNIPPET migxLoopCollection {"classname":"mygalTag","sortConfig":"[{\"sortby\":\"tag\"}]","tpl":"@CODE:[[+tag]]==[[+id]]","outputSeparator":"||"}

Создайте ещё одно поле с fieldname «newtag»

Сохраните поля и вкладку через «Done»

Вкладка «MIGXdb - Settings»

В «Hook Snippets» добавьте:

{"aftersave":"mygallery_aftersave","aftergetfields":"mygallery_aftergetfields"}

Сохраните конфигурацию

Создайте два сниппета

mygallery_aftersave:

$object = &$modx->getOption('object',$scriptProperties,null);
if ($object){
    $newtags = explode(',',$object->get('newtag'));
    $tags = explode('||',$object->get('tags'));
    $object_id = $object->get('id');
    //add new tags
    foreach ($newtags as $newtag){
        if (!empty($newtag)){
            if ($tag = $modx->getObject('mygalTag',array('tag'=>$newtag))){
            } else {
                $tag = $modx->newObject('mygalTag');
                $tag->set('tag',$newtag);
                $tag->save();
                $tags[] = $tag->get('id');
            }
        }
    }
    //get old imagetags
    $oldtags = array();
    $c = $modx->newQuery('mygalTagImage');
    $c->where(array('image'=>$object_id));
    if ($collection = $modx->getCollection('mygalTagImage',$c)){
    foreach ($collection as $tagimage){
            $oldtags[$tagimage->get('tag')] = $tagimage->get('tag');
        }
    }
    //add new imagetags
    foreach ($tags as $tag){
        if (!empty($tag)){
            unset($oldtags[$tag]):
            if ($tagimage = $modx->getObject('mygalTagImage',array('image'=>$object_id,'tag'=>$tag))){
            } else {
                $tagimage = $modx->newObject('mygalTagImage');
                $tagimage->set('image',$object_id);
                $tagimage->set('tag',$tag);
                $tagimage->save();
            }
        }
    }
    //remove removed imagetags
    foreach ($oldtags as $tag){
        if ($tagimage = $modx->getObject('mygalTagImage',array('image'=>$object_id,'tag'=>$tag))){
            $tagimage->remove();
        }
    }
}

mygallery_aftergetfields:

$object = &$modx->getOption('object',$scriptProperties,null);
if ($object){
    $newtags = explode(',',$object->get('newtag'));
    $tags = explode('||',$object->get('tags'));
    $object_id = $object->get('id');
    //add new tags
    foreach ($newtags as $newtag){
        if (!empty($newtag)){
            if ($tag = $modx->getObject('mygalTag',array('tag'=>$newtag))){
            } else {
                $tag = $modx->newObject('mygalTag');
                $tag->set('tag',$newtag);
                $tag->save();
                $tags[] = $tag->get('id');
            }
        }
    }
    //get old imagetags
    $oldtags = array();
    $c = $modx->newQuery('mygalTagImage');
    $c->where(array('image'=>$object_id));
    if ($collection = $modx->getCollection('mygalTagImage',$c)){
    foreach ($collection as $tagimage){
    $oldtags[$tagimage->get('tag')] = $tagimage->get('tag');
        }
    }
    //add new imagetags
    foreach ($tags as $tag){
        if (!empty($tag)){
            unset($oldtags[$tag]);
            if ($tagimage = $modx->getObject('mygalTagImage',array('image'=>$object_id,'tag'=>$tag))){
            } else {
                $tagimage = $modx->newObject('mygalTagImage');
                $tagimage->set('image',$object_id);
                $tagimage->set('tag',$tag);
                $tagimage->save();
            }
        }
    }
    //remove removed imagetags
    foreach ($oldtags as $tag){
        if ($tagimage = $modx->getObject('mygalTagImage',array('image'=>$object_id,'tag'=>$tag))){
            $tagimage->remove();
        }
    }
}

Получение тегов и фильтрация по тегу на фронтенде

Создайте сниппет «mygallery_prepareTagWhere» с кодом:

$tag = isset($_GET['tag']) ? (int) $_GET['tag'] : 0;
$resource_id = $modx->getOption('resource_id',$scriptProperties,$modx->resource->get('id'));
$output='';
if (!empty($tag)){
    $c = $modx->newQuery('mygalTagImage');
    $c->leftjoin('myGallery','Image');
    $c->where(array('tag'=>$tag,'Image.resource_id'=>$resource_id));
    //$c->prepare();echo $c->toSql();
    if ($collection = $modx->getCollection('mygalTagImage',$c)){
        $image_ids = array();
        foreach ($collection as $object){
            $image_ids[] = $object->get('image');
        }
        $output = ',"id:IN":['.implode(',',$image_ids).']';
    }
}
return $output;

Создайте чанк «mygallery_tag_item» с кодом:

<a href="[[~[[*id]]? &tag=`[[+Tag_id]]`]]">[[+Tag_tag]]</a><br>

Добавьте в шаблон:

[[!migxLoopCollection?
  &packageName=`mygallery`
  &classname=`mygalTagImage`
  &joins=`[{"alias":"Image"},{"alias":"Tag"}]`
  &where=`{"Image.resource_id":"[[*id]]","Image.published":"1"}`
  &placeholdersKeyField=``
  &groupby=`mygalTagImage.tag`
  &sortConfig=`[{"sortby":"Tag.tag"}]`
  &tpl=`mygallery_tag_item`
]]
[[!migxLoopCollection?
  &packageName=`mygallery`
  &classname=`myGallery`
  &sortConfig=`[{"sortby":"pos"}]`
  &where=`{"resource_id":"[[*id]]","published":"1"[[!mygallery_prepareTagWhere]]}`
  &tpl=`mygallery_item`
]]

Support the team building MODX with a monthly donation.

The budget raised through OpenCollective is transparent, including payouts, and any contributor can apply to be paid for their work on MODX.

Backers

  • modmore
  • STERC
  • Digital Penguin
  • Jens Wittmann – Gestaltung & Entwicklung
  • CrewMark
  • Fabian Christen
  • Sepia River Studios
  • Dannevang Digital
  • Alex
  • A. Moreno
  • Chris Fickling
  • Stéphane Jäggi
  • Murray Wood
  • Anton Tarasov
  • deJaya
  • JT Skaggs
  • Lefthandmedia
  • eydolan
  • Following Sea
  • Guido Gallenkamp
  • YJ
  • Raffy
  • Snow Creative
  • Nick Clark
  • Guest
  • Helen
  • krisznet
  • Yanni
  • Richard

Budget

$204 per month—let's make that $500!

Learn more