Jump to content
kongondo

Menu Builder

Recommended Posts

I don't know if MSN can use a WireArray to build menus. It certainly can take a PageArray and build a menu out of that. The key here is that MSN relies on true/natural PW child-parent relationships (unless something has changed that I don't know about) to create menus. So, $page->children will make sense to it. You won't get $page->children in MB...at least not in that original sense.

My bad. It is PageArray, not WireArray.

Anyway, could you consider the scenario of somehow making it possible for MenuBuilder and MarkupSimpleNavigation to work together? Maybe providing PageArray output with some dynamically-made-up pages for external links?

I really like the idea of separating concerns. It seems to me very handy to have one module to build menu markup from anywhere (MarkupSimpleNavigation) and one module to be able to generate contents for it from custom user input (MenuBuilder). So you do not have to learn two ways of doing the same thing on one site.

What do you think? Could this be possible?

Share this post


Link to post
Share on other sites

OK...sigh...because you asked nicely...
 
@note: 

  • Using this method, it makes no sense to create a menu with more than 1 level  in Menu Builder. The levels will be built using natural child-parent relationship in MSN
  • The CSS attritubes that can be set in MB have no meaning. I see no way of passing those to MSN
  • This was a one-time exercise. Currently, I am not able to support more features for this technique :-)

Step 1: Create a 1-level menu in MB
 
post-894-0-73568400-1464003482_thumb.png
 
Step 2:  Grab menu items from the menu created in MB in Step #1

$itemIDs = '';

$mb = $modules->get("MarkupMenuBuilder");
 
// options 1: get menu items as array
$menuItemsArray = $mb->getMenuItems('Ivan Gretsky', 1);
foreach($menuItemsArray as $m) $itemIDs .= $m['pages_id'] . '|'; 
$itemIDs = rtrim($itemIDs, '|');
 
        #### OR ####
 
//option 2: get menu items as object (WireArray)
$menuItemsObj = $mb->getMenuItems('Ivan Gretsky'); 
// implode the WireArray the cool way (PW 2.4+)
$itemIDs = $menuItemsObj->implode('|', 'pagesID');
 
// get a PageArray using menu item IDs
$itemsPageArray = $pages->find('id=' . $itemIDs);

 
Step 3: Output the menu using MSN

// pass the PageArray to MSN (optionally passing it MSN $options) to output your menu
$menu = $modules->get("MarkupSimpleNavigation");
echo $menu->render($options, null, $itemsPageArray);
  • Like 3

Share this post


Link to post
Share on other sites

Hi,

I got a problem, which makes me scratch my head a lot.

I have a menu item with two children, which are 'hidden', but not 'unpublished'. (A newsletter opt in page with landing pages for the double-opt-in-process.)

The menu generated looks like this (just the last 3 items):

                <li>
                    <a href='/pw/de/impressum/'>Impressum</a>
                </li>
                <li>
                    <a href='/pw/de/kontakt/'>Kontakt</a>
                </li>
                <li class="current">
                    <a href='/pw/de/newsletter/'>Newsletter</a>
                    <ul class="submenu">
                    </ul>
                </li>

As one can see, there is an empty ul in the last li. This causes some trouble with some jQuery - mobile - navigation generator.

What is puzzling me is, that in a second menu, which just contains this last 3 items (a footer in the non-mobile version) this ul does not appear. I could not find any differences in the menu settings. 

FYI: runs otherwise smoohtly on pw 3.08 dev.

Share this post


Link to post
Share on other sites

Works fine here...(2.7.3)...How are you building and generating the menu? Using includeChildren? Anything else?

Share this post


Link to post
Share on other sites

Thanks for your answer.

I can indeed make the empty ul make disappear by setting

'include_children' => 0

in the options. But then, also those items, which shall have their submenu, don't have one. 

Also, i can switch on an unintended empty ul in another menu, when i set include_children to 1 there.

Share this post


