monster_menus-9.0.x-dev/modules/rss_page/src/Element/RSSFeedList.php
modules/rss_page/src/Element/RSSFeedList.php
<?php
/**
* @file
* Contains \Drupal\rss_page\Element\RSSFeedList.
*/
namespace Drupal\rss_page\Element;
use Drupal\Core\Render\Attribute\FormElement;
use Drupal\Core\Url;
use Drupal\monster_menus\Element\MMCatlist;
use Drupal\monster_menus\Element\MMRepeatlist;
/**
* Provides a form element which allows the user to manipulate a list of RSS
* feeds.
*/
#[FormElement('rss_feed_list')]
class RSSFeedList extends MMRepeatlist {
public function getInfo() {
$class = static::class;
return [
'#input' => TRUE,
'#default_value' => [],
'#process' => [[$class, 'processGroup']],
'#pre_render' => [[$class, 'preRenderGroup'],
[$class, 'preRender']],
'#attached' => ['library' => ['monster_menus/mm', 'monster_menus/modal_dialog']],
'#rss_list_url_form_ID' => '',
'#rss_list_tax_form_ID' => '',
'#rss_list_query_form_ID' => '',
'#rss_list_is_portal_page' => FALSE,
'#theme' => 'rss_feed_list',
'#theme_wrappers' => ['form_element'],
];
}
/**
* Add Javascript code to a page, allowing the user to manipulate a list of
* RSS feeds.
*
* @param array $element
* The form element to display
* @return array
* The modified form element
*/
public static function preRender($element) {
if (isset($element['#mm_list_instance'])) {
return $element;
}
$_mmlist_instance = &drupal_static('_mmlist_instance', 0);
$labelAddURL = t('Add RSS feed...');
if (!$element['#rss_list_is_portal_page']) {
$is_portal = FALSE;
$flags = [];
$labelAboveInfo = t('Location:');
$labelAddQuery = '';
}
else {
$is_portal = TRUE;
$flags = ['is_portal' => TRUE];
$labelAboveInfo = '';
$labelAddQuery = t('Add a query...');
}
$labelAboveList = t('Feeds:');
$labelAboveActions = t('Action:');
$labelAddCat = t('Add page feed...');
$labels = mm_ui_mmlist_labels();
$delConfirm = t("Are you sure you want to delete this feed?\n\n(You can skip this alert in the future by holding the Shift key while clicking the Delete icon.)");
$popup_base = Url::fromRoute('monster_menus.browser_load', [], ['query' => ['_path' => "1-rss-$_mmlist_instance-r-r/"]])->toString();
$popup_URL = mm_home_mmtid();
$adds = [];
if (is_string($element['#value']) && str_starts_with($element['#value'], 'a:')) {
foreach (unserialize($element['#value']) as $obj) {
$url = '';
self::getAdd($obj->type, $obj->data, $obj->name, $url, $info, $popup_URL, $is_portal);
$adds[] = [$obj->name, $obj->type, $url, $info];
}
}
else {
foreach (_rss_page_split_feed_list($element['#value']) as $m) {
$name = $m->name;
$url = !$is_portal && $m->type == 'cat' ? '' : $m->data;
self::getAdd($m->type, $m->data, $name, $url, $info, $popup_URL, $is_portal);
$adds[] = [$name, $m->type, $url, $info];
}
}
if (!isset($popup_URL)) {
$popup_URL = 1;
}
$popup_label = t('Select a page');
$imgpath = base_path() . \Drupal::service('extension.list.module')->getPath('monster_menus') . '/images';
$url_form = $element['#rss_list_url_form_ID'];
$tax_form = $element['#rss_list_tax_form_ID'];
$query_form = $element['#rss_list_query_form_ID'];
$labelAddTax = t('Add tag feed...');
$name = $element['#parents'][0];
if (count($element['#parents']) > 1) {
$name .= '[' . join('][', array_slice($element['#parents'], 1)) . ']';
}
$labelAboveList .= !empty($element['#required']) ? ' <span class="form-required" title="' . t('This field is required.') . '">*</span>' : '';
$class = MMCatlist::addClass($element);
$settings = [
'where' => NULL,
'isSearch' => mm_ui_is_search(),
'listObjDivSelector' => "div[name=rss_list_obj$_mmlist_instance]",
'outerDivSelector' => "div[name=rss_list_obj$_mmlist_instance] + div[class=\"$class\"]",
'hiddenName' => $name,
'add' => $adds,
'autoName' => NULL,
'parms' => [
'popupBase' => $popup_base,
'popupURL' => $popup_URL,
'popupLabel' => $popup_label,
'flags' => $flags,
'addCallback' => 'rssAddCallback',
'replaceCallback' => 'rssReplCallback',
'selectCallback' => 'rssSelectCallback',
'dataCallback' => 'rssDataCallback',
'labelAboveActions' => $labelAboveActions,
'labelAddCat' => $labelAddCat,
'labelAddURL' => $labelAddURL,
'labelAddQuery' => $labelAddQuery,
'labelAddList' => $labelAddTax,
'labelAboveInfo' => $labelAboveInfo,
'imgPath' => $imgpath,
'inputDivID' => $url_form,
'inputDivID2' => $tax_form,
'inputDivID3' => $query_form,
'delConfirmMsg' => $delConfirm,
'labelTop' => $labels[0],
'labelUp' => $labels[1],
'labelX' => $labels[2],
'labelBott' => $labels[3],
'labelDown' => $labels[4],
'labelEdit' => $labels[5],
],
];
mm_ui_modal_dialog('init', $element);
$element['#attached']['drupalSettings']['MM']['mmListInit'][$_mmlist_instance] = $settings;
$element += [
'#mm_list_instance' => $_mmlist_instance++,
'#mm_list_class' => $class,
'#label_above_list' => $labelAboveList,
// '#mm_list_desc' => !empty($element['#description']) ? $element['#description'] : '',
];
return $element;
}
private static function getAdd($type, $data, &$name, &$url, &$info, &$popup_URL, $is_portal) {
if ($type == 'cat') {
$parents = mm_content_get_parents($data);
array_shift($parents); // skip root
$url = implode('/', $parents) . "/$data";
if (!isset($popup_URL)) {
$popup_URL = $url;
}
$path = [];
foreach ($parents as $par) {
if (!($tree = mm_content_get($par))) {
break;
}
$path[] = mm_content_get_name($tree);
}
$path[] = $name;
$info = implode(' » ', $path);
}
elseif ($is_portal && $type == 'query') {
$info = $name;
$url = $data;
}
elseif ($type == 'taxon') {
$info = '';
$url = $data;
}
else { // URL
$u = preg_replace('/\/(?!\/)/', '/​', $data);
$info = strpos($url, str_replace('...', '', $name)) ? $u : $name . '<br />' . $u;
$url = $data;
}
}
}
