Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
228 changes: 143 additions & 85 deletions attributes/page_selector/controller.php
Original file line number Diff line number Diff line change
@@ -1,85 +1,143 @@
<?php
namespace Concrete\Package\PageSelectorAttribute\Attribute\PageSelector;

use Loader;
use Page;
use Permissions;
defined('C5_EXECUTE') or die("Access Denied.");

class Controller extends \Concrete\Core\Attribute\Controller {

protected $searchIndexFieldDefinition = array('type' => 'integer', 'options' => array('default' => 0, 'notnull' => false));

public function getValue() {
$db = Loader::db();
$value = $db->GetOne("select value from atPageSelector where avID = ?", array($this->getAttributeValueID()));
return $value;
}

public function searchForm($list) {
$PagecID = $this->request('value');
$list->filterByAttribute($this->attributeKey->getAttributeKeyHandle(), $PagecID, '=');
return $list;
}

public function search() {
$form_selector = Loader::helper('form/page_selector');
print $form_selector->selectPage($this->field('value'), $this->request('value'), false);
}

public function form() {
if (is_object($this->attributeValue)) {
$value = $this->getAttributeValue()->getValue();
}
$form_selector = Loader::helper('form/page_selector');
print $form_selector->selectPage($this->field('value'), $value);
}

public function validateForm($p) {
return $p['value'] != 0;
}

public function saveValue($value) {
$db = Loader::db();
if(!intval($value)) {
$value = 0;
}
$db->Replace('atPageSelector', array('avID' => $this->getAttributeValueID(), 'value' => $value), 'avID', true);
}

public function deleteKey() {
$db = Loader::db();
$arr = $this->attributeKey->getAttributeValueIDList();
foreach($arr as $id) {
$db->Execute('delete from atPageSelector where avID = ?', array($id));
}
}

public function saveForm($data) {
$db = Loader::db();
$this->saveValue($data['value']);
}

public function deleteValue() {
$db = Loader::db();
$db->Execute('delete from atPageSelector where avID = ?', array($this->getAttributeValueID()));
}

public function getDisplayValue() {
$at_val = $this->getValue();
$html = '';
$at_page = Page::getByID($at_val);
if (is_object($at_page) && !$at_page->isInTrash()) {
$cpc = new Permissions($at_page);
if ($cpc->canViewPage()) {
$url = $at_page->getCollectionPath();
$name = h($at_page->getCollectionName());
$html = '<a href="' . $url . '" title="' . $name . '">' . $name . '</a>';
} else {
$html = '<a href="" class="page_denied">' . t('access denied') . '</a>';
}
}
return $html;
}

}
<?php
namespace Concrete\Package\PageSelectorAttribute\Attribute\PageSelector;

use Concrete\Core\Attribute\FontAwesomeIconFormatter;
use Concrete\Core\Backup\ContentExporter;
use Concrete\Core\Backup\ContentImporter\ValueInspector\ValueInspectorInterface;
use Concrete\Core\Error\ErrorList\Error\Error;
use Concrete\Core\Error\ErrorList\Error\FieldNotPresentError;
use Concrete\Core\Error\ErrorList\Field\AttributeField;
use Concrete\Core\Support\Facade\Application;
use Concrete\Package\PageSelectorAttribute\Entity\Attribute\Value\Value\PageSelectorValue;
use Page;
use Permissions;
use Concrete\Core\Attribute\Controller as AttributeTypeController;