Link to post
Share on other sites

My intent was not to suggest that you use include_children as a solution. What I needed is more information to reproduce this. I have been unable to replicate you issue so the more information I have the better :-)...How the menu is constructed, the options, your environment, etc...basically, the whole code if that is possible....

Edited by kongondo

Share this post


Link to post
Share on other sites

Ah, ok. I'll attach all files i think could be relevant. if you want more, just drop a line.

It's  the "newsletter" item, which has the empty ul.

post-4083-0-08867200-1464815536_thumb.jp

Share this post


Link to post
Share on other sites

Hi, I found a possible cause for the issue when tampering with my own menu function and running into the very same problem.

In line 351 of MarkupMenuBuilder.module 

if($p->numChildren) $hasNativeChildren = 1;// has children to add

is the function numChildren used. This function counts in default mode also hidden children. 

To make it count only visible children, it has to be used with a parameter:

if($p->numChildren(true)) $hasNativeChildren = 1;// has children to add

I tried it and it seems to work! :-)

Share this post


Link to post
Share on other sites

Ok, this might just be a dumb question...But, has anyone had any success adding "<span class="caret"></span>" into a menu yet using bootstrap? My dropdown works great, save for the the fact that for the life of me I can not figure out how to get the dropdown li to have a caret.

Share this post


Link to post
Share on other sites

Hi, I found a possible cause for the issue when tampering with my own menu function and running into the very same problem.

In line 351 of MarkupMenuBuilder.module 

if($p->numChildren) $hasNativeChildren = 1;// has children to add

is the function numChildren used. This function counts in default mode also hidden children. 

To make it count only visible children, it has to be used with a parameter:

if($p->numChildren(true)) $hasNativeChildren = 1;// has children to add

I tried it and it seems to work! :-)

OK, I'll try and replicate. As for the files, seems I wasn't clear, sorry. I just needed to see how you were calling menubuilder methods + the options you were passing to it :-)

Ok, this might just be a dumb question...But, has anyone had any success adding "<span class="caret"></span>" into a menu yet using bootstrap? My dropdown works great, save for the the fact that for the life of me I can not figure out how to get the dropdown li to have a caret.

Have a look here: https://processwire.com/talk/topic/4451-menu-builder/?p=120639

Share this post


Link to post
Share on other sites

Ha ha.. touche.. Well, I will get this all sorted out. I went with Example "1b", however, I am getting "Call to undefined function buildMenuFromObject()"... Any idea what could cause this?

Share this post


Link to post
Share on other sites

Example 1b is for buildMenuFromArray() actually...buildMenuFromObject() is for example 1a. Whichever you choose, you need to define the function first before you can call it...(i.e. the function code first, then echo it...)

Edited by kongondo

Share this post


Link to post
Share on other sites

Thank you so much (and sorry for my confusion). I thought I had it, but now I am just getting 6 errors:

Error: Exception: Method MarkupMenuBuilder::getMenuItems does not exist or is not callable in this context (in Desktop/_Staging/test/wire/core/Wire.php line 409)

#0 [internal function]: ProcessWire\Wire->___callUnknown('getMenuItems', Array)
#1 Desktop/_Staging/test/wire/core/Wire.php(347): call_user_func_array(Array, Array)
#2 Desktop/_Staging/test/wire/core/WireHooks.php(555): ProcessWire\Wire->_callMethod('___callUnknown', Array)
#3 Desktop/_Staging/test/wire/core/Wire.php(370): ProcessWire\WireHooks->runHooks(Object(MarkupMenuBuilder), 'callUnknown', Array)
#4 Desktop/_Staging/test/wire/core/Wire.php(371): ProcessWire\Wire->__call('callUnknown', Array)
#5 Desktop/_Staging/test/site/templates/navTwo.inc(11): ProcessWire\Wire->__call('getMenuItems', Array)
#6 /Desktop/_Staging/test/site/templates/head.inc(85): include('/Us

I am a bit lost on this now, though I am trying to dig through them and understand what they mean.

What I have thus far (all using example 1b):

head.inc

   <div class="collapse navbar-collapse container" id="bs-example-navbar-collapse-1">
     <?php //include('./navigation.inc');?>
     <?php include('./navTwo.inc');?>
     <?php  echo buildMenuFromArray(0, $menuItems2); ?>
   </div><!-- /.navbar-collapse -->

navTwo.inc

<?php
$mb = $modules->get('MarkupMenuBuilder');// get Menu Builder

$jsonStr = $pages->get(1033)->menu_items;
$arrayFromJSON = json_decode($jsonStr, true);
#$menu = $arrayFromJSON;// pass an array
$menu = 'main';// pass a title

/** grab menu items as WireArray with Menu objects **/
// for examples 1a, 2 and 3
$menuItems = $mb->getMenuItems($menu, 2, $options);// called with options and 2nd argument = 2 {return Menu (WireArray object)}
#$menuItems = $mb->getMenuItems($menu);// called without options; 2nd argument defaults to 2

/** grab menu items as Normal Array with Menu items **/
// only for example 1b below
$menuItems2 = $mb->getMenuItems($menu, 1);// called without options; 2nd argument is 1 so return array

/**
* Builds a nested list (menu items) of a single menu from an Array of menu items.
*
* A recursive function to display nested list of menu items.
*
* @access private
* @param Int $parent ID of menu item.
* @param Array $menu Array of menu items to display.
* @param Int $first Helper variable to designate first menu item.
* @return string $out.
*
*/
function buildMenuFromArray($parent = 0, $menu, $first = 0) {

  $out = '';
  $has_child = false;

  foreach ($menu as $id => $m) {

    $parentID = isset($m['parent_id']) ? $m['parent_id'] : 0;
    $newtab = isset($m['newtab']) && $m['newtab'] ? " target='_blank'" : '';
    // if this menu item is a parent; create the sub-items/child-menu-items
    if ($parentID == $parent) {// if this menu item is a parent; create the inner-items/child-menu-items

        // if this is the first child
        if ($has_child === false) {
            $has_child = true;// This is a parent
            if ($first == 0){
              $out .= "<ul class='main-menu cf'>\n";
              $first = 1;
            }
            else $out .= "\n<ul class='sub-menu'>\n";
        }

        $class = isset($m['is_current']) && $m['is_current'] ? ' class="current"' : '';

        // a menu item
        $out .= '<li' . $class . '><a href="' . $m['url'] . '"' . $newtab . '>' . $m['title'];
        // if menu item has children
        if (isset($m['is_parent']) && $m['is_parent']) {
          $out .= '<span class="drop-icon">▼</span>' .
              '<label title="Toggle Drop-down" class="drop-icon" for="' . wire('sanitizer')->pageName($m['title']) . '" onclick>▼</label>' .
          '</a>' .
          '<input type="checkbox" id="' . wire('sanitizer')->pageName($m['title']) . '">';
        }

        else $out .= '</a>';

        // call function again to generate nested list for sub-menu items belonging to this menu item.
        $out .= buildMenuFromArray($id, $menu, $first);
        $out .= "</li>\n";

    }// end if parent

  }// end foreach

  if ($has_child === true) $out .= "</ul>\n";

  return $out;

}



?>

Did I miss something crucial here?

Share this post


Link to post
Share on other sites

I see you copied and pasted more code than necessary. I have used your code and it works for me...

First, you need to make sure you have the latest version of Menu Builder which has the method getMenuItems(), i.e. version 0.1.5

head.inc

<div class="collapse navbar-collapse container" id="bs-example-navbar-collapse-1">
  <?php include('./navTwo.inc');?>
  <?php  echo buildMenuFromArray(0, $menuItems); ?>
</div><!-- /.navbar-collapse -->