class Controller extends AttributeTypeController
{
protected $searchIndexFieldDefinition = ['type' => 'integer', 'options' => ['default' => 0, 'notnull' => false]];

public function getIconFormatter()
{
return new FontAwesomeIconFormatter('file');
}

public function searchForm($list)
{
$PagecID = $this->request('value');
$list->filterByAttribute($this->attributeKey->getAttributeKeyHandle(), $PagecID, '=');

return $list;
}

public function search()
{
$form_selector = Application::getFacadeApplication()->make('helper/form/page_selector');
echo $form_selector->selectPage($this->field('value'), $this->request('value'), false);
}

public function form()
{
if (is_object($this->attributeValue)) {
$value = $this->getAttributeValue()->getValue();
}
$form_selector = Application::getFacadeApplication()->make('helper/form/page_selector');
echo $form_selector->selectPage($this->field('value'), (isset($value)) ? $value : null);
}

public function validateForm($p)
{
if (intval($p['value']) > 0) {
$c = Page::getByID(intval($p['value']));
if (is_object($c) && !$c->isError()) {
return true;
} else {
return new Error(t('You must specify a valid page for %s', $this->getAttributeKey()->getAttributeKeyDisplayName()),
new AttributeField($this->getAttributeKey())
);
}
} else {
return new FieldNotPresentError(new AttributeField($this->getAttributeKey()));
}
}

public function getDisplayValue()
{
$at_val = $this->getValue();
$html = '';
$at_page = Page::getByID($at_val);
if (is_object($at_page) && !$at_page->isInTrash()) {
$cpc = new Permissions($at_page);
if ($cpc->canViewPage()) {
$url = $at_page->getCollectionPath();
$name = h($at_page->getCollectionName());
$html = '<a href="' . $url . '" title="' . $name . '">' . $name . '</a>';
} else {
$html = '<a href="" class="page_denied">' . t('access denied') . '</a>';
}
}

return $html;
}

public function exportValue(\SimpleXMLElement $akv)
{
$av = $akv->addChild('value');
$cID = $this->getAttributeValue()->getValue();
/** @var Number $nh */
$nh = Application::getFacadeApplication()->make('helper/number');
if ($nh->isInteger($cID)) {
$av->addChild('cID', ContentExporter::replacePageWithPlaceHolder($cID));
} else {
$av->addChild('cID', 0);
}
}

/**
* @param \SimpleXMLElement $akv
*
* @return bool|string|void
*/
public function importValue(\SimpleXMLElement $akv)
{
if (isset($akv->value->cID)) {
$cIDVal = (string) $akv->value->cID;
/** @var ValueInspectorInterface $inspector */
$inspector = Application::getFacadeApplication()->make('import/value_inspector');
$result = $inspector->inspect($cIDVal);
$cID = $result->getReplacedValue();
if ($cID) {
return $this->createAttributeValue($cID);
}
}
}

public function createAttributeValue($mixed)
{
if (is_object($mixed) && method_exists($mixed, 'getCollectionID')) {
$mixed = $mixed->getCollectionID();
}

$value = new PageSelectorValue();
$value->setValue((int) $mixed);

return $value;
}

public function createAttributeValueFromRequest()
{
$data = $this->post();
if (intval($data['value']) > 0) {
$c = Page::getByID(intval($data['value']));

return $this->createAttributeValue($c);
}

return $this->createAttributeValue(0);
}

public function getAttributeValueClass()
{
return PageSelectorValue::class;
}
}
14 changes: 0 additions & 14 deletions attributes/page_selector/db.xml

This file was deleted.

Binary file removed attributes/page_selector/icon.png
Binary file not shown.
57 changes: 33 additions & 24 deletions controller.php
Original file line number Diff line number Diff line change
@@ -1,30 +1,39 @@
<?php
namespace Concrete\Package\PageSelectorAttribute;
use \Concrete\Core\Attribute\Key\Category as AttributeKeyCategory;
use \Concrete\Core\Attribute\Type as AttributeType;

use Concrete\Core\Attribute\Category\CategoryService;
use Concrete\Core\Attribute\TypeFactory;

defined('C5_EXECUTE') or die("Access Denied.");

class Controller extends \Concrete\Core\Package\Package {
class Controller extends \Concrete\Core\Package\Package
{
protected $pkgHandle = 'page_selector_attribute';
protected $appVersionRequired = '8.0';
protected $pkgVersion = '2.1';

public function getPackageDescription()
{
return t("Attribute that allows the selection of pages.");
}

public function getPackageName()
{
return t("Page Selector Attribute");
}

protected $pkgHandle = 'page_selector_attribute';
protected $appVersionRequired = '5.7.1';
protected $pkgVersion = '2.0';

public function getPackageDescription() {
return t("Attribute that allows the selection of pages.");
}

public function getPackageName() {
return t("Page Selector Attribute");
}

public function install() {
parent::install();
$pkgh = \Package::getByHandle('page_selector_attribute');
\Loader::model('attribute/categories/collection');
$col = AttributeKeyCategory::getByHandle('collection');
AttributeType::add('page_selector', t('Page Selector'), $pkgh);
$col->associateAttributeKeyType(AttributeType::getByHandle('page_selector'));
}
}
public function install()
{
$pkg = parent::install();
/** @var TypeFactory $factory */
$factory = $this->app->make(TypeFactory::class);
$type = $factory->getByHandle('page_selector');
if (!is_object($type)) {
$type = $factory->add('page_selector', t('Page Selector'), $pkg);
/** @var CategoryService $service */
$service = $this->app->make(CategoryService::class);
$col = $service->getByHandle('collection')->getController();
$col->associateAttributeKeyType($type);
}
}
}
58 changes: 58 additions & 0 deletions src/Concrete/Entity/Attribute/Value/Value/PageSelectorValue.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
<?php
namespace Concrete\Package\PageSelectorAttribute\Entity\Attribute\Value\Value;

use Concrete\Core\Entity\Attribute\Value\Value\AbstractValue;
use Concrete\Core\Page\Page;
use Doctrine\ORM\Mapping as ORM;

/**
* @ORM\Entity
* @ORM\Table(name="atPageSelector")
*/
class PageSelectorValue extends AbstractValue
{
/**
* @ORM\Column(type="integer", options={"default":0})
*/
protected $value;

/**
* @return int
*/
public function getValue()
{
return $this->value;
}

/**
* @return Page
*/
public function getPageObject()
{
return Page::getByID($this->getValue());
}

/**
* @param int $value
*/
public function setValue($value)
{
$this->value = $value;
}

/**
* @param Page $page
*/
public function setPageObject(Page $page)
{
$this->setValue($page->getCollectionID());
}

/**
* @return string
*/
public function __toString()
{
return (string) $this->getValue();
}
}