navTwo.inc

<?php
$mb = $modules->get('MarkupMenuBuilder');// get Menu Builder
$menu = 'Main';// pass a title of an existing menu (i.e. a menu already built and published in ProcessMenuBuilder)

// grab menu items as Normal Array with Menu items (argument #2 = 1)
$menuItems = $mb->getMenuItems($menu, 1);

/**
* Builds a nested list (menu items) of a single menu from an Array of menu items.
*
* A recursive function to display nested list of menu items.
*
* @access private
* @param Int $parent ID of menu item.
* @param Array $menu Array of menu items to display.
* @param Int $first Helper variable to designate first menu item.
* @return string $out.
*
*/
function buildMenuFromArray($parent = 0, $menu, $first = 0) {

  $out = '';
  $has_child = false;

  foreach ($menu as $id => $m) {

    $parentID = isset($m['parent_id']) ? $m['parent_id'] : 0;
    $newtab = isset($m['newtab']) && $m['newtab'] ? " target='_blank'" : '';
    // if this menu item is a parent; create the sub-items/child-menu-items
    if ($parentID == $parent) {// if this menu item is a parent; create the inner-items/child-menu-items

        // if this is the first child
        if ($has_child === false) {
            $has_child = true;// This is a parent
            if ($first == 0){
              $out .= "<ul class='main-menu cf'>\n";
              $first = 1;
            }
            else $out .= "\n<ul class='sub-menu'>\n";
        }

        $class = isset($m['is_current']) && $m['is_current'] ? ' class="current"' : '';

        // a menu item
        $out .= '<li' . $class . '><a href="' . $m['url'] . '"' . $newtab . '>' . $m['title'];
        // if menu item has children
        if (isset($m['is_parent']) && $m['is_parent']) {
          $out .= '<span class="drop-icon">▼</span>' .
              '<label title="Toggle Drop-down" class="drop-icon" for="' . wire('sanitizer')->pageName($m['title']) . '" onclick>▼</label>' .
          '</a>' .
          '<input type="checkbox" id="' . wire('sanitizer')->pageName($m['title']) . '">';
        }

        else $out .= '</a>';

        // call function again to generate nested list for sub-menu items belonging to this menu item.
        $out .= buildMenuFromArray($id, $menu, $first);
        $out .= "</li>\n";

    }// end if parent

  }// end foreach

  if ($has_child === true) $out .= "</ul>\n";

  return $out;

}

?>

Share this post


Link to post
Share on other sites

Thanks again.. Finally starting to understand what is going on, but now it is time to figure out how to give the "second nested ul" a different class than the wrapper ul. I thought I could pass that through with $options, but that doesnt seem to work. (sorry to drag this thread out).

Share this post


Link to post
Share on other sites

Actually, my bad; the README and my post above wasn't very clear (have now updated them). Not all options apply to getMenuItems(). The reason is that if using MarkupMenuBuilder to output the menu for you, i..e using the method render(), the structuring of the menu (the <ul>, their CSS classes, etc) are taken care of by the method. In contrast, if using getMenuItems() what you get back are the menu items with all their relevant properties. The reasoning here is that you will use those properties as well as any other logic and/or options you want in your own custom recursive function (nested loops) where you have full control of the markup. That said, only 3 options (from the list of those applicable to render()) apply to getMenuItems(). These are default_title, default_class and current_class_level. default_class is applied to the  item's property $m['ccss_itemclass'].

Here is a revised navTwo.inc showing how you can pass custom options to the recursive function and applying the same as well as the 3 options that can be passed to getMenuItems(). head.inc is also slightly revised to pass $options to buildMenuFromArray()

- @note: The new 4th argument in the function

- @note: The custom options array

- @note: Complete code for previous examples 1-3 can be found in these gists

head.inc

<div class="collapse navbar-collapse container" id="bs-example-navbar-collapse-1">
 <?php include('./navTwo.inc');
  // your CUSTOM options to pass to the recursive function buildMenuFromArray()
  $options = array (
   'submenu_css_class' => 'nested-ul-css-class',//CSS Class for sub-menus; you can use whatever index you want
   'other_custom_option' => 'foo',
   'first_class' => 'first',
   'last_class' => 'last',
   'current_class' => 'current',
   'has_children_class' => 'parent',
 );

  echo buildMenuFromArray(0, $menuItems, 0, $options);

 ?>
</div><!-- /.navbar-collapse -->

navTwo.inc

<?php
$mb = $modules->get('MarkupMenuBuilder');// get Menu Builder
$menu = 'Main';// pass a title of an existing menu (i.e. a menu already built and published in ProcessMenuBuilder)

// @note: only these 3 options will work with getMenuItems(); Only pass options if you need to; it is not mandatory 
$options4getMenuItems = array('default_title' => 1, 'default_class' => 'list-group', 'current_class_level' => 4);

// grab menu items as Normal Array with Menu items (argument #2 = 1)
#$menuItems = $mb->getMenuItems($menu, 1); OR
$menuItems = $mb->getMenuItems($menu, 1, $options4getMenuItems);// if passing options

/**
* Builds a nested list (menu items) of a single menu from an Array of menu items.
*
* A recursive function to display nested list of menu items.
*
* @access private
* @param Int $parent ID of menu item.
* @param Array $menu Array of menu items to display.
* @param Int $first Helper variable to designate first menu item.
* @return string $out.
*
*/
function buildMenuFromArray($parent = 0, $menu, $first = 0, $options = array()) {

  $out = '';
  $has_child = false;
  $subMenuCSSClass = isset($options['submenu_css_class']) ?  'class="' . $options['submenu_css_class'] . '"' :  '';

  foreach ($menu as $id => $m) {

    $parentID = isset($m['parent_id']) ? $m['parent_id'] : 0;
    $newtab = isset($m['newtab']) && $m['newtab'] ? " target='_blank'" : '';
    // if this menu item is a parent; create the sub-items/child-menu-items
    if ($parentID == $parent) {// if this menu item is a parent; create the inner-items/child-menu-items

        // if this is the first child
        if ($has_child === false) {
            $has_child = true;// This is a parent
            if ($first == 0){
              $out .= "<ul class='main-menu cf'>\n";
              $first = 1;
            }
            else $out .= "\n<ul ". $subMenuCSSClass .">\n";
        }

	// item CSS
	$itemCSSID = isset($m['css_itemid'])? ' id="' . $m['css_itemid'] . '"' : '';				
	$itemCSSClass = isset($m['css_itemclass']) ? $m['css_itemclass'] . ' ' : '';
	$itemFirst = isset($m['is_first']) && isset($options['first_class']) ? $options['first_class'] : '';				
	$itemHasChildren = isset($m['is_parent']) && isset($options['has_children_class']) ? $options['has_children_class'] . ' ' : '';				
	$itemLast = isset($m['is_last']) && isset($options['last_class']) ? $options['last_class'] . ' ' : '';
	$itemCurrent = 	isset($m['is_current']) && isset($options['current_class']) ? $options['current_class'] . ' ' : '';

	$classes = $itemCSSClass . $itemHasChildren . $itemLast . $itemCurrent . $itemFirst;
	$classes = trim(preg_replace('/\s+/', ' ', $classes));
	$class = strlen($classes) ? ' class="' . $classes . '"' : '';

        // a menu item
        $out .= '<li' . $itemCSSID . $class . '><a href="' . $m['url'] . '"' . $newtab . '>' . $m['title'];
        // if menu item has children
        if (isset($m['is_parent']) && $m['is_parent']) {
          $out .= '<span class="drop-icon">▼</span>' .
              '<label title="Toggle Drop-down" class="drop-icon" for="' . wire('sanitizer')->pageName($m['title']) . '" onclick>▼</label>' .
          '</a>' .
          '<input type="checkbox" id="' . wire('sanitizer')->pageName($m['title']) . '">';
        }

        else $out .= '</a>';

        // call function again to generate nested list for sub-menu items belonging to this menu item.
        $out .= buildMenuFromArray($id, $menu, $first, $options);
        $out .= "</li>\n";

    }// end if parent

  }// end foreach

  if ($has_child === true) $out .= "</ul>\n";

  return $out;

}

?>

Share this post


Link to post
Share on other sites

Thanks again Kongondo! I appreciate all the help. I actually figured it out about 5 mins ago (forgot to check back on the forums). It feel good to have actually learned through your help and the various comments what actually is occurring and not blindly copying. Your module has made things so much easier (once I learned).

Share this post


Link to post
Share on other sites

Hey kongondo,

thanks for thi great module again. A few days ago I figured out, that the output of the main menu builder header is not formated in html. Maybe it has to do with some other modules installed, because I never had the issue, that the output is not "rendered" as HTML.

Does anyone else have this issue, too?

 

menubuilder.jpg

Share this post


Link to post
Share on other sites

Saw that once in a multilingual setup, IIRC.....What's your setup? PW version, etc...

Share this post


Link to post
Share on other sites

Hey, 

 

thanks for your fast reply. I attached a screenshot with my current setup. You are right, the page is multilingual. 

Maybe you cna give me a hint, how I can solve this?

screenshot-2016-06-29 10-55-17.png

It seems, that the HTML is not rendered correctly. I tried to edit the HTML of the decription field and put Markdon tags in the description, which are displayed correct.

 

Edited by pmichaelis
Description Field HTML

Share this post


Link to post
Share on other sites

Sorry,

I still can't figure it out. All the descriptions are not displayed as HTML. A can't update Menu Item, or anything else. Does anyone have a hint for me to solve this?

Share this post


Link to post
Share on other sites

I see you are using PW 3.x. Could you please try in a multilingual PW 2.7xx and let me know if it works?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By d'Hinnisdaël
      Happy new year, everybody 🥬
      I've been sitting on this Dashboard module I made for a client and finally came around to cleaning it up and releasing it to the wider public. This is how it looks.
      ProcessWire Dashboard

      If anyone is interested in trying this out, please go ahead! I'd love to get some feedback on it. If this proves useful and survives some real-world testing, I'll add this to the module directory.
      Download
      You can find the latest release on Github.
      Documentation
      Check out the documentation to get started. This is where you'll find information about included panel types and configuration options.
      Custom Panels
      My goal was to make it really simple to create custom panels. The easiest way to do that is to use the panel type template and have it render a file in your templates folder. This might be enough for 80% of all use cases. For anything more complex (FormBuilder submissions? Comments? Live chat?), you can add new panel types by creating modules that extend the DashboardPanel base class. Check out the documentation on custom panels or take a look at the HelloWorld panel to get started. I'm happy to merge any user-created modules into the main repo if they might be useful to more than a few people.
       Disclaimer
      This is a pre-release version. Please treat it as such — don't install it on production sites. Just making sure 🍇
      Roadmap
      These are the things I'm looking to implement myself at some point. The wishlist is a lot longer, but those are the 80/20 items that I probably won't regret spending time on.
      Improve documentation & add examples ⚙️ Panel types Google Analytics ⚙️ Add new page  🔥 Drafts 🔥 At a glance / Page counter 404s  Layout options Render multiple tabs per panel panel groups with heading and spacing between ✅ panel wrappers as grid item (e.g. stacked notices) ✅ Admin themes support AdminThemeReno and AdminThemeDefault ✅ Shortcuts panel add a table layout with icon, title & summary ✅ Chart panel add default styles for common chart types ✅ load chart data from JS file (currently passed as PHP array) Collection panel support image columns ✅ add buttons: view all & add new ✅
    • By Pip
      Hi everyone!
      I'm trying out the Login/Register module for my site. Noted that the module assigns the newly registered user to login-register role. 
      Once you modify the login-register role's permissions, particularly adding page-edit, the new member role will be set to guest. 
      Thing is I'd like to grant my new users the power to create their own pages. Any advice? 
      Thanks. 
    • By Gadgetto
      SnipWire - Snipcart integration for ProcessWire
      Snipcart is a powerful 3rd party, developer-first HTML/JavaScript shopping cart platform. SnipWire is the missing link between Snipcart and the content management framework ProcessWire.
      With SnipWire, you can quickly turn any ProcessWire site into a Snipcart online shop. The SnipWire plugin helps you to get your store up and running in no time. Detailed knowledge of the Snipcart system is not required.
      SnipWire is free and open source licensed under Mozilla Public License 2.0! A lot of work and effort has gone into development. It would be nice if you could donate an amount to support further development:

      Status update links (inside this thread) for SnipWire development
      2020-07-03 -- SnipWire 0.8.7 (beta) released! Fixes some small bugs and adds an indicator for TEST mode 2020-04-06 -- SnipWire 0.8.6 (beta) released! Adds support for Snipcart subscriptions and also fixes some problems 2020-03-21 -- SnipWire 0.8.5 (beta) released! Improves SnipWires webhooks interface and provides some other fixes and additions 2020-03-03 -- SnipWire 0.8.4 (beta) released! Improves compatibility for Windows based Systems. 2020-03-01 -- SnipWire 0.8.3 (beta) released! The installation and uninstallation process has been heavily revised. 2020-02-08 -- SnipWire 0.8.2 (beta) released! Added a feature to change the cart and catalogue currency by GET, POST or SESSION param 2020-02-03 -- SnipWire 0.8.1 (beta) released! All custom classes moved into their own namespaces. 2020-02-01 -- SnipWire is now available via ProcessWire's module directory! 2020-01-30 -- SnipWire 0.8.0 (beta) first public release! (module just submitted to the PW modules directory) 2020-01-28 -- added Custom Order Fields feature (first SnipWire release version is near!) 2020-01-21 -- Snipcart v3 - when will the new cart system be implemented? 2020-01-19 -- integrated taxes provider finished (+ very flexible shipping taxes handling) 2020-01-14 -- new date range picker, discount editor, order notifiactions, order statuses, and more ... 2019-11-15 -- orders filter, order details, download + resend invoices, refunds 2019-10-18 -- list filters, REST API improvements, new docs platform, and more ... 2019-08-08 -- dashboard interface, currency selector, managing Orders, Customers and Products, Added a WireTabs, refinded caching behavior 2019-06-15 -- taxes provider, shop templates update, multiCURL implementation, and more ... 2019-06-02 -- FieldtypeSnipWireTaxSelector 2019-05-25 -- SnipWire will be free and open source Plugin Key Features
      Fast and simple store setup Full integration of the Snipcart dashboard into the ProcessWire backend (no need to leave the ProcessWire admin area) Browse and manage orders, customers, discounts, abandoned carts, and more Multi currency support Custom order and cart fields Process refunds and send customer notifications from within the ProcessWire backend Process Abandoned Carts + sending messages to customers from within the ProcessWire backend Complete Snipcart webhooks integration (all events are hookable via ProcessWire hooks) Integrated taxes provider (which is more flexible then Snipcart own provider) Useful Links
      SnipWire in PW modules directory SnipWire Docs (please note that the documentation is a work in progress) SnipWire @GitHub (feature requests and suggestions for improvement are welcome - I also accept pull requests) Snipcart Website  

       
      ---- INITIAL POST FROM 2019-05-25 ----
       
    • By Sten
      Hello
      Till now I hacked something with the twig template but it works no more with new PW versions so I look forward to create a module. I am working on a site in multiple languages : French, English, Italian, German, Spanish, Portuguese, Hebrew, Russian. The new posts are entered in any language with a field for language. Till now, I got twig files to get the translations with constants defined for each part of the pages.
      So I'd like to create a module to include theses files added according to the url /fr/en/...
      Have you some observations to do before I begin about the direction to take ?
      Thank you
    • By ukyo
      Mystique Module for ProcessWire CMS/CMF
      Github repo : https://github.com/trk/Mystique
      Mystique module allow you to create dynamic fields and store dynamic fields data on database by using a config file.
      Requirements
      ProcessWire 3.0 or newer PHP 7.0 or newer FieldtypeMystique InputfieldMystique Installation
      Install the module from the modules directory:
      Via Composer:
      composer require trk/mystique Via git clone:
      cd your-processwire-project-folder/ cd site/modules/ git clone https://github.com/trk/Mystique.git Module in live reaction with your Mystique config file
      This mean if you remove a field from your config file, field will be removed from edit screen. As you see on youtube video.
      Using Mystique with your module or use different configs path, autoload need to be true for modules
      Default configs path is site/templates/configs/, and your config file name need to start with Mystique. and need to end with .php extension.
      Adding custom path not supporting anymore !
      // Add your custom path inside your module class`init` function, didn't tested outside public function init() { $path = __DIR__ . DIRECTORY_SEPARATOR . 'configs' . DIRECTORY_SEPARATOR; Mystique::add($path); } Mystique module will search site/modules/**/configs/Mystique.*.php and site/templates/Mystique.*.php paths for Mystique config files.
      All config files need to return a PHP ARRAY like examples.
      Usage almost same with ProcessWire Inputfield Api, only difference is set and showIf usage like on example.
      <?php namespace ProcessWire; /** * Resource : testing-mystique */ return [ 'title' => __('Testing Mystique'), 'fields' => [ 'text_field' => [ 'label' => __('You can use short named types'), 'description' => __('In file showIf working like example'), 'notes' => __('Also you can use $input->set() method'), 'type' => 'text', 'showIf' => [ 'another_text' => "=''" ], 'set' => [ 'showCount' => InputfieldText::showCountChars, 'maxlength' => 255 ], 'attr' => [ 'attr-foo' => 'bar', 'attr-bar' => 'foo' ] ], 'another_text' => [ 'label' => __('Another text field (default type is text)') ] ] ]; Example:
      site/templates/configs/Mystique.seo-fields.php <?php namespace ProcessWire; /** * Resource : seo-fields */ return [ 'title' => __('Seo fields'), 'fields' => [ 'window_title' => [ 'label' => __('Window title'), 'type' => Mystique::TEXT, // or InputfieldText 'useLanguages' => true, 'attr' => [ 'placeholder' => __('Enter a window title') ] ], 'navigation_title' => [ 'label' => __('Navigation title'), 'type' => Mystique::TEXT, // or InputfieldText 'useLanguages' => true, 'showIf' => [ 'window_title' => "!=''" ], 'attr' => [ 'placeholder' => __('Enter a navigation title') ] ], 'description' => [ 'label' => __('Description for search engines'), 'type' => Mystique::TEXTAREA, 'useLanguages' => true ], 'page_tpye' => [ 'label' => __('Type'), 'type' => Mystique::SELECT, 'options' => [ 'basic' => __('Basic page'), 'gallery' => __('Gallery'), 'blog' => __('Blog') ] ], 'show_on_nav' => [ 'label' => __('Display this page on navigation'), 'type' => Mystique::CHECKBOX ] ] ]; Searching data on Mystique field is limited. Because, Mystique saving data to database in json format. When you make search for Mystique field, operator not important. Operator will be changed with %= operator.
      Search example
      $navigationPages = pages()->find('my_mystique_field.show_on_nav=1'); $navigationPages = pages()->find('my_mystique_field.page_tpye=gallery');
×
×
  • Create New...